[SCM] ardour/master: Imported Upstream version 4.2~dfsg
umlaeute at users.alioth.debian.org
umlaeute at users.alioth.debian.org
Thu Sep 10 21:38:29 UTC 2015
The following commit has been merged in the master branch:
commit bbe6427afc73fe22604ed740436e36584af9e084
Author: IOhannes m zmölnig <zmoelnig at umlautQ.umlaeute.mur.at>
Date: Thu Sep 10 21:29:45 2015 +0200
Imported Upstream version 4.2~dfsg
diff --git a/cfgtool/wscript b/cfgtool/wscript
index e5166eb..04dda4f 100644
--- a/cfgtool/wscript
+++ b/cfgtool/wscript
@@ -14,7 +14,7 @@ def configure(conf):
def build(bld):
if bld.env['build_target'] == 'mingw':
- return;
+ return;
obj = bld (features = 'cxx c cxxprogram')
obj.source = 'cfgtool.cc'
diff --git a/gtk2_ardour/about.cc b/gtk2_ardour/about.cc
index 41c5d84..3c8ff3e 100644
--- a/gtk2_ardour/about.cc
+++ b/gtk2_ardour/about.cc
@@ -183,6 +183,7 @@ static const char* authors[] = {
N_("Mike Täht"),
N_("Roy Vegard"),
N_("Thorsten Wilms"),
+ N_("Damien Zammit"),
N_("Grygorii Zharun"),
0
};
diff --git a/gtk2_ardour/add_video_dialog.cc b/gtk2_ardour/add_video_dialog.cc
index 44f61ec..5fc53c7 100644
--- a/gtk2_ardour/add_video_dialog.cc
+++ b/gtk2_ardour/add_video_dialog.cc
@@ -288,6 +288,7 @@ static bool check_video_file_extension(std::string file)
".webm" , ".WEBM" ,
".wmv" , ".WMV" ,
".ts" , ".TS" ,
+ ".mxf" , ".MXF" ,
};
for (size_t n = 0; n < sizeof(suffixes)/sizeof(suffixes[0]); ++n) {
@@ -321,8 +322,9 @@ AddVideoDialog::file_name (bool &local_file)
std::string video_server_url = video_get_server_url(Config);
/* check if video server is running locally */
- if (video_get_docroot(Config).size() > 0
- && !video_server_url.compare(0, 16, "http://localhost"))
+ if (video_get_docroot(Config).size() > 0 &&
+ (0 == video_server_url.compare (0, 16, "http://127.0.0.1") || 0 == video_server_url.compare (0, 16, "http://localhost"))
+ )
{
/* check if the file can be accessed */
int plen;
@@ -331,7 +333,7 @@ AddVideoDialog::file_name (bool &local_file)
char *ue = curl_easy_unescape(curl, uri.c_str(), uri.length(), &plen);
#ifdef PLATFORM_WINDOWS
char *tmp;
- while (tmp = strchr(ue, '/')) *tmp = '\\';
+ while ((tmp = strchr(ue, '/'))) *tmp = '\\';
#endif
std::string path = video_get_docroot(Config) + ue;
if (!::access(path.c_str(), R_OK)) {
@@ -396,8 +398,7 @@ AddVideoDialog::file_selection_changed ()
if (chooser.get_filename().size() > 0) {
std::string path = chooser.get_filename();
bool ok =
- check_video_file_extension(path)
- && Glib::file_test(path.c_str(), Glib::FILE_TEST_IS_REGULAR | Glib::FILE_TEST_IS_SYMLINK)
+ Glib::file_test(path.c_str(), Glib::FILE_TEST_IS_REGULAR | Glib::FILE_TEST_IS_SYMLINK)
&& !Glib::file_test(path.c_str(), Glib::FILE_TEST_IS_DIR);
set_action_ok(ok);
if (ok) {
@@ -416,8 +417,7 @@ AddVideoDialog::file_activated ()
std::string path = chooser.get_filename();
// TODO check docroot -> set import options
bool ok =
- check_video_file_extension(path)
- && Glib::file_test(path.c_str(), Glib::FILE_TEST_IS_REGULAR | Glib::FILE_TEST_IS_SYMLINK)
+ Glib::file_test(path.c_str(), Glib::FILE_TEST_IS_REGULAR | Glib::FILE_TEST_IS_SYMLINK)
&& !Glib::file_test(path.c_str(), Glib::FILE_TEST_IS_DIR);
if (ok) {
Gtk::Dialog::response(RESPONSE_ACCEPT);
diff --git a/gtk2_ardour/ardev_common.sh.in b/gtk2_ardour/ardev_common.sh.in
index fc287e1..eca7791 100644
--- a/gtk2_ardour/ardev_common.sh.in
+++ b/gtk2_ardour/ardev_common.sh.in
@@ -34,7 +34,7 @@ export ARDOUR_DLL_PATH=$libs
export GTK_PATH=~/.ardour3:$libs/clearlooks-newer
export VAMP_PATH=$libs/vamp-plugins${VAMP_PATH:+:$VAMP_PATH}
-export LD_LIBRARY_PATH=$libs/qm-dsp:$libs/vamp-sdk:$libs/surfaces:$libs/surfaces/control_protocol:$libs/ardour:$libs/midi++2:$libs/pbd:$libs/rubberband:$libs/soundtouch:$libs/gtkmm2ext:$libs/gnomecanvas:$libs/libsndfile:$libs/appleutility:$libs/taglib:$libs/evoral:$libs/evoral/src/libsmf:$libs/audiographer:$libs/timecode:$libs/libltc:$libs/canvas:$libs/ardouralsautil${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
+export LD_LIBRARY_PATH=$libs/ptformat:$libs/qm-dsp:$libs/vamp-sdk:$libs/surfaces:$libs/surfaces/control_protocol:$libs/ardour:$libs/midi++2:$libs/pbd:$libs/rubberband:$libs/soundtouch:$libs/gtkmm2ext:$libs/gnomecanvas:$libs/libsndfile:$libs/appleutility:$libs/taglib:$libs/evoral:$libs/evoral/src/libsmf:$libs/audiographer:$libs/timecode:$libs/libltc:$libs/canvas:$libs/ardouralsautil${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
# DYLD_LIBRARY_PATH is for darwin.
export DYLD_FALLBACK_LIBRARY_PATH=$LD_LIBRARY_PATH
diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in
index 086d2b8..27c0306 100644
--- a/gtk2_ardour/ardour.menus.in
+++ b/gtk2_ardour/ardour.menus.in
@@ -22,6 +22,9 @@
<menuitem action='AddTrackBus'/>
<separator/>
<menuitem action='addExistingAudioFiles'/>
+#ifdef PTFORMAT
+ <menuitem action='addExistingPTFiles'/>
+#endif
<!--menuitem action='importFromSession'/-->
<menuitem action='OpenVideo'/>
diff --git a/gtk2_ardour/ardour_dropdown.cc b/gtk2_ardour/ardour_dropdown.cc
index 6ad1f7c..29efe34 100644
--- a/gtk2_ardour/ardour_dropdown.cc
+++ b/gtk2_ardour/ardour_dropdown.cc
@@ -135,7 +135,7 @@ ArdourDropdown::clear_items ()
}
void
-ArdourDropdown::AddMenuElem (Menu_Helpers::MenuElem e)
+ArdourDropdown::AddMenuElem (Menu_Helpers::Element e)
{
using namespace Menu_Helpers;
diff --git a/gtk2_ardour/ardour_dropdown.h b/gtk2_ardour/ardour_dropdown.h
index c1cf119..7069768 100644
--- a/gtk2_ardour/ardour_dropdown.h
+++ b/gtk2_ardour/ardour_dropdown.h
@@ -40,7 +40,7 @@ class ArdourDropdown : public ArdourButton
bool on_scroll_event (GdkEventScroll*);
void clear_items ();
- void AddMenuElem (Gtk::Menu_Helpers::MenuElem e);
+ void AddMenuElem (Gtk::Menu_Helpers::Element e);
private:
Gtk::Menu _menu;
diff --git a/gtk2_ardour/ardour_knob.cc b/gtk2_ardour/ardour_knob.cc
index 0397b85..17fbff2 100644
--- a/gtk2_ardour/ardour_knob.cc
+++ b/gtk2_ardour/ardour_knob.cc
@@ -563,7 +563,7 @@ ArdourKnob::add_elements (Element e)
KnobPersistentTooltip::KnobPersistentTooltip (Gtk::Widget* w)
- : PersistentTooltip (w, 3)
+ : PersistentTooltip (w, true, 3)
, _dragging (false)
{
}
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index e371d58..b8598fe 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -28,6 +28,8 @@
#include <cerrno>
#include <fstream>
+#include <stdarg.h>
+
#ifndef PLATFORM_WINDOWS
#include <sys/resource.h>
#endif
@@ -55,6 +57,8 @@
#include "pbd/file_utils.h"
#include "pbd/localtime_r.h"
#include "pbd/pthread_utils.h"
+#include "pbd/replace_all.h"
+#include "pbd/xml++.h"
#include "gtkmm2ext/application.h"
#include "gtkmm2ext/bindings.h"
@@ -181,6 +185,42 @@ ask_about_configuration_copy (string const & old_dir, string const & new_dir, in
return (msg.run() == Gtk::RESPONSE_YES);
}
+static void
+libxml_generic_error_func (void* /* parsing_context*/,
+ const char* msg,
+ ...)
+{
+ va_list ap;
+ char buf[2048];
+
+ va_start (ap, msg);
+ vsnprintf (buf, sizeof (buf), msg, ap);
+ error << buf << endmsg;
+ va_end (ap);
+}
+
+static void
+libxml_structured_error_func (void* /* parsing_context*/,
+ xmlErrorPtr err)
+{
+ string msg;
+
+ if (err->message)
+ msg = err->message;
+
+ replace_all (msg, "\n", "");
+
+ if (err->file && err->line) {
+ error << X_("XML error: ") << msg << " in " << err->file << " at line " << err->line;
+
+ if (err->int2) {
+ error << ':' << err->int2;
+ }
+ }
+ error << endmsg;
+}
+
+
ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir, UIConfiguration* uic)
: Gtkmm2ext::UI (PROGRAM_NAME, argcp, argvp)
@@ -197,6 +237,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir, UIConfi
, nsm (0)
, _was_dirty (false)
, _mixer_on_top (false)
+ , _initial_verbose_plugin_scan (false)
, first_time_engine_run (true)
, roll_controllable (new TransportControllable ("transport roll", *this, TransportControllable::Roll))
, stop_controllable (new TransportControllable ("transport stop", *this, TransportControllable::Stop))
@@ -214,6 +255,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir, UIConfi
, error_alert_button ( ArdourButton::just_led_default_elements )
, editor_meter(0)
, editor_meter_peak_display()
+ , session_selector_window (0)
, open_session_selector (0)
, _numpad_locate_happening (false)
, _session_is_new (false)
@@ -258,6 +300,11 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir, UIConfi
theArdourUI = this;
}
+ /* stop libxml from spewing to stdout/stderr */
+
+ xmlSetGenericErrorFunc (this, libxml_generic_error_func);
+ xmlSetStructuredErrorFunc (this, libxml_structured_error_func);
+
ui_config->ParameterChanged.connect (sigc::mem_fun (*this, &ARDOUR_UI::parameter_changed));
boost::function<void (string)> pc (boost::bind (&ARDOUR_UI::parameter_changed, this, _1));
ui_config->map_parameters (pc);
@@ -754,6 +801,8 @@ ARDOUR_UI::check_announcements ()
#ifdef __APPLE__
_annc_filename = PROGRAM_NAME "_announcements_osx_";
+#elif defined PLATFORM_WINDOWS
+ _annc_filename = PROGRAM_NAME "_announcements_windows_";
#else
_annc_filename = PROGRAM_NAME "_announcements_linux_";
#endif
@@ -875,10 +924,12 @@ ARDOUR_UI::starting ()
} else {
if (brand_new_user) {
+ _initial_verbose_plugin_scan = true;
ArdourStartup s;
s.present ();
main().run();
s.hide ();
+ _initial_verbose_plugin_scan = false;
switch (s.response ()) {
case Gtk::RESPONSE_OK:
break;
@@ -3169,6 +3220,9 @@ ARDOUR_UI::load_session (const std::string& path, const std::string& snap_name,
msg.set_position (Gtk::WIN_POS_CENTER);
pop_back_splash (msg);
msg.present ();
+
+ dump_errors (cerr);
+
(void) msg.run ();
msg.hide ();
@@ -3854,7 +3908,7 @@ ARDOUR_UI::start_video_server (Gtk::Window* float_window, bool popup_msg)
Config->set_video_advanced_setup(false);
} else {
std::ostringstream osstream;
- osstream << "http://localhost:" << video_server_dialog->get_listenport() << "/";
+ osstream << "http://127.0.0.1:" << video_server_dialog->get_listenport() << "/";
Config->set_video_server_url(osstream.str());
Config->set_video_server_docroot(icsd_docroot);
Config->set_video_advanced_setup(true);
@@ -4171,6 +4225,7 @@ quickly enough to keep up with recording.\n"), PROGRAM_NAME));
static MessageDialog *scan_dlg = NULL;
static ProgressBar *scan_pbar = NULL;
static HBox *scan_tbox = NULL;
+static Gtk::Button *scan_timeout_button;
void
ARDOUR_UI::cancel_plugin_scan ()
@@ -4182,7 +4237,7 @@ void
ARDOUR_UI::cancel_plugin_timeout ()
{
PluginManager::instance().cancel_plugin_timeout();
- scan_tbox->hide();
+ scan_timeout_button->set_sensitive (false);
}
void
@@ -4192,10 +4247,13 @@ ARDOUR_UI::plugin_scan_timeout (int timeout)
return;
}
if (timeout > 0) {
+ scan_pbar->set_sensitive (false);
+ scan_timeout_button->set_sensitive (true);
scan_pbar->set_fraction ((float) timeout / (float) Config->get_vst_scan_timeout());
scan_tbox->show();
} else {
- scan_tbox->hide();
+ scan_pbar->set_sensitive (false);
+ scan_timeout_button->set_sensitive (false);
}
gui_idle_handler();
}
@@ -4208,7 +4266,7 @@ ARDOUR_UI::plugin_scan_dialog (std::string type, std::string plugin, bool can_ca
}
const bool cancelled = PluginManager::instance().cancelled();
- if (type != X_("closeme") && !ui_config->get_show_plugin_scan_window()) {
+ if (type != X_("closeme") && (!ui_config->get_show_plugin_scan_window()) && !_initial_verbose_plugin_scan) {
if (cancelled && scan_dlg->is_mapped()) {
scan_dlg->hide();
gui_idle_handler();
@@ -4220,7 +4278,6 @@ ARDOUR_UI::plugin_scan_dialog (std::string type, std::string plugin, bool can_ca
}
static Gtk::Button *cancel_button;
- static Gtk::Button *timeout_button;
if (!scan_dlg) {
scan_dlg = new MessageDialog("", false, MESSAGE_INFO, BUTTONS_NONE); // TODO manage
VBox* vbox = scan_dlg->get_vbox();
@@ -4236,10 +4293,10 @@ ARDOUR_UI::plugin_scan_dialog (std::string type, std::string plugin, bool can_ca
scan_tbox = manage( new HBox() );
- timeout_button = manage(new Gtk::Button(_("Stop Timeout")));
- timeout_button->set_name ("EditorGTKButton");
- timeout_button->signal_clicked().connect ( mem_fun (*this, &ARDOUR_UI::cancel_plugin_timeout) );
- timeout_button->show();
+ scan_timeout_button = manage(new Gtk::Button(_("Stop Timeout")));
+ scan_timeout_button->set_name ("EditorGTKButton");
+ scan_timeout_button->signal_clicked().connect ( mem_fun (*this, &ARDOUR_UI::cancel_plugin_timeout) );
+ scan_timeout_button->show();
scan_pbar = manage(new ProgressBar());
scan_pbar->set_orientation(Gtk::PROGRESS_RIGHT_TO_LEFT);
@@ -4247,7 +4304,7 @@ ARDOUR_UI::plugin_scan_dialog (std::string type, std::string plugin, bool can_ca
scan_pbar->show();
scan_tbox->pack_start (*scan_pbar, PACK_EXPAND_WIDGET, 4);
- scan_tbox->pack_start (*timeout_button, PACK_SHRINK, 4);
+ scan_tbox->pack_start (*scan_timeout_button, PACK_SHRINK, 4);
scan_dlg->get_vbox()->pack_start (*scan_tbox, PACK_SHRINK, 4);
}
@@ -4255,13 +4312,14 @@ ARDOUR_UI::plugin_scan_dialog (std::string type, std::string plugin, bool can_ca
assert(scan_dlg && scan_tbox && cancel_button);
if (type == X_("closeme")) {
+ scan_tbox->hide();
scan_dlg->hide();
} else {
scan_dlg->set_message(type + ": " + Glib::path_get_basename(plugin));
scan_dlg->show();
}
if (!can_cancel || !cancelled) {
- scan_tbox->hide();
+ scan_timeout_button->set_sensitive(false);
}
cancel_button->set_sensitive(can_cancel && !cancelled);
@@ -4864,3 +4922,9 @@ ARDOUR_UI::audioengine_became_silent ()
break;
}
}
+
+void
+ARDOUR_UI::hide_application ()
+{
+ Application::instance ()-> hide ();
+}
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index 9a3e7e9..722a0bf 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -308,6 +308,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
int disconnect_from_engine ();
int reconnect_to_engine ();
+ void hide_application ();
protected:
friend class PublicEditor;
@@ -335,6 +336,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
NSM_Client* nsm;
bool _was_dirty;
bool _mixer_on_top;
+ bool _initial_verbose_plugin_scan;
bool first_time_engine_run;
void goto_editor_window ();
diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc
index 0fbb33a..7d7ee7d 100644
--- a/gtk2_ardour/ardour_ui_dialogs.cc
+++ b/gtk2_ardour/ardour_ui_dialogs.cc
@@ -376,14 +376,28 @@ ARDOUR_UI::goto_mixer_window ()
void
ARDOUR_UI::toggle_mixer_window ()
{
- Glib::RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("toggle-mixer"));
- if (!act) {
- return;
+ /* thse windows are created in ARDOUR_UI::setup_windows()
+ * it should be impossible to get here with any of them being NULL
+ */
+ assert (editor && mixer && meterbridge);
+
+ bool show = false;
+ bool obscuring = false;
+
+ if (mixer->not_visible ()) {
+ show = true;
+ }
+ else if ( (!editor->not_visible () && ARDOUR_UI_UTILS::windows_overlap (editor, mixer))
+ || (!meterbridge->not_visible () && ARDOUR_UI_UTILS::windows_overlap (meterbridge, mixer))
+ ) {
+ obscuring = true;
}
- Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+ if (obscuring && (editor->property_has_toplevel_focus() || meterbridge->property_has_toplevel_focus())) {
+ show = true;
+ }
- if (tact->get_active()) {
+ if (show) {
goto_mixer_window ();
} else {
mixer->hide ();
@@ -393,15 +407,28 @@ ARDOUR_UI::toggle_mixer_window ()
void
ARDOUR_UI::toggle_meterbridge ()
{
- Glib::RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("toggle-meterbridge"));
- if (!act) {
- return;
+ assert (editor && mixer && meterbridge);
+
+ bool show = false;
+ bool obscuring = false;
+
+ if (meterbridge->not_visible ()) {
+ show = true;
+ }
+ else if ( (!editor->not_visible() && ARDOUR_UI_UTILS::windows_overlap (editor, meterbridge))
+ || (!mixer->not_visible () && ARDOUR_UI_UTILS::windows_overlap (meterbridge, mixer))
+ ) {
+ obscuring = true;
}
- Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+ if (obscuring && (editor->property_has_toplevel_focus() || mixer->property_has_toplevel_focus())) {
+ show = true;
+ }
- if (tact->get_active()) {
+ if (show) {
meterbridge->show_window ();
+ meterbridge->present ();
+ meterbridge->raise ();
} else {
meterbridge->hide_window (NULL);
}
@@ -411,79 +438,37 @@ void
ARDOUR_UI::toggle_editor_mixer ()
{
bool obscuring = false;
- /* currently, if windows are on different
- screens then we do nothing; but in the
- future we may want to bring the window
- to the front or something, so I'm leaving this
- variable for future use
- */
- bool same_screen = true;
-
- if (editor && mixer) {
-
- /* remeber: Screen != Monitor (Screen is a separately rendered
- * continuous geometry that make include 1 or more monitors.
- */
-
- if (editor->get_screen() != mixer->get_screen() && (mixer->get_screen() != 0) && (editor->get_screen() != 0)) {
- // different screens, so don't do anything
- same_screen = false;
- } else {
- // they are on the same screen, see if they are obscuring each other
-
- gint ex, ey, ew, eh;
- gint mx, my, mw, mh;
-
- editor->get_position (ex, ey);
- editor->get_size (ew, eh);
-
- mixer->get_position (mx, my);
- mixer->get_size (mw, mh);
-
- GdkRectangle e;
- GdkRectangle m;
- GdkRectangle r;
-
- e.x = ex;
- e.y = ey;
- e.width = ew;
- e.height = eh;
-
- m.x = mx;
- m.y = my;
- m.width = mw;
- m.height = mh;
-
- if (gdk_rectangle_intersect (&e, &m, &r)) {
- obscuring = true;
- }
- }
- }
-
- if (mixer && !mixer->not_visible() && mixer->property_has_toplevel_focus()) {
- if (obscuring && same_screen) {
- goto_editor_window();
- }
- } else if (editor && !editor->not_visible() && editor->property_has_toplevel_focus()) {
- if (obscuring && same_screen) {
- goto_mixer_window();
- }
- } else if (mixer && mixer->not_visible()) {
- if (obscuring && same_screen) {
- goto_mixer_window ();
- }
- } else if (editor && editor->not_visible()) {
- if (obscuring && same_screen) {
- goto_editor_window ();
- }
- } else if (obscuring && same_screen) {
- //it's unclear what to do here, so just do the opposite of what we did last time (old behavior)
- if (_mixer_on_top) {
+
+ if (editor && mixer) {
+ if (ARDOUR_UI_UTILS::windows_overlap (editor, mixer)) {
+ obscuring = true;
+ }
+ }
+
+ if (mixer && !mixer->not_visible() && mixer->property_has_toplevel_focus()) {
+ if (obscuring) {
+ goto_editor_window();
+ }
+ } else if (editor && !editor->not_visible() && editor->property_has_toplevel_focus()) {
+ if (obscuring) {
+ goto_mixer_window();
+ }
+ } else if (mixer && mixer->not_visible()) {
+ if (obscuring) {
+ goto_mixer_window ();
+ }
+ } else if (editor && editor->not_visible()) {
+ if (obscuring) {
+ goto_editor_window ();
+ }
+ } else if (obscuring) {
+ //it's unclear what to do here, so just do the opposite of what we did last time (old behavior)
+ if (_mixer_on_top) {
goto_editor_window ();
} else {
goto_mixer_window ();
}
- }
+ }
}
void
diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc
index 3f0bb44..4455e72 100644
--- a/gtk2_ardour/ardour_ui_ed.cc
+++ b/gtk2_ardour/ardour_ui_ed.cc
@@ -190,6 +190,7 @@ ARDOUR_UI::install_actions ()
common_actions = ActionGroup::create (X_("Common"));
ActionManager::register_action (common_actions, X_("Quit"), _("Quit"), (hide_return (sigc::mem_fun(*this, &ARDOUR_UI::finish))));
+ ActionManager::register_action (common_actions, X_("Hide"), _("Hide"), sigc::mem_fun (*this, &ARDOUR_UI::hide_application));
/* windows visibility actions */
@@ -201,9 +202,9 @@ ARDOUR_UI::install_actions ()
if (Profile->get_mixbus())
ActionManager::register_action (common_actions, X_("show-ui-prefs"), _("Show more UI preferences"), sigc::mem_fun (*this, &ARDOUR_UI::show_ui_prefs));
- 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-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_action (common_actions, X_("toggle-meterbridge"), S_("Window|Meterbridge"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_meterbridge));
ActionManager::register_action (common_actions, X_("reattach-all-tearoffs"), _("Reattach All Tearoffs"), sigc::mem_fun (*this, &ARDOUR_UI::reattach_all_tearoffs));
@@ -220,7 +221,7 @@ if (Profile->get_mixbus())
ActionManager::register_action (common_actions, X_("Forums"), _("User Forums"), mem_fun(*this, &ARDOUR_UI::launch_forums));
ActionManager::register_action (common_actions, X_("Howto_Report"), _("How to report a bug"), mem_fun(*this, &ARDOUR_UI::launch_howto_report));
- act = ActionManager::register_action (common_actions, X_("Save"), _("Save"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::save_state), string(""), false));
+ act = ActionManager::register_action (common_actions, X_("Save"), _("Save"), sigc::hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::save_state), string(""), false)));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::write_sensitive_actions.push_back (act);
diff --git a/gtk2_ardour/ardour_ui_mixer.cc b/gtk2_ardour/ardour_ui_mixer.cc
index a2669f9..56ecc05 100644
--- a/gtk2_ardour/ardour_ui_mixer.cc
+++ b/gtk2_ardour/ardour_ui_mixer.cc
@@ -46,7 +46,6 @@ ARDOUR_UI::create_mixer ()
}
mixer->signal_window_state_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::main_window_state_event_handler), false));
- mixer->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/toggle-mixer")));
return 0;
}
@@ -65,7 +64,6 @@ ARDOUR_UI::create_meterbridge ()
}
meterbridge->signal_window_state_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::main_window_state_event_handler), false));
- meterbridge->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/toggle-meterbridge")));
return 0;
}
diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc
index a511ff7..4f963a2 100644
--- a/gtk2_ardour/audio_region_view.cc
+++ b/gtk2_ardour/audio_region_view.cc
@@ -92,7 +92,7 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Container *parent, RouteTimeAxis
, trim_fade_in_drag_active(false)
, trim_fade_out_drag_active(false)
{
- Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&AudioRegionView::parameter_changed, this, _1), gui_context());
+ ARDOUR_UI::config()->ParameterChanged.connect (sigc::mem_fun (*this, &AudioRegionView::parameter_changed));
}
AudioRegionView::AudioRegionView (ArdourCanvas::Container *parent, RouteTimeAxisView &tv, boost::shared_ptr<AudioRegion> r, double spu,
@@ -113,7 +113,7 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Container *parent, RouteTimeAxis
, trim_fade_in_drag_active(false)
, trim_fade_out_drag_active(false)
{
- Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&AudioRegionView::parameter_changed, this, _1), gui_context());
+ ARDOUR_UI::config()->ParameterChanged.connect (sigc::mem_fun (*this, &AudioRegionView::parameter_changed));
}
AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_ptr<AudioRegion> other_region)
@@ -134,7 +134,7 @@ AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_pt
{
init (true);
- Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&AudioRegionView::parameter_changed, this, _1), gui_context());
+ ARDOUR_UI::config()->ParameterChanged.connect (sigc::mem_fun (*this, &AudioRegionView::parameter_changed));
}
void
@@ -1261,7 +1261,7 @@ AudioRegionView::add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *ev, b
trackview.session()->add_command (new MementoCommand<AudioRegion>(*(audio_region().get()), ®ion_before, ®ion_after));
}
- audio_region()->envelope()->add (fx, y, with_guard_points);
+ audio_region()->envelope()->editor_add (fx, y, with_guard_points);
XMLNode &after = audio_region()->envelope()->get_state();
trackview.session()->add_command (new MementoCommand<AutomationList>(*audio_region()->envelope().get(), &before, &after));
diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc
index 7951848..ed7bfc2 100644
--- a/gtk2_ardour/audio_streamview.cc
+++ b/gtk2_ardour/audio_streamview.cc
@@ -41,6 +41,7 @@
#include "tape_region_view.h"
#include "audio_time_axis.h"
#include "region_selection.h"
+#include "region_gain_line.h"
#include "selection.h"
#include "public_editor.h"
#include "ardour_ui.h"
@@ -471,3 +472,14 @@ AudioStreamView::color_handler ()
}
}
}
+
+void
+AudioStreamView::set_selected_points (PointSelection& points)
+{
+ for (list<RegionView *>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
+ AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
+ if (arv && arv->get_gain_line ()) {
+ arv->get_gain_line ()->set_selected_points (points);
+ }
+ }
+}
diff --git a/gtk2_ardour/audio_streamview.h b/gtk2_ardour/audio_streamview.h
index 8e9b095..443a390 100644
--- a/gtk2_ardour/audio_streamview.h
+++ b/gtk2_ardour/audio_streamview.h
@@ -26,6 +26,7 @@
#include <boost/weak_ptr.hpp>
#include "ardour/location.h"
+#include "point_selection.h"
#include "editing.h"
#include "streamview.h"
@@ -61,6 +62,7 @@ class AudioStreamView : public StreamView
std::pair<std::list<AudioRegionView*>, std::list<AudioRegionView*> > hide_xfades_with (boost::shared_ptr<ARDOUR::AudioRegion> ar);
RegionView* create_region_view (boost::shared_ptr<ARDOUR::Region>, bool, bool);
+ void set_selected_points (PointSelection&);
private:
void setup_rec_box ();
diff --git a/gtk2_ardour/automation_controller.cc b/gtk2_ardour/automation_controller.cc
index f57f2a7..44c0315 100644
--- a/gtk2_ardour/automation_controller.cc
+++ b/gtk2_ardour/automation_controller.cc
@@ -204,7 +204,7 @@ AutomationController::toggled ()
_controllable->set_automation_state(Write);
}
if (_controllable->list()) {
- _controllable->list()->set_in_write_pass(true, false, _controllable->session().audible_frame());
+ _controllable->list()->set_in_write_pass(true, true, _controllable->session().audible_frame());
}
}
const bool was_active = _controllable->get_value() >= 0.5;
diff --git a/gtk2_ardour/automation_line.cc b/gtk2_ardour/automation_line.cc
index 069a823..d0dc933 100644
--- a/gtk2_ardour/automation_line.cc
+++ b/gtk2_ardour/automation_line.cc
@@ -466,7 +466,6 @@ AutomationLine::string_to_fraction (string const & s) const
void
AutomationLine::start_drag_single (ControlPoint* cp, double x, float fraction)
{
- trackview.editor().begin_reversible_command (_("automation event move"));
trackview.editor().session()->add_command (
new MementoCommand<AutomationList> (memento_command_binder(), &get_state(), 0));
@@ -492,7 +491,6 @@ AutomationLine::start_drag_single (ControlPoint* cp, double x, float fraction)
void
AutomationLine::start_drag_line (uint32_t i1, uint32_t i2, float fraction)
{
- trackview.editor().begin_reversible_command (_("automation range move"));
trackview.editor().session()->add_command (
new MementoCommand<AutomationList> (memento_command_binder (), &get_state(), 0));
@@ -512,7 +510,6 @@ AutomationLine::start_drag_line (uint32_t i1, uint32_t i2, float fraction)
void
AutomationLine::start_drag_multiple (list<ControlPoint*> cp, float fraction, XMLNode* state)
{
- trackview.editor().begin_reversible_command (_("automation range move"));
trackview.editor().session()->add_command (
new MementoCommand<AutomationList> (memento_command_binder(), state, 0));
@@ -678,6 +675,7 @@ AutomationLine::drag_motion (double const x, float fraction, bool ignore_x, bool
for (vector<CCP>::iterator ccp = contiguous_points.begin(); ccp != contiguous_points.end(); ++ccp) {
(*ccp)->compute_x_bounds (trackview.editor());
}
+ _drag_had_movement = true;
}
/* OK, now on to the stuff related to *this* motion event. First, for
@@ -738,7 +736,6 @@ AutomationLine::drag_motion (double const x, float fraction, bool ignore_x, bool
_drag_distance += dx;
_drag_x += dx;
_last_drag_fraction = fraction;
- _drag_had_movement = true;
did_push = with_push;
return pair<double, float> (_drag_x + dx, _last_drag_fraction + dy);
@@ -951,7 +948,8 @@ AutomationLine::set_selected_points (PointSelection const & points)
set_colors ();
}
-void AutomationLine::set_colors ()
+void
+AutomationLine::set_colors ()
{
set_line_color (ARDOUR_UI::config()->color ("automation line"));
for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
diff --git a/gtk2_ardour/automation_region_view.cc b/gtk2_ardour/automation_region_view.cc
index 7e33094..b418d09 100644
--- a/gtk2_ardour/automation_region_view.cc
+++ b/gtk2_ardour/automation_region_view.cc
@@ -190,7 +190,7 @@ AutomationRegionView::add_automation_event (GdkEvent *, framepos_t when, double
view->editor().begin_reversible_command (_("add automation event"));
XMLNode& before = _line->the_list()->get_state();
- _line->the_list()->add (when_d, y, with_guard_points, false);
+ _line->the_list()->editor_add (when_d, y, with_guard_points);
XMLNode& after = _line->the_list()->get_state();
diff --git a/gtk2_ardour/automation_time_axis.cc b/gtk2_ardour/automation_time_axis.cc
index 01f2ebb..d5276e0 100644
--- a/gtk2_ardour/automation_time_axis.cc
+++ b/gtk2_ardour/automation_time_axis.cc
@@ -449,7 +449,7 @@ AutomationTimeAxisView::clear_clicked ()
} else if (_view) {
_view->clear ();
}
-
+ set_automation_state ((AutoState) ARDOUR::Off);
_editor.commit_reversible_command ();
_session->set_dirty ();
}
@@ -644,10 +644,10 @@ AutomationTimeAxisView::add_automation_event (GdkEvent* event, framepos_t when,
_editor.begin_reversible_command (_("add automation event"));
XMLNode& before = list->get_state();
- list->add (when, y, with_guard_points);
+ list->editor_add (when, y, with_guard_points);
XMLNode& after = list->get_state();
- _session->add_command (new MementoCommand<ARDOUR::AutomationList> (*list, &before, &after));
+ _session->add_command (new MementoCommand<ARDOUR::AutomationList> (*list.get (), &before, &after));
_editor.commit_reversible_command ();
_session->set_dirty ();
}
diff --git a/gtk2_ardour/debug.cc b/gtk2_ardour/debug.cc
index 7065e6a..811c246 100644
--- a/gtk2_ardour/debug.cc
+++ b/gtk2_ardour/debug.cc
@@ -29,3 +29,4 @@ PBD::DebugBits PBD::DEBUG::Drags = PBD::new_debug_bit ("drags");
PBD::DebugBits PBD::DEBUG::CutNPaste = PBD::new_debug_bit ("cutnpaste");
PBD::DebugBits PBD::DEBUG::Accelerators = PBD::new_debug_bit ("accelerators");
PBD::DebugBits PBD::DEBUG::GUITiming = PBD::new_debug_bit ("guitiming");
+PBD::DebugBits PBD::DEBUG::EngineControl = PBD::new_debug_bit ("enginecontrol");
diff --git a/gtk2_ardour/debug.h b/gtk2_ardour/debug.h
index 660e674..8574350 100644
--- a/gtk2_ardour/debug.h
+++ b/gtk2_ardour/debug.h
@@ -30,6 +30,7 @@ namespace PBD {
extern DebugBits CutNPaste;
extern DebugBits Accelerators;
extern DebugBits GUITiming;
+ extern DebugBits EngineControl;
}
}
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index 534dd26..98be85e 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -115,6 +115,7 @@
#include "note_base.h"
#include "playlist_selector.h"
#include "public_editor.h"
+#include "quantize_dialog.h"
#include "region_layering_order_editor.h"
#include "rgb_macros.h"
#include "rhythm_ferret.h"
@@ -300,6 +301,8 @@ Editor::Editor ()
, _following_mixer_selection (false)
, _control_point_toggled_on_press (false)
, _stepping_axis_view (0)
+ , quantize_dialog (0)
+ , _main_menu_disabler (0)
{
constructed = false;
@@ -412,7 +415,7 @@ Editor::Editor ()
timebar_height = std::max(12., ceil (15. * ARDOUR_UI::ui_scale));
TimeAxisView::setup_sizes ();
- Marker::setup_sizes (timebar_height);
+ ArdourMarker::setup_sizes (timebar_height);
_scroll_callbacks = 0;
@@ -809,6 +812,7 @@ Editor::~Editor()
delete _track_canvas_viewport;
delete _drags;
delete nudge_clock;
+ delete quantize_dialog;
}
XMLNode*
@@ -5402,7 +5406,7 @@ Editor::sync_track_view_list_and_routes ()
{
track_views = TrackViewList (_routes->views ());
- _summary->set_dirty ();
+ _summary->set_background_dirty();
_group_tabs->set_dirty ();
return false; // do not call again (until needed)
@@ -5684,13 +5688,18 @@ Editor::super_rapid_screen_update ()
} else {
- if (!_dragging_playhead && _follow_playhead && _session->requested_return_frame() < 0 && !pending_visual_change.being_handled) {
+ if (!_dragging_playhead && _session->requested_return_frame() < 0 && !pending_visual_change.being_handled) {
framepos_t const frame = playhead_cursor->current_frame ();
double target = ((double)frame - (double)current_page_samples()/3.0);
if (target <= 0.0) {
target = 0.0;
}
- reset_x_origin (target);
+ // compare to EditorCursor::set_position()
+ double const old_pos = sample_to_pixel_unrounded (leftmost_frame);
+ double const new_pos = sample_to_pixel_unrounded (target);
+ if (rint (new_pos) != rint (old_pos)) {
+ reset_x_origin (pixel_to_sample (floor (new_pos)));
+ }
}
}
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index d5645a1..c137bd7 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -111,7 +111,7 @@ class EditorSnapshots;
class EditorSummary;
class GroupedButtons;
class GUIObjectState;
-class Marker;
+class ArdourMarker;
class MidiRegionView;
class MixerStrip;
class MouseCursors;
@@ -119,6 +119,7 @@ class NoteBase;
class PlaylistSelector;
class PluginSelector;
class ProgressReporter;
+class QuantizeDialog;
class RhythmFerret;
class RulerDialog;
class Selection;
@@ -409,6 +410,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
int get_regionview_count_from_region_list (boost::shared_ptr<ARDOUR::Region>);
+ void do_ptimport(std::string path, ARDOUR::SrcQuality quality);
+
void do_import (std::vector<std::string> paths,
Editing::ImportDisposition disposition,
Editing::ImportMode mode,
@@ -641,8 +644,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
uint32_t location_cd_marker_color;
struct LocationMarkers {
- Marker* start;
- Marker* end;
+ ArdourMarker* start;
+ ArdourMarker* end;
bool valid;
LocationMarkers () : start(0), end(0), valid (true) {}
@@ -663,9 +666,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
};
LocationMarkers *find_location_markers (ARDOUR::Location *) const;
- ARDOUR::Location* find_location_from_marker (Marker *, bool& is_start) const;
- Marker* find_marker_from_location_id (PBD::ID const &, bool) const;
- Marker* entered_marker;
+ ARDOUR::Location* find_location_from_marker (ArdourMarker *, bool& is_start) const;
+ ArdourMarker* find_marker_from_location_id (PBD::ID const &, bool) const;
+ ArdourMarker* entered_marker;
bool _show_marker_lines;
typedef std::map<ARDOUR::Location*,LocationMarkers *> LocationMarkerMap;
@@ -673,7 +676,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void update_marker_labels ();
void update_marker_labels (ArdourCanvas::Container *);
- void check_marker_label (Marker *);
+ void check_marker_label (ArdourMarker *);
/** A set of lists of Markers that are in each of the canvas groups
* for the marker sections at the top of the editor. These lists
@@ -681,8 +684,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
* a marker has moved we can decide whether we need to update the labels
* for all markers or for just a few.
*/
- std::map<ArdourCanvas::Container *, std::list<Marker *> > _sorted_marker_lists;
- void remove_sorted_marker (Marker *);
+ std::map<ArdourCanvas::Container *, std::list<ArdourMarker *> > _sorted_marker_lists;
+ void remove_sorted_marker (ArdourMarker *);
void hide_marker (ArdourCanvas::Item*, GdkEvent*);
void clear_marker_display ();
@@ -1316,6 +1319,18 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void insert_region_list_selection (float times);
+ /* PT import */
+ void external_pt_dialog ();
+ typedef struct ptflookup {
+ uint16_t index1;
+ uint16_t index2;
+ PBD::ID id;
+
+ bool operator ==(const struct ptflookup& other) {
+ return (this->index1 == other.index1);
+ }
+ } ptflookup_t;
+
/* import & embed */
void add_external_audio_action (Editing::ImportMode);
@@ -1553,7 +1568,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
bool canvas_feature_line_event (GdkEvent* event, ArdourCanvas::Item*, RegionView*);
bool canvas_stream_view_event (GdkEvent* event,ArdourCanvas::Item*, RouteTimeAxisView*);
- bool canvas_marker_event (GdkEvent* event,ArdourCanvas::Item*, Marker*);
+ bool canvas_marker_event (GdkEvent* event,ArdourCanvas::Item*, ArdourMarker*);
bool canvas_tempo_marker_event (GdkEvent* event,ArdourCanvas::Item*, TempoMarker*);
bool canvas_meter_marker_event (GdkEvent* event,ArdourCanvas::Item*, MeterMarker*);
bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*);
@@ -1641,7 +1656,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void marker_menu_edit ();
void marker_menu_remove ();
void marker_menu_rename ();
- void rename_marker (Marker *marker);
+ void rename_marker (ArdourMarker *marker);
void toggle_marker_menu_lock ();
void toggle_marker_menu_glue ();
void marker_menu_hide ();
@@ -1678,7 +1693,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
Gtk::Menu* cd_marker_menu;
ArdourCanvas::Item* marker_menu_item;
- typedef std::list<Marker*> Marks;
+ typedef std::list<ArdourMarker*> Marks;
Marks metric_marks;
void remove_metric_marks ();
@@ -2237,6 +2252,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void update_bring_in_message (Gtk::Label* label, uint32_t n, uint32_t total, std::string name);
void bring_all_sources_into_session ();
+ QuantizeDialog* quantize_dialog;
+ MainMenuDisabler* _main_menu_disabler;
+
friend class Drag;
friend class RegionDrag;
friend class RegionMoveDrag;
diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc
index 71ce594..6b64471 100644
--- a/gtk2_ardour/editor_actions.cc
+++ b/gtk2_ardour/editor_actions.cc
@@ -196,7 +196,7 @@ Editor::register_actions ()
reg_sens (editor_actions, "deselect-all", _("Deselect All"), sigc::mem_fun(*this, &Editor::deselect_all));
reg_sens (editor_actions, "invert-selection", _("Invert Selection"), sigc::mem_fun(*this, &Editor::invert_selection));
- reg_sens (editor_actions, "select-loop-range", _("Set Range in Loop Range"), sigc::mem_fun(*this, &Editor::set_selection_from_loop));
+ reg_sens (editor_actions, "select-loop-range", _("Set Range to Loop Range"), sigc::mem_fun(*this, &Editor::set_selection_from_loop));
reg_sens (editor_actions, "select-punch-range", _("Set Range to Punch Range"), sigc::mem_fun(*this, &Editor::set_selection_from_punch));
reg_sens (editor_actions, "select-from-regions", _("Set Range to Selected Regions"), sigc::mem_fun(*this, &Editor::set_selection_from_region));
@@ -688,6 +688,9 @@ Editor::register_actions ()
ActionManager::register_action (rl_actions, X_("removeUnusedRegions"), _("Remove Unused"), sigc::mem_fun (*_regions, &EditorRegions::remove_unused_regions));
+ act = reg_sens (editor_actions, X_("addExistingPTFiles"), _("Import PT session"), sigc::mem_fun (*this, &Editor::external_pt_dialog));
+ ActionManager::write_sensitive_actions.push_back (act);
+
/* the next two are duplicate items with different names for use in two different contexts */
act = reg_sens (editor_actions, X_("addExistingAudioFiles"), _("Import"), sigc::mem_fun (*this, &Editor::external_audio_dialog));
diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc
index 6be0a78..406b255 100644
--- a/gtk2_ardour/editor_audio_import.cc
+++ b/gtk2_ardour/editor_audio_import.cc
@@ -303,6 +303,7 @@ Editor::do_import (vector<string> paths,
} else {
ipw.show ();
ok = (import_sndfiles (paths, disposition, mode, quality, pos, 1, 1, track, false, instrument) == 0);
+ import_status.sources.clear();
}
} else {
@@ -348,6 +349,7 @@ Editor::do_import (vector<string> paths,
}
ok = (import_sndfiles (to_import, disposition, mode, quality, pos, 1, -1, track, replace, instrument) == 0);
+ import_status.sources.clear();
break;
case Editing::ImportDistinctChannels:
@@ -356,6 +358,7 @@ Editor::do_import (vector<string> paths,
to_import.push_back (*a);
ok = (import_sndfiles (to_import, disposition, mode, quality, pos, -1, -1, track, replace, instrument) == 0);
+ import_status.sources.clear();
break;
case Editing::ImportSerializeFiles:
@@ -364,6 +367,7 @@ Editor::do_import (vector<string> paths,
to_import.push_back (*a);
ok = (import_sndfiles (to_import, disposition, mode, quality, pos, 1, 1, track, replace, instrument) == 0);
+ import_status.sources.clear();
break;
case Editing::ImportMergeFiles:
@@ -524,7 +528,6 @@ Editor::import_sndfiles (vector<string> paths,
pos = import_status.pos;
}
- import_status.sources.clear();
return result;
}
@@ -734,7 +737,7 @@ Editor::add_sources (vector<string> paths,
/* generate a per-channel region name so that things work as
* intended
*/
-
+
string path;
if (fs) {
@@ -742,7 +745,7 @@ Editor::add_sources (vector<string> paths,
} else {
region_name = (*x)->name();
}
-
+
if (sources.size() == 2) {
if (n == 0) {
region_name += "-L";
@@ -752,9 +755,9 @@ Editor::add_sources (vector<string> paths,
} else if (sources.size() > 2) {
region_name += string_compose ("-%1", n+1);
}
-
+
track_names.push_back (region_name);
-
+
} else {
if (fs) {
region_name = region_name_from_path (fs->path(), false, false, sources.size(), n);
@@ -825,7 +828,7 @@ Editor::add_sources (vector<string> paths,
* the API simpler.
*/
assert (regions.size() == track_names.size());
-
+
for (vector<boost::shared_ptr<Region> >::iterator r = regions.begin(); r != regions.end(); ++r, ++n) {
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (*r);
@@ -857,7 +860,7 @@ Editor::add_sources (vector<string> paths,
pos = get_preferred_edit_position ();
}
}
-
+
finish_bringing_in_material (*r, input_chan, output_chan, pos, mode, track, track_names[n], instrument);
rlen = (*r)->length();
@@ -873,7 +876,7 @@ Editor::add_sources (vector<string> paths,
}
commit_reversible_command ();
-
+
/* setup peak file building in another thread */
for (SourceList::iterator x = sources.begin(); x != sources.end(); ++x) {
diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc
index 6641792..f04c668 100644
--- a/gtk2_ardour/editor_canvas.cc
+++ b/gtk2_ardour/editor_canvas.cc
@@ -425,8 +425,8 @@ Editor::drop_paths_part_two (const vector<string>& paths, framepos_t frame, doub
/* drop onto canvas background: create new tracks */
frame = 0;
-
- do_import (midi_paths, Editing::ImportDistinctFiles, ImportAsTrack, SrcBest, frame);
+ InstrumentSelector is; // instantiation builds instrument-list and sets default.
+ do_import (midi_paths, Editing::ImportDistinctFiles, ImportAsTrack, SrcBest, frame, is.selected_instrument());
if (Profile->get_sae() || ARDOUR_UI::config()->get_only_copy_imported_files() || copy) {
do_import (audio_paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, SrcBest, frame);
@@ -1188,6 +1188,19 @@ Editor::which_canvas_cursor(ItemType type) const
{
Gdk::Cursor* cursor = which_mode_cursor ();
+ if (mouse_mode == MouseRange) {
+ switch (type) {
+ case StartSelectionTrimItem:
+ cursor = _cursors->left_side_trim;
+ break;
+ case EndSelectionTrimItem:
+ cursor = _cursors->right_side_trim;
+ break;
+ default:
+ break;
+ }
+ }
+
if ((mouse_mode == MouseObject || get_smart_mode ()) ||
mouse_mode == MouseContent) {
@@ -1223,7 +1236,7 @@ Editor::which_canvas_cursor(ItemType type) const
cursor = _cursors->fader;
break;
case GainLineItem:
- cursor = which_track_cursor ();
+ cursor = _cursors->cross_hair;
break;
case AutomationLineItem:
cursor = _cursors->cross_hair;
diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc
index 8af5389..adb896a 100644
--- a/gtk2_ardour/editor_canvas_events.cc
+++ b/gtk2_ardour/editor_canvas_events.cc
@@ -695,6 +695,11 @@ Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, Automation
type = AutomationLineItem;
}
+ clicked_control_point = 0;
+ clicked_axisview = &al->trackview;
+ clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
+ clicked_regionview = 0;
+
return typed_event (item, event, type);
}
@@ -976,7 +981,7 @@ Editor::canvas_feature_line_event (GdkEvent *event, ArdourCanvas::Item* item, Re
}
bool
-Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* /*marker*/)
+Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, ArdourMarker* /*marker*/)
{
return typed_event (item, event, MarkerItem);
}
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc
index b079972..9162828 100644
--- a/gtk2_ardour/editor_drag.cc
+++ b/gtk2_ardour/editor_drag.cc
@@ -96,8 +96,6 @@ DragManager::abort ()
{
_ending = true;
- cerr << "Aborting drag\n";
-
for (list<Drag*>::const_iterator i = _drags.begin(); i != _drags.end(); ++i) {
(*i)->abort ();
delete *i;
@@ -619,6 +617,11 @@ RegionMotionDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
assert(_last_pointer_time_axis_view >= 0);
_last_pointer_layer = tv.first->layer_display() == Overlaid ? 0 : tv.second;
}
+
+ if (_brushing) {
+ /* cross track dragging seems broken here. disabled for now. */
+ _y_constrained = true;
+ }
}
double
@@ -1223,13 +1226,13 @@ void
RegionMoveDrag::motion (GdkEvent* event, bool first_move)
{
if (_copy && first_move) {
-
- if (_x_constrained) {
+ if (_x_constrained && !_brushing) {
_editor->begin_reversible_command (Operations::fixed_time_region_copy);
- } else {
+ } else if (!_brushing) {
_editor->begin_reversible_command (Operations::region_copy);
+ } else if (_brushing) {
+ _editor->begin_reversible_command (Operations::drag_region_brush);
}
-
/* duplicate the regionview(s) and region(s) */
list<DraggingView> new_regionviews;
@@ -1287,14 +1290,14 @@ RegionMoveDrag::motion (GdkEvent* event, bool first_move)
}
} else if (!_copy && first_move) {
-
- if (_x_constrained) {
+ if (_x_constrained && !_brushing) {
_editor->begin_reversible_command (_("fixed time region drag"));
- } else {
+ } else if (!_brushing) {
_editor->begin_reversible_command (Operations::region_drag);
+ } else if (_brushing) {
+ _editor->begin_reversible_command (Operations::drag_region_brush);
}
}
-
RegionMotionDrag::motion (event, first_move);
}
@@ -1502,12 +1505,6 @@ RegionMoveDrag::finished_no_copy (
set<RouteTimeAxisView*> views_to_update;
RouteTimeAxisView* new_time_axis_view = 0;
- if (_brushing) {
- /* all changes were made during motion event handlers */
- _editor->commit_reversible_command ();
- return;
- }
-
typedef map<boost::shared_ptr<Playlist>, RouteTimeAxisView*> PlaylistMapping;
PlaylistMapping playlist_mapping;
@@ -1621,7 +1618,6 @@ RegionMoveDrag::finished_no_copy (
}
rv->region()->set_position (where);
-
_editor->session()->add_command (new StatefulDiffCommand (rv->region()));
}
@@ -1670,7 +1666,7 @@ RegionMoveDrag::finished_no_copy (
/* write commands for the accumulated diffs for all our modified playlists */
add_stateful_diff_commands_for_playlists (modified_playlists);
-
+ /* applies to _brushing */
_editor->commit_reversible_command ();
/* We have futzed with the layering of canvas items on our streamviews.
@@ -2336,6 +2332,8 @@ RegionCreateDrag::aborted (bool)
NoteResizeDrag::NoteResizeDrag (Editor* e, ArdourCanvas::Item* i)
: Drag (e, i)
, region (0)
+ , relative (false)
+ , at_front (true)
, _snap_delta (0)
{
DEBUG_TRACE (DEBUG::Drags, "New NoteResizeDrag\n");
@@ -2372,37 +2370,36 @@ NoteResizeDrag::start_grab (GdkEvent* event, Gdk::Cursor* /*ignored*/)
} else {
relative = true;
}
-
MidiRegionSelection& ms (_editor->get_selection().midi_regions);
-
if (ms.size() > 1) {
/* has to be relative, may make no sense otherwise */
relative = true;
}
-
/* select this note; if it is already selected, preserve the existing selection,
otherwise make this note the only one selected.
*/
region->note_selected (cnote, cnote->selected ());
-
- _editor->begin_reversible_command (_("resize notes"));
-
- for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ) {
- MidiRegionSelection::iterator next;
- next = r;
- ++next;
- MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*r);
- if (mrv) {
- mrv->begin_resizing (at_front);
- }
- r = next;
- }
}
void
-NoteResizeDrag::motion (GdkEvent* event, bool /*first_move*/)
+NoteResizeDrag::motion (GdkEvent* event, bool first_move)
{
MidiRegionSelection& ms (_editor->get_selection().midi_regions);
+ if (first_move) {
+ _editor->begin_reversible_command (_("resize notes"));
+
+ for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ) {
+ MidiRegionSelection::iterator next;
+ next = r;
+ ++next;
+ MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*r);
+ if (mrv) {
+ mrv->begin_resizing (at_front);
+ }
+ r = next;
+ }
+ }
+
for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ++r) {
NoteBase* nb = reinterpret_cast<NoteBase*> (_item->get_data ("notebase"));
assert (nb);
@@ -2436,8 +2433,12 @@ NoteResizeDrag::motion (GdkEvent* event, bool /*first_move*/)
}
void
-NoteResizeDrag::finished (GdkEvent* event, bool /*movement_occurred*/)
+NoteResizeDrag::finished (GdkEvent* event, bool movement_occurred)
{
+ if (!movement_occurred) {
+ return;
+ }
+
MidiRegionSelection& ms (_editor->get_selection().midi_regions);
for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ++r) {
NoteBase* nb = reinterpret_cast<NoteBase*> (_item->get_data ("notebase"));
@@ -2460,9 +2461,11 @@ NoteResizeDrag::finished (GdkEvent* event, bool /*movement_occurred*/)
}
}
}
+
if (apply_snap_delta) {
sd = _snap_delta;
}
+
mrv->commit_resizing (nb, at_front, _drags->current_pointer_x() - grab_x(), relative, sd, snap);
}
}
@@ -3481,7 +3484,7 @@ FadeInDrag::finished (GdkEvent* event, bool movement_occurred)
fade_length = pos - region->position();
}
- _editor->begin_reversible_command (_("change fade in length"));
+ bool in_command = false;
for (list<DraggingView>::iterator i = _views.begin(); i != _views.end(); ++i) {
@@ -3497,11 +3500,17 @@ FadeInDrag::finished (GdkEvent* event, bool movement_occurred)
tmp->audio_region()->set_fade_in_length (fade_length);
tmp->audio_region()->set_fade_in_active (true);
+ if (!in_command) {
+ _editor->begin_reversible_command (_("change fade in length"));
+ in_command = true;
+ }
XMLNode &after = alist->get_state();
_editor->session()->add_command(new MementoCommand<AutomationList>(*alist.get(), &before, &after));
}
- _editor->commit_reversible_command ();
+ if (in_command) {
+ _editor->commit_reversible_command ();
+ }
}
void
@@ -3600,7 +3609,7 @@ FadeOutDrag::finished (GdkEvent* event, bool movement_occurred)
fade_length = region->last_frame() - pos;
}
- _editor->begin_reversible_command (_("change fade out length"));
+ bool in_command = false;
for (list<DraggingView>::iterator i = _views.begin(); i != _views.end(); ++i) {
@@ -3616,11 +3625,17 @@ FadeOutDrag::finished (GdkEvent* event, bool movement_occurred)
tmp->audio_region()->set_fade_out_length (fade_length);
tmp->audio_region()->set_fade_out_active (true);
+ if (!in_command) {
+ _editor->begin_reversible_command (_("change fade out length"));
+ in_command = false;
+ }
XMLNode &after = alist->get_state();
_editor->session()->add_command(new MementoCommand<AutomationList>(*alist.get(), &before, &after));
}
- _editor->commit_reversible_command ();
+ if (in_command) {
+ _editor->commit_reversible_command ();
+ }
}
void
@@ -3642,7 +3657,7 @@ MarkerDrag::MarkerDrag (Editor* e, ArdourCanvas::Item* i)
{
DEBUG_TRACE (DEBUG::Drags, "New MarkerDrag\n");
- _marker = reinterpret_cast<Marker*> (_item->get_data ("marker"));
+ _marker = reinterpret_cast<ArdourMarker*> (_item->get_data ("marker"));
assert (_marker);
_points.push_back (ArdourCanvas::Duple (0, 0));
@@ -3656,7 +3671,7 @@ MarkerDrag::~MarkerDrag ()
}
}
-MarkerDrag::CopiedLocationMarkerInfo::CopiedLocationMarkerInfo (Location* l, Marker* m)
+MarkerDrag::CopiedLocationMarkerInfo::CopiedLocationMarkerInfo (Location* l, ArdourMarker* m)
{
location = new Location (*l);
markers.push_back (m);
@@ -3698,7 +3713,7 @@ MarkerDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
case Selection::Extend:
{
Locations::LocationList ll;
- list<Marker*> to_add;
+ list<ArdourMarker*> to_add;
framepos_t s, e;
_editor->selection->markers.range (s, e);
s = min (_marker->position(), s);
@@ -3813,17 +3828,17 @@ MarkerDrag::motion (GdkEvent* event, bool)
switch (_marker->type()) {
- case Marker::SessionStart:
- case Marker::RangeStart:
- case Marker::LoopStart:
- case Marker::PunchIn:
+ case ArdourMarker::SessionStart:
+ case ArdourMarker::RangeStart:
+ case ArdourMarker::LoopStart:
+ case ArdourMarker::PunchIn:
f_delta = newframe - copy_location->start();
break;
- case Marker::SessionEnd:
- case Marker::RangeEnd:
- case Marker::LoopEnd:
- case Marker::PunchOut:
+ case ArdourMarker::SessionEnd:
+ case ArdourMarker::RangeEnd:
+ case ArdourMarker::LoopEnd:
+ case ArdourMarker::PunchOut:
f_delta = newframe - copy_location->end();
break;
default:
@@ -3954,8 +3969,8 @@ MarkerDrag::finished (GdkEvent* event, bool movement_occurred)
_editor->_dragging_edit_point = false;
- _editor->begin_reversible_command ( _("move marker") );
XMLNode &before = _editor->session()->locations()->get_state();
+ bool in_command = false;
MarkerSelection::iterator i;
CopiedLocationInfo::iterator x;
@@ -3970,9 +3985,12 @@ MarkerDrag::finished (GdkEvent* event, bool movement_occurred)
if (location) {
if (location->locked()) {
- return;
+ continue;
+ }
+ if (!in_command) {
+ _editor->begin_reversible_command ( _("move marker") );
+ in_command = true;
}
-
if (location->is_mark()) {
location->set_start (((*x).location)->start());
} else {
@@ -3981,9 +3999,11 @@ MarkerDrag::finished (GdkEvent* event, bool movement_occurred)
}
}
- XMLNode &after = _editor->session()->locations()->get_state();
- _editor->session()->add_command(new MementoCommand<Locations>(*(_editor->session()->locations()), &before, &after));
- _editor->commit_reversible_command ();
+ if (in_command) {
+ XMLNode &after = _editor->session()->locations()->get_state();
+ _editor->session()->add_command(new MementoCommand<Locations>(*(_editor->session()->locations()), &before, &after));
+ _editor->commit_reversible_command ();
+ }
}
void
@@ -3998,7 +4018,7 @@ MarkerDrag::aborted (bool movement_occured)
/* move all markers to their original location */
- for (vector<Marker*>::iterator m = x->markers.begin(); m != x->markers.end(); ++m) {
+ for (vector<ArdourMarker*>::iterator m = x->markers.begin(); m != x->markers.end(); ++m) {
bool is_start;
Location * location = _editor->find_location_from_marker (*m, is_start);
@@ -4046,9 +4066,6 @@ ControlPointDrag::start_grab (GdkEvent* event, Gdk::Cursor* /*cursor*/)
setup_snap_delta (pos);
float const fraction = 1 - (_point->get_y() / _point->line().height());
-
- _point->line().start_drag_single (_point, _fixed_grab_x, fraction);
-
show_verbose_cursor_text (_point->line().get_verbose_cursor_string (fraction));
_pushing = Keyboard::modifier_state_equals (event->button.state, ArdourKeyboard::push_points_modifier ());
@@ -4059,7 +4076,7 @@ ControlPointDrag::start_grab (GdkEvent* event, Gdk::Cursor* /*cursor*/)
}
void
-ControlPointDrag::motion (GdkEvent* event, bool)
+ControlPointDrag::motion (GdkEvent* event, bool first_motion)
{
double dx = _drags->current_pointer_x() - last_pointer_x();
double dy = current_pointer_y() - last_pointer_y();
@@ -4078,11 +4095,6 @@ ControlPointDrag::motion (GdkEvent* event, bool)
// positive side of zero
double const zero_gain_y = (1.0 - _zero_gain_fraction) * _point->line().height() - .01;
- // make sure we hit zero when passing through
- if ((cy < zero_gain_y && (cy - dy) > zero_gain_y) || (cy > zero_gain_y && (cy - dy) < zero_gain_y)) {
- cy = zero_gain_y;
- }
-
if (_x_constrained) {
cx = _fixed_grab_x;
}
@@ -4093,6 +4105,11 @@ ControlPointDrag::motion (GdkEvent* event, bool)
_cumulative_x_drag = cx - _fixed_grab_x;
_cumulative_y_drag = cy - _fixed_grab_y;
+ // make sure we hit zero when passing through
+ if ((cy < zero_gain_y && (cy - dy) > zero_gain_y) || (cy > zero_gain_y && (cy - dy) < zero_gain_y)) {
+ cy = zero_gain_y;
+ }
+
cx = max (0.0, cx);
cy = max (0.0, cy);
cy = min ((double) _point->line().height(), cy);
@@ -4108,6 +4125,11 @@ ControlPointDrag::motion (GdkEvent* event, bool)
float const fraction = 1.0 - (cy / _point->line().height());
+ if (first_motion) {
+ _editor->begin_reversible_command (_("automation event move"));
+ _point->line().start_drag_single (_point, _fixed_grab_x, fraction);
+ }
+
_point->line().drag_motion (_editor->sample_to_pixel_unrounded (cx_frames), fraction, false, _pushing, _final_index);
show_verbose_cursor_text (_point->line().get_verbose_cursor_string (fraction));
@@ -4125,10 +4147,9 @@ ControlPointDrag::finished (GdkEvent* event, bool movement_occurred)
} else {
motion (event, false);
+ _point->line().end_drag (_pushing, _final_index);
+ _editor->commit_reversible_command ();
}
-
- _point->line().end_drag (_pushing, _final_index);
- _editor->commit_reversible_command ();
}
void
@@ -4153,6 +4174,8 @@ LineDrag::LineDrag (Editor* e, ArdourCanvas::Item* i)
: Drag (e, i)
, _line (0)
, _cumulative_y_drag (0)
+ , _before (0)
+ , _after (0)
{
DEBUG_TRACE (DEBUG::Drags, "New LineDrag\n");
}
@@ -4176,10 +4199,7 @@ LineDrag::start_grab (GdkEvent* event, Gdk::Cursor* /*cursor*/)
framecnt_t const frame_within_region = (framecnt_t) floor (cx * _editor->samples_per_pixel);
- uint32_t before;
- uint32_t after;
-
- if (!_line->control_points_adjacent (frame_within_region, before, after)) {
+ if (!_line->control_points_adjacent (frame_within_region, _before, _after)) {
/* no adjacent points */
return;
}
@@ -4193,13 +4213,11 @@ LineDrag::start_grab (GdkEvent* event, Gdk::Cursor* /*cursor*/)
double fraction = 1.0 - (cy / _line->height());
- _line->start_drag_line (before, after, fraction);
-
show_verbose_cursor_text (_line->get_verbose_cursor_string (fraction));
}
void
-LineDrag::motion (GdkEvent* event, bool)
+LineDrag::motion (GdkEvent* event, bool first_move)
{
double dy = current_pointer_y() - last_pointer_y();
@@ -4217,6 +4235,11 @@ LineDrag::motion (GdkEvent* event, bool)
double const fraction = 1.0 - (cy / _line->height());
uint32_t ignored;
+ if (first_move) {
+ _editor->begin_reversible_command (_("automation range move"));
+ _line->start_drag_line (_before, _after, fraction);
+ }
+
/* we are ignoring x position for this drag, so we can just pass in anything */
_line->drag_motion (0, fraction, true, false, ignored);
@@ -4229,20 +4252,17 @@ LineDrag::finished (GdkEvent* event, bool movement_occured)
if (movement_occured) {
motion (event, false);
_line->end_drag (false, 0);
+ _editor->commit_reversible_command ();
} else {
/* add a new control point on the line */
AutomationTimeAxisView* atv;
- _line->end_drag (false, 0);
-
if ((atv = dynamic_cast<AutomationTimeAxisView*>(_editor->clicked_axisview)) != 0) {
framepos_t where = _editor->window_event_sample (event, 0, 0);
atv->add_automation_event (event, where, event->button.y, false);
}
}
-
- _editor->commit_reversible_command ();
}
void
@@ -4820,7 +4840,6 @@ SelectionDrag::motion (GdkEvent* event, bool first_move)
case SelectionStartTrim:
- start = _editor->selection->time[_editor->clicked_selection].start;
end = _editor->selection->time[_editor->clicked_selection].end;
if (pending_position > end) {
@@ -4833,7 +4852,6 @@ SelectionDrag::motion (GdkEvent* event, bool first_move)
case SelectionEndTrim:
start = _editor->selection->time[_editor->clicked_selection].start;
- end = _editor->selection->time[_editor->clicked_selection].end;
if (pending_position < start) {
end = start;
@@ -4895,7 +4913,7 @@ SelectionDrag::finished (GdkEvent* event, bool movement_occurred)
/* XXX what if its a music time selection? */
if (s) {
- if ( s->get_play_range() && s->transport_rolling() ) {
+ if (s->get_play_range() && s->transport_rolling()) {
s->request_play_range (&_editor->selection->time, true);
} else {
if (ARDOUR_UI::config()->get_follow_edits() && !s->transport_rolling()) {
@@ -4905,8 +4923,14 @@ SelectionDrag::finished (GdkEvent* event, bool movement_occurred)
s->request_locate (_editor->get_selection().time.start());
}
}
- }
+ if (_editor->get_selection().time.length() != 0) {
+ s->set_range_selection (_editor->get_selection().time.start(), _editor->get_selection().time.end_frame());
+ } else {
+ s->clear_range_selection ();
+ }
+ }
+
} else {
/* just a click, no pointer movement.
*/
@@ -5521,8 +5545,8 @@ AutomationRangeDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
double const p = j->line->time_converter().from (i->start - j->line->time_converter().origin_b ());
double const q = j->line->time_converter().from (a - j->line->time_converter().origin_b ());
- the_list->editor_add (p, value (the_list, p));
- the_list->editor_add (q, value (the_list, q));
+ the_list->editor_add (p, value (the_list, p), false);
+ the_list->editor_add (q, value (the_list, q), false);
}
/* same thing for the end */
@@ -5547,8 +5571,8 @@ AutomationRangeDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
double const p = j->line->time_converter().from (b - j->line->time_converter().origin_b ());
double const q = j->line->time_converter().from (i->end - j->line->time_converter().origin_b ());
- the_list->editor_add (p, value (the_list, p));
- the_list->editor_add (q, value (the_list, q));
+ the_list->editor_add (p, value (the_list, p), false);
+ the_list->editor_add (q, value (the_list, q), false);
}
}
@@ -5585,19 +5609,22 @@ AutomationRangeDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
if (_nothing_to_drag) {
return;
}
-
- for (list<Line>::iterator i = _lines.begin(); i != _lines.end(); ++i) {
- i->line->start_drag_multiple (i->points, y_fraction (i->line, current_pointer_y()), i->state);
- }
}
void
-AutomationRangeDrag::motion (GdkEvent*, bool /*first_move*/)
+AutomationRangeDrag::motion (GdkEvent*, bool first_move)
{
if (_nothing_to_drag) {
return;
}
+ if (first_move) {
+ _editor->begin_reversible_command (_("automation range move"));
+ for (list<Line>::iterator i = _lines.begin(); i != _lines.end(); ++i) {
+ i->line->start_drag_multiple (i->points, y_fraction (i->line, current_pointer_y()), i->state);
+ }
+ }
+
for (list<Line>::iterator l = _lines.begin(); l != _lines.end(); ++l) {
float const f = y_fraction (l->line, current_pointer_y());
/* we are ignoring x position for this drag, so we can just pass in anything */
@@ -5608,9 +5635,9 @@ AutomationRangeDrag::motion (GdkEvent*, bool /*first_move*/)
}
void
-AutomationRangeDrag::finished (GdkEvent* event, bool)
+AutomationRangeDrag::finished (GdkEvent* event, bool motion_occurred)
{
- if (_nothing_to_drag) {
+ if (_nothing_to_drag || !motion_occurred) {
return;
}
diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h
index 6fcd927..b9310c7 100644
--- a/gtk2_ardour/editor_drag.h
+++ b/gtk2_ardour/editor_drag.h
@@ -27,14 +27,23 @@
#include "ardour/types.h"
+#include "canvas/types.h"
+
#include "cursor_context.h"
#include "editor_items.h"
#include "mouse_cursors.h"
+#include "editing.h"
namespace ARDOUR {
class Location;
}
+namespace ArdourCanvas {
+ class Item;
+ class Line;
+ class Rectangle;
+}
+
namespace PBD {
class StatefulDiffCommand;
}
@@ -46,6 +55,18 @@ class TimeAxisView;
class MidiTimeAxisView;
class Drag;
class NoteBase;
+class RegionView;
+class TimeAxisView;
+class RouteTimeAxisView;
+class RegionSelection;
+class MidiRegionView;
+class MeterMarker;
+class ArdourMarker;
+class TempoMarker;
+class ControlPoint;
+class AudioRegionView;
+class AutomationLine;
+class AutomationTimeAxisView;
/** Class to manage current drags */
class DragManager
@@ -456,13 +477,13 @@ protected:
private:
TimeAxisView *prev_tav; // where regions were most recently dragged from
TimeAxisView *orig_tav; // where drag started
- framecnt_t prev_amount;
- framepos_t prev_position;
- framecnt_t selection_length;
+ ARDOUR::framecnt_t prev_amount;
+ ARDOUR::framepos_t prev_position;
+ ARDOUR::framecnt_t selection_length;
bool allow_moves_across_tracks; // only if all selected regions are on one track
ARDOUR::RegionList *exclude;
- void add_all_after_to_views (TimeAxisView *tav, framepos_t where, const RegionSelection &exclude, bool drag_in_progress);
- void remove_unselected_from_views (framecnt_t amount, bool move_regions);
+ void add_all_after_to_views (TimeAxisView *tav, ARDOUR::framepos_t where, const RegionSelection &exclude, bool drag_in_progress);
+ void remove_unselected_from_views (ARDOUR::framecnt_t amount, bool move_regions);
};
@@ -559,7 +580,7 @@ public:
private:
double y_to_region (double) const;
- framecnt_t grid_frames (framepos_t) const;
+ ARDOUR::framecnt_t grid_frames (framepos_t) const;
MidiRegionView* _region_view;
ArdourCanvas::Rectangle* _drag_rect;
@@ -800,13 +821,13 @@ public:
private:
void update_item (ARDOUR::Location *);
- Marker* _marker; ///< marker being dragged
+ ArdourMarker* _marker; ///< marker being dragged
struct CopiedLocationMarkerInfo {
ARDOUR::Location* location;
- std::vector<Marker*> markers;
+ std::vector<ArdourMarker*> markers;
bool move_both;
- CopiedLocationMarkerInfo (ARDOUR::Location* l, Marker* m);
+ CopiedLocationMarkerInfo (ARDOUR::Location* l, ArdourMarker* m);
};
typedef std::list<CopiedLocationMarkerInfo> CopiedLocationInfo;
@@ -856,6 +877,8 @@ private:
double _fixed_grab_x;
double _fixed_grab_y;
double _cumulative_y_drag;
+ uint32_t _before;
+ uint32_t _after;
};
/** Transient feature line drags*/
diff --git a/gtk2_ardour/editor_export_audio.cc b/gtk2_ardour/editor_export_audio.cc
index f92cf07..c2abbca 100644
--- a/gtk2_ardour/editor_export_audio.cc
+++ b/gtk2_ardour/editor_export_audio.cc
@@ -86,9 +86,9 @@ Editor::export_selection ()
void
Editor::export_range ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc
index 392b3bb..a034232 100644
--- a/gtk2_ardour/editor_markers.cc
+++ b/gtk2_ardour/editor_markers.cc
@@ -106,10 +106,10 @@ Editor::add_new_location_internal (Location* location)
if (location->is_mark()) {
if (location->is_cd_marker() && ruler_cd_marker_action->get_active()) {
- lam->start = new Marker (*this, *cd_marker_group, color, location->name(), Marker::Mark, location->start());
+ lam->start = new ArdourMarker (*this, *cd_marker_group, color, location->name(), ArdourMarker::Mark, location->start());
group = cd_marker_group;
} else {
- lam->start = new Marker (*this, *marker_group, color, location->name(), Marker::Mark, location->start());
+ lam->start = new ArdourMarker (*this, *marker_group, color, location->name(), ArdourMarker::Mark, location->start());
group = marker_group;
}
@@ -118,41 +118,41 @@ Editor::add_new_location_internal (Location* location)
} else if (location->is_auto_loop()) {
// transport marker
- lam->start = new Marker (*this, *transport_marker_group, color,
- location->name(), Marker::LoopStart, location->start());
- lam->end = new Marker (*this, *transport_marker_group, color,
- location->name(), Marker::LoopEnd, location->end());
+ lam->start = new ArdourMarker (*this, *transport_marker_group, color,
+ location->name(), ArdourMarker::LoopStart, location->start());
+ lam->end = new ArdourMarker (*this, *transport_marker_group, color,
+ location->name(), ArdourMarker::LoopEnd, location->end());
group = transport_marker_group;
} else if (location->is_auto_punch()) {
// transport marker
- lam->start = new Marker (*this, *transport_marker_group, color,
- location->name(), Marker::PunchIn, location->start());
- lam->end = new Marker (*this, *transport_marker_group, color,
- location->name(), Marker::PunchOut, location->end());
+ lam->start = new ArdourMarker (*this, *transport_marker_group, color,
+ location->name(), ArdourMarker::PunchIn, location->start());
+ lam->end = new ArdourMarker (*this, *transport_marker_group, color,
+ location->name(), ArdourMarker::PunchOut, location->end());
group = transport_marker_group;
} else if (location->is_session_range()) {
// session range
- lam->start = new Marker (*this, *marker_group, color, _("start"), Marker::SessionStart, location->start());
- lam->end = new Marker (*this, *marker_group, color, _("end"), Marker::SessionEnd, location->end());
+ lam->start = new ArdourMarker (*this, *marker_group, color, _("start"), ArdourMarker::SessionStart, location->start());
+ lam->end = new ArdourMarker (*this, *marker_group, color, _("end"), ArdourMarker::SessionEnd, location->end());
group = marker_group;
} else {
// range marker
if (location->is_cd_marker() && ruler_cd_marker_action->get_active()) {
- lam->start = new Marker (*this, *cd_marker_group, color,
- location->name(), Marker::RangeStart, location->start());
- lam->end = new Marker (*this, *cd_marker_group, color,
- location->name(), Marker::RangeEnd, location->end());
+ lam->start = new ArdourMarker (*this, *cd_marker_group, color,
+ location->name(), ArdourMarker::RangeStart, location->start());
+ lam->end = new ArdourMarker (*this, *cd_marker_group, color,
+ location->name(), ArdourMarker::RangeEnd, location->end());
group = cd_marker_group;
} else {
- lam->start = new Marker (*this, *range_marker_group, color,
- location->name(), Marker::RangeStart, location->start());
- lam->end = new Marker (*this, *range_marker_group, color,
- location->name(), Marker::RangeEnd, location->end());
+ lam->start = new ArdourMarker (*this, *range_marker_group, color,
+ location->name(), ArdourMarker::RangeStart, location->start());
+ lam->end = new ArdourMarker (*this, *range_marker_group, color,
+ location->name(), ArdourMarker::RangeEnd, location->end());
group = range_marker_group;
}
}
@@ -224,15 +224,15 @@ Editor::location_changed (Location *location)
* lengthened)
*/
void
-Editor::check_marker_label (Marker* m)
+Editor::check_marker_label (ArdourMarker* m)
{
/* Get a time-ordered list of markers from the last time anything changed */
- std::list<Marker*>& sorted = _sorted_marker_lists[m->get_parent()];
+ std::list<ArdourMarker*>& sorted = _sorted_marker_lists[m->get_parent()];
- list<Marker*>::iterator i = find (sorted.begin(), sorted.end(), m);
+ list<ArdourMarker*>::iterator i = find (sorted.begin(), sorted.end(), m);
- list<Marker*>::iterator prev = sorted.end ();
- list<Marker*>::iterator next = i;
+ list<ArdourMarker*>::iterator prev = sorted.end ();
+ list<ArdourMarker*>::iterator next = i;
++next;
/* Look to see if the previous marker is still behind `m' in time */
@@ -299,7 +299,7 @@ Editor::check_marker_label (Marker* m)
}
struct MarkerComparator {
- bool operator() (Marker const * a, Marker const * b) {
+ bool operator() (ArdourMarker const * a, ArdourMarker const * b) {
return a->position() < b->position();
}
};
@@ -308,7 +308,7 @@ struct MarkerComparator {
void
Editor::update_marker_labels ()
{
- for (std::map<ArdourCanvas::Container *, std::list<Marker *> >::iterator i = _sorted_marker_lists.begin(); i != _sorted_marker_lists.end(); ++i) {
+ for (std::map<ArdourCanvas::Container *, std::list<ArdourMarker *> >::iterator i = _sorted_marker_lists.begin(); i != _sorted_marker_lists.end(); ++i) {
update_marker_labels (i->first);
}
}
@@ -317,7 +317,7 @@ Editor::update_marker_labels ()
void
Editor::update_marker_labels (ArdourCanvas::Container* group)
{
- list<Marker*>& sorted = _sorted_marker_lists[group];
+ list<ArdourMarker*>& sorted = _sorted_marker_lists[group];
if (sorted.empty()) {
return;
@@ -327,10 +327,10 @@ Editor::update_marker_labels (ArdourCanvas::Container* group)
sorted.sort (MarkerComparator ());
- list<Marker*>::iterator i = sorted.begin ();
+ list<ArdourMarker*>::iterator i = sorted.begin ();
- list<Marker*>::iterator prev = sorted.end ();
- list<Marker*>::iterator next = i;
+ list<ArdourMarker*>::iterator prev = sorted.end ();
+ list<ArdourMarker*>::iterator next = i;
if (next != sorted.end()) {
++next;
@@ -467,7 +467,7 @@ Editor::find_location_markers (Location *location) const
}
Location *
-Editor::find_location_from_marker (Marker *marker, bool& is_start) const
+Editor::find_location_from_marker (ArdourMarker *marker, bool& is_start) const
{
LocationMarkerMap::const_iterator i;
@@ -580,11 +580,11 @@ Editor::LocationMarkers::set_name (const string& str)
{
/* XXX: hack: don't change names of session start/end markers */
- if (start->type() != Marker::SessionStart) {
+ if (start->type() != ArdourMarker::SessionStart) {
start->set_name (str);
}
- if (end && end->type() != Marker::SessionEnd) {
+ if (end && end->type() != ArdourMarker::SessionEnd) {
end->set_name (str);
}
}
@@ -726,10 +726,10 @@ Editor::mouse_add_new_range (framepos_t where)
void
Editor::remove_marker (ArdourCanvas::Item& item, GdkEvent*)
{
- Marker* marker;
+ ArdourMarker* marker;
bool is_start;
- if ((marker = static_cast<Marker*> (item.get_data ("marker"))) == 0) {
+ if ((marker = static_cast<ArdourMarker*> (item.get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -815,8 +815,8 @@ Editor::tempo_or_meter_marker_context_menu (GdkEventButton* ev, ArdourCanvas::It
void
Editor::marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item* item)
{
- Marker * marker;
- if ((marker = reinterpret_cast<Marker *> (item->get_data("marker"))) == 0) {
+ ArdourMarker * marker;
+ if ((marker = reinterpret_cast<ArdourMarker *> (item->get_data("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -999,9 +999,9 @@ Editor::build_new_transport_marker_menu ()
void
Editor::marker_menu_hide ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1017,9 +1017,9 @@ Editor::marker_menu_hide ()
void
Editor::marker_menu_select_using_range ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1035,9 +1035,9 @@ Editor::marker_menu_select_using_range ()
void
Editor::marker_menu_select_all_selectables_using_range ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1054,9 +1054,9 @@ Editor::marker_menu_select_all_selectables_using_range ()
void
Editor::marker_menu_separate_regions_using_location ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1073,9 +1073,9 @@ Editor::marker_menu_separate_regions_using_location ()
void
Editor::marker_menu_play_from ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1103,9 +1103,9 @@ Editor::marker_menu_play_from ()
void
Editor::marker_menu_set_playhead ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1131,12 +1131,12 @@ Editor::marker_menu_set_playhead ()
void
Editor::marker_menu_range_to_next ()
{
- Marker* marker;
+ ArdourMarker* marker;
if (!_session) {
return;
}
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1164,9 +1164,9 @@ Editor::marker_menu_range_to_next ()
void
Editor::marker_menu_set_from_playhead ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1192,9 +1192,9 @@ Editor::marker_menu_set_from_playhead ()
void
Editor::marker_menu_set_from_selection (bool /*force_regions*/)
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1223,9 +1223,9 @@ Editor::marker_menu_set_from_selection (bool /*force_regions*/)
void
Editor::marker_menu_play_range ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1248,9 +1248,9 @@ Editor::marker_menu_play_range ()
void
Editor::marker_menu_loop_range ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1274,7 +1274,7 @@ Editor::marker_menu_loop_range ()
void
Editor::marker_menu_zoom_to_range ()
{
- Marker* marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"));
+ ArdourMarker* marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"));
assert (marker);
bool is_start;
@@ -1300,7 +1300,7 @@ Editor::marker_menu_zoom_to_range ()
void
Editor::dynamic_cast_marker_object (void* p, MeterMarker** m, TempoMarker** t) const
{
- Marker* marker = reinterpret_cast<Marker*> (p);
+ ArdourMarker* marker = reinterpret_cast<ArdourMarker*> (p);
if (!marker) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
@@ -1343,9 +1343,9 @@ Editor::marker_menu_remove ()
void
Editor::toggle_marker_menu_lock ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1369,9 +1369,9 @@ Editor::toggle_marker_menu_lock ()
void
Editor::marker_menu_rename ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1381,7 +1381,7 @@ Editor::marker_menu_rename ()
}
void
-Editor::rename_marker(Marker *marker)
+Editor::rename_marker(ArdourMarker *marker)
{
Location* loc;
bool is_start;
@@ -1563,9 +1563,9 @@ Editor::goto_nth_marker (int n)
void
Editor::toggle_marker_menu_glue ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1598,14 +1598,14 @@ Editor::toggle_marker_lines ()
}
void
-Editor::remove_sorted_marker (Marker* m)
+Editor::remove_sorted_marker (ArdourMarker* m)
{
- for (std::map<ArdourCanvas::Container *, std::list<Marker *> >::iterator i = _sorted_marker_lists.begin(); i != _sorted_marker_lists.end(); ++i) {
+ for (std::map<ArdourCanvas::Container *, std::list<ArdourMarker *> >::iterator i = _sorted_marker_lists.begin(); i != _sorted_marker_lists.end(); ++i) {
i->second.remove (m);
}
}
-Marker *
+ArdourMarker *
Editor::find_marker_from_location_id (PBD::ID const & id, bool is_start) const
{
for (LocationMarkerMap::const_iterator i = location_markers.begin(); i != location_markers.end(); ++i) {
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc
index 5c10678..0d9ad69 100644
--- a/gtk2_ardour/editor_mouse.cc
+++ b/gtk2_ardour/editor_mouse.cc
@@ -446,7 +446,8 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
if (((mouse_mode != MouseObject) &&
(mouse_mode != MouseAudition || item_type != RegionItem) &&
(mouse_mode != MouseTimeFX || item_type != RegionItem) &&
- (mouse_mode != MouseDraw)) ||
+ (mouse_mode != MouseDraw) &&
+ (mouse_mode != MouseContent || item_type == RegionItem)) ||
((event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) || event->button.button > 3)) {
return;
}
@@ -512,7 +513,8 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
break;
case ControlPointItem:
- set_selected_track_as_side_effect (op);
+ /* for object/track exclusivity, we don't call set_selected_track_as_side_effect (op); */
+
if (eff_mouse_mode != MouseRange) {
_mouse_changed_selection |= set_selected_control_point_from_click (press, op);
}
@@ -761,11 +763,21 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
}
return true;
+ case GainLineItem:
+ _drags->set (new LineDrag (this, item), event);
+ return true;
+ break;
+
case ControlPointItem:
_drags->set (new ControlPointDrag (this, item), event);
return true;
break;
+ case AutomationLineItem:
+ _drags->set (new LineDrag (this, item), event);
+ return true;
+ break;
+
case StreamItem:
//in the past, we created a new midi region here, but perhaps that is best left to the Draw mode
break;
@@ -1216,10 +1228,10 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
break;
case TempoMarkerItem: {
- Marker* marker;
+ ArdourMarker* marker;
TempoMarker* tempo_marker;
- if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (item->get_data ("marker"))) == 0) {
fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1234,10 +1246,10 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
}
case MeterMarkerItem: {
- Marker* marker;
+ ArdourMarker* marker;
MeterMarker* meter_marker;
- if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (item->get_data ("marker"))) == 0) {
fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -1564,7 +1576,7 @@ bool
Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type)
{
ControlPoint* cp;
- Marker * marker;
+ ArdourMarker * marker;
double fraction;
bool ret = true;
@@ -1617,7 +1629,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
break;
case MarkerItem:
- if ((marker = static_cast<Marker *> (item->get_data ("marker"))) == 0) {
+ if ((marker = static_cast<ArdourMarker *> (item->get_data ("marker"))) == 0) {
break;
}
entered_marker = marker;
@@ -1698,7 +1710,7 @@ bool
Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type)
{
AutomationLine* al;
- Marker *marker;
+ ArdourMarker *marker;
Location *loc;
bool is_start;
bool ret = true;
@@ -1724,7 +1736,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type)
break;
case MarkerItem:
- if ((marker = static_cast<Marker *> (item->get_data ("marker"))) == 0) {
+ if ((marker = static_cast<ArdourMarker *> (item->get_data ("marker"))) == 0) {
break;
}
entered_marker = 0;
@@ -2121,10 +2133,10 @@ Editor::point_trim (GdkEvent* event, framepos_t new_bound)
void
Editor::hide_marker (ArdourCanvas::Item* item, GdkEvent* /*event*/)
{
- Marker* marker;
+ ArdourMarker* marker;
bool is_start;
- if ((marker = static_cast<Marker *> (item->get_data ("marker"))) == 0) {
+ if ((marker = static_cast<ArdourMarker *> (item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -2200,7 +2212,7 @@ Editor::mouse_brush_insert_region (RegionView* rv, framepos_t pos)
// playlist is frozen, so we have to update manually XXX this is disgusting
- playlist->RegionAdded (new_region); /* EMIT SIGNAL */
+ //playlist->RegionAdded (new_region); /* EMIT SIGNAL */
}
gint
@@ -2262,8 +2274,6 @@ Editor::add_region_brush_drag (ArdourCanvas::Item* item, GdkEvent*, RegionView*
}
_drags->add (new RegionMoveDrag (this, item, region_view, selection->regions.by_layer(), true, false));
-
- begin_reversible_command (Operations::drag_region_brush);
}
/** Start a grab where a time range is selected, track(s) are selected, and the
@@ -2303,7 +2313,6 @@ Editor::start_selection_grab (ArdourCanvas::Item* /*item*/, GdkEvent* event)
/* A selection grab currently creates two undo/redo operations, one for
creating the new region and another for moving it.
*/
-
begin_reversible_command (Operations::selection_grab);
boost::shared_ptr<Playlist> playlist = clicked_axisview->playlist();
@@ -2316,6 +2325,7 @@ Editor::start_selection_grab (ArdourCanvas::Item* /*item*/, GdkEvent* event)
if (latest_regionviews.empty()) {
/* something went wrong */
+ abort_reversible_command ();
return;
}
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index 2c44508..6b1960e 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -336,9 +336,9 @@ Editor::move_range_selection_start_or_end_to_region_boundary (bool move_end, boo
return;
}
- begin_reversible_command (_("alter selection"));
+ begin_reversible_selection_op (_("alter selection"));
selection->set_preserving_all_ranges (start, end);
- commit_reversible_command ();
+ commit_reversible_selection_op ();
}
bool
@@ -400,8 +400,7 @@ Editor::nudge_forward (bool next, bool force_playhead)
} else if (!force_playhead && !selection->markers.empty()) {
bool is_start;
-
- begin_reversible_command (_("nudge location forward"));
+ bool in_command = false;
for (MarkerSelection::iterator i = selection->markers.begin(); i != selection->markers.end(); ++i) {
@@ -432,13 +431,18 @@ Editor::nudge_forward (bool next, bool force_playhead)
loc->set_end (max_framepos);
}
}
+ if (!in_command) {
+ begin_reversible_command (_("nudge location forward"));
+ in_command = true;
+ }
XMLNode& after (loc->get_state());
_session->add_command (new MementoCommand<Location>(*loc, &before, &after));
}
}
- commit_reversible_command ();
-
+ if (in_command) {
+ commit_reversible_command ();
+ }
} else {
distance = get_nudge_distance (playhead_cursor->current_frame (), next_distance);
_session->request_locate (playhead_cursor->current_frame () + distance);
@@ -485,8 +489,7 @@ Editor::nudge_backward (bool next, bool force_playhead)
} else if (!force_playhead && !selection->markers.empty()) {
bool is_start;
-
- begin_reversible_command (_("nudge location forward"));
+ bool in_command = false;
for (MarkerSelection::iterator i = selection->markers.begin(); i != selection->markers.end(); ++i) {
@@ -519,13 +522,17 @@ Editor::nudge_backward (bool next, bool force_playhead)
loc->set_end (loc->length());
}
}
-
+ if (!in_command) {
+ begin_reversible_command (_("nudge location forward"));
+ in_command = true;
+ }
XMLNode& after (loc->get_state());
_session->add_command (new MementoCommand<Location>(*loc, &before, &after));
}
}
-
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
} else {
@@ -615,7 +622,8 @@ Editor::sequence_regions ()
if (!rs.empty()) {
- begin_reversible_command (_("sequence regions"));
+ bool in_command = false;
+
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
boost::shared_ptr<Region> r ((*i)->region());
@@ -635,13 +643,20 @@ Editor::sequence_regions ()
r->set_position(r_end_prev);
}
+ if (!in_command) {
+ begin_reversible_command (_("sequence regions"));
+ in_command = true;
+ }
_session->add_command (new StatefulDiffCommand (r));
r_end=r->position() + r->length();
iCount++;
}
- commit_reversible_command ();
+
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
}
@@ -2172,10 +2187,7 @@ void
Editor::remove_location_at_playhead_cursor ()
{
if (_session) {
-
//set up for undo
- begin_reversible_command (_("remove marker"));
-
XMLNode &before = _session->locations()->get_state();
bool removed = false;
@@ -2191,9 +2203,9 @@ Editor::remove_location_at_playhead_cursor ()
//store undo
if (removed) {
+ begin_reversible_command (_("remove marker"));
XMLNode &after = _session->locations()->get_state();
_session->add_command(new MementoCommand<Locations>(*(_session->locations()), &before, &after));
-
commit_reversible_command ();
}
}
@@ -2208,8 +2220,7 @@ Editor::add_locations_from_region ()
if (rs.empty()) {
return;
}
-
- begin_reversible_command (selection->regions.size () > 1 ? _("add markers") : _("add marker"));
+ bool commit = false;
XMLNode &before = _session->locations()->get_state();
@@ -2220,12 +2231,15 @@ Editor::add_locations_from_region ()
Location *location = new Location (*_session, region->position(), region->last_frame(), region->name(), Location::IsRangeMarker);
_session->locations()->add (location, true);
+ commit = true;
}
- XMLNode &after = _session->locations()->get_state();
- _session->add_command (new MementoCommand<Locations>(*(_session->locations()), &before, &after));
-
- commit_reversible_command ();
+ if (commit) {
+ begin_reversible_command (selection->regions.size () > 1 ? _("add markers") : _("add marker"));
+ XMLNode &after = _session->locations()->get_state();
+ _session->add_command (new MementoCommand<Locations>(*(_session->locations()), &before, &after));
+ commit_reversible_command ();
+ }
}
/** Add a single range marker around all selected regions */
@@ -2238,8 +2252,6 @@ Editor::add_location_from_region ()
return;
}
- begin_reversible_command (_("add marker"));
-
XMLNode &before = _session->locations()->get_state();
string markername;
@@ -2260,9 +2272,9 @@ Editor::add_location_from_region ()
Location *location = new Location (*_session, selection->regions.start(), selection->regions.end_frame(), markername, Location::IsRangeMarker);
_session->locations()->add (location, true);
+ begin_reversible_command (_("add marker"));
XMLNode &after = _session->locations()->get_state();
_session->add_command (new MementoCommand<Locations>(*(_session->locations()), &before, &after));
-
commit_reversible_command ();
}
@@ -3264,8 +3276,7 @@ Editor::crop_region_to (framepos_t start, framepos_t end)
framepos_t the_start;
framepos_t the_end;
framepos_t cnt;
-
- begin_reversible_command (_("trim to selection"));
+ bool in_command = false;
for (vector<boost::shared_ptr<Playlist> >::iterator i = playlists.begin(); i != playlists.end(); ++i) {
@@ -3290,12 +3301,18 @@ Editor::crop_region_to (framepos_t start, framepos_t end)
the_end = min (end, the_end);
cnt = the_end - the_start + 1;
+ if(!in_command) {
+ begin_reversible_command (_("trim to selection"));
+ in_command = true;
+ }
region->clear_changes ();
region->trim_to (the_start, cnt);
_session->add_command (new StatefulDiffCommand (region));
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
@@ -3308,8 +3325,8 @@ Editor::region_fill_track ()
}
framepos_t const end = _session->current_end_frame ();
-
- begin_reversible_command (Operations::region_fill);
+ RegionSelection foo;
+ bool in_command = false;
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
@@ -3318,21 +3335,39 @@ Editor::region_fill_track ()
boost::shared_ptr<Playlist> pl = region->playlist();
if (end <= region->last_frame()) {
- return;
+ continue;
}
double times = (double) (end - region->last_frame()) / (double) region->length();
if (times == 0) {
- return;
+ continue;
+ }
+
+ if (!in_command) {
+ begin_reversible_command (Operations::region_fill);
+ in_command = true;
}
+ TimeAxisView& tv = (*i)->get_time_axis_view();
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (&tv);
+ latest_regionviews.clear ();
+ sigc::connection c = rtv->view()->RegionViewAdded.connect (sigc::mem_fun(*this, &Editor::collect_new_region_view));
pl->clear_changes ();
pl->add_region (RegionFactory::create (region, true), region->last_frame(), times);
_session->add_command (new StatefulDiffCommand (pl));
+
+ c.disconnect ();
+
+ foo.insert (foo.end(), latest_regionviews.begin(), latest_regionviews.end());
}
- commit_reversible_command ();
+ if (in_command) {
+ if (!foo.empty()) {
+ selection->set (foo);
+ }
+ commit_reversible_command ();
+ }
}
void
@@ -3362,10 +3397,10 @@ Editor::region_fill_selection ()
framepos_t selection_length = end - start;
float times = (float)selection_length / region->length();
-
- begin_reversible_command (Operations::fill_selection);
+ bool in_command = false;
TrackViewList ts = selection->tracks.filter_to_unique_playlists ();
+ RegionSelection foo;
for (TrackViewList::iterator i = ts.begin(); i != ts.end(); ++i) {
@@ -3373,12 +3408,27 @@ Editor::region_fill_selection ()
continue;
}
+ if (!in_command) {
+ begin_reversible_command (Operations::fill_selection);
+ in_command = true;
+ }
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
+ latest_regionviews.clear ();
+ sigc::connection c = rtv->view()->RegionViewAdded.connect (sigc::mem_fun(*this, &Editor::collect_new_region_view));
+
playlist->clear_changes ();
playlist->add_region (RegionFactory::create (region, true), start, times);
_session->add_command (new StatefulDiffCommand (playlist));
+ c.disconnect ();
+ foo.insert (foo.end(), latest_regionviews.begin(), latest_regionviews.end());
}
- commit_reversible_command ();
+ if (in_command) {
+ if (!foo.empty()) {
+ selection->set (foo);
+ }
+ commit_reversible_command ();
+ }
}
void
@@ -3676,8 +3726,7 @@ void
Editor::trim_region_to_location (const Location& loc, const char* str)
{
RegionSelection rs = get_regions_from_selection_and_entered ();
-
- begin_reversible_command (str);
+ bool in_command = false;
for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
RegionView* rv = (*x);
@@ -3708,10 +3757,17 @@ Editor::trim_region_to_location (const Location& loc, const char* str)
rv->region()->clear_changes ();
rv->region()->trim_to (start, (end - start));
+
+ if (!in_command) {
+ begin_reversible_command (str);
+ in_command = true;
+ }
_session->add_command(new StatefulDiffCommand (rv->region()));
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
@@ -3730,8 +3786,7 @@ void
Editor::trim_to_region(bool forward)
{
RegionSelection rs = get_regions_from_selection_and_entered ();
-
- begin_reversible_command (_("trim to region"));
+ bool in_command = false;
boost::shared_ptr<Region> next_region;
@@ -3746,7 +3801,7 @@ Editor::trim_to_region(bool forward)
AudioTimeAxisView* atav = dynamic_cast<AudioTimeAxisView*> (&arv->get_time_axis_view());
if (!atav) {
- return;
+ continue;
}
float speed = 1.0;
@@ -3785,10 +3840,16 @@ Editor::trim_to_region(bool forward)
arv->region_changed (ARDOUR::bounds_change);
}
+ if (!in_command) {
+ begin_reversible_command (_("trim to region"));
+ in_command = true;
+ }
_session->add_command(new StatefulDiffCommand (region));
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
@@ -3913,8 +3974,7 @@ Editor::bounce_range_selection (bool replace, bool enable_processing)
framepos_t start = selection->time[clicked_selection].start;
framepos_t end = selection->time[clicked_selection].end;
framepos_t cnt = end - start + 1;
-
- begin_reversible_command (_("bounce range"));
+ bool in_command = false;
for (TrackViewList::iterator i = views.begin(); i != views.end(); ++i) {
@@ -3927,7 +3987,7 @@ Editor::bounce_range_selection (bool replace, bool enable_processing)
boost::shared_ptr<Playlist> playlist;
if ((playlist = rtv->playlist()) == 0) {
- return;
+ continue;
}
InterThreadInfo itt;
@@ -3954,6 +4014,10 @@ Editor::bounce_range_selection (bool replace, bool enable_processing)
playlist->add_region (r, start);
}
+ if (!in_command) {
+ begin_reversible_command (_("bounce range"));
+ in_command = true;
+ }
vector<Command*> cmds;
playlist->rdiff (cmds);
_session->add_commands (cmds);
@@ -3961,7 +4025,9 @@ Editor::bounce_range_selection (bool replace, bool enable_processing)
_session->add_command (new StatefulDiffCommand (playlist));
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
/** Delete selected regions, automation points or a time range */
@@ -4315,8 +4381,6 @@ Editor::remove_selected_regions ()
return;
}
- begin_reversible_command (_("remove region"));
-
list<boost::shared_ptr<Region> > regions_to_remove;
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
@@ -4360,6 +4424,7 @@ Editor::remove_selected_regions ()
}
vector<boost::shared_ptr<Playlist> >::iterator pl;
+ bool in_command = false;
for (pl = playlists.begin(); pl != playlists.end(); ++pl) {
(*pl)->thaw ();
@@ -4367,6 +4432,11 @@ Editor::remove_selected_regions ()
/* We might have removed regions, which alters other regions' layering_index,
so we need to do a recursive diff here.
*/
+
+ if (!in_command) {
+ begin_reversible_command (_("remove region"));
+ in_command = true;
+ }
vector<Command*> cmds;
(*pl)->rdiff (cmds);
_session->add_commands (cmds);
@@ -4374,7 +4444,9 @@ Editor::remove_selected_regions ()
_session->add_command(new StatefulDiffCommand (*pl));
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
/** Cut, copy or clear selected regions.
@@ -4710,6 +4782,10 @@ Editor::paste_internal (framepos_t position, float times)
void
Editor::duplicate_some_regions (RegionSelection& regions, float times)
{
+ if (regions.empty ()) {
+ return;
+ }
+
boost::shared_ptr<Playlist> playlist;
RegionSelection sel = regions; // clear (below) may clear the argument list if its the current region selection
RegionSelection foo;
@@ -4764,11 +4840,10 @@ Editor::duplicate_selection (float times)
return;
}
- begin_reversible_command (_("duplicate selection"));
-
ri = new_regions.begin();
TrackViewList ts = selection->tracks.filter_to_unique_playlists ();
+ bool in_command = false;
for (TrackViewList::iterator i = ts.begin(); i != ts.end(); ++i) {
if ((playlist = (*i)->playlist()) == 0) {
@@ -4782,6 +4857,11 @@ Editor::duplicate_selection (float times)
end = selection->time.end_frame();
}
playlist->duplicate (*ri, end, times);
+
+ if (!in_command) {
+ begin_reversible_command (_("duplicate selection"));
+ in_command = true;
+ }
_session->add_command (new StatefulDiffCommand (playlist));
++ri;
@@ -4790,7 +4870,9 @@ Editor::duplicate_selection (float times)
}
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
/** Reset all selected points to the relevant default value */
@@ -4848,9 +4930,8 @@ Editor::nudge_track (bool use_edit, bool forwards)
return;
}
- begin_reversible_command (_("nudge track"));
-
TrackViewList ts = selection->tracks.filter_to_unique_playlists ();
+ bool in_command = false;
for (TrackViewList::iterator i = ts.begin(); i != ts.end(); ++i) {
@@ -4863,6 +4944,10 @@ Editor::nudge_track (bool use_edit, bool forwards)
playlist->nudge_after (start, distance, forwards);
+ if (!in_command) {
+ begin_reversible_command (_("nudge track"));
+ in_command = true;
+ }
vector<Command*> cmds;
playlist->rdiff (cmds);
@@ -4871,7 +4956,9 @@ Editor::nudge_track (bool use_edit, bool forwards)
_session->add_command (new StatefulDiffCommand (playlist));
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
@@ -4951,9 +5038,8 @@ Editor::normalize_region ()
}
}
- begin_reversible_command (_("normalize"));
-
list<double>::const_iterator a = max_amps.begin ();
+ bool in_command = false;
for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*> (*r);
@@ -4966,12 +5052,19 @@ Editor::normalize_region ()
double const amp = dialog.normalize_individually() ? *a : max_amp;
arv->audio_region()->normalize (amp, dialog.target ());
+
+ if (!in_command) {
+ begin_reversible_command (_("normalize"));
+ in_command = true;
+ }
_session->add_command (new StatefulDiffCommand (arv->region()));
++a;
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
@@ -4988,7 +5081,7 @@ Editor::reset_region_scale_amplitude ()
return;
}
- begin_reversible_command ("reset gain");
+ bool in_command = false;
for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*r);
@@ -4996,10 +5089,17 @@ Editor::reset_region_scale_amplitude ()
continue;
arv->region()->clear_changes ();
arv->audio_region()->set_scale_amplitude (1.0f);
+
+ if(!in_command) {
+ begin_reversible_command ("reset gain");
+ in_command = true;
+ }
_session->add_command (new StatefulDiffCommand (arv->region()));
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
@@ -5011,7 +5111,7 @@ Editor::adjust_region_gain (bool up)
return;
}
- begin_reversible_command ("adjust region gain");
+ bool in_command = false;
for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*r);
@@ -5030,10 +5130,17 @@ Editor::adjust_region_gain (bool up)
}
arv->audio_region()->set_scale_amplitude (dB_to_coefficient (dB));
+
+ if (!in_command) {
+ begin_reversible_command ("adjust region gain");
+ in_command = true;
+ }
_session->add_command (new StatefulDiffCommand (arv->region()));
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
@@ -5105,7 +5212,7 @@ Editor::apply_midi_note_edit_op (MidiOperator& op, const RegionSelection& rs)
return;
}
- begin_reversible_command (op.name ());
+ bool in_command = false;
for (RegionSelection::const_iterator r = rs.begin(); r != rs.end(); ) {
RegionSelection::const_iterator tmp = r;
@@ -5116,6 +5223,10 @@ Editor::apply_midi_note_edit_op (MidiOperator& op, const RegionSelection& rs)
if (mrv) {
Command* cmd = apply_midi_note_edit_op_to_region (op, *mrv);
if (cmd) {
+ if (!in_command) {
+ begin_reversible_command (op.name ());
+ in_command = true;
+ }
(*cmd)();
_session->add_command (cmd);
}
@@ -5124,7 +5235,9 @@ Editor::apply_midi_note_edit_op (MidiOperator& op, const RegionSelection& rs)
r = tmp;
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
@@ -5136,9 +5249,9 @@ Editor::fork_region ()
return;
}
- begin_reversible_command (_("Fork Region(s)"));
-
CursorContext::Handle cursor_ctx = CursorContext::create(*this, _cursors->wait);
+ bool in_command = false;
+
gdk_flush ();
for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ) {
@@ -5152,7 +5265,11 @@ Editor::fork_region ()
boost::shared_ptr<Playlist> playlist = mrv->region()->playlist();
boost::shared_ptr<MidiSource> new_source = _session->create_midi_source_by_stealing_name (mrv->midi_view()->track());
boost::shared_ptr<MidiRegion> newregion = mrv->midi_region()->clone (new_source);
-
+
+ if (!in_command) {
+ begin_reversible_command (_("Fork Region(s)"));
+ in_command = true;
+ }
playlist->clear_changes ();
playlist->replace_region (mrv->region(), newregion, mrv->region()->position());
_session->add_command(new StatefulDiffCommand (playlist));
@@ -5164,7 +5281,9 @@ Editor::fork_region ()
r = tmp;
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
@@ -5182,16 +5301,22 @@ Editor::quantize_regions (const RegionSelection& rs)
return;
}
- QuantizeDialog* qd = new QuantizeDialog (*this);
+ if (!quantize_dialog) {
+ quantize_dialog = new QuantizeDialog (*this);
+ }
- qd->present ();
- const int r = qd->run ();
- qd->hide ();
+ quantize_dialog->present ();
+ const int r = quantize_dialog->run ();
+ quantize_dialog->hide ();
if (r == Gtk::RESPONSE_OK) {
- Quantize quant (qd->snap_start(), qd->snap_end(),
- qd->start_grid_size(), qd->end_grid_size(),
- qd->strength(), qd->swing(), qd->threshold());
+ Quantize quant (quantize_dialog->snap_start(),
+ quantize_dialog->snap_end(),
+ quantize_dialog->start_grid_size(),
+ quantize_dialog->end_grid_size(),
+ quantize_dialog->strength(),
+ quantize_dialog->swing(),
+ quantize_dialog->threshold());
apply_midi_note_edit_op (quant, rs);
}
@@ -5286,9 +5411,9 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress
return;
}
- begin_reversible_command (command);
-
CursorContext::Handle cursor_ctx = CursorContext::create(*this, _cursors->wait);
+ bool in_command = false;
+
gdk_flush ();
int n = 0;
@@ -5331,17 +5456,22 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress
}
}
-
/* We might have removed regions, which alters other regions' layering_index,
so we need to do a recursive diff here.
*/
+
+ if (!in_command) {
+ begin_reversible_command (command);
+ in_command = true;
+ }
vector<Command*> cmds;
playlist->rdiff (cmds);
_session->add_commands (cmds);
_session->add_command(new StatefulDiffCommand (playlist));
+
} else {
- return;
+ continue;
}
if (progress) {
@@ -5353,7 +5483,9 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress
++n;
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
@@ -5371,7 +5503,7 @@ Editor::reset_region_gain_envelopes ()
return;
}
- begin_reversible_command (_("reset region gain"));
+ bool in_command = false;
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
@@ -5380,11 +5512,18 @@ Editor::reset_region_gain_envelopes ()
XMLNode& before (alist->get_state());
arv->audio_region()->set_default_envelope ();
+
+ if (!in_command) {
+ begin_reversible_command (_("reset region gain"));
+ in_command = true;
+ }
_session->add_command (new MementoCommand<AutomationList>(*arv->audio_region()->envelope().get(), &before, &alist->get_state()));
}
}
-
- commit_reversible_command ();
+
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
@@ -5424,18 +5563,25 @@ Editor::toggle_gain_envelope_active ()
return;
}
- begin_reversible_command (_("region gain envelope active"));
-
+ bool in_command = false;
+
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
if (arv) {
arv->region()->clear_changes ();
arv->audio_region()->set_envelope_active (!arv->audio_region()->envelope_active());
+
+ if (!in_command) {
+ begin_reversible_command (_("region gain envelope active"));
+ in_command = true;
+ }
_session->add_command (new StatefulDiffCommand (arv->region()));
}
}
-
- commit_reversible_command ();
+
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
@@ -5665,13 +5811,13 @@ Editor::set_fade_length (bool in)
cmd = _("set fade out length");
}
- begin_reversible_command (cmd);
+ bool in_command = false;
for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
if (!tmp) {
- return;
+ continue;
}
boost::shared_ptr<AutomationList> alist;
@@ -5691,11 +5837,17 @@ Editor::set_fade_length (bool in)
tmp->audio_region()->set_fade_out_active (true);
}
+ if (!in_command) {
+ begin_reversible_command (cmd);
+ in_command = true;
+ }
XMLNode &after = alist->get_state();
_session->add_command(new MementoCommand<AutomationList>(*alist, &before, &after));
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
@@ -5706,14 +5858,13 @@ Editor::set_fade_in_shape (FadeShape shape)
if (rs.empty()) {
return;
}
-
- begin_reversible_command (_("set fade in shape"));
+ bool in_command = false;
for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
if (!tmp) {
- return;
+ continue;
}
boost::shared_ptr<AutomationList> alist = tmp->audio_region()->fade_in();
@@ -5721,12 +5872,17 @@ Editor::set_fade_in_shape (FadeShape shape)
tmp->audio_region()->set_fade_in_shape (shape);
+ if (!in_command) {
+ begin_reversible_command (_("set fade in shape"));
+ in_command = true;
+ }
XMLNode &after = alist->get_state();
_session->add_command(new MementoCommand<AutomationList>(*alist.get(), &before, &after));
}
- commit_reversible_command ();
-
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
@@ -5737,14 +5893,13 @@ Editor::set_fade_out_shape (FadeShape shape)
if (rs.empty()) {
return;
}
-
- begin_reversible_command (_("set fade out shape"));
+ bool in_command = false;
for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
if (!tmp) {
- return;
+ continue;
}
boost::shared_ptr<AutomationList> alist = tmp->audio_region()->fade_out();
@@ -5752,11 +5907,17 @@ Editor::set_fade_out_shape (FadeShape shape)
tmp->audio_region()->set_fade_out_shape (shape);
+ if(!in_command) {
+ begin_reversible_command (_("set fade out shape"));
+ in_command = true;
+ }
XMLNode &after = alist->get_state();
_session->add_command(new MementoCommand<AutomationList>(*alist.get(), &before, &after));
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
@@ -5767,14 +5928,13 @@ Editor::set_fade_in_active (bool yn)
if (rs.empty()) {
return;
}
-
- begin_reversible_command (_("set fade in active"));
+ bool in_command = false;
for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
if (!tmp) {
- return;
+ continue;
}
@@ -5782,10 +5942,17 @@ Editor::set_fade_in_active (bool yn)
ar->clear_changes ();
ar->set_fade_in_active (yn);
+
+ if (!in_command) {
+ begin_reversible_command (_("set fade in active"));
+ in_command = true;
+ }
_session->add_command (new StatefulDiffCommand (ar));
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
@@ -5796,24 +5963,30 @@ Editor::set_fade_out_active (bool yn)
if (rs.empty()) {
return;
}
-
- begin_reversible_command (_("set fade out active"));
+ bool in_command = false;
for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
if (!tmp) {
- return;
+ continue;
}
boost::shared_ptr<AudioRegion> ar (tmp->audio_region());
ar->clear_changes ();
ar->set_fade_out_active (yn);
+
+ if (!in_command) {
+ begin_reversible_command (_("set fade out active"));
+ in_command = true;
+ }
_session->add_command(new StatefulDiffCommand (ar));
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
@@ -5849,11 +6022,14 @@ Editor::toggle_region_fades (int dir)
}
/* XXX should this undo-able? */
+ bool in_command = false;
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
if ((ar = boost::dynamic_pointer_cast<AudioRegion>((*i)->region())) == 0) {
continue;
}
+ ar->clear_changes ();
+
if (dir == 1 || dir == 0) {
ar->set_fade_in_active (!yn);
}
@@ -5861,6 +6037,15 @@ Editor::toggle_region_fades (int dir)
if (dir == -1 || dir == 0) {
ar->set_fade_out_active (!yn);
}
+ if (!in_command) {
+ begin_reversible_command (_("toggle fade active"));
+ in_command = true;
+ }
+ _session->add_command(new StatefulDiffCommand (ar));
+ }
+
+ if (in_command) {
+ commit_reversible_command ();
}
}
@@ -6958,13 +7143,11 @@ Editor::insert_time (
bool all_playlists, bool ignore_music_glue, bool markers_too, bool glued_markers_too, bool locked_markers_too, bool tempo_too
)
{
- bool commit = false;
if (Config->get_edit_mode() == Lock) {
return;
}
-
- begin_reversible_command (_("insert time"));
+ bool in_command = false;
TrackViewList ts = selection->tracks.filter_to_unique_playlists ();
@@ -7004,19 +7187,25 @@ Editor::insert_time (
(*i)->shift (pos, frames, (opt == MoveIntersected), ignore_music_glue);
+ if (!in_command) {
+ begin_reversible_command (_("insert time"));
+ in_command = true;
+ }
vector<Command*> cmds;
(*i)->rdiff (cmds);
_session->add_commands (cmds);
_session->add_command (new StatefulDiffCommand (*i));
- commit = true;
}
/* automation */
RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*x);
if (rtav) {
+ if (!in_command) {
+ begin_reversible_command (_("insert time"));
+ in_command = true;
+ }
rtav->route ()->shift (pos, frames);
- commit = true;
}
}
@@ -7052,16 +7241,27 @@ Editor::insert_time (
}
if (moved) {
+ if (!in_command) {
+ begin_reversible_command (_("insert time"));
+ in_command = true;
+ }
XMLNode& after (_session->locations()->get_state());
_session->add_command (new MementoCommand<Locations>(*_session->locations(), &before, &after));
}
}
if (tempo_too) {
+ if (!in_command) {
+ begin_reversible_command (_("insert time"));
+ in_command = true;
+ }
+ XMLNode& before (_session->tempo_map().get_state());
_session->tempo_map().insert_time (pos, frames);
+ XMLNode& after (_session->tempo_map().get_state());
+ _session->add_command (new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
}
- if (commit) {
+ if (in_command) {
commit_reversible_command ();
}
}
@@ -7104,14 +7304,11 @@ void
Editor::remove_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt,
bool ignore_music_glue, bool markers_too, bool glued_markers_too, bool locked_markers_too, bool tempo_too)
{
- bool commit = false;
-
if (Config->get_edit_mode() == Lock) {
error << (_("Cannot insert or delete time when in Lock edit.")) << endmsg;
return;
}
-
- begin_reversible_command (_("cut time"));
+ bool in_command = false;
for (TrackSelection::iterator x = selection->tracks.begin(); x != selection->tracks.end(); ++x) {
/* regions */
@@ -7127,17 +7324,23 @@ Editor::remove_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt,
pl->cut (rl);
pl->shift (pos, -frames, true, ignore_music_glue);
+ if (!in_command) {
+ begin_reversible_command (_("cut time"));
+ in_command = true;
+ }
XMLNode &after = pl->get_state();
_session->add_command (new MementoCommand<Playlist> (*pl, &before, &after));
- commit = true;
}
/* automation */
RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*x);
if (rtav) {
+ if (!in_command) {
+ begin_reversible_command (_("cut time"));
+ in_command = true;
+ }
rtav->route ()->shift (pos, -frames);
- commit = true;
}
}
@@ -7206,23 +7409,29 @@ Editor::remove_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt,
}
if (moved) {
+ if (!in_command) {
+ begin_reversible_command (_("cut time"));
+ in_command = true;
+ }
XMLNode& after (_session->locations()->get_state());
_session->add_command (new MementoCommand<Locations>(*_session->locations(), &before, &after));
- commit = true;
}
}
if (tempo_too) {
XMLNode& before (_session->tempo_map().get_state());
- if (_session->tempo_map().cut_time (pos, frames) ) {
+ if (_session->tempo_map().remove_time (pos, frames) ) {
+ if (!in_command) {
+ begin_reversible_command (_("remove time"));
+ in_command = true;
+ }
XMLNode& after (_session->tempo_map().get_state());
_session->add_command (new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
- commit = true;
}
}
- if (commit) {
+ if (in_command) {
commit_reversible_command ();
}
}
@@ -7541,15 +7750,10 @@ Editor::lock ()
lock_dialog->get_vbox()->show_all ();
lock_dialog->set_size_request (200, 200);
}
+
+ delete _main_menu_disabler;
+ _main_menu_disabler = new MainMenuDisabler;
-#ifdef __APPLE__
- /* The global menu bar continues to be accessible to applications
- with modal dialogs, which means that we need to desensitize
- all items in the menu bar. Since those items are really just
- proxies for actions, that means disabling all actions.
- */
- ActionManager::disable_all_actions ();
-#endif
lock_dialog->present ();
}
@@ -7558,9 +7762,7 @@ Editor::unlock ()
{
lock_dialog->hide ();
-#ifdef __APPLE__
- ActionManager::pop_action_state ();
-#endif
+ delete _main_menu_disabler;
if (ARDOUR_UI::config()->get_lock_gui_after_seconds()) {
start_lock_event_timing ();
diff --git a/gtk2_ardour/editor_pt_import.cc b/gtk2_ardour/editor_pt_import.cc
new file mode 100644
index 0000000..15723c3
--- /dev/null
+++ b/gtk2_ardour/editor_pt_import.cc
@@ -0,0 +1,260 @@
+/*
+ Copyright (C) 2000-2006 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.
+
+*/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <errno.h>
+#include <unistd.h>
+#include <algorithm>
+
+#include "pbd/pthread_utils.h"
+#include "pbd/basename.h"
+#include "pbd/shortpath.h"
+#include "pbd/stateful_diff_command.h"
+
+#include <gtkmm2ext/choice.h>
+
+#include "ardour/audio_track.h"
+#include "ardour/audiofilesource.h"
+#include "ardour/audioregion.h"
+#include "ardour/midi_region.h"
+#include "ardour/midi_track.h"
+#include "ardour/operations.h"
+#include "ardour/region_factory.h"
+#include "ardour/smf_source.h"
+#include "ardour/source_factory.h"
+#include "ardour/utils.h"
+#include "ardour/playlist.h"
+#include "ardour/session.h"
+#include "pbd/memento_command.h"
+
+#include "ptformat/ptfformat.h"
+
+#include "ardour_ui.h"
+#include "cursor_context.h"
+#include "editor.h"
+#include "sfdb_ui.h"
+#include "editing.h"
+#include "audio_time_axis.h"
+#include "midi_time_axis.h"
+#include "session_import_dialog.h"
+#include "gui_thread.h"
+#include "interthread_progress_window.h"
+#include "mouse_cursors.h"
+#include "editor_cursors.h"
+
+#include "i18n.h"
+
+using namespace std;
+using namespace ARDOUR;
+using namespace PBD;
+using namespace Gtk;
+using namespace Gtkmm2ext;
+using namespace Editing;
+using std::string;
+
+/* Functions supporting the incorporation of PT sessions into ardour */
+
+void
+Editor::external_pt_dialog ()
+{
+ std::string ptpath;
+
+ if (_session == 0) {
+ MessageDialog msg (_("You can't import a PT session until you have a session loaded."));
+ msg.run ();
+ return;
+ }
+
+ Gtk::FileChooserDialog dialog(_("Import PT Session"), FILE_CHOOSER_ACTION_OPEN);
+ dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
+ dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK);
+
+ while (true) {
+ int result = dialog.run();
+
+ if (result == Gtk::RESPONSE_OK) {
+ ptpath = dialog.get_filename ();
+
+ if (!Glib::file_test (ptpath, Glib::FILE_TEST_IS_DIR|Glib::FILE_TEST_EXISTS)) {
+ Gtk::MessageDialog msg (string_compose (_("%1: this is only the directory/folder name, not the filename.\n"), ptpath));
+ msg.run ();
+ continue;
+ }
+ }
+
+ if (ptpath.length()) {
+ do_ptimport(ptpath, SrcBest);
+ break;
+ }
+
+ if (result == Gtk::RESPONSE_CANCEL) {
+ break;
+ }
+ }
+}
+
+void
+Editor::do_ptimport (std::string ptpath,
+ SrcQuality quality)
+{
+ vector<boost::shared_ptr<Region> > regions;
+ boost::shared_ptr<ARDOUR::Track> track;
+ ARDOUR::PluginInfoPtr instrument;
+ vector<string> to_import;
+ string fullpath;
+ bool ok = false;
+ PTFFormat ptf;
+ framepos_t pos = -1;
+
+ vector<ptflookup_t> ptfwavpair;
+ vector<ptflookup_t> ptfregpair;
+
+ if (ptf.load(ptpath, _session->frame_rate()) == -1) {
+ MessageDialog msg (_("Doesn't seem to be a valid PT session file"));
+ msg.run ();
+ return;
+ } else {
+ MessageDialog msg (string_compose (_("PT v%1 Session @ %2Hz\n\n%3 audio files\n%4 regions\n%5 active regions\n\nContinue..."), (int)ptf.version, ptf.sessionrate, ptf.audiofiles.size(), ptf.regions.size(), ptf.tracks.size()));
+ msg.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
+
+ int result = msg.run ();
+ if (result != Gtk::RESPONSE_OK) {
+ return;
+ }
+ }
+ current_interthread_info = &import_status;
+ import_status.current = 1;
+ import_status.total = ptf.audiofiles.size ();
+ import_status.all_done = false;
+
+ ImportProgressWindow ipw (&import_status, _("Import"), _("Cancel Import"));
+
+ SourceList just_one;
+ SourceList imported;
+
+ for (vector<PTFFormat::wav_t>::iterator a = ptf.audiofiles.begin(); a != ptf.audiofiles.end(); ++a) {
+ ptflookup_t p;
+
+ fullpath = Glib::build_filename (Glib::path_get_dirname(ptpath), "Audio Files");
+ fullpath = Glib::build_filename (fullpath, a->filename);
+ to_import.clear ();
+ to_import.push_back (fullpath);
+ ipw.show ();
+ ok = import_sndfiles (to_import, Editing::ImportDistinctFiles, Editing::ImportAsRegion, quality, pos, 1, -1, track, false, instrument);
+ if (!import_status.sources.empty()) {
+ p.index1 = a->index;
+ p.id = import_status.sources.back()->id();
+
+ ptfwavpair.push_back(p);
+ imported.push_back(import_status.sources.back());
+ }
+ }
+
+ for (vector<PTFFormat::region_t>::iterator a = ptf.regions.begin();
+ a != ptf.regions.end(); ++a) {
+ for (vector<ptflookup_t>::iterator p = ptfwavpair.begin();
+ p != ptfwavpair.end(); ++p) {
+ if (p->index1 == a->wave.index) {
+ for (SourceList::iterator x = imported.begin();
+ x != imported.end(); ++x) {
+ if ((*x)->id() == p->id) {
+ // Matched an uncreated ptf region to ardour region
+ ptflookup_t rp;
+ PropertyList plist;
+
+ plist.add (ARDOUR::Properties::start, a->sampleoffset);
+ plist.add (ARDOUR::Properties::position, 0);
+ plist.add (ARDOUR::Properties::length, a->length);
+ plist.add (ARDOUR::Properties::name, a->name);
+ plist.add (ARDOUR::Properties::layer, 0);
+ plist.add (ARDOUR::Properties::whole_file, false);
+ plist.add (ARDOUR::Properties::external, true);
+
+ just_one.clear();
+ just_one.push_back(*x);
+
+ boost::shared_ptr<Region> r = RegionFactory::create (just_one, plist);
+ regions.push_back(r);
+
+ rp.id = regions.back()->id();
+ rp.index1 = a->index;
+ ptfregpair.push_back(rp);
+ }
+ }
+ }
+ }
+ }
+
+ boost::shared_ptr<AudioTrack> existing_track;
+ uint16_t nth = 0;
+ vector<ptflookup_t> usedtracks;
+ ptflookup_t utr;
+
+ for (vector<PTFFormat::track_t>::iterator a = ptf.tracks.begin();
+ a != ptf.tracks.end(); ++a) {
+ for (vector<ptflookup_t>::iterator p = ptfregpair.begin();
+ p != ptfregpair.end(); ++p) {
+
+ if (p->index1 == a->reg.index) {
+ // Matched a ptf active region to an ardour region
+ utr.index1 = a->index;
+ utr.index2 = nth;
+ utr.id = p->id;
+ boost::shared_ptr<Region> r = RegionFactory::region_by_id (p->id);
+ vector<ptflookup_t>::iterator lookuptr = usedtracks.begin();
+ vector<ptflookup_t>::iterator found;
+ if ((found = std::find(lookuptr, usedtracks.end(), utr)) != usedtracks.end()) {
+ DEBUG_TRACE (DEBUG::FileUtils, string_compose ("\twav(%1) reg(%2) ptf_tr(%3) ard_tr(%4)\n", a->reg.wave.filename.c_str(), a->reg.index, found->index1, found->index2));
+ existing_track = get_nth_selected_audio_track(found->index2);
+ // Put on existing track
+ boost::shared_ptr<Playlist> playlist = existing_track->playlist();
+ boost::shared_ptr<Region> copy (RegionFactory::create (r, true));
+ playlist->clear_changes ();
+ playlist->add_region (copy, a->reg.startpos);
+ //_session->add_command (new StatefulDiffCommand (playlist));
+ } else {
+ // Put on a new track
+ DEBUG_TRACE (DEBUG::FileUtils, string_compose ("\twav(%1) reg(%2) new_tr(%3)\n", a->reg.wave.filename.c_str(), a->reg.index, nth));
+ list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (1, 2, Normal, 0, 1));
+ if (at.empty()) {
+ return;
+ }
+ existing_track = at.back();
+ existing_track->set_name (a->name);
+ boost::shared_ptr<Playlist> playlist = existing_track->playlist();
+ boost::shared_ptr<Region> copy (RegionFactory::create (r, true));
+ playlist->clear_changes ();
+ playlist->add_region (copy, a->reg.startpos);
+ //_session->add_command (new StatefulDiffCommand (playlist));
+ nth++;
+ }
+ usedtracks.push_back(utr);
+ }
+ }
+ }
+
+ import_status.sources.clear();
+
+ if (ok) {
+ _session->save_state ("");
+ }
+ import_status.all_done = true;
+}
diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc
index b071ed6..4479431 100644
--- a/gtk2_ardour/editor_selection.cc
+++ b/gtk2_ardour/editor_selection.cc
@@ -30,6 +30,7 @@
#include "control_protocol/control_protocol.h"
+#include "editor_drag.h"
#include "editor.h"
#include "actions.h"
#include "audio_time_axis.h"
@@ -325,19 +326,23 @@ Editor::set_selected_control_point_from_click (bool press, Selection::Operation
if (!clicked_control_point) {
return false;
}
+ bool ret = false;
switch (op) {
case Selection::Set:
if (press) {
selection->set (clicked_control_point);
+ ret = true;
}
break;
case Selection::Add:
if (press) {
selection->add (clicked_control_point);
+ ret = true;
}
break;
case Selection::Toggle:
+
/* This is a bit of a hack; if we Primary-Click-Drag a control
point (for push drag) we want the point we clicked on to be
selected, otherwise we end up confusingly dragging an
@@ -352,9 +357,11 @@ Editor::set_selected_control_point_from_click (bool press, Selection::Operation
*/
selection->toggle (clicked_control_point);
_control_point_toggled_on_press = true;
+ ret = true;
} else if (!press && !_control_point_toggled_on_press) {
/* This is the release, and the point wasn't toggled on the press, so do it now */
selection->toggle (clicked_control_point);
+ ret = true;
} else {
/* Reset our flag */
_control_point_toggled_on_press = false;
@@ -365,7 +372,7 @@ Editor::set_selected_control_point_from_click (bool press, Selection::Operation
break;
}
- return true;
+ return ret;
}
void
@@ -652,9 +659,12 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
if (press)
goto out;
else {
- get_equivalent_regions(clicked_regionview, all_equivalent_regions, ARDOUR::Properties::select.property_id);
- selection->set(all_equivalent_regions);
- commit = true;
+ if (selection->regions.size() > 1) {
+ /* collapse region selection down to just this one region (and its equivalents) */
+ get_equivalent_regions(clicked_regionview, all_equivalent_regions, ARDOUR::Properties::select.property_id);
+ selection->set(all_equivalent_regions);
+ commit = true;
+ }
}
}
break;
@@ -1027,6 +1037,19 @@ Editor::time_selection_changed ()
} else {
ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, true);
}
+
+ /* propagate into backend, but only when there is no drag or we are at
+ * the end of a drag, otherwise this is too expensive (could case a
+ * locate per mouse motion event.
+ */
+
+ if (_session && !_drags->active()) {
+ if (selection->time.length() != 0) {
+ _session->set_range_selection (selection->time.start(), selection->time.end_frame());
+ } else {
+ _session->clear_range_selection ();
+ }
+ }
}
/** Set all region actions to have a given sensitivity */
@@ -1337,6 +1360,17 @@ Editor::region_selection_changed ()
if (_session && !_session->transport_rolling() && !selection->regions.empty()) {
maybe_locate_with_edit_preroll (selection->regions.start());
}
+
+ /* propagate into backend */
+
+ if (_session) {
+ if (!selection->regions.empty()) {
+ _session->set_object_selection (selection->regions.start(), selection->regions.end_frame());
+ } else {
+ _session->clear_object_selection ();
+ }
+ }
+
}
void
diff --git a/gtk2_ardour/editor_tempodisplay.cc b/gtk2_ardour/editor_tempodisplay.cc
index 4c2b40f..dea576a 100644
--- a/gtk2_ardour/editor_tempodisplay.cc
+++ b/gtk2_ardour/editor_tempodisplay.cc
@@ -263,10 +263,10 @@ Editor::mouse_add_new_meter_event (framepos_t frame)
void
Editor::remove_tempo_marker (ArdourCanvas::Item* item)
{
- Marker* marker;
+ ArdourMarker* marker;
TempoMarker* tempo_marker;
- if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (item->get_data ("marker"))) == 0) {
fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -363,10 +363,10 @@ Editor::real_remove_tempo_marker (TempoSection *section)
void
Editor::remove_meter_marker (ArdourCanvas::Item* item)
{
- Marker* marker;
+ ArdourMarker* marker;
MeterMarker* meter_marker;
- if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (item->get_data ("marker"))) == 0) {
fatal << _("programming error: meter marker canvas item has no marker object pointer!") << endmsg;
abort(); /*NOTREACHED*/
}
diff --git a/gtk2_ardour/editor_timefx.cc b/gtk2_ardour/editor_timefx.cc
index 2025ec7..5908e50 100644
--- a/gtk2_ardour/editor_timefx.cc
+++ b/gtk2_ardour/editor_timefx.cc
@@ -133,6 +133,8 @@ Editor::pitch_shift (RegionSelection& regions, float fraction)
if (ret == 0) {
commit_reversible_command ();
+ } else {
+ abort_reversible_command ();
}
return ret;
diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc
index 78a082c..9b9b1bf 100644
--- a/gtk2_ardour/engine_dialog.cc
+++ b/gtk2_ardour/engine_dialog.cc
@@ -49,6 +49,7 @@
#include "pbd/error.h"
#include "opts.h"
+#include "debug.h"
#include "ardour_ui.h"
#include "engine_dialog.h"
#include "gui_thread.h"
@@ -62,6 +63,8 @@ using namespace PBD;
using namespace Glib;
using namespace ARDOUR_UI_UTILS;
+#define DEBUG_ECONTROL(msg) DEBUG_TRACE (PBD::DEBUG::EngineControl, string_compose ("%1: %2\n", __LINE__, msg));
+
static const unsigned int midi_tab = 2;
static const unsigned int latency_tab = 1; /* zero-based, page zero is the main setup page */
@@ -83,6 +86,7 @@ EngineControl::EngineControl ()
, ports_spinner (ports_adjustment)
, control_app_button (_("Device Control Panel"))
, midi_devices_button (_("Midi Device Setup"))
+ , stop_engine_button (_("Stop (Reconfigure)"))
, lm_measure_label (_("Measure"))
, lm_use_button (_("Use results"))
, lm_back_button (_("Back to settings ... (ignore results)"))
@@ -95,6 +99,7 @@ EngineControl::EngineControl ()
, _desired_sample_rate (0)
, started_at_least_once (false)
, queue_device_changed (false)
+ , block_signals(0)
{
using namespace Notebook_Helpers;
vector<string> backend_names;
@@ -119,7 +124,6 @@ EngineControl::EngineControl ()
}
set_popdown_strings (backend_combo, backend_names);
- 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
@@ -177,8 +181,6 @@ EngineControl::EngineControl ()
lm_table.attach (*misc_align, 1, 3, row, row+1, FILL, (AttachOptions) 0);
++row;
- xopt = AttachOptions(0);
-
lm_measure_label.set_padding (10, 10);
lm_measure_button.add (lm_measure_label);
lm_measure_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::latency_button_clicked));
@@ -250,9 +252,6 @@ EngineControl::EngineControl ()
get_vbox()->set_border_width (12);
get_vbox()->pack_start (notebook);
- get_action_area()->pack_start (engine_status);
- engine_status.show();
-
/* need a special function to print "all available channels" when the
* channel counts hit zero.
*/
@@ -265,9 +264,16 @@ EngineControl::EngineControl ()
midi_devices_button.set_name ("generic button");
midi_devices_button.set_can_focus(true);
- control_app_button.signal_clicked().connect (mem_fun (*this, &EngineControl::control_app_button_clicked));
+ control_app_button.signal_clicked.connect (mem_fun (*this, &EngineControl::control_app_button_clicked));
+ control_app_button.set_name ("generic button");
+ control_app_button.set_can_focus(true);
manage_control_app_sensitivity ();
+ stop_engine_button.signal_clicked.connect (mem_fun (*this, &EngineControl::stop_engine_button_clicked));
+ stop_engine_button.set_sensitive (false);
+ stop_engine_button.set_name ("generic button");
+ stop_engine_button.set_can_focus(true);
+
cancel_button = add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_CANCEL);
apply_button = add_button (Gtk::Stock::APPLY, Gtk::RESPONSE_APPLY);
ok_button = add_button (Gtk::Stock::OK, Gtk::RESPONSE_OK);
@@ -282,46 +288,106 @@ EngineControl::EngineControl ()
ARDOUR::AudioEngine::instance()->DeviceListChanged.connect (devicelist_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::device_list_changed, this), gui_context());
if (audio_setup) {
- set_state (*audio_setup);
- }
-
- if (backend_combo.get_active_text().empty()) {
- PBD::Unwinder<uint32_t> protect_ignore_changes (ignore_changes, ignore_changes + 1);
- backend_combo.set_active_text (backend_names.front());
+ if (!set_state (*audio_setup)) {
+ set_default_state ();
+ }
+ } else {
+ set_default_state ();
}
- backend_changed ();
-
- /* in case the setting the backend failed, e.g. stale config, from set_state(), try again */
- if (0 == ARDOUR::AudioEngine::instance()->current_backend()) {
- backend_combo.set_active_text (backend_names.back());
- /* ignore: don't save state */
- PBD::Unwinder<uint32_t> protect_ignore_changes (ignore_changes, ignore_changes + 1);
- backend_changed ();
- }
+ connect_changed_signals ();
+ notebook.signal_switch_page().connect (sigc::mem_fun (*this, &EngineControl::on_switch_page));
- /* Connect to signals */
+ connect_disconnect_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::connect_disconnect_click));
+ connect_disconnect_button.set_no_show_all();
- 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));
- midi_option_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::midi_option_changed));
+}
- input_device_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::input_device_changed));
- output_device_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::output_device_changed));
+void
+EngineControl::connect_changed_signals ()
+{
+ backend_combo_connection = backend_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::backend_changed));
+ driver_combo_connection = driver_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::driver_changed));
+ sample_rate_combo_connection = sample_rate_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::sample_rate_changed));
+ buffer_size_combo_connection = buffer_size_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::buffer_size_changed));
+ device_combo_connection = device_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::device_changed));
+ midi_option_combo_connection = midi_option_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::midi_option_changed));
+
+ input_device_combo_connection = input_device_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::input_device_changed));
+ output_device_combo_connection = output_device_combo.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::output_device_changed));
+
+ input_latency_connection = input_latency.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::parameter_changed));
+ output_latency_connection = output_latency.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::parameter_changed));
+ input_channels_connection = input_channels.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::parameter_changed));
+ output_channels_connection = output_channels.signal_changed ().connect (
+ sigc::mem_fun (*this, &EngineControl::parameter_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));
+void
+EngineControl::block_changed_signals ()
+{
+ if (block_signals++ == 0) {
+ DEBUG_ECONTROL ("Blocking changed signals");
+ backend_combo_connection.block ();
+ driver_combo_connection.block ();
+ sample_rate_combo_connection.block ();
+ buffer_size_combo_connection.block ();
+ device_combo_connection.block ();
+ input_device_combo_connection.block ();
+ output_device_combo_connection.block ();
+ midi_option_combo_connection.block ();
+ input_latency_connection.block ();
+ output_latency_connection.block ();
+ input_channels_connection.block ();
+ output_channels_connection.block ();
+ }
+}
- notebook.signal_switch_page().connect (sigc::mem_fun (*this, &EngineControl::on_switch_page));
+void
+EngineControl::unblock_changed_signals ()
+{
+ if (--block_signals == 0) {
+ DEBUG_ECONTROL ("Unblocking changed signals");
+ backend_combo_connection.unblock ();
+ driver_combo_connection.unblock ();
+ sample_rate_combo_connection.unblock ();
+ buffer_size_combo_connection.unblock ();
+ device_combo_connection.unblock ();
+ input_device_combo_connection.unblock ();
+ output_device_combo_connection.unblock ();
+ midi_option_combo_connection.unblock ();
+ input_latency_connection.unblock ();
+ output_latency_connection.unblock ();
+ input_channels_connection.unblock ();
+ output_channels_connection.unblock ();
+ }
+}
- connect_disconnect_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::connect_disconnect_click));
- connect_disconnect_button.set_no_show_all();
+EngineControl::SignalBlocker::SignalBlocker (EngineControl& engine_control,
+ const std::string& reason)
+ : ec (engine_control)
+ , m_reason (reason)
+{
+ DEBUG_ECONTROL (string_compose ("SignalBlocker: %1", m_reason));
+ ec.block_changed_signals ();
+}
+EngineControl::SignalBlocker::~SignalBlocker ()
+{
+ DEBUG_ECONTROL (string_compose ("~SignalBlocker: %1", m_reason));
+ ec.unblock_changed_signals ();
}
void
@@ -333,8 +399,6 @@ EngineControl::on_show ()
backend_changed ();
}
device_changed ();
- input_device_changed ();
- output_device_changed ();
ok_button->grab_focus();
}
@@ -402,6 +466,11 @@ EngineControl::build_notebook ()
basic_packer.attach (*label, 0, 1, 0, 1, xopt, (AttachOptions) 0);
basic_packer.attach (backend_combo, 1, 2, 0, 1, xopt, (AttachOptions) 0);
+ basic_packer.attach (engine_status, 2, 3, 0, 1, xopt, (AttachOptions) 0);
+ engine_status.show();
+
+ basic_packer.attach (stop_engine_button, 3, 4, 0, 1, xopt, xopt);
+
lm_button_audio.signal_clicked.connect (sigc::mem_fun (*this, &EngineControl::calibrate_audio_latency));
lm_button_audio.set_name ("generic button");
lm_button_audio.set_can_focus(true);
@@ -538,7 +607,13 @@ EngineControl::build_full_control_notebook ()
label = manage (left_aligned_label (_("MIDI System:")));
basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
basic_packer.attach (midi_option_combo, 1, 2, row, row + 1, SHRINK, (AttachOptions) 0);
+#if ! defined __APPLE__ && ! defined PLATFORM_WINDOWS // => linux, YAY
+ /* Currently the only backend with dedicated Midi setup is ALSA.
+ * lot of people complain that this is greyed out
+ * "I can't use MIDI, the setup is greyed out"
+ */
basic_packer.attach (midi_devices_button, 3, 4, row, row+1, xopt, xopt);
+#endif
row++;
}
@@ -658,6 +733,105 @@ EngineControl::setup_midi_tab_for_backend ()
}
void
+EngineControl::update_sensitivity ()
+{
+ boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
+ if (!backend) {
+ ok_button->set_sensitive (false);
+ apply_button->set_sensitive (false);
+ stop_engine_button.set_sensitive (false);
+ return;
+ }
+
+ bool valid = true;
+ size_t devices_available = 0;
+
+ if (backend->use_separate_input_and_output_devices ()) {
+ devices_available += get_popdown_string_count (input_device_combo);
+ devices_available += get_popdown_string_count (output_device_combo);
+ } else {
+ devices_available += get_popdown_string_count (device_combo);
+ }
+
+ if (devices_available == 0) {
+ valid = false;
+ input_latency.set_sensitive (false);
+ output_latency.set_sensitive (false);
+ input_channels.set_sensitive (false);
+ output_channels.set_sensitive (false);
+ } else {
+ input_latency.set_sensitive (true);
+ output_latency.set_sensitive (true);
+ input_channels.set_sensitive (true);
+ output_channels.set_sensitive (true);
+ }
+
+ if (get_popdown_string_count (buffer_size_combo) > 0) {
+ if (!ARDOUR::AudioEngine::instance()->running()) {
+ buffer_size_combo.set_sensitive (valid);
+ } else if (backend->can_change_sample_rate_when_running()) {
+ buffer_size_combo.set_sensitive (valid || !_have_control);
+ } else {
+#if 1
+ /* TODO
+ * Currently there is no way to manually stop the
+ * engine in order to re-configure it.
+ * This needs to remain sensitive for now.
+ *
+ * (it's also handy to implicily
+ * re-start the engine)
+ */
+ buffer_size_combo.set_sensitive (true);
+#else
+ buffer_size_combo.set_sensitive (false);
+#endif
+ }
+ } else {
+ buffer_size_combo.set_sensitive (false);
+ valid = false;
+ }
+
+ if (get_popdown_string_count (sample_rate_combo) > 0) {
+ if (!ARDOUR::AudioEngine::instance()->running()) {
+ sample_rate_combo.set_sensitive (true);
+ } else {
+ sample_rate_combo.set_sensitive (false);
+ }
+ } else {
+ sample_rate_combo.set_sensitive (false);
+ valid = false;
+ }
+
+ if (ARDOUR::AudioEngine::instance()->running() && _have_control) {
+ input_device_combo.set_sensitive (false);
+ output_device_combo.set_sensitive (false);
+ device_combo.set_sensitive (false);
+ driver_combo.set_sensitive (false);
+ stop_engine_button.set_sensitive (true);
+ stop_engine_button.show ();
+ } else {
+ input_device_combo.set_sensitive (true);
+ output_device_combo.set_sensitive (true);
+ device_combo.set_sensitive (true);
+ if (backend->requires_driver_selection() && get_popdown_string_count(driver_combo) > 0) {
+ driver_combo.set_sensitive (true);
+ } else {
+ driver_combo.set_sensitive (false);
+ }
+ stop_engine_button.set_sensitive (false);
+ stop_engine_button.hide ();
+ }
+
+ if (valid || !_have_control) {
+ ok_button->set_sensitive (true);
+ apply_button->set_sensitive (true);
+ } else {
+ ok_button->set_sensitive (false);
+ apply_button->set_sensitive (false);
+ }
+}
+
+void
EngineControl::setup_midi_tab_for_jack ()
{
}
@@ -752,13 +926,9 @@ EngineControl::refresh_midi_display (std::string focus)
}
void
-EngineControl::update_sensitivity ()
-{
-}
-
-void
EngineControl::backend_changed ()
{
+ SignalBlocker blocker (*this, "backend_changed");
string backend_name = backend_combo.get_active_text();
boost::shared_ptr<ARDOUR::AudioBackend> backend;
@@ -768,6 +938,8 @@ EngineControl::backend_changed ()
return;
}
+ DEBUG_ECONTROL (string_compose ("Backend name: %1", backend_name));
+
_have_control = ARDOUR::AudioEngine::instance()->setup_required ();
build_notebook ();
@@ -775,38 +947,39 @@ EngineControl::backend_changed ()
_midi_devices.clear();
if (backend->requires_driver_selection()) {
- vector<string> drivers = backend->enumerate_drivers();
- driver_combo.set_sensitive (true);
-
- if (!drivers.empty()) {
- {
- string current_driver;
- current_driver = backend->driver_name ();
-
- // driver might not have been set yet
- if (current_driver == "") {
- current_driver = driver_combo.get_active_text ();
- if (current_driver == "")
- // driver has never been set, make sure it's not blank
- current_driver = drivers.front ();
- }
-
- PBD::Unwinder<uint32_t> protect_ignore_changes (ignore_changes, ignore_changes + 1);
- set_popdown_strings (driver_combo, drivers);
- driver_combo.set_active_text (current_driver);
- }
-
+ if (set_driver_popdown_strings ()) {
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 ();
}
+ update_midi_options ();
+
+ connect_disconnect_button.hide();
+
+ midi_option_changed();
+
+ started_at_least_once = false;
+
+ /* changing the backend implies stopping the engine
+ * ARDOUR::AudioEngine() may or may not emit this signal
+ * depending on previous engine state
+ */
+ engine_stopped (); // set "active/inactive"
+
+ if (!ignore_changes) {
+ maybe_display_saved_state ();
+ }
+}
+
+void
+EngineControl::update_midi_options ()
+{
+ boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
vector<string> midi_options = backend->enumerate_midi_options();
if (midi_options.size() == 1) {
@@ -821,16 +994,6 @@ EngineControl::backend_changed ()
midi_option_combo.set_sensitive (false);
}
}
-
- connect_disconnect_button.hide();
-
- midi_option_changed();
-
- started_at_least_once = false;
-
- if (!ignore_changes) {
- maybe_display_saved_state ();
- }
}
bool
@@ -851,10 +1014,41 @@ EngineControl::print_channel_count (Gtk::SpinButton* sb)
return true;
}
+// @return true if there are drivers available
+bool
+EngineControl::set_driver_popdown_strings ()
+{
+ DEBUG_ECONTROL ("set_driver_popdown_strings");
+ boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
+ vector<string> drivers = backend->enumerate_drivers();
+
+ if (drivers.empty ()) {
+ // This is an error...?
+ return false;
+ }
+
+ string current_driver = backend->driver_name ();
+
+ DEBUG_ECONTROL (string_compose ("backend->driver_name: %1", current_driver));
+
+ if (std::find (drivers.begin (), drivers.end (), current_driver) ==
+ drivers.end ()) {
+
+ current_driver = drivers.front ();
+ }
+
+ set_popdown_strings (driver_combo, drivers);
+ DEBUG_ECONTROL (
+ string_compose ("driver_combo.set_active_text: %1", current_driver));
+ driver_combo.set_active_text (current_driver);
+ return true;
+}
+
// @return true if there are devices available
bool
EngineControl::set_device_popdown_strings ()
{
+ DEBUG_ECONTROL ("set_device_popdown_strings");
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
vector<ARDOUR::AudioBackend::DeviceStatus> all_devices = backend->enumerate_devices ();
@@ -873,44 +1067,35 @@ EngineControl::set_device_popdown_strings ()
available_devices.push_back (i->name);
}
+ if (available_devices.empty ()) {
+ return false;
+ }
- if (!available_devices.empty()) {
- update_sensitivity ();
+ string current_device = backend->device_name ();
- {
- string current_device, found_device;
- current_device = device_combo.get_active_text ();
- if (current_device == "") {
- current_device = backend->device_name ();
- }
+ // Make sure that backend->device_name () is a valid
+ // device, the backend may not return a valid device if it hasn't
+ // been set yet.
+ if (std::find (available_devices.begin (),
+ available_devices.end (),
+ current_device) == available_devices.end ()) {
- // Make sure that the active text is still relevant for this
- // device (it might only be relevant to the previous device!!)
- for (vector<string>::const_iterator i = available_devices.begin(); i != available_devices.end(); ++i) {
- if (*i == current_device)
- found_device = current_device;
- }
- if (found_device == "")
- // device has never been set (or was not relevant
- // for this backend) Let's make sure it's not blank
- current_device = available_devices.front ();
+ current_device = available_devices.front ();
+ }
- PBD::Unwinder<uint32_t> protect_ignore_changes (ignore_changes, ignore_changes + 1);
- set_popdown_strings (device_combo, available_devices);
+ set_popdown_strings (device_combo, available_devices);
+ DEBUG_ECONTROL (
+ string_compose ("set device_combo active text: %1", current_device));
- device_combo.set_active_text (current_device);
- }
-
- device_changed ();
- return true;
- }
- return false;
+ device_combo.set_active_text (current_device);
+ return true;
}
// @return true if there are input devices available
bool
EngineControl::set_input_device_popdown_strings ()
{
+ DEBUG_ECONTROL ("set_input_device_popdown_strings");
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
vector<ARDOUR::AudioBackend::DeviceStatus> all_devices = backend->enumerate_input_devices ();
@@ -920,44 +1105,35 @@ EngineControl::set_input_device_popdown_strings ()
available_devices.push_back (i->name);
}
- if (!available_devices.empty()) {
- update_sensitivity ();
-
- {
- string current_device, found_device;
- current_device = input_device_combo.get_active_text ();
- if (current_device == "") {
- current_device = backend->input_device_name ();
- }
-
- // Make sure that the active text is still relevant for this
- // device (it might only be relevant to the previous device!!)
- for (vector<string>::const_iterator i = available_devices.begin(); i != available_devices.end(); ++i) {
- if (*i == current_device)
- found_device = current_device;
- }
- if (found_device == "")
- // device has never been set (or was not relevant
- // for this backend) Let's make sure it's not blank
- current_device = available_devices.front ();
+ if (available_devices.empty()) {
+ return false;
+ }
- PBD::Unwinder<uint32_t> protect_ignore_changes (ignore_changes, ignore_changes + 1);
- set_popdown_strings (input_device_combo, available_devices);
+ string current_device = backend->input_device_name ();
- input_device_combo.set_active_text (current_device);
- }
+ // Make sure that backend->input_device_name () is a valid
+ // device, the backend may not return a valid device if it hasn't
+ // been set yet.
+ if (std::find (available_devices.begin (),
+ available_devices.end (),
+ current_device) == available_devices.end ()) {
- input_device_changed ();
- return true;
+ current_device = available_devices.front ();
}
- return false;
+ set_popdown_strings (input_device_combo, available_devices);
+
+ DEBUG_ECONTROL (
+ string_compose ("set input_device_combo active text: %1", current_device));
+ input_device_combo.set_active_text (current_device);
+ return true;
}
// @return true if there are output devices available
bool
EngineControl::set_output_device_popdown_strings ()
{
+ DEBUG_ECONTROL ("set_output_device_popdown_strings");
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
vector<ARDOUR::AudioBackend::DeviceStatus> all_devices = backend->enumerate_output_devices ();
@@ -967,43 +1143,34 @@ EngineControl::set_output_device_popdown_strings ()
available_devices.push_back (i->name);
}
- if (!available_devices.empty()) {
- update_sensitivity ();
-
- {
- string current_device, found_device;
- current_device = output_device_combo.get_active_text ();
- if (current_device == "") {
- current_device = backend->output_device_name ();
- }
-
- // Make sure that the active text is still relevant for this
- // device (it might only be relevant to the previous device!!)
- for (vector<string>::const_iterator i = available_devices.begin(); i != available_devices.end(); ++i) {
- if (*i == current_device)
- found_device = current_device;
- }
- if (found_device == "")
- // device has never been set (or was not relevant
- // for this backend) Let's make sure it's not blank
- current_device = available_devices.front ();
+ if (available_devices.empty()) {
+ return false;
+ }
- PBD::Unwinder<uint32_t> protect_ignore_changes (ignore_changes, ignore_changes + 1);
- set_popdown_strings (output_device_combo, available_devices);
+ string current_device = backend->output_device_name ();
- output_device_combo.set_active_text (current_device);
- }
+ // Make sure that backend->output_device_name () is a valid
+ // device, the backend may not return a valid device if it hasn't
+ // been set yet.
+ if (std::find (available_devices.begin (),
+ available_devices.end (),
+ current_device) == available_devices.end ()) {
- output_device_changed ();
- return true;
+ current_device = available_devices.front ();
}
- return false;
+ set_popdown_strings (output_device_combo, available_devices);
+
+ DEBUG_ECONTROL (
+ string_compose ("set output_device_combo active text: %1", current_device));
+ output_device_combo.set_active_text (current_device);
+ return true;
}
void
EngineControl::list_devices ()
{
+ DEBUG_ECONTROL ("list_devices");
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
assert (backend);
@@ -1020,44 +1187,19 @@ EngineControl::list_devices ()
}
if (devices_available) {
- input_latency.set_sensitive (true);
- output_latency.set_sensitive (true);
- input_channels.set_sensitive (true);
- output_channels.set_sensitive (true);
-
- ok_button->set_sensitive (true);
- apply_button->set_sensitive (true);
-
+ device_changed ();
} else {
device_combo.clear();
input_device_combo.clear();
output_device_combo.clear();
- 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);
- if (_have_control) {
- ok_button->set_sensitive (false);
- apply_button->set_sensitive (false);
- } else {
- ok_button->set_sensitive (true);
- apply_button->set_sensitive (true);
- if (backend->can_change_sample_rate_when_running() && sample_rate_combo.get_children().size() > 0) {
- sample_rate_combo.set_sensitive (true);
- }
- if (backend->can_change_buffer_size_when_running() && buffer_size_combo.get_children().size() > 0) {
- buffer_size_combo.set_sensitive (true);
- }
-
- }
}
+ update_sensitivity ();
}
void
EngineControl::driver_changed ()
{
+ SignalBlocker blocker (*this, "driver_changed");
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
assert (backend);
@@ -1069,27 +1211,50 @@ EngineControl::driver_changed ()
}
}
+vector<float>
+EngineControl::get_sample_rates_for_all_devices ()
+{
+ boost::shared_ptr<ARDOUR::AudioBackend> backend =
+ ARDOUR::AudioEngine::instance ()->current_backend ();
+ vector<float> all_rates;
+
+ if (backend->use_separate_input_and_output_devices ()) {
+ all_rates = backend->available_sample_rates2 (get_input_device_name (), get_output_device_name ());
+ } else {
+ all_rates = backend->available_sample_rates (get_device_name ());
+ }
+ return all_rates;
+}
+
+vector<float>
+EngineControl::get_default_sample_rates ()
+{
+ vector<float> rates;
+ rates.push_back (8000.0f);
+ rates.push_back (16000.0f);
+ rates.push_back (32000.0f);
+ rates.push_back (44100.0f);
+ rates.push_back (48000.0f);
+ rates.push_back (88200.0f);
+ rates.push_back (96000.0f);
+ rates.push_back (192000.0f);
+ rates.push_back (384000.0f);
+ return rates;
+}
+
void
-EngineControl::set_samplerate_popdown_strings (const std::string& device_name)
+EngineControl::set_samplerate_popdown_strings ()
{
+ DEBUG_ECONTROL ("set_samplerate_popdown_strings");
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
string desired;
vector<float> sr;
vector<string> s;
if (_have_control) {
- sr = backend->available_sample_rates (device_name);
+ sr = get_sample_rates_for_all_devices ();
} 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);
+ sr = get_default_sample_rates ();
}
for (vector<float>::const_iterator x = sr.begin(); x != sr.end(); ++x) {
@@ -1099,66 +1264,102 @@ EngineControl::set_samplerate_popdown_strings (const std::string& device_name)
}
}
+ set_popdown_strings (sample_rate_combo, s);
+
if (!s.empty()) {
- sample_rate_combo.set_sensitive (true);
- set_popdown_strings (sample_rate_combo, s);
+ if (desired.empty ()) {
+ float new_active_sr = backend->default_sample_rate ();
- if (desired.empty()) {
- sample_rate_combo.set_active_text (rate_as_string (backend->default_sample_rate()));
+ if (std::find (sr.begin (), sr.end (), new_active_sr) == sr.end ()) {
+ new_active_sr = sr.front ();
+ }
+
+ sample_rate_combo.set_active_text (rate_as_string (new_active_sr));
} else {
sample_rate_combo.set_active_text (desired);
}
+ }
+ update_sensitivity ();
+}
+
+vector<uint32_t>
+EngineControl::get_buffer_sizes_for_all_devices ()
+{
+ boost::shared_ptr<ARDOUR::AudioBackend> backend =
+ ARDOUR::AudioEngine::instance ()->current_backend ();
+ vector<uint32_t> all_sizes;
+
+ if (backend->use_separate_input_and_output_devices ()) {
+ all_sizes = backend->available_buffer_sizes2 (get_input_device_name (), get_output_device_name ());
} else {
- sample_rate_combo.set_sensitive (false);
+ all_sizes = backend->available_buffer_sizes (get_device_name ());
}
+ return all_sizes;
+}
+
+vector<uint32_t>
+EngineControl::get_default_buffer_sizes ()
+{
+ vector<uint32_t> sizes;
+ sizes.push_back (8);
+ sizes.push_back (16);
+ sizes.push_back (32);
+ sizes.push_back (64);
+ sizes.push_back (128);
+ sizes.push_back (256);
+ sizes.push_back (512);
+ sizes.push_back (1024);
+ sizes.push_back (2048);
+ sizes.push_back (4096);
+ sizes.push_back (8192);
+ return sizes;
}
void
-EngineControl::set_buffersize_popdown_strings (const std::string& device_name)
+EngineControl::set_buffersize_popdown_strings ()
{
+ DEBUG_ECONTROL ("set_buffersize_popdown_strings");
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
vector<uint32_t> bs;
vector<string> s;
if (_have_control) {
- bs = backend->available_buffer_sizes (device_name);
+ bs = get_buffer_sizes_for_all_devices ();
} 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 ();
+ bs = get_default_buffer_sizes ();
+ }
+
for (vector<uint32_t>::const_iterator x = bs.begin(); x != bs.end(); ++x) {
s.push_back (bufsize_as_string (*x));
}
+ set_popdown_strings (buffer_size_combo, s);
+
if (!s.empty()) {
- buffer_size_combo.set_sensitive (true);
- set_popdown_strings (buffer_size_combo, s);
+ buffer_size_combo.set_active_text (s.front());
uint32_t period = backend->buffer_size();
- if (0 == period) {
- period = backend->default_buffer_size(device_name);
+ if (0 == period && backend->use_separate_input_and_output_devices ()) {
+ period = backend->default_buffer_size (get_input_device_name ());
+ }
+ if (0 == period && backend->use_separate_input_and_output_devices ()) {
+ period = backend->default_buffer_size (get_output_device_name ());
+ }
+ if (0 == period && !backend->use_separate_input_and_output_devices ()) {
+ period = backend->default_buffer_size (get_device_name ());
}
+
set_active_text_if_present (buffer_size_combo, bufsize_as_string (period));
show_buffer_duration ();
- } else {
- buffer_size_combo.set_sensitive (false);
}
+ update_sensitivity ();
}
void
EngineControl::device_changed ()
{
+ SignalBlocker blocker (*this, "device_changed");
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
assert (backend);
@@ -1201,13 +1402,10 @@ EngineControl::device_changed ()
*/
PBD::Unwinder<uint32_t> protect_ignore_changes (ignore_changes, ignore_changes + 1);
- /* backends that support separate devices, need to ignore
- * the device-name - and use the devies set above
- */
- set_samplerate_popdown_strings (device_name_in);
- set_buffersize_popdown_strings (device_name_in);
- /* XXX theoretically need to set min + max channel counts here
- */
+ set_samplerate_popdown_strings ();
+ set_buffersize_popdown_strings ();
+
+ /* TODO set min + max channel counts here */
manage_control_app_sensitivity ();
}
@@ -1222,63 +1420,15 @@ EngineControl::device_changed ()
void
EngineControl::input_device_changed ()
{
- boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
- assert (backend);
- string input_device_name = input_device_combo.get_active_text ();
-
- if (!ignore_changes && input_device_name != backend->input_device_name()) {
- queue_device_changed = true;
- }
-
- backend->set_input_device_name(input_device_name);
-
- {
- PBD::Unwinder<uint32_t> protect_ignore_changes (ignore_changes, ignore_changes + 1);
-
- set_samplerate_popdown_strings (input_device_name);
- set_buffersize_popdown_strings (input_device_name);
- /* XXX theoretically need to set min + max channel counts here
- */
-
- manage_control_app_sensitivity ();
- }
-
- /* pick up any saved state for this device */
-
- if (!ignore_changes) {
- maybe_display_saved_state ();
- }
+ DEBUG_ECONTROL ("input_device_changed");
+ device_changed ();
}
void
EngineControl::output_device_changed ()
{
- boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
- assert (backend);
- string output_device_name = output_device_combo.get_active_text ();
-
- if (!ignore_changes && output_device_name != backend->output_device_name()) {
- queue_device_changed = true;
- }
-
- backend->set_output_device_name(output_device_name);
-
- {
- PBD::Unwinder<uint32_t> protect_ignore_changes (ignore_changes, ignore_changes + 1);
-
- set_samplerate_popdown_strings (output_device_name);
- set_buffersize_popdown_strings (output_device_name);
- /* XXX theoretically need to set min + max channel counts here
- */
-
- manage_control_app_sensitivity ();
- }
-
- /* pick up any saved state for this device */
-
- if (!ignore_changes) {
- maybe_display_saved_state ();
- }
+ DEBUG_ECONTROL ("output_device_changed");
+ device_changed ();
}
string
@@ -1295,6 +1445,7 @@ EngineControl::bufsize_as_string (uint32_t sz)
void
EngineControl::sample_rate_changed ()
{
+ DEBUG_ECONTROL ("sample_rate_changed");
/* reset the strings for buffer size to show the correct msec value
(reflecting the new sample rate).
*/
@@ -1306,13 +1457,14 @@ EngineControl::sample_rate_changed ()
void
EngineControl::buffer_size_changed ()
{
+ DEBUG_ECONTROL ("buffer_size_changed");
show_buffer_duration ();
}
void
EngineControl::show_buffer_duration ()
{
-
+ DEBUG_ECONTROL ("show_buffer_duration");
/* buffer sizes - convert from just samples to samples + msecs for
* the displayed string
*/
@@ -1346,6 +1498,7 @@ EngineControl::show_buffer_duration ()
void
EngineControl::midi_option_changed ()
{
+ DEBUG_ECONTROL ("midi_option_changed");
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
assert (backend);
@@ -1537,6 +1690,8 @@ EngineControl::maybe_display_saved_state ()
XMLNode&
EngineControl::get_state ()
{
+ LocaleGuard lg (X_("C"));
+
XMLNode* root = new XMLNode ("AudioMIDISetup");
std::string path;
@@ -1582,6 +1737,22 @@ EngineControl::get_state ()
}
void
+EngineControl::set_default_state ()
+{
+ vector<string> backend_names;
+ vector<const ARDOUR::AudioBackendInfo*> backends = ARDOUR::AudioEngine::instance()->available_backends();
+
+ for (vector<const ARDOUR::AudioBackendInfo*>::const_iterator b = backends.begin(); b != backends.end(); ++b) {
+ backend_names.push_back ((*b)->name);
+ }
+ backend_combo.set_active_text (backend_names.front());
+
+ // We could set default backends per platform etc here
+
+ backend_changed ();
+}
+
+bool
EngineControl::set_state (const XMLNode& root)
{
XMLNodeList clist, cclist;
@@ -1593,7 +1764,7 @@ EngineControl::set_state (const XMLNode& root)
fprintf (stderr, "EngineControl::set_state\n");
if (root.name() != "AudioMIDISetup") {
- return;
+ return false;
}
clist = root.children();
@@ -1746,27 +1917,105 @@ EngineControl::set_state (const XMLNode& root)
for (StateList::const_iterator i = states.begin(); i != states.end(); ++i) {
if ((*i)->active) {
- PBD::Unwinder<uint32_t> protect_ignore_changes (ignore_changes, ignore_changes + 1);
- backend_combo.set_active_text ((*i)->backend);
- driver_combo.set_active_text ((*i)->driver);
- device_combo.set_active_text ((*i)->device);
- fprintf (stderr, "setting input device to: %s ", (*i)->input_device.c_str());
- input_device_combo.set_active_text ((*i)->input_device);
- fprintf (stderr, "setting output device to: %s ", (*i)->output_device.c_str());
- output_device_combo.set_active_text ((*i)->output_device);
- sample_rate_combo.set_active_text (rate_as_string ((*i)->sample_rate));
- set_active_text_if_present (buffer_size_combo, bufsize_as_string ((*i)->buffer_size));
- input_latency.set_value ((*i)->input_latency);
- output_latency.set_value ((*i)->output_latency);
- midi_option_combo.set_active_text ((*i)->midi_option);
- break;
+ return set_current_state (*i);
}
}
+ return false;
+}
+
+bool
+EngineControl::set_current_state (const State& state)
+{
+ DEBUG_ECONTROL ("set_current_state");
+
+ boost::shared_ptr<ARDOUR::AudioBackend> backend;
+
+ if (!(backend = ARDOUR::AudioEngine::instance ()->set_backend (
+ state->backend, "ardour", ""))) {
+ DEBUG_ECONTROL (string_compose ("Unable to set backend to %1", state->backend));
+ // this shouldn't happen as the invalid backend names should have been
+ // removed from the list of states.
+ return false;
+ }
+
+ // now reflect the change in the backend in the GUI so backend_changed will
+ // do the right thing
+ backend_combo.set_active_text (state->backend);
+
+ if (!state->driver.empty ()) {
+ if (!backend->requires_driver_selection ()) {
+ DEBUG_ECONTROL ("Backend should require driver selection");
+ // A backend has changed from having driver selection to not having
+ // it or someone has been manually editing a config file and messed
+ // it up
+ return false;
+ }
+
+ if (backend->set_driver (state->driver) != 0) {
+ DEBUG_ECONTROL (string_compose ("Unable to set driver %1", state->driver));
+ // Driver names for a backend have changed and the name in the
+ // config file is now invalid or support for driver is no longer
+ // included in the backend
+ return false;
+ }
+ // no need to set the driver_combo as backend_changed will use
+ // backend->driver_name to set the active driver
+ }
+
+ if (!state->device.empty ()) {
+ if (backend->set_device_name (state->device) != 0) {
+ DEBUG_ECONTROL (
+ string_compose ("Unable to set device name %1", state->device));
+ // device is no longer available on the system
+ return false;
+ }
+ // no need to set active device as it will be picked up in
+ // via backend_changed ()/set_device_popdown_strings
+
+ } else {
+ // backend supports separate input/output devices
+ if (backend->set_input_device_name (state->input_device) != 0) {
+ DEBUG_ECONTROL (string_compose ("Unable to set input device name %1",
+ state->input_device));
+ // input device is no longer available on the system
+ return false;
+ }
+
+ if (backend->set_output_device_name (state->output_device) != 0) {
+ DEBUG_ECONTROL (string_compose ("Unable to set output device name %1",
+ state->input_device));
+ // output device is no longer available on the system
+ return false;
+ }
+ // no need to set active devices as it will be picked up in via
+ // backend_changed ()/set_*_device_popdown_strings
+ }
+
+ backend_changed ();
+
+ // Now restore the state of the rest of the controls
+
+ // We don't use a SignalBlocker as set_current_state is currently only
+ // called from set_state before any signals are connected. If at some point
+ // a more general named state mechanism is implemented and
+ // set_current_state is called while signals are connected then a
+ // SignalBlocker will need to be instantiated before setting these.
+
+ device_combo.set_active_text (state->device);
+ input_device_combo.set_active_text (state->input_device);
+ output_device_combo.set_active_text (state->output_device);
+ sample_rate_combo.set_active_text (rate_as_string (state->sample_rate));
+ set_active_text_if_present (buffer_size_combo, bufsize_as_string (state->buffer_size));
+ input_latency.set_value (state->input_latency);
+ output_latency.set_value (state->output_latency);
+ midi_option_combo.set_active_text (state->midi_option);
+ return true;
}
int
EngineControl::push_state_to_backend (bool start)
{
+ DEBUG_ECONTROL ("push_state_to_backend");
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
if (!backend) {
@@ -2156,7 +2405,7 @@ EngineControl::get_backend () const
string
EngineControl::get_driver () const
{
- if (driver_combo.get_sensitive() && driver_combo.get_parent()) {
+ if (driver_combo.get_parent()) {
return driver_combo.get_active_text ();
} else {
return "";
@@ -2194,6 +2443,12 @@ EngineControl::control_app_button_clicked ()
}
void
+EngineControl::stop_engine_button_clicked ()
+{
+ ARDOUR::AudioEngine::instance()->stop ();
+}
+
+void
EngineControl::manage_control_app_sensitivity ()
{
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
@@ -2216,8 +2471,6 @@ EngineControl::set_desired_sample_rate (uint32_t sr)
{
_desired_sample_rate = sr;
device_changed ();
- input_device_changed ();
- output_device_changed ();
}
void
@@ -2225,9 +2478,8 @@ EngineControl::on_switch_page (GtkNotebookPage*, guint page_num)
{
if (page_num == 0) {
cancel_button->set_sensitive (true);
- ok_button->set_sensitive (true);
- apply_button->set_sensitive (true);
_measure_midi.reset();
+ update_sensitivity ();
} else {
cancel_button->set_sensitive (false);
ok_button->set_sensitive (false);
@@ -2509,14 +2761,16 @@ EngineControl::engine_running ()
set_active_text_if_present (buffer_size_combo, 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()));
connect_disconnect_button.show();
started_at_least_once = true;
- engine_status.set_markup(string_compose ("<span foreground=\"green\">%1</span>", _("Active")));
+ if (_have_control) {
+ engine_status.set_markup(string_compose ("<span foreground=\"green\">%1</span>", _("Running")));
+ } else {
+ engine_status.set_markup(string_compose ("<span foreground=\"green\">%1</span>", _("Connected")));
+ }
+ update_sensitivity();
}
void
@@ -2525,13 +2779,11 @@ 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()));
connect_disconnect_button.show();
- sample_rate_combo.set_sensitive (true);
- buffer_size_combo.set_sensitive (true);
- engine_status.set_markup(string_compose ("<span foreground=\"red\">%1</span>", _("Inactive")));
+ engine_status.set_markup(X_(""));
+ update_sensitivity();
}
void
diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h
index 1ca9937..783ab44 100644
--- a/gtk2_ardour/engine_dialog.h
+++ b/gtk2_ardour/engine_dialog.h
@@ -46,7 +46,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
static bool need_setup ();
XMLNode& get_state ();
- void set_state (const XMLNode&);
+ bool set_state (const XMLNode&);
void set_desired_sample_rate (uint32_t);
@@ -82,8 +82,9 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
Gtk::SpinButton ports_spinner;
Gtk::Label have_control_text;
- Gtk::Button control_app_button;
+ ArdourButton control_app_button;
ArdourButton midi_devices_button;
+ ArdourButton stop_engine_button;
Gtk::Button connect_disconnect_button;
@@ -134,8 +135,16 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
void setup_midi_tab_for_jack ();
void refresh_midi_display (std::string focus = "");
+ void update_midi_options ();
+
std::string bufsize_as_string (uint32_t);
+ std::vector<float> get_default_sample_rates ();
+ std::vector<uint32_t> get_default_buffer_sizes ();
+
+ std::vector<float> get_sample_rates_for_all_devices ();
+ std::vector<uint32_t> get_buffer_sizes_for_all_devices ();
+
float get_rate() const;
uint32_t get_buffer_size() const;
uint32_t get_input_channels() const;
@@ -152,11 +161,12 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
void device_changed ();
void input_device_changed ();
void output_device_changed ();
+ bool set_driver_popdown_strings ();
bool set_device_popdown_strings ();
bool set_input_device_popdown_strings ();
bool set_output_device_popdown_strings ();
- void set_samplerate_popdown_strings (const std::string& dev_name);
- void set_buffersize_popdown_strings (const std::string& dev_name);
+ void set_samplerate_popdown_strings ();
+ void set_buffersize_popdown_strings ();
void list_devices ();
void show_buffer_duration ();
@@ -234,6 +244,9 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
void store_state (State);
bool equivalent_states (const State&, const State&);
+ bool set_current_state (const State& state);
+ void set_default_state ();
+
bool _have_control;
static bool print_channel_count (Gtk::SpinButton*);
@@ -242,9 +255,41 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
void build_full_control_notebook ();
void build_no_control_notebook ();
+ void connect_changed_signals ();
+ void block_changed_signals ();
+ void unblock_changed_signals ();
+
+ class SignalBlocker
+ {
+ public:
+ SignalBlocker (EngineControl& engine_control, const std::string& reason);
+
+ ~SignalBlocker ();
+
+ private:
+ EngineControl& ec;
+ std::string m_reason;
+ };
+
+ uint32_t block_signals;
+
+ sigc::connection backend_combo_connection;
+ sigc::connection driver_combo_connection;
+ sigc::connection sample_rate_combo_connection;
+ sigc::connection buffer_size_combo_connection;
+ sigc::connection device_combo_connection;
+ sigc::connection input_device_combo_connection;
+ sigc::connection output_device_combo_connection;
+ sigc::connection midi_option_combo_connection;
+ sigc::connection input_latency_connection;
+ sigc::connection output_latency_connection;
+ sigc::connection input_channels_connection;
+ sigc::connection output_channels_connection;
+
void on_show ();
void on_response (int);
void control_app_button_clicked ();
+ void stop_engine_button_clicked ();
void use_latency_button_clicked ();
void manage_control_app_sensitivity ();
int push_state_to_backend (bool start);
diff --git a/gtk2_ardour/export_channel_selector.cc b/gtk2_ardour/export_channel_selector.cc
index 77cabad..c868d69 100644
--- a/gtk2_ardour/export_channel_selector.cc
+++ b/gtk2_ardour/export_channel_selector.cc
@@ -40,6 +40,12 @@ using namespace Glib;
using namespace ARDOUR;
using namespace PBD;
+struct EditorOrderRouteSorter {
+ bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
+ return a->order_key () < b->order_key ();
+ }
+};
+
PortExportChannelSelector::PortExportChannelSelector (ARDOUR::Session * session, ProfileManagerPtr manager) :
ExportChannelSelector (session, manager),
channels_label (_("Channels:"), Gtk::ALIGN_LEFT),
@@ -115,6 +121,8 @@ PortExportChannelSelector::fill_route_list ()
channel_view.add_route (master);
}
+ routes.sort (EditorOrderRouteSorter ());
+
for (RouteList::iterator it = routes.begin(); it != routes.end(); ++it) {
if ((*it)->is_master () || (*it)->is_monitor ()) {
continue;
@@ -539,8 +547,7 @@ RegionExportChannelSelector::handle_selection ()
TrackExportChannelSelector::TrackExportChannelSelector (ARDOUR::Session * session, ProfileManagerPtr manager)
: ExportChannelSelector(session, manager)
- , region_contents_button(source_group, _("Export region contents"))
- , track_output_button(source_group, _("Export track output"))
+ , track_output_button(_("Apply track/bus processing"))
, select_tracks_button (_("Select all tracks"))
, select_busses_button (_("Select all busses"))
, select_none_button (_("Deselect all"))
@@ -548,7 +555,6 @@ TrackExportChannelSelector::TrackExportChannelSelector (ARDOUR::Session * sessio
pack_start(main_layout);
// Options
- options_box.pack_start(region_contents_button);
options_box.pack_start(track_output_button);
options_box.pack_start (select_tracks_button);
options_box.pack_start (select_busses_button);
@@ -588,6 +594,8 @@ TrackExportChannelSelector::TrackExportChannelSelector (ARDOUR::Session * sessio
select_busses_button.signal_clicked().connect (sigc::mem_fun (*this, &TrackExportChannelSelector::select_busses));
select_none_button.signal_clicked().connect (sigc::mem_fun (*this, &TrackExportChannelSelector::select_none));
+ track_output_button.signal_clicked().connect (sigc::mem_fun (*this, &TrackExportChannelSelector::track_outputs_selected));
+
fill_list();
show_all_children ();
@@ -639,6 +647,12 @@ TrackExportChannelSelector::select_none ()
}
void
+TrackExportChannelSelector::track_outputs_selected ()
+{
+ update_config();
+}
+
+void
TrackExportChannelSelector::fill_list()
{
track_list->clear();
@@ -716,6 +730,7 @@ TrackExportChannelSelector::update_config()
}
state->config->set_name (route->name());
+
}
CriticalSelectionChanged ();
diff --git a/gtk2_ardour/export_channel_selector.h b/gtk2_ardour/export_channel_selector.h
index aa9999a..6dd770c 100644
--- a/gtk2_ardour/export_channel_selector.h
+++ b/gtk2_ardour/export_channel_selector.h
@@ -263,15 +263,15 @@ class TrackExportChannelSelector : public ExportChannelSelector
Gtk::ScrolledWindow track_scroller;
Gtk::HBox options_box;
- Gtk::RadioButton::Group source_group;
- Gtk::RadioButton region_contents_button;
- Gtk::RadioButton track_output_button;
+ Gtk::CheckButton track_output_button;
Gtk::Button select_tracks_button;
Gtk::Button select_busses_button;
Gtk::Button select_none_button;
void select_tracks ();
void select_busses ();
void select_none ();
+
+ void track_outputs_selected ();
};
#endif /* __export_channel_selector_h__ */
diff --git a/gtk2_ardour/macosx/tracks.xcodeproj/project.pbxproj b/gtk2_ardour/macosx/tracks.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..2d5ae13
--- /dev/null
+++ b/gtk2_ardour/macosx/tracks.xcodeproj/project.pbxproj
@@ -0,0 +1,2987 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 43279248194EFFF1003C9FEA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43279247194EFFF1003C9FEA /* Cocoa.framework */; };
+ 43279252194EFFF1003C9FEA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 43279250194EFFF1003C9FEA /* InfoPlist.strings */; };
+ 43279254194EFFF1003C9FEA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 43279253194EFFF1003C9FEA /* main.m */; };
+ 43279258194EFFF1003C9FEA /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 43279256194EFFF1003C9FEA /* Credits.rtf */; };
+ 4327925B194EFFF1003C9FEA /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4327925A194EFFF1003C9FEA /* AppDelegate.m */; };
+ 4327925E194EFFF1003C9FEA /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4327925C194EFFF1003C9FEA /* MainMenu.xib */; };
+ 43279331194F003A003C9FEA /* act-disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279263194F0039003C9FEA /* act-disabled.png */; };
+ 43279332194F003A003C9FEA /* add.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279264194F0039003C9FEA /* add.png */; };
+ 43279333194F003A003C9FEA /* application-x-ardour_16px.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279265194F0039003C9FEA /* application-x-ardour_16px.png */; };
+ 43279334194F003A003C9FEA /* application-x-ardour_22px.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279266194F0039003C9FEA /* application-x-ardour_22px.png */; };
+ 43279335194F003A003C9FEA /* application-x-ardour_32px.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279267194F0039003C9FEA /* application-x-ardour_32px.png */; };
+ 43279336194F003A003C9FEA /* application-x-ardour_48px.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279268194F0039003C9FEA /* application-x-ardour_48px.png */; };
+ 43279337194F003A003C9FEA /* ardour-app-icon_osx.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279269194F0039003C9FEA /* ardour-app-icon_osx.png */; };
+ 43279338194F003A003C9FEA /* ardour-app-icon_osx_mask.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327926A194F0039003C9FEA /* ardour-app-icon_osx_mask.png */; };
+ 43279339194F003A003C9FEA /* ardour_icon_16px.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327926B194F0039003C9FEA /* ardour_icon_16px.png */; };
+ 4327933A194F003A003C9FEA /* ardour_icon_22px.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327926C194F0039003C9FEA /* ardour_icon_22px.png */; };
+ 4327933B194F003A003C9FEA /* ardour_icon_256px.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327926D194F0039003C9FEA /* ardour_icon_256px.png */; };
+ 4327933C194F003A003C9FEA /* ardour_icon_32px.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327926E194F0039003C9FEA /* ardour_icon_32px.png */; };
+ 4327933D194F003A003C9FEA /* ardour_icon_48px.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327926F194F0039003C9FEA /* ardour_icon_48px.png */; };
+ 4327933E194F003A003C9FEA /* chord.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279270194F0039003C9FEA /* chord.png */; };
+ 4327933F194F003A003C9FEA /* close.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279271194F0039003C9FEA /* close.png */; };
+ 43279340194F003A003C9FEA /* computer_keyboard.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279272194F0039003C9FEA /* computer_keyboard.png */; };
+ 43279341194F003A003C9FEA /* computer_keyboard_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279273194F0039003C9FEA /* computer_keyboard_active.png */; };
+ 43279342194F003A003C9FEA /* display_clock_mockup.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279274194F0039003C9FEA /* display_clock_mockup.png */; };
+ 43279343194F003A003C9FEA /* display_metrics_mockup.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279275194F0039003C9FEA /* display_metrics_mockup.png */; };
+ 43279344194F003A003C9FEA /* eighthnote.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279276194F0039003C9FEA /* eighthnote.png */; };
+ 43279345194F003A003C9FEA /* expand_left_right_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279277194F0039003C9FEA /* expand_left_right_cursor.png */; };
+ 43279346194F003A003C9FEA /* expand_up_down_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279278194F0039003C9FEA /* expand_up_down_cursor.png */; };
+ 43279347194F003A003C9FEA /* export_icons.sh in Resources */ = {isa = PBXBuildFile; fileRef = 43279279194F0039003C9FEA /* export_icons.sh */; };
+ 43279348194F003A003C9FEA /* fade_in_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327927A194F0039003C9FEA /* fade_in_cursor.png */; };
+ 43279349194F003A003C9FEA /* fade_out_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327927B194F0039003C9FEA /* fade_out_cursor.png */; };
+ 4327934A194F003A003C9FEA /* fadein-constant-power.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327927C194F0039003C9FEA /* fadein-constant-power.png */; };
+ 4327934B194F003A003C9FEA /* fadein-fast-cut.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327927D194F0039003C9FEA /* fadein-fast-cut.png */; };
+ 4327934C194F003A003C9FEA /* fadein-linear.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327927E194F0039003C9FEA /* fadein-linear.png */; };
+ 4327934D194F003A003C9FEA /* fadein-long-cut.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327927F194F0039003C9FEA /* fadein-long-cut.png */; };
+ 4327934E194F003A003C9FEA /* fadein-S1.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279280194F0039003C9FEA /* fadein-S1.png */; };
+ 4327934F194F003A003C9FEA /* fadein-S2.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279281194F0039003C9FEA /* fadein-S2.png */; };
+ 43279350194F003A003C9FEA /* fadein-short-cut.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279282194F0039003C9FEA /* fadein-short-cut.png */; };
+ 43279351194F003A003C9FEA /* fadein-slow-cut.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279283194F0039003C9FEA /* fadein-slow-cut.png */; };
+ 43279352194F003A003C9FEA /* fadeout-constant-power.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279284194F0039003C9FEA /* fadeout-constant-power.png */; };
+ 43279353194F003A003C9FEA /* fadeout-fast-cut.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279285194F0039003C9FEA /* fadeout-fast-cut.png */; };
+ 43279354194F003A003C9FEA /* fadeout-linear.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279286194F0039003C9FEA /* fadeout-linear.png */; };
+ 43279355194F003A003C9FEA /* fadeout-long-cut.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279287194F0039003C9FEA /* fadeout-long-cut.png */; };
+ 43279356194F003A003C9FEA /* fadeout-S1.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279288194F0039003C9FEA /* fadeout-S1.png */; };
+ 43279357194F003A003C9FEA /* fadeout-S2.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279289194F0039003C9FEA /* fadeout-S2.png */; };
+ 43279358194F003A003C9FEA /* fadeout-short-cut.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327928A194F0039003C9FEA /* fadeout-short-cut.png */; };
+ 43279359194F003A003C9FEA /* fadeout-slow-cut.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327928B194F0039003C9FEA /* fadeout-slow-cut.png */; };
+ 4327935A194F003A003C9FEA /* fader_belt.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327928C194F0039003C9FEA /* fader_belt.png */; };
+ 4327935B194F003A003C9FEA /* fader_belt_desensitised.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327928D194F0039003C9FEA /* fader_belt_desensitised.png */; };
+ 4327935C194F003A003C9FEA /* fader_belt_h.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327928E194F0039003C9FEA /* fader_belt_h.png */; };
+ 4327935D194F003A003C9FEA /* fader_belt_h_desensitised.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327928F194F0039003C9FEA /* fader_belt_h_desensitised.png */; };
+ 4327935E194F003A003C9FEA /* fader_belt_h_medium.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279290194F0039003C9FEA /* fader_belt_h_medium.png */; };
+ 4327935F194F003A003C9FEA /* fader_belt_h_medium_desensitised.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279291194F0039003C9FEA /* fader_belt_h_medium_desensitised.png */; };
+ 43279360194F003A003C9FEA /* fader_belt_h_thin.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279292194F0039003C9FEA /* fader_belt_h_thin.png */; };
+ 43279361194F003A003C9FEA /* fader_belt_h_thin_desensitised.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279293194F0039003C9FEA /* fader_belt_h_thin_desensitised.png */; };
+ 43279362194F003A003C9FEA /* fader_handle.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279294194F0039003C9FEA /* fader_handle.png */; };
+ 43279363194F003A003C9FEA /* ferret_02.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279295194F0039003C9FEA /* ferret_02.png */; };
+ 43279364194F003A003C9FEA /* forte.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279296194F0039003C9FEA /* forte.png */; };
+ 43279365194F003A003C9FEA /* fortissimo.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279297194F0039003C9FEA /* fortissimo.png */; };
+ 43279366194F003A003C9FEA /* fortississimo.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279298194F0039003C9FEA /* fortississimo.png */; };
+ 43279367194F003A003C9FEA /* grabber.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279299194F0039003C9FEA /* grabber.png */; };
+ 43279368194F003A003C9FEA /* grabber_edit_point.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327929A194F0039003C9FEA /* grabber_edit_point.png */; };
+ 43279369194F003A003C9FEA /* grabber_note.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327929B194F0039003C9FEA /* grabber_note.png */; };
+ 4327936A194F003A003C9FEA /* halfnote.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327929C194F0039003C9FEA /* halfnote.png */; };
+ 4327936B194F003A003C9FEA /* hide.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327929D194F0039003C9FEA /* hide.png */; };
+ 4327936C194F003A003C9FEA /* horizontal_zoom_fader_face.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327929E194F0039003C9FEA /* horizontal_zoom_fader_face.png */; };
+ 4327936D194F003A003C9FEA /* i_beam_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327929F194F0039003C9FEA /* i_beam_cursor.png */; };
+ 4327936E194F003A003C9FEA /* inspector_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792A0194F0039003C9FEA /* inspector_on.png */; };
+ 4327936F194F003A003C9FEA /* inspector_on_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792A1194F0039003C9FEA /* inspector_on_active.png */; };
+ 43279370194F003A003C9FEA /* inspector_on_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792A2194F0039003C9FEA /* inspector_on_prelight.png */; };
+ 43279371194F003A003C9FEA /* join_tools.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792A3194F0039003C9FEA /* join_tools.png */; };
+ 43279372194F003A003C9FEA /* knob.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792A4194F0039003C9FEA /* knob.png */; };
+ 43279373194F003A003C9FEA /* lock_session.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792A5194F0039003C9FEA /* lock_session.png */; };
+ 43279374194F003A003C9FEA /* lock_session_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792A6194F0039003C9FEA /* lock_session_active.png */; };
+ 43279375194F003A003C9FEA /* lock_session_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792A7194F0039003C9FEA /* lock_session_prelight.png */; };
+ 43279376194F003A003C9FEA /* media_button.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792A8194F0039003C9FEA /* media_button.png */; };
+ 43279377194F003A003C9FEA /* media_button_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792A9194F0039003C9FEA /* media_button_active.png */; };
+ 43279378194F003A003C9FEA /* media_button_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792AA194F0039003C9FEA /* media_button_prelight.png */; };
+ 43279379194F003A003C9FEA /* meter_bridge_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792AB194F0039003C9FEA /* meter_bridge_on.png */; };
+ 4327937A194F003A003C9FEA /* meter_bridge_on_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792AC194F0039003C9FEA /* meter_bridge_on_active.png */; };
+ 4327937B194F003A003C9FEA /* meter_bridge_on_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792AD194F0039003C9FEA /* meter_bridge_on_prelight.png */; };
+ 4327937C194F003A003C9FEA /* metronome.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792AE194F0039003C9FEA /* metronome.png */; };
+ 4327937D194F003A003C9FEA /* mezzforte.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792AF194F0039003C9FEA /* mezzforte.png */; };
+ 4327937E194F003A003C9FEA /* mezzoforte.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792B0194F0039003C9FEA /* mezzoforte.png */; };
+ 4327937F194F003A003C9FEA /* mezzopiano.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792B1194F0039003C9FEA /* mezzopiano.png */; };
+ 43279380194F003A003C9FEA /* midi-input-active.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792B2194F0039003C9FEA /* midi-input-active.png */; };
+ 43279381194F003A003C9FEA /* midi-input-inactive.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792B3194F0039003C9FEA /* midi-input-inactive.png */; };
+ 43279382194F003A003C9FEA /* midi_panic.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792B4194F0039003C9FEA /* midi_panic.png */; };
+ 43279383194F003A003C9FEA /* midi_socket_small.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792B5194F0039003C9FEA /* midi_socket_small.png */; };
+ 43279384194F003A003C9FEA /* midi_sound_notes.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792B6194F0039003C9FEA /* midi_sound_notes.png */; };
+ 43279385194F003A003C9FEA /* midi_tool_erase.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792B7194F0039003C9FEA /* midi_tool_erase.png */; };
+ 43279386194F003A003C9FEA /* midi_tool_pencil.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792B8194F0039003C9FEA /* midi_tool_pencil.png */; };
+ 43279387194F003A003C9FEA /* midi_tool_select.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792B9194F0039003C9FEA /* midi_tool_select.png */; };
+ 43279388194F003A003C9FEA /* mixer_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792BA194F0039003C9FEA /* mixer_on.png */; };
+ 43279389194F003A003C9FEA /* mixer_on_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792BB194F0039003C9FEA /* mixer_on_active.png */; };
+ 4327938A194F003A003C9FEA /* mixer_on_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792BC194F0039003C9FEA /* mixer_on_prelight.png */; };
+ 4327938B194F003A003C9FEA /* mode_multi_out.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792BD194F0039003C9FEA /* mode_multi_out.png */; };
+ 4327938C194F003A003C9FEA /* mode_multi_out_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792BE194F0039003C9FEA /* mode_multi_out_active.png */; };
+ 4327938D194F003A003C9FEA /* mode_multi_out_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792BF194F0039003C9FEA /* mode_multi_out_prelight.png */; };
+ 4327938E194F003A003C9FEA /* mode_stereo_out.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792C0194F0039003C9FEA /* mode_stereo_out.png */; };
+ 4327938F194F003A003C9FEA /* mode_stereo_out_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792C1194F0039003C9FEA /* mode_stereo_out_active.png */; };
+ 43279390194F003A003C9FEA /* mode_stereo_out_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792C2194F0039003C9FEA /* mode_stereo_out_prelight.png */; };
+ 43279391194F003A003C9FEA /* move_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792C3194F0039003C9FEA /* move_cursor.png */; };
+ 43279392194F003A003C9FEA /* mute-disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792C4194F0039003C9FEA /* mute-disabled.png */; };
+ 43279393194F003A003C9FEA /* mute-enabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792C5194F0039003C9FEA /* mute-enabled.png */; };
+ 43279394194F003A003C9FEA /* muted-by-others.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792C6194F0039003C9FEA /* muted-by-others.png */; };
+ 43279395194F003A003C9FEA /* nudge_left.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792C7194F0039003C9FEA /* nudge_left.png */; };
+ 43279396194F003A003C9FEA /* nudge_right.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792C8194F0039003C9FEA /* nudge_right.png */; };
+ 43279397194F003A003C9FEA /* pianissimo.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792C9194F0039003C9FEA /* pianissimo.png */; };
+ 43279398194F003A003C9FEA /* pianississimo.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792CA194F0039003C9FEA /* pianississimo.png */; };
+ 43279399194F003A003C9FEA /* piano.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792CB194F0039003C9FEA /* piano.png */; };
+ 4327939A194F003A003C9FEA /* quarternote.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792CC194F0039003C9FEA /* quarternote.png */; };
+ 4327939B194F003A003C9FEA /* rec-enabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792CD194F0039003C9FEA /* rec-enabled.png */; };
+ 4327939C194F003A003C9FEA /* rec-in-progress.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792CE194F0039003C9FEA /* rec-in-progress.png */; };
+ 4327939D194F003A003C9FEA /* record-normal-disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792CF194F0039003C9FEA /* record-normal-disabled.png */; };
+ 4327939E194F003A003C9FEA /* record-normal-enabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792D0194F0039003C9FEA /* record-normal-enabled.png */; };
+ 4327939F194F003A003C9FEA /* record-normal-in-progress.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792D1194F0039003C9FEA /* record-normal-in-progress.png */; };
+ 432793A0194F003A003C9FEA /* record-step.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792D2194F0039003C9FEA /* record-step.png */; };
+ 432793A1194F003A003C9FEA /* record_disabled_grey.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792D3194F0039003C9FEA /* record_disabled_grey.png */; };
+ 432793A2194F003A003C9FEA /* record_normal_red.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792D4194F0039003C9FEA /* record_normal_red.png */; };
+ 432793A3194F003A003C9FEA /* record_tape_red.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792D5194F0039003C9FEA /* record_tape_red.png */; };
+ 432793A4194F003A003C9FEA /* resize_bottom_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792D6194F0039003C9FEA /* resize_bottom_cursor.png */; };
+ 432793A5194F003A003C9FEA /* resize_bottom_left_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792D7194F0039003C9FEA /* resize_bottom_left_cursor.png */; };
+ 432793A6194F003A003C9FEA /* resize_bottom_right_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792D8194F0039003C9FEA /* resize_bottom_right_cursor.png */; };
+ 432793A7194F003A003C9FEA /* resize_left_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792D9194F0039003C9FEA /* resize_left_cursor.png */; };
+ 432793A8194F003A003C9FEA /* resize_right_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792DA194F0039003C9FEA /* resize_right_cursor.png */; };
+ 432793A9194F003A003C9FEA /* resize_top_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792DB194F0039003C9FEA /* resize_top_cursor.png */; };
+ 432793AA194F003A003C9FEA /* resize_top_left_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792DC194F0039003C9FEA /* resize_top_left_cursor.png */; };
+ 432793AB194F003A003C9FEA /* resize_top_right_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792DD194F0039003C9FEA /* resize_top_right_cursor.png */; };
+ 432793AC194F003A003C9FEA /* sae.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792DE194F0039003C9FEA /* sae.png */; };
+ 432793AD194F003A003C9FEA /* sessionlock.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792DF194F0039003C9FEA /* sessionlock.png */; };
+ 432793AE194F003A003C9FEA /* sixteenthnote.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792E0194F0039003C9FEA /* sixteenthnote.png */; };
+ 432793AF194F003A003C9FEA /* sixtyfourthnote.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792E1194F0039003C9FEA /* sixtyfourthnote.png */; };
+ 432793B0194F003A003C9FEA /* slider_controller_fader.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792E2194F0039003C9FEA /* slider_controller_fader.png */; };
+ 432793B1194F003A003C9FEA /* slider_controller_fader_handle.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792E3194F0039003C9FEA /* slider_controller_fader_handle.png */; };
+ 432793B2194F003A003C9FEA /* solo-disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792E4194F0039003C9FEA /* solo-disabled.png */; };
+ 432793B3194F003A003C9FEA /* solo-enabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792E5194F0039003C9FEA /* solo-enabled.png */; };
+ 432793B4194F003A003C9FEA /* solo-isolate-disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792E6194F0039003C9FEA /* solo-isolate-disabled.png */; };
+ 432793B5194F003A003C9FEA /* solo-isolate-enabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792E7194F0039003C9FEA /* solo-isolate-enabled.png */; };
+ 432793B6194F003A003C9FEA /* solo-isolated.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792E8194F0039003C9FEA /* solo-isolated.png */; };
+ 432793B7194F003A003C9FEA /* solo-safe-disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792E9194F0039003C9FEA /* solo-safe-disabled.png */; };
+ 432793B8194F003A003C9FEA /* solo-safe-enabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792EA194F0039003C9FEA /* solo-safe-enabled.png */; };
+ 432793B9194F003A003C9FEA /* solo-safe-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792EB194F0039003C9FEA /* solo-safe-icon.png */; };
+ 432793BA194F003A003C9FEA /* soloed-by-others.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792EC194F0039003C9FEA /* soloed-by-others.png */; };
+ 432793BB194F003A003C9FEA /* step-editing.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792ED194F0039003C9FEA /* step-editing.png */; };
+ 432793BC194F003A003C9FEA /* strip_width.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792EE194F0039003C9FEA /* strip_width.png */; };
+ 432793BD194F003A003C9FEA /* systemlock.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792EF194F0039003C9FEA /* systemlock.png */; };
+ 432793BE194F003A003C9FEA /* tav_exp.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792F0194F0039003C9FEA /* tav_exp.png */; };
+ 432793BF194F003A003C9FEA /* tav_shrink.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792F1194F0039003C9FEA /* tav_shrink.png */; };
+ 432793C0194F003A003C9FEA /* thirtysecondnote.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792F2194F0039003C9FEA /* thirtysecondnote.png */; };
+ 432793C1194F003A003C9FEA /* tool_arrow.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792F3194F0039003C9FEA /* tool_arrow.png */; };
+ 432793C2194F003A003C9FEA /* tool_arrow_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792F4194F0039003C9FEA /* tool_arrow_active.png */; };
+ 432793C3194F003A003C9FEA /* tool_arrow_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792F5194F0039003C9FEA /* tool_arrow_prelight.png */; };
+ 432793C4194F003A003C9FEA /* tool_audition.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792F6194F0039003C9FEA /* tool_audition.png */; };
+ 432793C5194F003A003C9FEA /* tool_cut.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792F7194F0039003C9FEA /* tool_cut.png */; };
+ 432793C6194F003A003C9FEA /* tool_cut_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792F8194F0039003C9FEA /* tool_cut_active.png */; };
+ 432793C7194F003A003C9FEA /* tool_cut_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792F9194F0039003C9FEA /* tool_cut_prelight.png */; };
+ 432793C8194F003A003C9FEA /* tool_gain.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792FA194F0039003C9FEA /* tool_gain.png */; };
+ 432793C9194F003A003C9FEA /* tool_marker.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792FB194F0039003C9FEA /* tool_marker.png */; };
+ 432793CA194F003A003C9FEA /* tool_marker_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792FC194F0039003C9FEA /* tool_marker_active.png */; };
+ 432793CB194F003A003C9FEA /* tool_marker_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792FD194F0039003C9FEA /* tool_marker_prelight.png */; };
+ 432793CC194F003A003C9FEA /* tool_note.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792FE194F0039003C9FEA /* tool_note.png */; };
+ 432793CD194F003A003C9FEA /* tool_object.png in Resources */ = {isa = PBXBuildFile; fileRef = 432792FF194F0039003C9FEA /* tool_object.png */; };
+ 432793CE194F003A003C9FEA /* tool_object_range.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279300194F0039003C9FEA /* tool_object_range.png */; };
+ 432793CF194F003A003C9FEA /* tool_range.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279301194F0039003C9FEA /* tool_range.png */; };
+ 432793D0194F003A003C9FEA /* tool_stretch.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279302194F0039003C9FEA /* tool_stretch.png */; };
+ 432793D1194F003A003C9FEA /* tool_waveform_zoom.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279303194F0039003C9FEA /* tool_waveform_zoom.png */; };
+ 432793D2194F003A003C9FEA /* tool_waveform_zoom_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279304194F0039003C9FEA /* tool_waveform_zoom_active.png */; };
+ 432793D3194F003A003C9FEA /* tool_waveform_zoom_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279305194F0039003C9FEA /* tool_waveform_zoom_prelight.png */; };
+ 432793D4194F003A003C9FEA /* tool_zoom.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279306194F0039003C9FEA /* tool_zoom.png */; };
+ 432793D5194F003A003C9FEA /* tool_zoom_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279307194F0039003C9FEA /* tool_zoom_active.png */; };
+ 432793D6194F003A003C9FEA /* tool_zoom_ardour.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279308194F0039003C9FEA /* tool_zoom_ardour.png */; };
+ 432793D7194F003A003C9FEA /* tool_zoom_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279309194F0039003C9FEA /* tool_zoom_prelight.png */; };
+ 432793D8194F003A003C9FEA /* tracks.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327930A194F003A003C9FEA /* tracks.png */; };
+ 432793D9194F003A003C9FEA /* tracks_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327930B194F003A003C9FEA /* tracks_active.png */; };
+ 432793DA194F003A003C9FEA /* tracks_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327930C194F003A003C9FEA /* tracks_prelight.png */; };
+ 432793DB194F003A003C9FEA /* transport_end.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327930D194F003A003C9FEA /* transport_end.png */; };
+ 432793DC194F003A003C9FEA /* transport_end_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327930E194F003A003C9FEA /* transport_end_active.png */; };
+ 432793DD194F003A003C9FEA /* transport_end_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327930F194F003A003C9FEA /* transport_end_prelight.png */; };
+ 432793DE194F003A003C9FEA /* transport_loop.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279310194F003A003C9FEA /* transport_loop.png */; };
+ 432793DF194F003A003C9FEA /* transport_loop_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279311194F003A003C9FEA /* transport_loop_active.png */; };
+ 432793E0194F003A003C9FEA /* transport_loop_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279312194F003A003C9FEA /* transport_loop_prelight.png */; };
+ 432793E1194F003A003C9FEA /* transport_play.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279313194F003A003C9FEA /* transport_play.png */; };
+ 432793E2194F003A003C9FEA /* transport_play_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279314194F003A003C9FEA /* transport_play_active.png */; };
+ 432793E3194F003A003C9FEA /* transport_play_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279315194F003A003C9FEA /* transport_play_prelight.png */; };
+ 432793E4194F003A003C9FEA /* transport_range.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279316194F003A003C9FEA /* transport_range.png */; };
+ 432793E5194F003A003C9FEA /* transport_record.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279317194F003A003C9FEA /* transport_record.png */; };
+ 432793E6194F003A003C9FEA /* transport_record_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279318194F003A003C9FEA /* transport_record_active.png */; };
+ 432793E7194F003A003C9FEA /* transport_record_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279319194F003A003C9FEA /* transport_record_prelight.png */; };
+ 432793E8194F003A003C9FEA /* transport_start.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327931A194F003A003C9FEA /* transport_start.png */; };
+ 432793E9194F003A003C9FEA /* transport_start_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327931B194F003A003C9FEA /* transport_start_active.png */; };
+ 432793EA194F003A003C9FEA /* transport_start_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327931C194F003A003C9FEA /* transport_start_prelight.png */; };
+ 432793EB194F003A003C9FEA /* transport_stop.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327931D194F003A003C9FEA /* transport_stop.png */; };
+ 432793EC194F003A003C9FEA /* transport_stop_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327931E194F003A003C9FEA /* transport_stop_active.png */; };
+ 432793ED194F003A003C9FEA /* transport_stop_prelight.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327931F194F003A003C9FEA /* transport_stop_prelight.png */; };
+ 432793EE194F003A003C9FEA /* trim_bottom_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279320194F003A003C9FEA /* trim_bottom_cursor.png */; };
+ 432793EF194F003A003C9FEA /* trim_left_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279321194F003A003C9FEA /* trim_left_cursor.png */; };
+ 432793F0194F003A003C9FEA /* trim_left_cursor_5.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279322194F003A003C9FEA /* trim_left_cursor_5.png */; };
+ 432793F1194F003A003C9FEA /* trim_left_cursor_right_only.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279323194F003A003C9FEA /* trim_left_cursor_right_only.png */; };
+ 432793F2194F003A003C9FEA /* trim_right_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279324194F003A003C9FEA /* trim_right_cursor.png */; };
+ 432793F3194F003A003C9FEA /* trim_right_cursor_5.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279325194F003A003C9FEA /* trim_right_cursor_5.png */; };
+ 432793F4194F003A003C9FEA /* trim_right_cursor_left_only.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279326194F003A003C9FEA /* trim_right_cursor_left_only.png */; };
+ 432793F5194F003A003C9FEA /* trim_top_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279327194F003A003C9FEA /* trim_top_cursor.png */; };
+ 432793F6194F003A003C9FEA /* vertical_zoom_fader_face.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279328194F003A003C9FEA /* vertical_zoom_fader_face.png */; };
+ 432793F7194F003A003C9FEA /* wholenote.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279329194F003A003C9FEA /* wholenote.png */; };
+ 432793F8194F003A003C9FEA /* zoom_fader_handle.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327932A194F003A003C9FEA /* zoom_fader_handle.png */; };
+ 432793F9194F003A003C9FEA /* zoom_fader_handle_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327932B194F003A003C9FEA /* zoom_fader_handle_active.png */; };
+ 432793FA194F003A003C9FEA /* zoom_full.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327932C194F003A003C9FEA /* zoom_full.png */; };
+ 432793FB194F003A003C9FEA /* zoom_in.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327932D194F003A003C9FEA /* zoom_in.png */; };
+ 432793FC194F003A003C9FEA /* zoom_in_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327932E194F003A003C9FEA /* zoom_in_cursor.png */; };
+ 432793FD194F003A003C9FEA /* zoom_out.png in Resources */ = {isa = PBXBuildFile; fileRef = 4327932F194F003A003C9FEA /* zoom_out.png */; };
+ 432793FE194F003A003C9FEA /* zoom_out_cursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279330194F003A003C9FEA /* zoom_out_cursor.png */; };
+ 43279431194F0062003C9FEA /* forwardblarrow.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279400194F0062003C9FEA /* forwardblarrow.xpm */; };
+ 43279432194F0062003C9FEA /* h_meter_strip.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279401194F0062003C9FEA /* h_meter_strip.xpm */; };
+ 43279433194F0062003C9FEA /* hiin.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279402194F0062003C9FEA /* hiin.xpm */; };
+ 43279434194F0062003C9FEA /* hiout.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279403194F0062003C9FEA /* hiout.xpm */; };
+ 43279435194F0062003C9FEA /* hslider00.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279404194F0062003C9FEA /* hslider00.xpm */; };
+ 43279436194F0062003C9FEA /* hslider01.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279405194F0062003C9FEA /* hslider01.xpm */; };
+ 43279437194F0062003C9FEA /* left_arrow.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279406194F0062003C9FEA /* left_arrow.xpm */; };
+ 43279438194F0062003C9FEA /* linin.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279407194F0062003C9FEA /* linin.xpm */; };
+ 43279439194F0062003C9FEA /* linout.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279408194F0062003C9FEA /* linout.xpm */; };
+ 4327943A194F0062003C9FEA /* loin.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279409194F0062003C9FEA /* loin.xpm */; };
+ 4327943B194F0062003C9FEA /* loop.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 4327940A194F0062003C9FEA /* loop.xpm */; };
+ 4327943C194F0062003C9FEA /* loout.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 4327940B194F0062003C9FEA /* loout.xpm */; };
+ 4327943D194F0062003C9FEA /* lr.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 4327940C194F0062003C9FEA /* lr.xpm */; };
+ 4327943E194F0062003C9FEA /* regin.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 4327940D194F0062003C9FEA /* regin.xpm */; };
+ 4327943F194F0062003C9FEA /* regin2.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 4327940E194F0062003C9FEA /* regin2.xpm */; };
+ 43279440194F0062003C9FEA /* regout.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 4327940F194F0062003C9FEA /* regout.xpm */; };
+ 43279441194F0062003C9FEA /* regout2.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279410194F0062003C9FEA /* regout2.xpm */; };
+ 43279442194F0062003C9FEA /* revdblarrow.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279411194F0062003C9FEA /* revdblarrow.xpm */; };
+ 43279443194F0062003C9FEA /* right_arrow.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279412194F0062003C9FEA /* right_arrow.xpm */; };
+ 43279444194F0062003C9FEA /* set-next-button.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279413194F0062003C9FEA /* set-next-button.xpm */; };
+ 43279445194F0062003C9FEA /* small-round-button-01.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279414194F0062003C9FEA /* small-round-button-01.xpm */; };
+ 43279446194F0062003C9FEA /* small_x.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279415194F0062003C9FEA /* small_x.xpm */; };
+ 43279447194F0062003C9FEA /* toggle-button-00.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279416194F0062003C9FEA /* toggle-button-00.xpm */; };
+ 43279448194F0062003C9FEA /* toggle-button-01.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279417194F0062003C9FEA /* toggle-button-01.xpm */; };
+ 43279449194F0062003C9FEA /* tool_audition.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279418194F0062003C9FEA /* tool_audition.xpm */; };
+ 4327944A194F0062003C9FEA /* tool_gain.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279419194F0062003C9FEA /* tool_gain.xpm */; };
+ 4327944B194F0062003C9FEA /* tool_object.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 4327941A194F0062003C9FEA /* tool_object.xpm */; };
+ 4327944C194F0062003C9FEA /* tool_range.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 4327941B194F0062003C9FEA /* tool_range.xpm */; };
+ 4327944D194F0062003C9FEA /* tool_stretch.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 4327941C194F0062003C9FEA /* tool_stretch.xpm */; };
+ 4327944E194F0062003C9FEA /* tool_zoom.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 4327941D194F0062003C9FEA /* tool_zoom.xpm */; };
+ 4327944F194F0062003C9FEA /* v_meter_strip.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 4327941E194F0062003C9FEA /* v_meter_strip.xpm */; };
+ 43279450194F0062003C9FEA /* vslider00.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 4327941F194F0062003C9FEA /* vslider00.xpm */; };
+ 43279451194F0062003C9FEA /* vslider01.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279420194F0062003C9FEA /* vslider01.xpm */; };
+ 43279452194F0062003C9FEA /* vslider02_rail.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279421194F0062003C9FEA /* vslider02_rail.xpm */; };
+ 43279453194F0062003C9FEA /* vslider02_slider.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279422194F0062003C9FEA /* vslider02_slider.xpm */; };
+ 43279454194F0062003C9FEA /* vslider_slider_16wide.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279423194F0062003C9FEA /* vslider_slider_16wide.xpm */; };
+ 43279455194F0062003C9FEA /* zoom_full.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279424194F0062003C9FEA /* zoom_full.xpm */; };
+ 43279456194F0062003C9FEA /* zoom_in.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279425194F0062003C9FEA /* zoom_in.xpm */; };
+ 43279457194F0062003C9FEA /* zoom_out.xpm in Resources */ = {isa = PBXBuildFile; fileRef = 43279426194F0062003C9FEA /* zoom_out.xpm */; };
+ 43279458194F0062003C9FEA /* small-splash.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279427194F0062003C9FEA /* small-splash.png */; };
+ 43279459194F0062003C9FEA /* splash.png in Resources */ = {isa = PBXBuildFile; fileRef = 43279428194F0062003C9FEA /* splash.png */; };
+ 4327945A194F0062003C9FEA /* device_capture_control.xml in Resources */ = {isa = PBXBuildFile; fileRef = 4327942A194F0062003C9FEA /* device_capture_control.xml */; };
+ 4327945B194F0062003C9FEA /* device_playback_control.xml in Resources */ = {isa = PBXBuildFile; fileRef = 4327942B194F0062003C9FEA /* device_playback_control.xml */; };
+ 4327945C194F0062003C9FEA /* editor_window.xml in Resources */ = {isa = PBXBuildFile; fileRef = 4327942C194F0062003C9FEA /* editor_window.xml */; };
+ 4327945D194F0062003C9FEA /* midi_device_control.xml in Resources */ = {isa = PBXBuildFile; fileRef = 4327942D194F0062003C9FEA /* midi_device_control.xml */; };
+ 4327945E194F0062003C9FEA /* session_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 4327942E194F0062003C9FEA /* session_dialog.xml */; };
+ 4327945F194F0062003C9FEA /* session_lock_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 4327942F194F0062003C9FEA /* session_lock_dialog.xml */; };
+ 43279460194F0062003C9FEA /* tracks_preferences.xml in Resources */ = {isa = PBXBuildFile; fileRef = 43279430194F0062003C9FEA /* tracks_preferences.xml */; };
+ 4327947F194F009E003C9FEA /* tracks.menus.in in Resources */ = {isa = PBXBuildFile; fileRef = 43279475194F009E003C9FEA /* tracks.menus.in */; };
+ 43B351ED194F04E00038C140 /* step_editing.bindings in Resources */ = {isa = PBXBuildFile; fileRef = 43B351C0194F04E00038C140 /* step_editing.bindings */; };
+ 5BC24BAA1A64328D006A2400 /* trackslive.menus.in in Resources */ = {isa = PBXBuildFile; fileRef = 5BC24BA91A64328D006A2400 /* trackslive.menus.in */; };
+ 5BC67E591A408FCE00F29ABA /* progress_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 5BC67E581A408FCE00F29ABA /* progress_dialog.xml */; };
+ 5BC67E5F1A4090BD00F29ABA /* progress_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = 5BC67E5E1A4090BD00F29ABA /* progress_dialog.cc */; };
+ 95176F7A1A08E6E800E32046 /* file_sample_rate_mismatch_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95176F791A08E6E800E32046 /* file_sample_rate_mismatch_dialog.cc */; };
+ 95176F7E1A08E76F00E32046 /* file_sample_rate_mismatch_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95176F7D1A08E76F00E32046 /* file_sample_rate_mismatch_dialog.xml */; };
+ 952E0B3C1A0A1D7000F375D0 /* buildlog.txt in Resources */ = {isa = PBXBuildFile; fileRef = 952E0B3B1A0A1D7000F375D0 /* buildlog.txt */; };
+ 954DCFBD1A0239DA00B7160E /* about_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = 954DCFBC1A0239DA00B7160E /* about_dialog.cc */; };
+ 954DCFC11A023AAB00B7160E /* about_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 954DCFBF1A023AAB00B7160E /* about_dialog.xml */; };
+ 954DCFC21A023AAB00B7160E /* license_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 954DCFC01A023AAB00B7160E /* license_dialog.xml */; };
+ 954DCFDE1A07A14E00B7160E /* read_only_session_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 954DCFDD1A07A14E00B7160E /* read_only_session_dialog.xml */; };
+ 956D3F8A1A851805004F328C /* waves_import_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 956D3F891A851805004F328C /* waves_import_dialog.xml */; };
+ 957EF44B1A30BFB300F1500E /* waves_message_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = 957EF44A1A30BFB300F1500E /* waves_message_dialog.cc */; };
+ 95A134DE1A0239080008E3D6 /* license_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95A134DD1A0239080008E3D6 /* license_dialog.cc */; };
+ 95D1C51F1A78ED2100BE28DB /* waves_edit_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D1C51E1A78ED2100BE28DB /* waves_edit_dialog.cc */; };
+ 95D1C5211A78ED3A00BE28DB /* waves_edit_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D1C5201A78ED3A00BE28DB /* waves_edit_dialog.xml */; };
+ 95D4986E1AEA363E006E065D /* audio_engine_reset_info_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D4986B1AEA363E006E065D /* audio_engine_reset_info_dialog.xml */; };
+ 95D4986F1AEA363E006E065D /* crash_recovery_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D4986C1AEA363E006E065D /* crash_recovery_dialog.xml */; };
+ 95D498701AEA363E006E065D /* waves_save_template_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D4986D1AEA363E006E065D /* waves_save_template_dialog.xml */; };
+ 95D5D1371A8A514300407F98 /* waves_numeric_edit_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D5D1361A8A514300407F98 /* waves_numeric_edit_dialog.cc */; };
+ 95D5D1391A8A514300407F98 /* waves_numeric_edit_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D5D1381A8A514300407F98 /* waves_numeric_edit_dialog.xml */; };
+ 95D6A67C1A8E22E80030CDD0 /* waves_keyeditor.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D6A67A1A8E22E80030CDD0 /* waves_keyeditor.xml */; };
+ 95D71D551A4C66F600DE5B3B /* waves_track_color_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D71D541A4C66F600DE5B3B /* waves_track_color_dialog.cc */; };
+ 95D71D581A4C69AE00DE5B3B /* waves_track_color_dialog.logic.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D71D571A4C69AE00DE5B3B /* waves_track_color_dialog.logic.cc */; };
+ 95D795E81A7BB40C00120A4F /* marker_inspector_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D795DB1A7BB40C00120A4F /* marker_inspector_dialog.xml */; };
+ 95D795EA1A7BB40C00120A4F /* waves_export_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D795DD1A7BB40C00120A4F /* waves_export_dialog.xml */; };
+ 95D795EB1A7BB40C00120A4F /* waves_export_file_notebook_page.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D795DE1A7BB40C00120A4F /* waves_export_file_notebook_page.xml */; };
+ 95D795EC1A7BB40C00120A4F /* waves_export_file_notebook.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D795DF1A7BB40C00120A4F /* waves_export_file_notebook.xml */; };
+ 95D795ED1A7BB40C00120A4F /* waves_export_filename_selector.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D795E01A7BB40C00120A4F /* waves_export_filename_selector.xml */; };
+ 95D795EE1A7BB40C00120A4F /* waves_export_format_selector.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D795E11A7BB40C00120A4F /* waves_export_format_selector.xml */; };
+ 95D795EF1A7BB40C00120A4F /* waves_export_preset_selector.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D795E21A7BB40C00120A4F /* waves_export_preset_selector.xml */; };
+ 95D795F01A7BB40C00120A4F /* waves_export_timespan_selector.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D795E31A7BB40C00120A4F /* waves_export_timespan_selector.xml */; };
+ 95D795F11A7BB40C00120A4F /* waves_port_export_channel_selector.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D795E41A7BB40C00120A4F /* waves_port_export_channel_selector.xml */; };
+ 95D795F21A7BB40C00120A4F /* waves_region_export_channel_selector.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D795E51A7BB40C00120A4F /* waves_region_export_channel_selector.xml */; };
+ 95D795F31A7BB40C00120A4F /* waves_track_color_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D795E61A7BB40C00120A4F /* waves_track_color_dialog.xml */; };
+ 95D795F41A7BB40C00120A4F /* waves_track_export_channel_selector.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D795E71A7BB40C00120A4F /* waves_track_export_channel_selector.xml */; };
+ 95D7960B1A7BB9E000120A4F /* floating_text_entry.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D795FF1A7BB9E000120A4F /* floating_text_entry.cc */; };
+ 95D7960C1A7BB9E000120A4F /* marker_inspector_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D796001A7BB9E000120A4F /* marker_inspector_dialog.cc */; };
+ 95D7960D1A7BB9E000120A4F /* marker_inspector_dialog.logic.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D796011A7BB9E000120A4F /* marker_inspector_dialog.logic.cc */; };
+ 95D7960E1A7BB9E000120A4F /* route_inspector.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D796021A7BB9E000120A4F /* route_inspector.cc */; };
+ 95D7960F1A7BB9E000120A4F /* waves_export_channel_selector.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D796031A7BB9E000120A4F /* waves_export_channel_selector.cc */; };
+ 95D796101A7BB9E000120A4F /* waves_export_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D796041A7BB9E000120A4F /* waves_export_dialog.cc */; };
+ 95D796111A7BB9E000120A4F /* waves_export_file_notebook.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D796051A7BB9E000120A4F /* waves_export_file_notebook.cc */; };
+ 95D796121A7BB9E000120A4F /* waves_export_filename_selector.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D796061A7BB9E000120A4F /* waves_export_filename_selector.cc */; };
+ 95D796131A7BB9E000120A4F /* waves_export_format_selector.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D796071A7BB9E000120A4F /* waves_export_format_selector.cc */; };
+ 95D796141A7BB9E000120A4F /* waves_export_preset_selector.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D796081A7BB9E000120A4F /* waves_export_preset_selector.cc */; };
+ 95D796151A7BB9E000120A4F /* waves_export_timespan_selector.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D796091A7BB9E000120A4F /* waves_export_timespan_selector.cc */; };
+ 95D796161A7BB9E000120A4F /* waves_import_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D7960A1A7BB9E000120A4F /* waves_import_dialog.cc */; };
+ 95D9E3791A8D1B3B00A0DA46 /* waves_ambiguous_file_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D9E3771A8D1B3B00A0DA46 /* waves_ambiguous_file_dialog.xml */; };
+ 95D9E37A1A8D1B3B00A0DA46 /* waves_missing_file_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95D9E3781A8D1B3B00A0DA46 /* waves_missing_file_dialog.xml */; };
+ 95D9E37F1A8D1B6600A0DA46 /* waves_ambiguous_file_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D9E37D1A8D1B6600A0DA46 /* waves_ambiguous_file_dialog.cc */; };
+ 95D9E3801A8D1B6600A0DA46 /* waves_missing_file_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95D9E37E1A8D1B6600A0DA46 /* waves_missing_file_dialog.cc */; };
+ 95E2A7AB1A8F652F0080BD79 /* waves_radio_item.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95E2A7AA1A8F652F0080BD79 /* waves_radio_item.xml */; };
+ 95E5E9461AE946510000E2CE /* waves_tooltip.cc in Sources */ = {isa = PBXBuildFile; fileRef = 95E5E9451AE946510000E2CE /* waves_tooltip.cc */; };
+ 95F9DFD71A35A8BD0007E953 /* waves_message_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95F9DFD61A35A8BD0007E953 /* waves_message_dialog.xml */; };
+ 95F9DFE01A35F3310007E953 /* waves_clean_up_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95F9DFD81A35F3310007E953 /* waves_clean_up_dialog.xml */; };
+ 95F9DFE11A35F3310007E953 /* waves_connect_to_backend_error_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95F9DFD91A35F3310007E953 /* waves_connect_to_backend_error_dialog.xml */; };
+ 95F9DFE21A35F3310007E953 /* waves_excessive_split_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95F9DFDA1A35F3310007E953 /* waves_excessive_split_dialog.xml */; };
+ 95F9DFE41A35F3310007E953 /* waves_file_exists_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95F9DFDC1A35F3310007E953 /* waves_file_exists_dialog.xml */; };
+ 95F9DFE51A35F3310007E953 /* waves_how_to_import_dialog_1.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95F9DFDD1A35F3310007E953 /* waves_how_to_import_dialog_1.xml */; };
+ 95F9DFE61A35F3310007E953 /* waves_how_to_import_dialog_2.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95F9DFDE1A35F3310007E953 /* waves_how_to_import_dialog_2.xml */; };
+ 95F9DFE71A35F3310007E953 /* waves_route_rename_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = 95F9DFDF1A35F3310007E953 /* waves_route_rename_dialog.xml */; };
+ CE1A907A199A37AE00ECA62B /* add_tracks_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = CE1A9079199A37AE00ECA62B /* add_tracks_dialog.cc */; };
+ CE1C6DCE19879F04006BDB03 /* compact_meter_bridge.cc in Sources */ = {isa = PBXBuildFile; fileRef = CE1C6DCC19879F04006BDB03 /* compact_meter_bridge.cc */; };
+ CE1C6DCF19879F04006BDB03 /* compact_meter_strip.cc in Sources */ = {isa = PBXBuildFile; fileRef = CE1C6DCD19879F04006BDB03 /* compact_meter_strip.cc */; };
+ CE1C6DE01987A924006BDB03 /* master_bus_ui.cc in Sources */ = {isa = PBXBuildFile; fileRef = CE1C6DDF1987A924006BDB03 /* master_bus_ui.cc */; };
+ CE294C5F19CAD4E300D12768 /* add_tracks_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = CE294C5719CAD4E300D12768 /* add_tracks_dialog.xml */; };
+ CE294C6019CAD4E300D12768 /* compact_meter_bridge.xml in Resources */ = {isa = PBXBuildFile; fileRef = CE294C5819CAD4E300D12768 /* compact_meter_bridge.xml */; };
+ CE294C6119CAD4E300D12768 /* compact_meter_strip.xml in Resources */ = {isa = PBXBuildFile; fileRef = CE294C5919CAD4E300D12768 /* compact_meter_strip.xml */; };
+ CE294C6219CAD4E300D12768 /* marker_io_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = CE294C5A19CAD4E300D12768 /* marker_io_dialog.xml */; };
+ CE294C6319CAD4E300D12768 /* meter_bridge_view.xml in Resources */ = {isa = PBXBuildFile; fileRef = CE294C5B19CAD4E300D12768 /* meter_bridge_view.xml */; };
+ CE294C6419CAD4E300D12768 /* meter_strip_gain_meter.xml in Resources */ = {isa = PBXBuildFile; fileRef = CE294C5C19CAD4E300D12768 /* meter_strip_gain_meter.xml */; };
+ CE294C6519CAD4E300D12768 /* mixer_bridge_view.xml in Resources */ = {isa = PBXBuildFile; fileRef = CE294C5D19CAD4E300D12768 /* mixer_bridge_view.xml */; };
+ CE294C6619CAD4E300D12768 /* time_info_box.xml in Resources */ = {isa = PBXBuildFile; fileRef = CE294C5E19CAD4E300D12768 /* time_info_box.xml */; };
+ CE294C7519CAD54500D12768 /* marker_io_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = CE294C6B19CAD54500D12768 /* marker_io_dialog.cc */; };
+ CE294C7619CAD54500D12768 /* mixer_bridge_view.cc in Sources */ = {isa = PBXBuildFile; fileRef = CE294C6C19CAD54500D12768 /* mixer_bridge_view.cc */; };
+ CE294C7719CAD54500D12768 /* open_file_dialog_nix.cc in Sources */ = {isa = PBXBuildFile; fileRef = CE294C6D19CAD54500D12768 /* open_file_dialog_nix.cc */; };
+ CE294C7819CAD54500D12768 /* open_file_dialog_windows.cc in Sources */ = {isa = PBXBuildFile; fileRef = CE294C6E19CAD54500D12768 /* open_file_dialog_windows.cc */; };
+ CE294C7919CAD54500D12768 /* ruler_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = CE294C6F19CAD54500D12768 /* ruler_dialog.cc */; };
+ CE294C7A19CAD54500D12768 /* soundcloud_export_selector.cc in Sources */ = {isa = PBXBuildFile; fileRef = CE294C7019CAD54500D12768 /* soundcloud_export_selector.cc */; };
+ CE294C7B19CAD54500D12768 /* waves_dropdown.cc in Sources */ = {isa = PBXBuildFile; fileRef = CE294C7119CAD54500D12768 /* waves_dropdown.cc */; };
+ CE294C7C19CAD54500D12768 /* waves_grid.cc in Sources */ = {isa = PBXBuildFile; fileRef = CE294C7219CAD54500D12768 /* waves_grid.cc */; };
+ CE294C7D19CAD54500D12768 /* waves_zoom_control.cc in Sources */ = {isa = PBXBuildFile; fileRef = CE294C7319CAD54500D12768 /* waves_zoom_control.cc */; };
+ CEAFC770195445560016ACF0 /* bbt_time.cc in Sources */ = {isa = PBXBuildFile; fileRef = CEAFC76E195445560016ACF0 /* bbt_time.cc */; };
+ CEAFC771195445560016ACF0 /* time.cc in Sources */ = {isa = PBXBuildFile; fileRef = CEAFC76F195445560016ACF0 /* time.cc */; };
+ CEB0A9F219583F96006D269A /* session_close_dialog.cc in Sources */ = {isa = PBXBuildFile; fileRef = CEB0A9F119583F96006D269A /* session_close_dialog.cc */; };
+ CEB0A9F41958447C006D269A /* session_close_dialog.xml in Resources */ = {isa = PBXBuildFile; fileRef = CEB0A9F31958447C006D269A /* session_close_dialog.xml */; };
+ CEB9D791197516BE00B21780 /* audio_time_axis.xml in Resources */ = {isa = PBXBuildFile; fileRef = CEB9D787197516BE00B21780 /* audio_time_axis.xml */; };
+ CEB9D792197516BE00B21780 /* automation_time_axis.xml in Resources */ = {isa = PBXBuildFile; fileRef = CEB9D788197516BE00B21780 /* automation_time_axis.xml */; };
+ CEB9D793197516BE00B21780 /* editor_mixer.xml in Resources */ = {isa = PBXBuildFile; fileRef = CEB9D789197516BE00B21780 /* editor_mixer.xml */; };
+ CEB9D794197516BE00B21780 /* inspector_gain_meter.xml in Resources */ = {isa = PBXBuildFile; fileRef = CEB9D78A197516BE00B21780 /* inspector_gain_meter.xml */; };
+ CEB9D796197516BE00B21780 /* master_ui.xml in Resources */ = {isa = PBXBuildFile; fileRef = CEB9D78C197516BE00B21780 /* master_ui.xml */; };
+ CEB9D797197516BE00B21780 /* meter_strip.xml in Resources */ = {isa = PBXBuildFile; fileRef = CEB9D78D197516BE00B21780 /* meter_strip.xml */; };
+ CEB9D798197516BE00B21780 /* mixer_gain_meter.xml in Resources */ = {isa = PBXBuildFile; fileRef = CEB9D78E197516BE00B21780 /* mixer_gain_meter.xml */; };
+ CEB9D799197516BE00B21780 /* mixer_strip.xml in Resources */ = {isa = PBXBuildFile; fileRef = CEB9D78F197516BE00B21780 /* mixer_strip.xml */; };
+ CEB9D79A197516BE00B21780 /* track_header_gain_meter.xml in Resources */ = {isa = PBXBuildFile; fileRef = CEB9D790197516BE00B21780 /* track_header_gain_meter.xml */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 43B351F2194F12FB0038C140 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 43B351EE194F12FB0038C140 /* waves_audiobackend.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 43AA86DC194EECE000A67B56;
+ remoteInfo = waves_audiobackend;
+ };
+ 43B351F8194F130D0038C140 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 43B351F4194F130C0038C140 /* libardour.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 43AA82A9194EEAAF00A67B56;
+ remoteInfo = libardour;
+ };
+ 43B351FE194F131E0038C140 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 43B351FA194F131D0038C140 /* pbd.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 8D07F2C80486CC7A007CD1D0;
+ remoteInfo = pbd;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 43279043194EFFB9003C9FEA /* actions.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = actions.cc; path = ../actions.cc; sourceTree = SOURCE_ROOT; };
+ 43279045194EFFB9003C9FEA /* add_route_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = add_route_dialog.cc; path = ../add_route_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 43279047194EFFB9003C9FEA /* add_video_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = add_video_dialog.cc; path = ../add_video_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 43279049194EFFB9003C9FEA /* ambiguous_file_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ambiguous_file_dialog.cc; path = ../ambiguous_file_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 4327904B194EFFB9003C9FEA /* analysis_window.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = analysis_window.cc; path = ../analysis_window.cc; sourceTree = SOURCE_ROOT; };
+ 4327904D194EFFB9003C9FEA /* ardour_button.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ardour_button.cc; path = ../ardour_button.cc; sourceTree = SOURCE_ROOT; };
+ 4327904F194EFFB9003C9FEA /* ardour_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ardour_dialog.cc; path = ../ardour_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 43279051194EFFB9003C9FEA /* ardour_ui_dependents.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ardour_ui_dependents.cc; path = ../ardour_ui_dependents.cc; sourceTree = SOURCE_ROOT; };
+ 43279052194EFFB9003C9FEA /* ardour_ui_dialogs.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ardour_ui_dialogs.cc; path = ../ardour_ui_dialogs.cc; sourceTree = SOURCE_ROOT; };
+ 43279053194EFFB9003C9FEA /* ardour_ui_ed.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ardour_ui_ed.cc; path = ../ardour_ui_ed.cc; sourceTree = SOURCE_ROOT; };
+ 43279054194EFFB9003C9FEA /* ardour_ui_mixer.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ardour_ui_mixer.cc; path = ../ardour_ui_mixer.cc; sourceTree = SOURCE_ROOT; };
+ 43279055194EFFB9003C9FEA /* ardour_ui_options.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ardour_ui_options.cc; path = ../ardour_ui_options.cc; sourceTree = SOURCE_ROOT; };
+ 43279056194EFFB9003C9FEA /* ardour_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ardour_ui.cc; path = ../ardour_ui.cc; sourceTree = SOURCE_ROOT; };
+ 43279058194EFFB9003C9FEA /* ardour_ui2.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ardour_ui2.cc; path = ../ardour_ui2.cc; sourceTree = SOURCE_ROOT; };
+ 43279059194EFFB9003C9FEA /* ardour_window.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ardour_window.cc; path = ../ardour_window.cc; sourceTree = SOURCE_ROOT; };
+ 4327905C194EFFB9003C9FEA /* au_pluginui.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = au_pluginui.mm; path = ../au_pluginui.mm; sourceTree = SOURCE_ROOT; };
+ 4327905D194EFFB9003C9FEA /* audio_clock.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = audio_clock.cc; path = ../audio_clock.cc; sourceTree = SOURCE_ROOT; };
+ 4327905F194EFFB9003C9FEA /* audio_region_editor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = audio_region_editor.cc; path = ../audio_region_editor.cc; sourceTree = SOURCE_ROOT; };
+ 43279061194EFFB9003C9FEA /* audio_region_view.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = audio_region_view.cc; path = ../audio_region_view.cc; sourceTree = SOURCE_ROOT; };
+ 43279063194EFFB9003C9FEA /* audio_streamview.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = audio_streamview.cc; path = ../audio_streamview.cc; sourceTree = SOURCE_ROOT; };
+ 43279065194EFFB9003C9FEA /* audio_time_axis.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = audio_time_axis.cc; path = ../audio_time_axis.cc; sourceTree = SOURCE_ROOT; };
+ 43279067194EFFB9003C9FEA /* automation_controller.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = automation_controller.cc; path = ../automation_controller.cc; sourceTree = SOURCE_ROOT; };
+ 43279069194EFFB9003C9FEA /* automation_line.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = automation_line.cc; path = ../automation_line.cc; sourceTree = SOURCE_ROOT; };
+ 4327906B194EFFB9003C9FEA /* automation_region_view.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = automation_region_view.cc; path = ../automation_region_view.cc; sourceTree = SOURCE_ROOT; };
+ 4327906E194EFFB9003C9FEA /* automation_streamview.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = automation_streamview.cc; path = ../automation_streamview.cc; sourceTree = SOURCE_ROOT; };
+ 43279070194EFFB9003C9FEA /* automation_time_axis.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = automation_time_axis.cc; path = ../automation_time_axis.cc; sourceTree = SOURCE_ROOT; };
+ 43279072194EFFB9003C9FEA /* axis_view.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = axis_view.cc; path = ../axis_view.cc; sourceTree = SOURCE_ROOT; };
+ 43279074194EFFB9003C9FEA /* big_clock_window.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = big_clock_window.cc; path = ../big_clock_window.cc; sourceTree = SOURCE_ROOT; };
+ 43279076194EFFB9003C9FEA /* bundle_env_cocoa.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = bundle_env_cocoa.cc; path = ../bundle_env_cocoa.cc; sourceTree = SOURCE_ROOT; };
+ 43279077194EFFB9003C9FEA /* bundle_env_linux.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = bundle_env_linux.cc; path = ../bundle_env_linux.cc; sourceTree = SOURCE_ROOT; };
+ 43279078194EFFB9003C9FEA /* bundle_env_mingw.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = bundle_env_mingw.cc; path = ../bundle_env_mingw.cc; sourceTree = SOURCE_ROOT; };
+ 43279079194EFFB9003C9FEA /* bundle_env_msvc.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = bundle_env_msvc.cc; path = ../bundle_env_msvc.cc; sourceTree = SOURCE_ROOT; };
+ 4327907B194EFFB9003C9FEA /* bundle_manager.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = bundle_manager.cc; path = ../bundle_manager.cc; sourceTree = SOURCE_ROOT; };
+ 4327907D194EFFB9003C9FEA /* button_joiner.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = button_joiner.cc; path = ../button_joiner.cc; sourceTree = SOURCE_ROOT; };
+ 4327907F194EFFB9003C9FEA /* canvas_patch_change.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = canvas_patch_change.cc; path = ../canvas_patch_change.cc; sourceTree = SOURCE_ROOT; };
+ 43279081194EFFB9003C9FEA /* canvas-simpleline.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "canvas-simpleline.c"; path = "../canvas-simpleline.c"; sourceTree = SOURCE_ROOT; };
+ 43279082194EFFB9003C9FEA /* canvas-simplerect.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "canvas-simplerect.c"; path = "../canvas-simplerect.c"; sourceTree = SOURCE_ROOT; };
+ 43279083194EFFB9003C9FEA /* canvas-waveview.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "canvas-waveview.c"; path = "../canvas-waveview.c"; sourceTree = SOURCE_ROOT; };
+ 43279085194EFFB9003C9FEA /* clock_group.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = clock_group.cc; path = ../clock_group.cc; sourceTree = SOURCE_ROOT; };
+ 43279087194EFFB9003C9FEA /* cocoacarbon.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = cocoacarbon.mm; path = ../cocoacarbon.mm; sourceTree = SOURCE_ROOT; };
+ 43279088194EFFB9003C9FEA /* configinfo.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = configinfo.cc; path = ../configinfo.cc; sourceTree = SOURCE_ROOT; };
+ 4327908A194EFFB9003C9FEA /* control_point_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = control_point_dialog.cc; path = ../control_point_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 4327908C194EFFB9003C9FEA /* control_point.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = control_point.cc; path = ../control_point.cc; sourceTree = SOURCE_ROOT; };
+ 4327908E194EFFB9003C9FEA /* crossfade_edit.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = crossfade_edit.cc; path = ../crossfade_edit.cc; sourceTree = SOURCE_ROOT; };
+ 43279092194EFFB9003C9FEA /* curvetest.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = curvetest.cc; path = ../curvetest.cc; sourceTree = SOURCE_ROOT; };
+ 43279094194EFFB9003C9FEA /* debug.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = debug.cc; path = ../debug.cc; sourceTree = SOURCE_ROOT; };
+ 43279096194EFFB9003C9FEA /* device_connection_control.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = device_connection_control.cc; path = ../device_connection_control.cc; sourceTree = SOURCE_ROOT; };
+ 43279098194EFFB9003C9FEA /* edit_note_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = edit_note_dialog.cc; path = ../edit_note_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 4327909B194EFFB9003C9FEA /* editing.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editing.cc; path = ../editing.cc; sourceTree = SOURCE_ROOT; };
+ 4327909D194EFFB9003C9FEA /* editor_actions.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_actions.cc; path = ../editor_actions.cc; sourceTree = SOURCE_ROOT; };
+ 4327909E194EFFB9003C9FEA /* editor_audio_import.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_audio_import.cc; path = ../editor_audio_import.cc; sourceTree = SOURCE_ROOT; };
+ 4327909F194EFFB9003C9FEA /* editor_audiotrack.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_audiotrack.cc; path = ../editor_audiotrack.cc; sourceTree = SOURCE_ROOT; };
+ 432790A0194EFFB9003C9FEA /* editor_canvas_events.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_canvas_events.cc; path = ../editor_canvas_events.cc; sourceTree = SOURCE_ROOT; };
+ 432790A1194EFFB9003C9FEA /* editor_canvas.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_canvas.cc; path = ../editor_canvas.cc; sourceTree = SOURCE_ROOT; };
+ 432790A2194EFFB9003C9FEA /* editor_component.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_component.cc; path = ../editor_component.cc; sourceTree = SOURCE_ROOT; };
+ 432790A4194EFFB9003C9FEA /* editor_cursors.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_cursors.cc; path = ../editor_cursors.cc; sourceTree = SOURCE_ROOT; };
+ 432790A6194EFFB9003C9FEA /* editor_drag.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_drag.cc; path = ../editor_drag.cc; sourceTree = SOURCE_ROOT; };
+ 432790A9194EFFB9003C9FEA /* editor_export_audio.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_export_audio.cc; path = ../editor_export_audio.cc; sourceTree = SOURCE_ROOT; };
+ 432790AA194EFFB9003C9FEA /* editor_group_tabs.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_group_tabs.cc; path = ../editor_group_tabs.cc; sourceTree = SOURCE_ROOT; };
+ 432790AD194EFFB9003C9FEA /* editor_keys.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_keys.cc; path = ../editor_keys.cc; sourceTree = SOURCE_ROOT; };
+ 432790AE194EFFB9003C9FEA /* editor_locations.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_locations.cc; path = ../editor_locations.cc; sourceTree = SOURCE_ROOT; };
+ 432790B0194EFFB9003C9FEA /* editor_markers.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_markers.cc; path = ../editor_markers.cc; sourceTree = SOURCE_ROOT; };
+ 432790B1194EFFB9003C9FEA /* editor_mixer.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_mixer.cc; path = ../editor_mixer.cc; sourceTree = SOURCE_ROOT; };
+ 432790B2194EFFB9003C9FEA /* editor_mouse.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_mouse.cc; path = ../editor_mouse.cc; sourceTree = SOURCE_ROOT; };
+ 432790B3194EFFB9003C9FEA /* editor_ops.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_ops.cc; path = ../editor_ops.cc; sourceTree = SOURCE_ROOT; };
+ 432790B4194EFFB9003C9FEA /* editor_regions.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_regions.cc; path = ../editor_regions.cc; sourceTree = SOURCE_ROOT; };
+ 432790B6194EFFB9003C9FEA /* editor_route_groups.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_route_groups.cc; path = ../editor_route_groups.cc; sourceTree = SOURCE_ROOT; };
+ 432790B8194EFFB9003C9FEA /* editor_routes.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_routes.cc; path = ../editor_routes.cc; sourceTree = SOURCE_ROOT; };
+ 432790BA194EFFB9003C9FEA /* editor_rulers.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_rulers.cc; path = ../editor_rulers.cc; sourceTree = SOURCE_ROOT; };
+ 432790BB194EFFB9003C9FEA /* editor_selection.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_selection.cc; path = ../editor_selection.cc; sourceTree = SOURCE_ROOT; };
+ 432790BC194EFFB9003C9FEA /* editor_snapshots.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_snapshots.cc; path = ../editor_snapshots.cc; sourceTree = SOURCE_ROOT; };
+ 432790BE194EFFB9003C9FEA /* editor_summary.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_summary.cc; path = ../editor_summary.cc; sourceTree = SOURCE_ROOT; };
+ 432790C0194EFFB9003C9FEA /* editor_tempodisplay.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_tempodisplay.cc; path = ../editor_tempodisplay.cc; sourceTree = SOURCE_ROOT; };
+ 432790C1194EFFB9003C9FEA /* editor_timefx.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_timefx.cc; path = ../editor_timefx.cc; sourceTree = SOURCE_ROOT; };
+ 432790C2194EFFB9003C9FEA /* editor_videotimeline.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor_videotimeline.cc; path = ../editor_videotimeline.cc; sourceTree = SOURCE_ROOT; };
+ 432790C5194EFFB9003C9FEA /* editor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = editor.cc; path = ../editor.cc; sourceTree = SOURCE_ROOT; };
+ 432790C7194EFFB9003C9FEA /* engine_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = engine_dialog.cc; path = ../engine_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 432790C9194EFFB9003C9FEA /* enums.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = enums.cc; path = ../enums.cc; sourceTree = SOURCE_ROOT; };
+ 432790CB194EFFB9003C9FEA /* evtest.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = evtest.cc; path = ../evtest.cc; sourceTree = SOURCE_ROOT; };
+ 432790CC194EFFB9003C9FEA /* export_channel_selector.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = export_channel_selector.cc; path = ../export_channel_selector.cc; sourceTree = SOURCE_ROOT; };
+ 432790CE194EFFB9003C9FEA /* export_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = export_dialog.cc; path = ../export_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 432790D0194EFFB9003C9FEA /* export_file_notebook.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = export_file_notebook.cc; path = ../export_file_notebook.cc; sourceTree = SOURCE_ROOT; };
+ 432790D2194EFFB9003C9FEA /* export_filename_selector.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = export_filename_selector.cc; path = ../export_filename_selector.cc; sourceTree = SOURCE_ROOT; };
+ 432790D4194EFFB9003C9FEA /* export_format_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = export_format_dialog.cc; path = ../export_format_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 432790D6194EFFB9003C9FEA /* export_format_selector.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = export_format_selector.cc; path = ../export_format_selector.cc; sourceTree = SOURCE_ROOT; };
+ 432790D8194EFFB9003C9FEA /* export_preset_selector.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = export_preset_selector.cc; path = ../export_preset_selector.cc; sourceTree = SOURCE_ROOT; };
+ 432790DA194EFFB9003C9FEA /* export_range_markers_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = export_range_markers_dialog.cc; path = ../export_range_markers_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 432790DC194EFFB9003C9FEA /* export_timespan_selector.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = export_timespan_selector.cc; path = ../export_timespan_selector.cc; sourceTree = SOURCE_ROOT; };
+ 432790DE194EFFB9003C9FEA /* export_video_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = export_video_dialog.cc; path = ../export_video_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 432790E0194EFFB9003C9FEA /* export_video_infobox.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = export_video_infobox.cc; path = ../export_video_infobox.cc; sourceTree = SOURCE_ROOT; };
+ 432790E2194EFFB9003C9FEA /* fft_graph.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = fft_graph.cc; path = ../fft_graph.cc; sourceTree = SOURCE_ROOT; };
+ 432790E4194EFFB9003C9FEA /* fft_result.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = fft_result.cc; path = ../fft_result.cc; sourceTree = SOURCE_ROOT; };
+ 432790E6194EFFB9003C9FEA /* fft.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = fft.cc; path = ../fft.cc; sourceTree = SOURCE_ROOT; };
+ 432790E9194EFFB9003C9FEA /* gain_meter.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = gain_meter.cc; path = ../gain_meter.cc; sourceTree = SOURCE_ROOT; };
+ 432790EB194EFFB9003C9FEA /* generic_pluginui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = generic_pluginui.cc; path = ../generic_pluginui.cc; sourceTree = SOURCE_ROOT; };
+ 432790ED194EFFB9003C9FEA /* ghostregion.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ghostregion.cc; path = ../ghostregion.cc; sourceTree = SOURCE_ROOT; };
+ 432790EF194EFFB9003C9FEA /* global_port_matrix.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = global_port_matrix.cc; path = ../global_port_matrix.cc; sourceTree = SOURCE_ROOT; };
+ 432790F2194EFFB9003C9FEA /* gprofhelper.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = gprofhelper.c; path = ../gprofhelper.c; sourceTree = SOURCE_ROOT; };
+ 432790F3194EFFB9003C9FEA /* group_tabs.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = group_tabs.cc; path = ../group_tabs.cc; sourceTree = SOURCE_ROOT; };
+ 432790F5194EFFB9003C9FEA /* gtk_pianokeyboard.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = gtk_pianokeyboard.c; path = ../gtk_pianokeyboard.c; sourceTree = SOURCE_ROOT; };
+ 432790FB194EFFB9003C9FEA /* gui_object.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = gui_object.cc; path = ../gui_object.cc; sourceTree = SOURCE_ROOT; };
+ 432790FE194EFFB9003C9FEA /* hit.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = hit.cc; path = ../hit.cc; sourceTree = SOURCE_ROOT; };
+ 43279101194EFFB9003C9FEA /* insert_time_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = insert_time_dialog.cc; path = ../insert_time_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 43279103194EFFB9003C9FEA /* interthread_progress_window.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = interthread_progress_window.cc; path = ../interthread_progress_window.cc; sourceTree = SOURCE_ROOT; };
+ 43279105194EFFB9003C9FEA /* io_selector.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = io_selector.cc; path = ../io_selector.cc; sourceTree = SOURCE_ROOT; };
+ 43279107194EFFB9003C9FEA /* keyboard.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = keyboard.cc; path = ../keyboard.cc; sourceTree = SOURCE_ROOT; };
+ 43279109194EFFB9003C9FEA /* keyeditor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = keyeditor.cc; path = ../keyeditor.cc; sourceTree = SOURCE_ROOT; };
+ 4327910B194EFFB9003C9FEA /* latency_gui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = latency_gui.cc; path = ../latency_gui.cc; sourceTree = SOURCE_ROOT; };
+ 4327910D194EFFB9003C9FEA /* led.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = led.cc; path = ../led.cc; sourceTree = SOURCE_ROOT; };
+ 4327910F194EFFB9003C9FEA /* level_meter.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = level_meter.cc; path = ../level_meter.cc; sourceTree = SOURCE_ROOT; };
+ 43279111194EFFB9003C9FEA /* linux_vst_gui_support.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = linux_vst_gui_support.cc; path = ../linux_vst_gui_support.cc; sourceTree = SOURCE_ROOT; };
+ 43279112194EFFB9003C9FEA /* location_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = location_ui.cc; path = ../location_ui.cc; sourceTree = SOURCE_ROOT; };
+ 43279116194EFFB9003C9FEA /* lv2_plugin_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = lv2_plugin_ui.cc; path = ../lv2_plugin_ui.cc; sourceTree = SOURCE_ROOT; };
+ 43279118194EFFB9003C9FEA /* lxvst_plugin_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = lxvst_plugin_ui.cc; path = ../lxvst_plugin_ui.cc; sourceTree = SOURCE_ROOT; };
+ 4327911A194EFFB9003C9FEA /* main_clock.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = main_clock.cc; path = ../main_clock.cc; sourceTree = SOURCE_ROOT; };
+ 4327911C194EFFB9003C9FEA /* main.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = main.cc; path = ../main.cc; sourceTree = SOURCE_ROOT; };
+ 4327911E194EFFB9003C9FEA /* marker.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = marker.cc; path = ../marker.cc; sourceTree = SOURCE_ROOT; };
+ 43279120194EFFB9003C9FEA /* meter_patterns.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = meter_patterns.cc; path = ../meter_patterns.cc; sourceTree = SOURCE_ROOT; };
+ 43279122194EFFB9003C9FEA /* meter_strip.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = meter_strip.cc; path = ../meter_strip.cc; sourceTree = SOURCE_ROOT; };
+ 43279124194EFFB9003C9FEA /* meterbridge.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = meterbridge.cc; path = ../meterbridge.cc; sourceTree = SOURCE_ROOT; };
+ 43279126194EFFB9003C9FEA /* midi_automation_line.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_automation_line.cc; path = ../midi_automation_line.cc; sourceTree = SOURCE_ROOT; };
+ 43279128194EFFB9003C9FEA /* midi_channel_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_channel_dialog.cc; path = ../midi_channel_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 4327912A194EFFB9003C9FEA /* midi_channel_selector.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_channel_selector.cc; path = ../midi_channel_selector.cc; sourceTree = SOURCE_ROOT; };
+ 4327912C194EFFB9003C9FEA /* midi_cut_buffer.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_cut_buffer.cc; path = ../midi_cut_buffer.cc; sourceTree = SOURCE_ROOT; };
+ 4327912E194EFFB9003C9FEA /* midi_device_connection_control.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_device_connection_control.cc; path = ../midi_device_connection_control.cc; sourceTree = SOURCE_ROOT; };
+ 43279130194EFFB9003C9FEA /* midi_export_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_export_dialog.cc; path = ../midi_export_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 43279132194EFFB9003C9FEA /* midi_list_editor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_list_editor.cc; path = ../midi_list_editor.cc; sourceTree = SOURCE_ROOT; };
+ 43279134194EFFB9003C9FEA /* midi_port_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_port_dialog.cc; path = ../midi_port_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 43279136194EFFB9003C9FEA /* midi_region_view.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_region_view.cc; path = ../midi_region_view.cc; sourceTree = SOURCE_ROOT; };
+ 43279138194EFFB9003C9FEA /* midi_scroomer.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_scroomer.cc; path = ../midi_scroomer.cc; sourceTree = SOURCE_ROOT; };
+ 4327913A194EFFB9003C9FEA /* midi_selection.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_selection.cc; path = ../midi_selection.cc; sourceTree = SOURCE_ROOT; };
+ 4327913C194EFFB9003C9FEA /* midi_streamview.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_streamview.cc; path = ../midi_streamview.cc; sourceTree = SOURCE_ROOT; };
+ 4327913E194EFFB9003C9FEA /* midi_time_axis.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_time_axis.cc; path = ../midi_time_axis.cc; sourceTree = SOURCE_ROOT; };
+ 43279140194EFFB9003C9FEA /* midi_tracer.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_tracer.cc; path = ../midi_tracer.cc; sourceTree = SOURCE_ROOT; };
+ 43279143194EFFB9003C9FEA /* midi_velocity_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = midi_velocity_dialog.cc; path = ../midi_velocity_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 43279145194EFFB9003C9FEA /* missing_file_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = missing_file_dialog.cc; path = ../missing_file_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 43279147194EFFB9003C9FEA /* missing_plugin_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = missing_plugin_dialog.cc; path = ../missing_plugin_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 43279149194EFFB9003C9FEA /* mixer_actor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = mixer_actor.cc; path = ../mixer_actor.cc; sourceTree = SOURCE_ROOT; };
+ 4327914B194EFFB9003C9FEA /* mixer_group_tabs.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = mixer_group_tabs.cc; path = ../mixer_group_tabs.cc; sourceTree = SOURCE_ROOT; };
+ 4327914D194EFFB9003C9FEA /* mixer_strip.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = mixer_strip.cc; path = ../mixer_strip.cc; sourceTree = SOURCE_ROOT; };
+ 4327914F194EFFB9003C9FEA /* mixer_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = mixer_ui.cc; path = ../mixer_ui.cc; sourceTree = SOURCE_ROOT; };
+ 43279151194EFFB9003C9FEA /* monitor_section.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = monitor_section.cc; path = ../monitor_section.cc; sourceTree = SOURCE_ROOT; };
+ 43279153194EFFB9003C9FEA /* mono_panner_editor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = mono_panner_editor.cc; path = ../mono_panner_editor.cc; sourceTree = SOURCE_ROOT; };
+ 43279155194EFFB9003C9FEA /* mono_panner.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = mono_panner.cc; path = ../mono_panner.cc; sourceTree = SOURCE_ROOT; };
+ 43279157194EFFB9003C9FEA /* mouse_cursors.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = mouse_cursors.cc; path = ../mouse_cursors.cc; sourceTree = SOURCE_ROOT; };
+ 43279159194EFFB9003C9FEA /* mtest.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = mtest.cc; path = ../mtest.cc; sourceTree = SOURCE_ROOT; };
+ 4327915A194EFFB9003C9FEA /* nag.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = nag.cc; path = ../nag.cc; sourceTree = SOURCE_ROOT; };
+ 4327915C194EFFB9003C9FEA /* new_plugin_preset_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = new_plugin_preset_dialog.cc; path = ../new_plugin_preset_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 4327915E194EFFB9003C9FEA /* normalize_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = normalize_dialog.cc; path = ../normalize_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 43279160194EFFB9003C9FEA /* note_base.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = note_base.cc; path = ../note_base.cc; sourceTree = SOURCE_ROOT; };
+ 43279162194EFFB9003C9FEA /* note_player.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = note_player.cc; path = ../note_player.cc; sourceTree = SOURCE_ROOT; };
+ 43279164194EFFB9003C9FEA /* note.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = note.cc; path = ../note.cc; sourceTree = SOURCE_ROOT; };
+ 43279166194EFFB9003C9FEA /* nsm.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = nsm.cc; path = ../nsm.cc; sourceTree = SOURCE_ROOT; };
+ 43279168194EFFB9003C9FEA /* nsmclient.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = nsmclient.cc; path = ../nsmclient.cc; sourceTree = SOURCE_ROOT; };
+ 4327916D194EFFB9003C9FEA /* open_file_dialog.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = open_file_dialog.mm; path = ../open_file_dialog.mm; sourceTree = SOURCE_ROOT; };
+ 4327916E194EFFB9003C9FEA /* option_editor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = option_editor.cc; path = ../option_editor.cc; sourceTree = SOURCE_ROOT; };
+ 43279170194EFFB9003C9FEA /* opts.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = opts.cc; path = ../opts.cc; sourceTree = SOURCE_ROOT; };
+ 43279172194EFFB9003C9FEA /* panner_editor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = panner_editor.cc; path = ../panner_editor.cc; sourceTree = SOURCE_ROOT; };
+ 43279174194EFFB9003C9FEA /* panner_interface.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = panner_interface.cc; path = ../panner_interface.cc; sourceTree = SOURCE_ROOT; };
+ 43279176194EFFB9003C9FEA /* panner_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = panner_ui.cc; path = ../panner_ui.cc; sourceTree = SOURCE_ROOT; };
+ 43279178194EFFB9003C9FEA /* panner2d.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = panner2d.cc; path = ../panner2d.cc; sourceTree = SOURCE_ROOT; };
+ 4327917A194EFFB9003C9FEA /* patch_change_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = patch_change_dialog.cc; path = ../patch_change_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 4327917C194EFFB9003C9FEA /* patch_change.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = patch_change.cc; path = ../patch_change.cc; sourceTree = SOURCE_ROOT; };
+ 4327917E194EFFB9003C9FEA /* piano_roll_header.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = piano_roll_header.cc; path = ../piano_roll_header.cc; sourceTree = SOURCE_ROOT; };
+ 43279180194EFFB9003C9FEA /* pingback.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = pingback.cc; path = ../pingback.cc; sourceTree = SOURCE_ROOT; };
+ 43279183194EFFB9003C9FEA /* playlist_selector.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = playlist_selector.cc; path = ../playlist_selector.cc; sourceTree = SOURCE_ROOT; };
+ 43279185194EFFB9003C9FEA /* plugin_eq_gui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = plugin_eq_gui.cc; path = ../plugin_eq_gui.cc; sourceTree = SOURCE_ROOT; };
+ 43279188194EFFBA003C9FEA /* plugin_selector.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = plugin_selector.cc; path = ../plugin_selector.cc; sourceTree = SOURCE_ROOT; };
+ 4327918A194EFFBA003C9FEA /* plugin_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = plugin_ui.cc; path = ../plugin_ui.cc; sourceTree = SOURCE_ROOT; };
+ 4327918D194EFFBA003C9FEA /* port_group.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = port_group.cc; path = ../port_group.cc; sourceTree = SOURCE_ROOT; };
+ 4327918F194EFFBA003C9FEA /* port_insert_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = port_insert_ui.cc; path = ../port_insert_ui.cc; sourceTree = SOURCE_ROOT; };
+ 43279191194EFFBA003C9FEA /* port_matrix_body.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = port_matrix_body.cc; path = ../port_matrix_body.cc; sourceTree = SOURCE_ROOT; };
+ 43279193194EFFBA003C9FEA /* port_matrix_column_labels.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = port_matrix_column_labels.cc; path = ../port_matrix_column_labels.cc; sourceTree = SOURCE_ROOT; };
+ 43279195194EFFBA003C9FEA /* port_matrix_component.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = port_matrix_component.cc; path = ../port_matrix_component.cc; sourceTree = SOURCE_ROOT; };
+ 43279197194EFFBA003C9FEA /* port_matrix_grid.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = port_matrix_grid.cc; path = ../port_matrix_grid.cc; sourceTree = SOURCE_ROOT; };
+ 43279199194EFFBA003C9FEA /* port_matrix_labels.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = port_matrix_labels.cc; path = ../port_matrix_labels.cc; sourceTree = SOURCE_ROOT; };
+ 4327919B194EFFBA003C9FEA /* port_matrix_row_labels.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = port_matrix_row_labels.cc; path = ../port_matrix_row_labels.cc; sourceTree = SOURCE_ROOT; };
+ 4327919E194EFFBA003C9FEA /* port_matrix.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = port_matrix.cc; path = ../port_matrix.cc; sourceTree = SOURCE_ROOT; };
+ 432791A0194EFFBA003C9FEA /* processor_box.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = processor_box.cc; path = ../processor_box.cc; sourceTree = SOURCE_ROOT; };
+ 432791A3194EFFBA003C9FEA /* progress_reporter.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = progress_reporter.cc; path = ../progress_reporter.cc; sourceTree = SOURCE_ROOT; };
+ 432791A5194EFFBA003C9FEA /* prompter.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = prompter.cc; path = ../prompter.cc; sourceTree = SOURCE_ROOT; };
+ 432791A7194EFFBA003C9FEA /* public_editor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = public_editor.cc; path = ../public_editor.cc; sourceTree = SOURCE_ROOT; };
+ 432791A9194EFFBA003C9FEA /* quantize_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = quantize_dialog.cc; path = ../quantize_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 432791AB194EFFBA003C9FEA /* rc_option_editor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = rc_option_editor.cc; path = ../rc_option_editor.cc; sourceTree = SOURCE_ROOT; };
+ 432791AD194EFFBA003C9FEA /* region_editor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = region_editor.cc; path = ../region_editor.cc; sourceTree = SOURCE_ROOT; };
+ 432791AF194EFFBA003C9FEA /* region_gain_line.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = region_gain_line.cc; path = ../region_gain_line.cc; sourceTree = SOURCE_ROOT; };
+ 432791B1194EFFBA003C9FEA /* region_layering_order_editor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = region_layering_order_editor.cc; path = ../region_layering_order_editor.cc; sourceTree = SOURCE_ROOT; };
+ 432791B3194EFFBA003C9FEA /* region_selection.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = region_selection.cc; path = ../region_selection.cc; sourceTree = SOURCE_ROOT; };
+ 432791B5194EFFBA003C9FEA /* region_view.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = region_view.cc; path = ../region_view.cc; sourceTree = SOURCE_ROOT; };
+ 432791B7194EFFBA003C9FEA /* return_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = return_ui.cc; path = ../return_ui.cc; sourceTree = SOURCE_ROOT; };
+ 432791BA194EFFBA003C9FEA /* rhythm_ferret.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = rhythm_ferret.cc; path = ../rhythm_ferret.cc; sourceTree = SOURCE_ROOT; };
+ 432791BC194EFFBA003C9FEA /* route_group_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = route_group_dialog.cc; path = ../route_group_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 432791BE194EFFBA003C9FEA /* route_group_menu.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = route_group_menu.cc; path = ../route_group_menu.cc; sourceTree = SOURCE_ROOT; };
+ 432791C0194EFFBA003C9FEA /* route_params_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = route_params_ui.cc; path = ../route_params_ui.cc; sourceTree = SOURCE_ROOT; };
+ 432791C2194EFFBA003C9FEA /* route_processor_selection.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = route_processor_selection.cc; path = ../route_processor_selection.cc; sourceTree = SOURCE_ROOT; };
+ 432791C5194EFFBA003C9FEA /* route_time_axis.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = route_time_axis.cc; path = ../route_time_axis.cc; sourceTree = SOURCE_ROOT; };
+ 432791C8194EFFBA003C9FEA /* route_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = route_ui.cc; path = ../route_ui.cc; sourceTree = SOURCE_ROOT; };
+ 432791CA194EFFBA003C9FEA /* search_path_option.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = search_path_option.cc; path = ../search_path_option.cc; sourceTree = SOURCE_ROOT; };
+ 432791CE194EFFBA003C9FEA /* selection.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = selection.cc; path = ../selection.cc; sourceTree = SOURCE_ROOT; };
+ 432791D0194EFFBA003C9FEA /* send_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = send_ui.cc; path = ../send_ui.cc; sourceTree = SOURCE_ROOT; };
+ 432791D2194EFFBA003C9FEA /* session_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = session_dialog.cc; path = ../session_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 432791D4194EFFBA003C9FEA /* session_dialog.logic.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = session_dialog.logic.cc; path = ../session_dialog.logic.cc; sourceTree = SOURCE_ROOT; };
+ 432791D6194EFFBA003C9FEA /* session_import_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = session_import_dialog.cc; path = ../session_import_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 432791D8194EFFBA003C9FEA /* session_lock_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = session_lock_dialog.cc; path = ../session_lock_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 432791DA194EFFBA003C9FEA /* session_metadata_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = session_metadata_dialog.cc; path = ../session_metadata_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 432791DC194EFFBA003C9FEA /* session_option_editor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = session_option_editor.cc; path = ../session_option_editor.cc; sourceTree = SOURCE_ROOT; };
+ 432791DE194EFFBA003C9FEA /* sfdb_freesound_mootcher.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = sfdb_freesound_mootcher.cc; path = ../sfdb_freesound_mootcher.cc; sourceTree = SOURCE_ROOT; };
+ 432791E0194EFFBA003C9FEA /* sfdb_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = sfdb_ui.cc; path = ../sfdb_ui.cc; sourceTree = SOURCE_ROOT; };
+ 432791E2194EFFBA003C9FEA /* shuttle_control.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = shuttle_control.cc; path = ../shuttle_control.cc; sourceTree = SOURCE_ROOT; };
+ 432791E4194EFFBA003C9FEA /* speaker_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = speaker_dialog.cc; path = ../speaker_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 432791E6194EFFBA003C9FEA /* splash.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = splash.cc; path = ../splash.cc; sourceTree = SOURCE_ROOT; };
+ 432791EA194EFFBA003C9FEA /* step_editor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = step_editor.cc; path = ../step_editor.cc; sourceTree = SOURCE_ROOT; };
+ 432791EC194EFFBA003C9FEA /* step_entry.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = step_entry.cc; path = ../step_entry.cc; sourceTree = SOURCE_ROOT; };
+ 432791EE194EFFBA003C9FEA /* stereo_panner_editor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = stereo_panner_editor.cc; path = ../stereo_panner_editor.cc; sourceTree = SOURCE_ROOT; };
+ 432791F0194EFFBA003C9FEA /* stereo_panner.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = stereo_panner.cc; path = ../stereo_panner.cc; sourceTree = SOURCE_ROOT; };
+ 432791F2194EFFBA003C9FEA /* streamview.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = streamview.cc; path = ../streamview.cc; sourceTree = SOURCE_ROOT; };
+ 432791F5194EFFBA003C9FEA /* strip_silence_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = strip_silence_dialog.cc; path = ../strip_silence_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 432791F7194EFFBA003C9FEA /* sys_ex.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = sys_ex.cc; path = ../sys_ex.cc; sourceTree = SOURCE_ROOT; };
+ 432791F9194EFFBA003C9FEA /* tape_region_view.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = tape_region_view.cc; path = ../tape_region_view.cc; sourceTree = SOURCE_ROOT; };
+ 432791FB194EFFBA003C9FEA /* tempo_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = tempo_dialog.cc; path = ../tempo_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 432791FD194EFFBA003C9FEA /* tempo_lines.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = tempo_lines.cc; path = ../tempo_lines.cc; sourceTree = SOURCE_ROOT; };
+ 432791FF194EFFBA003C9FEA /* theme_manager.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = theme_manager.cc; path = ../theme_manager.cc; sourceTree = SOURCE_ROOT; };
+ 43279201194EFFBA003C9FEA /* time_axis_view_item.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = time_axis_view_item.cc; path = ../time_axis_view_item.cc; sourceTree = SOURCE_ROOT; };
+ 43279203194EFFBA003C9FEA /* time_axis_view.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = time_axis_view.cc; path = ../time_axis_view.cc; sourceTree = SOURCE_ROOT; };
+ 43279205194EFFBA003C9FEA /* time_fx_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = time_fx_dialog.cc; path = ../time_fx_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 43279207194EFFBA003C9FEA /* time_info_box.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = time_info_box.cc; path = ../time_info_box.cc; sourceTree = SOURCE_ROOT; };
+ 43279209194EFFBA003C9FEA /* time_selection.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = time_selection.cc; path = ../time_selection.cc; sourceTree = SOURCE_ROOT; };
+ 4327920B194EFFBA003C9FEA /* timecode_tester.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = timecode_tester.cc; path = ../timecode_tester.cc; sourceTree = SOURCE_ROOT; };
+ 4327920C194EFFBA003C9FEA /* track_selection.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = track_selection.cc; path = ../track_selection.cc; sourceTree = SOURCE_ROOT; };
+ 4327920E194EFFBA003C9FEA /* track_view_list.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = track_view_list.cc; path = ../track_view_list.cc; sourceTree = SOURCE_ROOT; };
+ 43279210194EFFBA003C9FEA /* tracks_control_panel.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = tracks_control_panel.cc; path = ../tracks_control_panel.cc; sourceTree = SOURCE_ROOT; };
+ 43279212194EFFBA003C9FEA /* tracks_control_panel.logic.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = tracks_control_panel.logic.cc; path = ../tracks_control_panel.logic.cc; sourceTree = SOURCE_ROOT; };
+ 43279214194EFFBA003C9FEA /* transcode_ffmpeg.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = transcode_ffmpeg.cc; path = ../transcode_ffmpeg.cc; sourceTree = SOURCE_ROOT; };
+ 43279216194EFFBA003C9FEA /* transcode_video_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = transcode_video_dialog.cc; path = ../transcode_video_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 43279218194EFFBA003C9FEA /* transpose_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = transpose_dialog.cc; path = ../transpose_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 4327921B194EFFBA003C9FEA /* ui_config.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ui_config.cc; path = ../ui_config.cc; sourceTree = SOURCE_ROOT; };
+ 4327921D194EFFBA003C9FEA /* utils_videotl.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = utils_videotl.cc; path = ../utils_videotl.cc; sourceTree = SOURCE_ROOT; };
+ 4327921F194EFFBA003C9FEA /* utils.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = utils.cc; path = ../utils.cc; sourceTree = SOURCE_ROOT; };
+ 43279221194EFFBA003C9FEA /* verbose_cursor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = verbose_cursor.cc; path = ../verbose_cursor.cc; sourceTree = SOURCE_ROOT; };
+ 43279223194EFFBA003C9FEA /* version.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = version.cc; path = ../version.cc; sourceTree = SOURCE_ROOT; };
+ 43279225194EFFBA003C9FEA /* video_image_frame.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = video_image_frame.cc; path = ../video_image_frame.cc; sourceTree = SOURCE_ROOT; };
+ 43279227194EFFBA003C9FEA /* video_monitor.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = video_monitor.cc; path = ../video_monitor.cc; sourceTree = SOURCE_ROOT; };
+ 43279229194EFFBA003C9FEA /* video_server_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = video_server_dialog.cc; path = ../video_server_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 4327922B194EFFBA003C9FEA /* video_timeline.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = video_timeline.cc; path = ../video_timeline.cc; sourceTree = SOURCE_ROOT; };
+ 4327922D194EFFBA003C9FEA /* visibility_group.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = visibility_group.cc; path = ../visibility_group.cc; sourceTree = SOURCE_ROOT; };
+ 4327922F194EFFBA003C9FEA /* volume_controller.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = volume_controller.cc; path = ../volume_controller.cc; sourceTree = SOURCE_ROOT; };
+ 43279231194EFFBA003C9FEA /* vst_plugin_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = vst_plugin_ui.cc; path = ../vst_plugin_ui.cc; sourceTree = SOURCE_ROOT; };
+ 43279233194EFFBA003C9FEA /* waves_button.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = waves_button.cc; path = ../waves_button.cc; sourceTree = SOURCE_ROOT; };
+ 43279235194EFFBA003C9FEA /* waves_dialog.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = waves_dialog.cc; path = ../waves_dialog.cc; sourceTree = SOURCE_ROOT; };
+ 43279237194EFFBA003C9FEA /* waves_icon_button.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = waves_icon_button.cc; path = ../waves_icon_button.cc; sourceTree = SOURCE_ROOT; };
+ 43279239194EFFBA003C9FEA /* waves_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = waves_ui.cc; path = ../waves_ui.cc; sourceTree = SOURCE_ROOT; };
+ 4327923B194EFFBA003C9FEA /* window_manager.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = window_manager.cc; path = ../window_manager.cc; sourceTree = SOURCE_ROOT; };
+ 4327923D194EFFBA003C9FEA /* windows_vst_plugin_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = windows_vst_plugin_ui.cc; path = ../windows_vst_plugin_ui.cc; sourceTree = SOURCE_ROOT; };
+ 43279244194EFFF1003C9FEA /* Tracks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tracks.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 43279247194EFFF1003C9FEA /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ 4327924A194EFFF1003C9FEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
+ 4327924B194EFFF1003C9FEA /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
+ 4327924C194EFFF1003C9FEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 4327924F194EFFF1003C9FEA /* Tracks-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Tracks-Info.plist"; path = "Tracks/Tracks-Info.plist"; sourceTree = SOURCE_ROOT; };
+ 43279251194EFFF1003C9FEA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 43279253194EFFF1003C9FEA /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Tracks/main.m; sourceTree = SOURCE_ROOT; };
+ 43279255194EFFF1003C9FEA /* Tracks-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "Tracks-Prefix.pch"; path = "Tracks/Tracks-Prefix.pch"; sourceTree = SOURCE_ROOT; };
+ 43279257194EFFF1003C9FEA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = "<group>"; };
+ 43279259194EFFF1003C9FEA /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Tracks/AppDelegate.h; sourceTree = SOURCE_ROOT; };
+ 4327925A194EFFF1003C9FEA /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Tracks/AppDelegate.m; sourceTree = SOURCE_ROOT; };
+ 4327925D194EFFF1003C9FEA /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = "<group>"; };
+ 43279263194F0039003C9FEA /* act-disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "act-disabled.png"; path = "../icons/act-disabled.png"; sourceTree = SOURCE_ROOT; };
+ 43279264194F0039003C9FEA /* add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = add.png; path = ../icons/add.png; sourceTree = SOURCE_ROOT; };
+ 43279265194F0039003C9FEA /* application-x-ardour_16px.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "application-x-ardour_16px.png"; path = "../icons/application-x-ardour_16px.png"; sourceTree = SOURCE_ROOT; };
+ 43279266194F0039003C9FEA /* application-x-ardour_22px.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "application-x-ardour_22px.png"; path = "../icons/application-x-ardour_22px.png"; sourceTree = SOURCE_ROOT; };
+ 43279267194F0039003C9FEA /* application-x-ardour_32px.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "application-x-ardour_32px.png"; path = "../icons/application-x-ardour_32px.png"; sourceTree = SOURCE_ROOT; };
+ 43279268194F0039003C9FEA /* application-x-ardour_48px.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "application-x-ardour_48px.png"; path = "../icons/application-x-ardour_48px.png"; sourceTree = SOURCE_ROOT; };
+ 43279269194F0039003C9FEA /* ardour-app-icon_osx.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ardour-app-icon_osx.png"; path = "../icons/ardour-app-icon_osx.png"; sourceTree = SOURCE_ROOT; };
+ 4327926A194F0039003C9FEA /* ardour-app-icon_osx_mask.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ardour-app-icon_osx_mask.png"; path = "../icons/ardour-app-icon_osx_mask.png"; sourceTree = SOURCE_ROOT; };
+ 4327926B194F0039003C9FEA /* ardour_icon_16px.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ardour_icon_16px.png; path = ../icons/ardour_icon_16px.png; sourceTree = SOURCE_ROOT; };
+ 4327926C194F0039003C9FEA /* ardour_icon_22px.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ardour_icon_22px.png; path = ../icons/ardour_icon_22px.png; sourceTree = SOURCE_ROOT; };
+ 4327926D194F0039003C9FEA /* ardour_icon_256px.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ardour_icon_256px.png; path = ../icons/ardour_icon_256px.png; sourceTree = SOURCE_ROOT; };
+ 4327926E194F0039003C9FEA /* ardour_icon_32px.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ardour_icon_32px.png; path = ../icons/ardour_icon_32px.png; sourceTree = SOURCE_ROOT; };
+ 4327926F194F0039003C9FEA /* ardour_icon_48px.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ardour_icon_48px.png; path = ../icons/ardour_icon_48px.png; sourceTree = SOURCE_ROOT; };
+ 43279270194F0039003C9FEA /* chord.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = chord.png; path = ../icons/chord.png; sourceTree = SOURCE_ROOT; };
+ 43279271194F0039003C9FEA /* close.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = close.png; path = ../icons/close.png; sourceTree = SOURCE_ROOT; };
+ 43279272194F0039003C9FEA /* computer_keyboard.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = computer_keyboard.png; path = ../icons/computer_keyboard.png; sourceTree = SOURCE_ROOT; };
+ 43279273194F0039003C9FEA /* computer_keyboard_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = computer_keyboard_active.png; path = ../icons/computer_keyboard_active.png; sourceTree = SOURCE_ROOT; };
+ 43279274194F0039003C9FEA /* display_clock_mockup.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = display_clock_mockup.png; path = ../icons/display_clock_mockup.png; sourceTree = SOURCE_ROOT; };
+ 43279275194F0039003C9FEA /* display_metrics_mockup.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = display_metrics_mockup.png; path = ../icons/display_metrics_mockup.png; sourceTree = SOURCE_ROOT; };
+ 43279276194F0039003C9FEA /* eighthnote.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = eighthnote.png; path = ../icons/eighthnote.png; sourceTree = SOURCE_ROOT; };
+ 43279277194F0039003C9FEA /* expand_left_right_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = expand_left_right_cursor.png; path = ../icons/expand_left_right_cursor.png; sourceTree = SOURCE_ROOT; };
+ 43279278194F0039003C9FEA /* expand_up_down_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = expand_up_down_cursor.png; path = ../icons/expand_up_down_cursor.png; sourceTree = SOURCE_ROOT; };
+ 43279279194F0039003C9FEA /* export_icons.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = export_icons.sh; path = ../icons/export_icons.sh; sourceTree = SOURCE_ROOT; };
+ 4327927A194F0039003C9FEA /* fade_in_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fade_in_cursor.png; path = ../icons/fade_in_cursor.png; sourceTree = SOURCE_ROOT; };
+ 4327927B194F0039003C9FEA /* fade_out_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fade_out_cursor.png; path = ../icons/fade_out_cursor.png; sourceTree = SOURCE_ROOT; };
+ 4327927C194F0039003C9FEA /* fadein-constant-power.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadein-constant-power.png"; path = "../icons/fadein-constant-power.png"; sourceTree = SOURCE_ROOT; };
+ 4327927D194F0039003C9FEA /* fadein-fast-cut.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadein-fast-cut.png"; path = "../icons/fadein-fast-cut.png"; sourceTree = SOURCE_ROOT; };
+ 4327927E194F0039003C9FEA /* fadein-linear.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadein-linear.png"; path = "../icons/fadein-linear.png"; sourceTree = SOURCE_ROOT; };
+ 4327927F194F0039003C9FEA /* fadein-long-cut.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadein-long-cut.png"; path = "../icons/fadein-long-cut.png"; sourceTree = SOURCE_ROOT; };
+ 43279280194F0039003C9FEA /* fadein-S1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadein-S1.png"; path = "../icons/fadein-S1.png"; sourceTree = SOURCE_ROOT; };
+ 43279281194F0039003C9FEA /* fadein-S2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadein-S2.png"; path = "../icons/fadein-S2.png"; sourceTree = SOURCE_ROOT; };
+ 43279282194F0039003C9FEA /* fadein-short-cut.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadein-short-cut.png"; path = "../icons/fadein-short-cut.png"; sourceTree = SOURCE_ROOT; };
+ 43279283194F0039003C9FEA /* fadein-slow-cut.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadein-slow-cut.png"; path = "../icons/fadein-slow-cut.png"; sourceTree = SOURCE_ROOT; };
+ 43279284194F0039003C9FEA /* fadeout-constant-power.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadeout-constant-power.png"; path = "../icons/fadeout-constant-power.png"; sourceTree = SOURCE_ROOT; };
+ 43279285194F0039003C9FEA /* fadeout-fast-cut.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadeout-fast-cut.png"; path = "../icons/fadeout-fast-cut.png"; sourceTree = SOURCE_ROOT; };
+ 43279286194F0039003C9FEA /* fadeout-linear.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadeout-linear.png"; path = "../icons/fadeout-linear.png"; sourceTree = SOURCE_ROOT; };
+ 43279287194F0039003C9FEA /* fadeout-long-cut.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadeout-long-cut.png"; path = "../icons/fadeout-long-cut.png"; sourceTree = SOURCE_ROOT; };
+ 43279288194F0039003C9FEA /* fadeout-S1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadeout-S1.png"; path = "../icons/fadeout-S1.png"; sourceTree = SOURCE_ROOT; };
+ 43279289194F0039003C9FEA /* fadeout-S2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadeout-S2.png"; path = "../icons/fadeout-S2.png"; sourceTree = SOURCE_ROOT; };
+ 4327928A194F0039003C9FEA /* fadeout-short-cut.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadeout-short-cut.png"; path = "../icons/fadeout-short-cut.png"; sourceTree = SOURCE_ROOT; };
+ 4327928B194F0039003C9FEA /* fadeout-slow-cut.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fadeout-slow-cut.png"; path = "../icons/fadeout-slow-cut.png"; sourceTree = SOURCE_ROOT; };
+ 4327928C194F0039003C9FEA /* fader_belt.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fader_belt.png; path = ../icons/fader_belt.png; sourceTree = SOURCE_ROOT; };
+ 4327928D194F0039003C9FEA /* fader_belt_desensitised.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fader_belt_desensitised.png; path = ../icons/fader_belt_desensitised.png; sourceTree = SOURCE_ROOT; };
+ 4327928E194F0039003C9FEA /* fader_belt_h.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fader_belt_h.png; path = ../icons/fader_belt_h.png; sourceTree = SOURCE_ROOT; };
+ 4327928F194F0039003C9FEA /* fader_belt_h_desensitised.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fader_belt_h_desensitised.png; path = ../icons/fader_belt_h_desensitised.png; sourceTree = SOURCE_ROOT; };
+ 43279290194F0039003C9FEA /* fader_belt_h_medium.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fader_belt_h_medium.png; path = ../icons/fader_belt_h_medium.png; sourceTree = SOURCE_ROOT; };
+ 43279291194F0039003C9FEA /* fader_belt_h_medium_desensitised.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fader_belt_h_medium_desensitised.png; path = ../icons/fader_belt_h_medium_desensitised.png; sourceTree = SOURCE_ROOT; };
+ 43279292194F0039003C9FEA /* fader_belt_h_thin.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fader_belt_h_thin.png; path = ../icons/fader_belt_h_thin.png; sourceTree = SOURCE_ROOT; };
+ 43279293194F0039003C9FEA /* fader_belt_h_thin_desensitised.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fader_belt_h_thin_desensitised.png; path = ../icons/fader_belt_h_thin_desensitised.png; sourceTree = SOURCE_ROOT; };
+ 43279294194F0039003C9FEA /* fader_handle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fader_handle.png; path = ../icons/fader_handle.png; sourceTree = SOURCE_ROOT; };
+ 43279295194F0039003C9FEA /* ferret_02.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ferret_02.png; path = ../icons/ferret_02.png; sourceTree = SOURCE_ROOT; };
+ 43279296194F0039003C9FEA /* forte.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = forte.png; path = ../icons/forte.png; sourceTree = SOURCE_ROOT; };
+ 43279297194F0039003C9FEA /* fortissimo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fortissimo.png; path = ../icons/fortissimo.png; sourceTree = SOURCE_ROOT; };
+ 43279298194F0039003C9FEA /* fortississimo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fortississimo.png; path = ../icons/fortississimo.png; sourceTree = SOURCE_ROOT; };
+ 43279299194F0039003C9FEA /* grabber.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = grabber.png; path = ../icons/grabber.png; sourceTree = SOURCE_ROOT; };
+ 4327929A194F0039003C9FEA /* grabber_edit_point.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = grabber_edit_point.png; path = ../icons/grabber_edit_point.png; sourceTree = SOURCE_ROOT; };
+ 4327929B194F0039003C9FEA /* grabber_note.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = grabber_note.png; path = ../icons/grabber_note.png; sourceTree = SOURCE_ROOT; };
+ 4327929C194F0039003C9FEA /* halfnote.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = halfnote.png; path = ../icons/halfnote.png; sourceTree = SOURCE_ROOT; };
+ 4327929D194F0039003C9FEA /* hide.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = hide.png; path = ../icons/hide.png; sourceTree = SOURCE_ROOT; };
+ 4327929E194F0039003C9FEA /* horizontal_zoom_fader_face.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = horizontal_zoom_fader_face.png; path = ../icons/horizontal_zoom_fader_face.png; sourceTree = SOURCE_ROOT; };
+ 4327929F194F0039003C9FEA /* i_beam_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = i_beam_cursor.png; path = ../icons/i_beam_cursor.png; sourceTree = SOURCE_ROOT; };
+ 432792A0194F0039003C9FEA /* inspector_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = inspector_on.png; path = ../icons/inspector_on.png; sourceTree = SOURCE_ROOT; };
+ 432792A1194F0039003C9FEA /* inspector_on_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = inspector_on_active.png; path = ../icons/inspector_on_active.png; sourceTree = SOURCE_ROOT; };
+ 432792A2194F0039003C9FEA /* inspector_on_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = inspector_on_prelight.png; path = ../icons/inspector_on_prelight.png; sourceTree = SOURCE_ROOT; };
+ 432792A3194F0039003C9FEA /* join_tools.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = join_tools.png; path = ../icons/join_tools.png; sourceTree = SOURCE_ROOT; };
+ 432792A4194F0039003C9FEA /* knob.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = knob.png; path = ../icons/knob.png; sourceTree = SOURCE_ROOT; };
+ 432792A5194F0039003C9FEA /* lock_session.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lock_session.png; path = ../icons/lock_session.png; sourceTree = SOURCE_ROOT; };
+ 432792A6194F0039003C9FEA /* lock_session_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lock_session_active.png; path = ../icons/lock_session_active.png; sourceTree = SOURCE_ROOT; };
+ 432792A7194F0039003C9FEA /* lock_session_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lock_session_prelight.png; path = ../icons/lock_session_prelight.png; sourceTree = SOURCE_ROOT; };
+ 432792A8194F0039003C9FEA /* media_button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = media_button.png; path = ../icons/media_button.png; sourceTree = SOURCE_ROOT; };
+ 432792A9194F0039003C9FEA /* media_button_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = media_button_active.png; path = ../icons/media_button_active.png; sourceTree = SOURCE_ROOT; };
+ 432792AA194F0039003C9FEA /* media_button_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = media_button_prelight.png; path = ../icons/media_button_prelight.png; sourceTree = SOURCE_ROOT; };
+ 432792AB194F0039003C9FEA /* meter_bridge_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = meter_bridge_on.png; path = ../icons/meter_bridge_on.png; sourceTree = SOURCE_ROOT; };
+ 432792AC194F0039003C9FEA /* meter_bridge_on_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = meter_bridge_on_active.png; path = ../icons/meter_bridge_on_active.png; sourceTree = SOURCE_ROOT; };
+ 432792AD194F0039003C9FEA /* meter_bridge_on_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = meter_bridge_on_prelight.png; path = ../icons/meter_bridge_on_prelight.png; sourceTree = SOURCE_ROOT; };
+ 432792AE194F0039003C9FEA /* metronome.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = metronome.png; path = ../icons/metronome.png; sourceTree = SOURCE_ROOT; };
+ 432792AF194F0039003C9FEA /* mezzforte.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mezzforte.png; path = ../icons/mezzforte.png; sourceTree = SOURCE_ROOT; };
+ 432792B0194F0039003C9FEA /* mezzoforte.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mezzoforte.png; path = ../icons/mezzoforte.png; sourceTree = SOURCE_ROOT; };
+ 432792B1194F0039003C9FEA /* mezzopiano.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mezzopiano.png; path = ../icons/mezzopiano.png; sourceTree = SOURCE_ROOT; };
+ 432792B2194F0039003C9FEA /* midi-input-active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "midi-input-active.png"; path = "../icons/midi-input-active.png"; sourceTree = SOURCE_ROOT; };
+ 432792B3194F0039003C9FEA /* midi-input-inactive.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "midi-input-inactive.png"; path = "../icons/midi-input-inactive.png"; sourceTree = SOURCE_ROOT; };
+ 432792B4194F0039003C9FEA /* midi_panic.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = midi_panic.png; path = ../icons/midi_panic.png; sourceTree = SOURCE_ROOT; };
+ 432792B5194F0039003C9FEA /* midi_socket_small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = midi_socket_small.png; path = ../icons/midi_socket_small.png; sourceTree = SOURCE_ROOT; };
+ 432792B6194F0039003C9FEA /* midi_sound_notes.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = midi_sound_notes.png; path = ../icons/midi_sound_notes.png; sourceTree = SOURCE_ROOT; };
+ 432792B7194F0039003C9FEA /* midi_tool_erase.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = midi_tool_erase.png; path = ../icons/midi_tool_erase.png; sourceTree = SOURCE_ROOT; };
+ 432792B8194F0039003C9FEA /* midi_tool_pencil.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = midi_tool_pencil.png; path = ../icons/midi_tool_pencil.png; sourceTree = SOURCE_ROOT; };
+ 432792B9194F0039003C9FEA /* midi_tool_select.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = midi_tool_select.png; path = ../icons/midi_tool_select.png; sourceTree = SOURCE_ROOT; };
+ 432792BA194F0039003C9FEA /* mixer_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mixer_on.png; path = ../icons/mixer_on.png; sourceTree = SOURCE_ROOT; };
+ 432792BB194F0039003C9FEA /* mixer_on_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mixer_on_active.png; path = ../icons/mixer_on_active.png; sourceTree = SOURCE_ROOT; };
+ 432792BC194F0039003C9FEA /* mixer_on_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mixer_on_prelight.png; path = ../icons/mixer_on_prelight.png; sourceTree = SOURCE_ROOT; };
+ 432792BD194F0039003C9FEA /* mode_multi_out.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mode_multi_out.png; path = ../icons/mode_multi_out.png; sourceTree = SOURCE_ROOT; };
+ 432792BE194F0039003C9FEA /* mode_multi_out_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mode_multi_out_active.png; path = ../icons/mode_multi_out_active.png; sourceTree = SOURCE_ROOT; };
+ 432792BF194F0039003C9FEA /* mode_multi_out_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mode_multi_out_prelight.png; path = ../icons/mode_multi_out_prelight.png; sourceTree = SOURCE_ROOT; };
+ 432792C0194F0039003C9FEA /* mode_stereo_out.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mode_stereo_out.png; path = ../icons/mode_stereo_out.png; sourceTree = SOURCE_ROOT; };
+ 432792C1194F0039003C9FEA /* mode_stereo_out_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mode_stereo_out_active.png; path = ../icons/mode_stereo_out_active.png; sourceTree = SOURCE_ROOT; };
+ 432792C2194F0039003C9FEA /* mode_stereo_out_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mode_stereo_out_prelight.png; path = ../icons/mode_stereo_out_prelight.png; sourceTree = SOURCE_ROOT; };
+ 432792C3194F0039003C9FEA /* move_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = move_cursor.png; path = ../icons/move_cursor.png; sourceTree = SOURCE_ROOT; };
+ 432792C4194F0039003C9FEA /* mute-disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "mute-disabled.png"; path = "../icons/mute-disabled.png"; sourceTree = SOURCE_ROOT; };
+ 432792C5194F0039003C9FEA /* mute-enabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "mute-enabled.png"; path = "../icons/mute-enabled.png"; sourceTree = SOURCE_ROOT; };
+ 432792C6194F0039003C9FEA /* muted-by-others.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "muted-by-others.png"; path = "../icons/muted-by-others.png"; sourceTree = SOURCE_ROOT; };
+ 432792C7194F0039003C9FEA /* nudge_left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = nudge_left.png; path = ../icons/nudge_left.png; sourceTree = SOURCE_ROOT; };
+ 432792C8194F0039003C9FEA /* nudge_right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = nudge_right.png; path = ../icons/nudge_right.png; sourceTree = SOURCE_ROOT; };
+ 432792C9194F0039003C9FEA /* pianissimo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = pianissimo.png; path = ../icons/pianissimo.png; sourceTree = SOURCE_ROOT; };
+ 432792CA194F0039003C9FEA /* pianississimo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = pianississimo.png; path = ../icons/pianississimo.png; sourceTree = SOURCE_ROOT; };
+ 432792CB194F0039003C9FEA /* piano.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = piano.png; path = ../icons/piano.png; sourceTree = SOURCE_ROOT; };
+ 432792CC194F0039003C9FEA /* quarternote.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = quarternote.png; path = ../icons/quarternote.png; sourceTree = SOURCE_ROOT; };
+ 432792CD194F0039003C9FEA /* rec-enabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "rec-enabled.png"; path = "../icons/rec-enabled.png"; sourceTree = SOURCE_ROOT; };
+ 432792CE194F0039003C9FEA /* rec-in-progress.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "rec-in-progress.png"; path = "../icons/rec-in-progress.png"; sourceTree = SOURCE_ROOT; };
+ 432792CF194F0039003C9FEA /* record-normal-disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "record-normal-disabled.png"; path = "../icons/record-normal-disabled.png"; sourceTree = SOURCE_ROOT; };
+ 432792D0194F0039003C9FEA /* record-normal-enabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "record-normal-enabled.png"; path = "../icons/record-normal-enabled.png"; sourceTree = SOURCE_ROOT; };
+ 432792D1194F0039003C9FEA /* record-normal-in-progress.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "record-normal-in-progress.png"; path = "../icons/record-normal-in-progress.png"; sourceTree = SOURCE_ROOT; };
+ 432792D2194F0039003C9FEA /* record-step.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "record-step.png"; path = "../icons/record-step.png"; sourceTree = SOURCE_ROOT; };
+ 432792D3194F0039003C9FEA /* record_disabled_grey.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = record_disabled_grey.png; path = ../icons/record_disabled_grey.png; sourceTree = SOURCE_ROOT; };
+ 432792D4194F0039003C9FEA /* record_normal_red.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = record_normal_red.png; path = ../icons/record_normal_red.png; sourceTree = SOURCE_ROOT; };
+ 432792D5194F0039003C9FEA /* record_tape_red.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = record_tape_red.png; path = ../icons/record_tape_red.png; sourceTree = SOURCE_ROOT; };
+ 432792D6194F0039003C9FEA /* resize_bottom_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = resize_bottom_cursor.png; path = ../icons/resize_bottom_cursor.png; sourceTree = SOURCE_ROOT; };
+ 432792D7194F0039003C9FEA /* resize_bottom_left_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = resize_bottom_left_cursor.png; path = ../icons/resize_bottom_left_cursor.png; sourceTree = SOURCE_ROOT; };
+ 432792D8194F0039003C9FEA /* resize_bottom_right_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = resize_bottom_right_cursor.png; path = ../icons/resize_bottom_right_cursor.png; sourceTree = SOURCE_ROOT; };
+ 432792D9194F0039003C9FEA /* resize_left_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = resize_left_cursor.png; path = ../icons/resize_left_cursor.png; sourceTree = SOURCE_ROOT; };
+ 432792DA194F0039003C9FEA /* resize_right_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = resize_right_cursor.png; path = ../icons/resize_right_cursor.png; sourceTree = SOURCE_ROOT; };
+ 432792DB194F0039003C9FEA /* resize_top_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = resize_top_cursor.png; path = ../icons/resize_top_cursor.png; sourceTree = SOURCE_ROOT; };
+ 432792DC194F0039003C9FEA /* resize_top_left_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = resize_top_left_cursor.png; path = ../icons/resize_top_left_cursor.png; sourceTree = SOURCE_ROOT; };
+ 432792DD194F0039003C9FEA /* resize_top_right_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = resize_top_right_cursor.png; path = ../icons/resize_top_right_cursor.png; sourceTree = SOURCE_ROOT; };
+ 432792DE194F0039003C9FEA /* sae.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = sae.png; path = ../icons/sae.png; sourceTree = SOURCE_ROOT; };
+ 432792DF194F0039003C9FEA /* sessionlock.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = sessionlock.png; path = ../icons/sessionlock.png; sourceTree = SOURCE_ROOT; };
+ 432792E0194F0039003C9FEA /* sixteenthnote.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = sixteenthnote.png; path = ../icons/sixteenthnote.png; sourceTree = SOURCE_ROOT; };
+ 432792E1194F0039003C9FEA /* sixtyfourthnote.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = sixtyfourthnote.png; path = ../icons/sixtyfourthnote.png; sourceTree = SOURCE_ROOT; };
+ 432792E2194F0039003C9FEA /* slider_controller_fader.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = slider_controller_fader.png; path = ../icons/slider_controller_fader.png; sourceTree = SOURCE_ROOT; };
+ 432792E3194F0039003C9FEA /* slider_controller_fader_handle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = slider_controller_fader_handle.png; path = ../icons/slider_controller_fader_handle.png; sourceTree = SOURCE_ROOT; };
+ 432792E4194F0039003C9FEA /* solo-disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "solo-disabled.png"; path = "../icons/solo-disabled.png"; sourceTree = SOURCE_ROOT; };
+ 432792E5194F0039003C9FEA /* solo-enabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "solo-enabled.png"; path = "../icons/solo-enabled.png"; sourceTree = SOURCE_ROOT; };
+ 432792E6194F0039003C9FEA /* solo-isolate-disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "solo-isolate-disabled.png"; path = "../icons/solo-isolate-disabled.png"; sourceTree = SOURCE_ROOT; };
+ 432792E7194F0039003C9FEA /* solo-isolate-enabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "solo-isolate-enabled.png"; path = "../icons/solo-isolate-enabled.png"; sourceTree = SOURCE_ROOT; };
+ 432792E8194F0039003C9FEA /* solo-isolated.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "solo-isolated.png"; path = "../icons/solo-isolated.png"; sourceTree = SOURCE_ROOT; };
+ 432792E9194F0039003C9FEA /* solo-safe-disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "solo-safe-disabled.png"; path = "../icons/solo-safe-disabled.png"; sourceTree = SOURCE_ROOT; };
+ 432792EA194F0039003C9FEA /* solo-safe-enabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "solo-safe-enabled.png"; path = "../icons/solo-safe-enabled.png"; sourceTree = SOURCE_ROOT; };
+ 432792EB194F0039003C9FEA /* solo-safe-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "solo-safe-icon.png"; path = "../icons/solo-safe-icon.png"; sourceTree = SOURCE_ROOT; };
+ 432792EC194F0039003C9FEA /* soloed-by-others.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "soloed-by-others.png"; path = "../icons/soloed-by-others.png"; sourceTree = SOURCE_ROOT; };
+ 432792ED194F0039003C9FEA /* step-editing.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "step-editing.png"; path = "../icons/step-editing.png"; sourceTree = SOURCE_ROOT; };
+ 432792EE194F0039003C9FEA /* strip_width.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = strip_width.png; path = ../icons/strip_width.png; sourceTree = SOURCE_ROOT; };
+ 432792EF194F0039003C9FEA /* systemlock.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = systemlock.png; path = ../icons/systemlock.png; sourceTree = SOURCE_ROOT; };
+ 432792F0194F0039003C9FEA /* tav_exp.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tav_exp.png; path = ../icons/tav_exp.png; sourceTree = SOURCE_ROOT; };
+ 432792F1194F0039003C9FEA /* tav_shrink.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tav_shrink.png; path = ../icons/tav_shrink.png; sourceTree = SOURCE_ROOT; };
+ 432792F2194F0039003C9FEA /* thirtysecondnote.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = thirtysecondnote.png; path = ../icons/thirtysecondnote.png; sourceTree = SOURCE_ROOT; };
+ 432792F3194F0039003C9FEA /* tool_arrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_arrow.png; path = ../icons/tool_arrow.png; sourceTree = SOURCE_ROOT; };
+ 432792F4194F0039003C9FEA /* tool_arrow_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_arrow_active.png; path = ../icons/tool_arrow_active.png; sourceTree = SOURCE_ROOT; };
+ 432792F5194F0039003C9FEA /* tool_arrow_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_arrow_prelight.png; path = ../icons/tool_arrow_prelight.png; sourceTree = SOURCE_ROOT; };
+ 432792F6194F0039003C9FEA /* tool_audition.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_audition.png; path = ../icons/tool_audition.png; sourceTree = SOURCE_ROOT; };
+ 432792F7194F0039003C9FEA /* tool_cut.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_cut.png; path = ../icons/tool_cut.png; sourceTree = SOURCE_ROOT; };
+ 432792F8194F0039003C9FEA /* tool_cut_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_cut_active.png; path = ../icons/tool_cut_active.png; sourceTree = SOURCE_ROOT; };
+ 432792F9194F0039003C9FEA /* tool_cut_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_cut_prelight.png; path = ../icons/tool_cut_prelight.png; sourceTree = SOURCE_ROOT; };
+ 432792FA194F0039003C9FEA /* tool_gain.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_gain.png; path = ../icons/tool_gain.png; sourceTree = SOURCE_ROOT; };
+ 432792FB194F0039003C9FEA /* tool_marker.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_marker.png; path = ../icons/tool_marker.png; sourceTree = SOURCE_ROOT; };
+ 432792FC194F0039003C9FEA /* tool_marker_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_marker_active.png; path = ../icons/tool_marker_active.png; sourceTree = SOURCE_ROOT; };
+ 432792FD194F0039003C9FEA /* tool_marker_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_marker_prelight.png; path = ../icons/tool_marker_prelight.png; sourceTree = SOURCE_ROOT; };
+ 432792FE194F0039003C9FEA /* tool_note.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_note.png; path = ../icons/tool_note.png; sourceTree = SOURCE_ROOT; };
+ 432792FF194F0039003C9FEA /* tool_object.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_object.png; path = ../icons/tool_object.png; sourceTree = SOURCE_ROOT; };
+ 43279300194F0039003C9FEA /* tool_object_range.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_object_range.png; path = ../icons/tool_object_range.png; sourceTree = SOURCE_ROOT; };
+ 43279301194F0039003C9FEA /* tool_range.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_range.png; path = ../icons/tool_range.png; sourceTree = SOURCE_ROOT; };
+ 43279302194F0039003C9FEA /* tool_stretch.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_stretch.png; path = ../icons/tool_stretch.png; sourceTree = SOURCE_ROOT; };
+ 43279303194F0039003C9FEA /* tool_waveform_zoom.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_waveform_zoom.png; path = ../icons/tool_waveform_zoom.png; sourceTree = SOURCE_ROOT; };
+ 43279304194F0039003C9FEA /* tool_waveform_zoom_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_waveform_zoom_active.png; path = ../icons/tool_waveform_zoom_active.png; sourceTree = SOURCE_ROOT; };
+ 43279305194F0039003C9FEA /* tool_waveform_zoom_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_waveform_zoom_prelight.png; path = ../icons/tool_waveform_zoom_prelight.png; sourceTree = SOURCE_ROOT; };
+ 43279306194F0039003C9FEA /* tool_zoom.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_zoom.png; path = ../icons/tool_zoom.png; sourceTree = SOURCE_ROOT; };
+ 43279307194F0039003C9FEA /* tool_zoom_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_zoom_active.png; path = ../icons/tool_zoom_active.png; sourceTree = SOURCE_ROOT; };
+ 43279308194F0039003C9FEA /* tool_zoom_ardour.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_zoom_ardour.png; path = ../icons/tool_zoom_ardour.png; sourceTree = SOURCE_ROOT; };
+ 43279309194F0039003C9FEA /* tool_zoom_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tool_zoom_prelight.png; path = ../icons/tool_zoom_prelight.png; sourceTree = SOURCE_ROOT; };
+ 4327930A194F003A003C9FEA /* tracks.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tracks.png; path = ../icons/tracks.png; sourceTree = SOURCE_ROOT; };
+ 4327930B194F003A003C9FEA /* tracks_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tracks_active.png; path = ../icons/tracks_active.png; sourceTree = SOURCE_ROOT; };
+ 4327930C194F003A003C9FEA /* tracks_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tracks_prelight.png; path = ../icons/tracks_prelight.png; sourceTree = SOURCE_ROOT; };
+ 4327930D194F003A003C9FEA /* transport_end.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_end.png; path = ../icons/transport_end.png; sourceTree = SOURCE_ROOT; };
+ 4327930E194F003A003C9FEA /* transport_end_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_end_active.png; path = ../icons/transport_end_active.png; sourceTree = SOURCE_ROOT; };
+ 4327930F194F003A003C9FEA /* transport_end_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_end_prelight.png; path = ../icons/transport_end_prelight.png; sourceTree = SOURCE_ROOT; };
+ 43279310194F003A003C9FEA /* transport_loop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_loop.png; path = ../icons/transport_loop.png; sourceTree = SOURCE_ROOT; };
+ 43279311194F003A003C9FEA /* transport_loop_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_loop_active.png; path = ../icons/transport_loop_active.png; sourceTree = SOURCE_ROOT; };
+ 43279312194F003A003C9FEA /* transport_loop_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_loop_prelight.png; path = ../icons/transport_loop_prelight.png; sourceTree = SOURCE_ROOT; };
+ 43279313194F003A003C9FEA /* transport_play.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_play.png; path = ../icons/transport_play.png; sourceTree = SOURCE_ROOT; };
+ 43279314194F003A003C9FEA /* transport_play_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_play_active.png; path = ../icons/transport_play_active.png; sourceTree = SOURCE_ROOT; };
+ 43279315194F003A003C9FEA /* transport_play_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_play_prelight.png; path = ../icons/transport_play_prelight.png; sourceTree = SOURCE_ROOT; };
+ 43279316194F003A003C9FEA /* transport_range.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_range.png; path = ../icons/transport_range.png; sourceTree = SOURCE_ROOT; };
+ 43279317194F003A003C9FEA /* transport_record.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_record.png; path = ../icons/transport_record.png; sourceTree = SOURCE_ROOT; };
+ 43279318194F003A003C9FEA /* transport_record_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_record_active.png; path = ../icons/transport_record_active.png; sourceTree = SOURCE_ROOT; };
+ 43279319194F003A003C9FEA /* transport_record_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_record_prelight.png; path = ../icons/transport_record_prelight.png; sourceTree = SOURCE_ROOT; };
+ 4327931A194F003A003C9FEA /* transport_start.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_start.png; path = ../icons/transport_start.png; sourceTree = SOURCE_ROOT; };
+ 4327931B194F003A003C9FEA /* transport_start_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_start_active.png; path = ../icons/transport_start_active.png; sourceTree = SOURCE_ROOT; };
+ 4327931C194F003A003C9FEA /* transport_start_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_start_prelight.png; path = ../icons/transport_start_prelight.png; sourceTree = SOURCE_ROOT; };
+ 4327931D194F003A003C9FEA /* transport_stop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_stop.png; path = ../icons/transport_stop.png; sourceTree = SOURCE_ROOT; };
+ 4327931E194F003A003C9FEA /* transport_stop_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_stop_active.png; path = ../icons/transport_stop_active.png; sourceTree = SOURCE_ROOT; };
+ 4327931F194F003A003C9FEA /* transport_stop_prelight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transport_stop_prelight.png; path = ../icons/transport_stop_prelight.png; sourceTree = SOURCE_ROOT; };
+ 43279320194F003A003C9FEA /* trim_bottom_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = trim_bottom_cursor.png; path = ../icons/trim_bottom_cursor.png; sourceTree = SOURCE_ROOT; };
+ 43279321194F003A003C9FEA /* trim_left_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = trim_left_cursor.png; path = ../icons/trim_left_cursor.png; sourceTree = SOURCE_ROOT; };
+ 43279322194F003A003C9FEA /* trim_left_cursor_5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = trim_left_cursor_5.png; path = ../icons/trim_left_cursor_5.png; sourceTree = SOURCE_ROOT; };
+ 43279323194F003A003C9FEA /* trim_left_cursor_right_only.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = trim_left_cursor_right_only.png; path = ../icons/trim_left_cursor_right_only.png; sourceTree = SOURCE_ROOT; };
+ 43279324194F003A003C9FEA /* trim_right_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = trim_right_cursor.png; path = ../icons/trim_right_cursor.png; sourceTree = SOURCE_ROOT; };
+ 43279325194F003A003C9FEA /* trim_right_cursor_5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = trim_right_cursor_5.png; path = ../icons/trim_right_cursor_5.png; sourceTree = SOURCE_ROOT; };
+ 43279326194F003A003C9FEA /* trim_right_cursor_left_only.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = trim_right_cursor_left_only.png; path = ../icons/trim_right_cursor_left_only.png; sourceTree = SOURCE_ROOT; };
+ 43279327194F003A003C9FEA /* trim_top_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = trim_top_cursor.png; path = ../icons/trim_top_cursor.png; sourceTree = SOURCE_ROOT; };
+ 43279328194F003A003C9FEA /* vertical_zoom_fader_face.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = vertical_zoom_fader_face.png; path = ../icons/vertical_zoom_fader_face.png; sourceTree = SOURCE_ROOT; };
+ 43279329194F003A003C9FEA /* wholenote.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = wholenote.png; path = ../icons/wholenote.png; sourceTree = SOURCE_ROOT; };
+ 4327932A194F003A003C9FEA /* zoom_fader_handle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = zoom_fader_handle.png; path = ../icons/zoom_fader_handle.png; sourceTree = SOURCE_ROOT; };
+ 4327932B194F003A003C9FEA /* zoom_fader_handle_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = zoom_fader_handle_active.png; path = ../icons/zoom_fader_handle_active.png; sourceTree = SOURCE_ROOT; };
+ 4327932C194F003A003C9FEA /* zoom_full.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = zoom_full.png; path = ../icons/zoom_full.png; sourceTree = SOURCE_ROOT; };
+ 4327932D194F003A003C9FEA /* zoom_in.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = zoom_in.png; path = ../icons/zoom_in.png; sourceTree = SOURCE_ROOT; };
+ 4327932E194F003A003C9FEA /* zoom_in_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = zoom_in_cursor.png; path = ../icons/zoom_in_cursor.png; sourceTree = SOURCE_ROOT; };
+ 4327932F194F003A003C9FEA /* zoom_out.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = zoom_out.png; path = ../icons/zoom_out.png; sourceTree = SOURCE_ROOT; };
+ 43279330194F003A003C9FEA /* zoom_out_cursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = zoom_out_cursor.png; path = ../icons/zoom_out_cursor.png; sourceTree = SOURCE_ROOT; };
+ 43279400194F0062003C9FEA /* forwardblarrow.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = forwardblarrow.xpm; path = ../pixmaps/forwardblarrow.xpm; sourceTree = SOURCE_ROOT; };
+ 43279401194F0062003C9FEA /* h_meter_strip.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = h_meter_strip.xpm; path = ../pixmaps/h_meter_strip.xpm; sourceTree = SOURCE_ROOT; };
+ 43279402194F0062003C9FEA /* hiin.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = hiin.xpm; path = ../pixmaps/hiin.xpm; sourceTree = SOURCE_ROOT; };
+ 43279403194F0062003C9FEA /* hiout.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = hiout.xpm; path = ../pixmaps/hiout.xpm; sourceTree = SOURCE_ROOT; };
+ 43279404194F0062003C9FEA /* hslider00.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = hslider00.xpm; path = ../pixmaps/hslider00.xpm; sourceTree = SOURCE_ROOT; };
+ 43279405194F0062003C9FEA /* hslider01.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = hslider01.xpm; path = ../pixmaps/hslider01.xpm; sourceTree = SOURCE_ROOT; };
+ 43279406194F0062003C9FEA /* left_arrow.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = left_arrow.xpm; path = ../pixmaps/left_arrow.xpm; sourceTree = SOURCE_ROOT; };
+ 43279407194F0062003C9FEA /* linin.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = linin.xpm; path = ../pixmaps/linin.xpm; sourceTree = SOURCE_ROOT; };
+ 43279408194F0062003C9FEA /* linout.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = linout.xpm; path = ../pixmaps/linout.xpm; sourceTree = SOURCE_ROOT; };
+ 43279409194F0062003C9FEA /* loin.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = loin.xpm; path = ../pixmaps/loin.xpm; sourceTree = SOURCE_ROOT; };
+ 4327940A194F0062003C9FEA /* loop.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = loop.xpm; path = ../pixmaps/loop.xpm; sourceTree = SOURCE_ROOT; };
+ 4327940B194F0062003C9FEA /* loout.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = loout.xpm; path = ../pixmaps/loout.xpm; sourceTree = SOURCE_ROOT; };
+ 4327940C194F0062003C9FEA /* lr.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = lr.xpm; path = ../pixmaps/lr.xpm; sourceTree = SOURCE_ROOT; };
+ 4327940D194F0062003C9FEA /* regin.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = regin.xpm; path = ../pixmaps/regin.xpm; sourceTree = SOURCE_ROOT; };
+ 4327940E194F0062003C9FEA /* regin2.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = regin2.xpm; path = ../pixmaps/regin2.xpm; sourceTree = SOURCE_ROOT; };
+ 4327940F194F0062003C9FEA /* regout.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = regout.xpm; path = ../pixmaps/regout.xpm; sourceTree = SOURCE_ROOT; };
+ 43279410194F0062003C9FEA /* regout2.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = regout2.xpm; path = ../pixmaps/regout2.xpm; sourceTree = SOURCE_ROOT; };
+ 43279411194F0062003C9FEA /* revdblarrow.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = revdblarrow.xpm; path = ../pixmaps/revdblarrow.xpm; sourceTree = SOURCE_ROOT; };
+ 43279412194F0062003C9FEA /* right_arrow.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = right_arrow.xpm; path = ../pixmaps/right_arrow.xpm; sourceTree = SOURCE_ROOT; };
+ 43279413194F0062003C9FEA /* set-next-button.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "set-next-button.xpm"; path = "../pixmaps/set-next-button.xpm"; sourceTree = SOURCE_ROOT; };
+ 43279414194F0062003C9FEA /* small-round-button-01.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "small-round-button-01.xpm"; path = "../pixmaps/small-round-button-01.xpm"; sourceTree = SOURCE_ROOT; };
+ 43279415194F0062003C9FEA /* small_x.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = small_x.xpm; path = ../pixmaps/small_x.xpm; sourceTree = SOURCE_ROOT; };
+ 43279416194F0062003C9FEA /* toggle-button-00.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "toggle-button-00.xpm"; path = "../pixmaps/toggle-button-00.xpm"; sourceTree = SOURCE_ROOT; };
+ 43279417194F0062003C9FEA /* toggle-button-01.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "toggle-button-01.xpm"; path = "../pixmaps/toggle-button-01.xpm"; sourceTree = SOURCE_ROOT; };
+ 43279418194F0062003C9FEA /* tool_audition.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = tool_audition.xpm; path = ../pixmaps/tool_audition.xpm; sourceTree = SOURCE_ROOT; };
+ 43279419194F0062003C9FEA /* tool_gain.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = tool_gain.xpm; path = ../pixmaps/tool_gain.xpm; sourceTree = SOURCE_ROOT; };
+ 4327941A194F0062003C9FEA /* tool_object.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = tool_object.xpm; path = ../pixmaps/tool_object.xpm; sourceTree = SOURCE_ROOT; };
+ 4327941B194F0062003C9FEA /* tool_range.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = tool_range.xpm; path = ../pixmaps/tool_range.xpm; sourceTree = SOURCE_ROOT; };
+ 4327941C194F0062003C9FEA /* tool_stretch.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = tool_stretch.xpm; path = ../pixmaps/tool_stretch.xpm; sourceTree = SOURCE_ROOT; };
+ 4327941D194F0062003C9FEA /* tool_zoom.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = tool_zoom.xpm; path = ../pixmaps/tool_zoom.xpm; sourceTree = SOURCE_ROOT; };
+ 4327941E194F0062003C9FEA /* v_meter_strip.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = v_meter_strip.xpm; path = ../pixmaps/v_meter_strip.xpm; sourceTree = SOURCE_ROOT; };
+ 4327941F194F0062003C9FEA /* vslider00.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = vslider00.xpm; path = ../pixmaps/vslider00.xpm; sourceTree = SOURCE_ROOT; };
+ 43279420194F0062003C9FEA /* vslider01.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = vslider01.xpm; path = ../pixmaps/vslider01.xpm; sourceTree = SOURCE_ROOT; };
+ 43279421194F0062003C9FEA /* vslider02_rail.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = vslider02_rail.xpm; path = ../pixmaps/vslider02_rail.xpm; sourceTree = SOURCE_ROOT; };
+ 43279422194F0062003C9FEA /* vslider02_slider.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = vslider02_slider.xpm; path = ../pixmaps/vslider02_slider.xpm; sourceTree = SOURCE_ROOT; };
+ 43279423194F0062003C9FEA /* vslider_slider_16wide.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = vslider_slider_16wide.xpm; path = ../pixmaps/vslider_slider_16wide.xpm; sourceTree = SOURCE_ROOT; };
+ 43279424194F0062003C9FEA /* zoom_full.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = zoom_full.xpm; path = ../pixmaps/zoom_full.xpm; sourceTree = SOURCE_ROOT; };
+ 43279425194F0062003C9FEA /* zoom_in.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = zoom_in.xpm; path = ../pixmaps/zoom_in.xpm; sourceTree = SOURCE_ROOT; };
+ 43279426194F0062003C9FEA /* zoom_out.xpm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = zoom_out.xpm; path = ../pixmaps/zoom_out.xpm; sourceTree = SOURCE_ROOT; };
+ 43279427194F0062003C9FEA /* small-splash.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "small-splash.png"; path = "../small-splash.png"; sourceTree = SOURCE_ROOT; };
+ 43279428194F0062003C9FEA /* splash.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = splash.png; path = ../splash.png; sourceTree = SOURCE_ROOT; };
+ 4327942A194F0062003C9FEA /* device_capture_control.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = device_capture_control.xml; path = ../ui/device_capture_control.xml; sourceTree = SOURCE_ROOT; };
+ 4327942B194F0062003C9FEA /* device_playback_control.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = device_playback_control.xml; path = ../ui/device_playback_control.xml; sourceTree = SOURCE_ROOT; };
+ 4327942C194F0062003C9FEA /* editor_window.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = editor_window.xml; path = ../ui/editor_window.xml; sourceTree = SOURCE_ROOT; };
+ 4327942D194F0062003C9FEA /* midi_device_control.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = midi_device_control.xml; path = ../ui/midi_device_control.xml; sourceTree = SOURCE_ROOT; };
+ 4327942E194F0062003C9FEA /* session_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = session_dialog.xml; path = ../ui/session_dialog.xml; sourceTree = SOURCE_ROOT; };
+ 4327942F194F0062003C9FEA /* session_lock_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = session_lock_dialog.xml; path = ../ui/session_lock_dialog.xml; sourceTree = SOURCE_ROOT; };
+ 43279430194F0062003C9FEA /* tracks_preferences.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = tracks_preferences.xml; path = ../ui/tracks_preferences.xml; sourceTree = SOURCE_ROOT; };
+ 43279475194F009E003C9FEA /* tracks.menus.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = tracks.menus.in; path = ../tracks.menus.in; sourceTree = SOURCE_ROOT; };
+ 435E66781A4AB60C00472D50 /* audiographer.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = audiographer.xcodeproj; path = ../../libs/audiographer/macos/audiographer/audiographer.xcodeproj; sourceTree = "<group>"; };
+ 4397595019CADAFC00740098 /* canvas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = canvas.xcodeproj; path = ../../libs/canvas/macosx/canvas/canvas.xcodeproj; sourceTree = "<group>"; };
+ 4397599619CB06AC00740098 /* gtkmm2ext.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = gtkmm2ext.xcodeproj; path = ../../libs/gtkmm2ext/macosx/gtkmm2ext/gtkmm2ext.xcodeproj; sourceTree = "<group>"; };
+ 43B350F1194F04E00038C140 /* actions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = actions.h; path = ../actions.h; sourceTree = SOURCE_ROOT; };
+ 43B350F2194F04E00038C140 /* add_route_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = add_route_dialog.h; path = ../add_route_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B350F3194F04E00038C140 /* add_video_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = add_video_dialog.h; path = ../add_video_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B350F4194F04E00038C140 /* ambiguous_file_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ambiguous_file_dialog.h; path = ../ambiguous_file_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B350F5194F04E00038C140 /* analysis_window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = analysis_window.h; path = ../analysis_window.h; sourceTree = SOURCE_ROOT; };
+ 43B350F6194F04E00038C140 /* ardour_button.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ardour_button.h; path = ../ardour_button.h; sourceTree = SOURCE_ROOT; };
+ 43B350F7194F04E00038C140 /* ardour_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ardour_dialog.h; path = ../ardour_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B350F8194F04E00038C140 /* ardour_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ardour_ui.h; path = ../ardour_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B350F9194F04E00038C140 /* ardour_window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ardour_window.h; path = ../ardour_window.h; sourceTree = SOURCE_ROOT; };
+ 43B350FA194F04E00038C140 /* au_pluginui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = au_pluginui.h; path = ../au_pluginui.h; sourceTree = SOURCE_ROOT; };
+ 43B350FB194F04E00038C140 /* audio_clock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_clock.h; path = ../audio_clock.h; sourceTree = SOURCE_ROOT; };
+ 43B350FC194F04E00038C140 /* audio_region_editor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_region_editor.h; path = ../audio_region_editor.h; sourceTree = SOURCE_ROOT; };
+ 43B350FD194F04E00038C140 /* audio_region_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_region_view.h; path = ../audio_region_view.h; sourceTree = SOURCE_ROOT; };
+ 43B350FE194F04E00038C140 /* audio_streamview.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_streamview.h; path = ../audio_streamview.h; sourceTree = SOURCE_ROOT; };
+ 43B350FF194F04E00038C140 /* audio_time_axis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_time_axis.h; path = ../audio_time_axis.h; sourceTree = SOURCE_ROOT; };
+ 43B35100194F04E00038C140 /* automation_controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = automation_controller.h; path = ../automation_controller.h; sourceTree = SOURCE_ROOT; };
+ 43B35101194F04E00038C140 /* automation_line.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = automation_line.h; path = ../automation_line.h; sourceTree = SOURCE_ROOT; };
+ 43B35102194F04E00038C140 /* automation_region_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = automation_region_view.h; path = ../automation_region_view.h; sourceTree = SOURCE_ROOT; };
+ 43B35103194F04E00038C140 /* automation_selection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = automation_selection.h; path = ../automation_selection.h; sourceTree = SOURCE_ROOT; };
+ 43B35104194F04E00038C140 /* automation_streamview.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = automation_streamview.h; path = ../automation_streamview.h; sourceTree = SOURCE_ROOT; };
+ 43B35105194F04E00038C140 /* automation_time_axis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = automation_time_axis.h; path = ../automation_time_axis.h; sourceTree = SOURCE_ROOT; };
+ 43B35106194F04E00038C140 /* axis_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = axis_view.h; path = ../axis_view.h; sourceTree = SOURCE_ROOT; };
+ 43B35107194F04E00038C140 /* big_clock_window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = big_clock_window.h; path = ../big_clock_window.h; sourceTree = SOURCE_ROOT; };
+ 43B35108194F04E00038C140 /* bundle_env.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bundle_env.h; path = ../bundle_env.h; sourceTree = SOURCE_ROOT; };
+ 43B35109194F04E00038C140 /* bundle_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bundle_manager.h; path = ../bundle_manager.h; sourceTree = SOURCE_ROOT; };
+ 43B3510A194F04E00038C140 /* button_joiner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = button_joiner.h; path = ../button_joiner.h; sourceTree = SOURCE_ROOT; };
+ 43B3510B194F04E00038C140 /* canvas_vars.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = canvas_vars.h; path = ../canvas_vars.h; sourceTree = SOURCE_ROOT; };
+ 43B3510C194F04E00038C140 /* canvas-waveview.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "canvas-waveview.h"; path = "../canvas-waveview.h"; sourceTree = SOURCE_ROOT; };
+ 43B3510D194F04E00038C140 /* clock_group.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = clock_group.h; path = ../clock_group.h; sourceTree = SOURCE_ROOT; };
+ 43B3510E194F04E00038C140 /* configinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = configinfo.h; path = ../configinfo.h; sourceTree = SOURCE_ROOT; };
+ 43B3510F194F04E00038C140 /* control_point_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = control_point_dialog.h; path = ../control_point_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B35110194F04E00038C140 /* control_point.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = control_point.h; path = ../control_point.h; sourceTree = SOURCE_ROOT; };
+ 43B35111194F04E00038C140 /* crossfade_edit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crossfade_edit.h; path = ../crossfade_edit.h; sourceTree = SOURCE_ROOT; };
+ 43B35112194F04E00038C140 /* crossfade_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crossfade_view.h; path = ../crossfade_view.h; sourceTree = SOURCE_ROOT; };
+ 43B35113194F04E00038C140 /* crossfade_xpms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crossfade_xpms.h; path = ../crossfade_xpms.h; sourceTree = SOURCE_ROOT; };
+ 43B35114194F04E00038C140 /* dbg_msg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dbg_msg.h; path = ../dbg_msg.h; sourceTree = SOURCE_ROOT; };
+ 43B35115194F04E00038C140 /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = debug.h; path = ../debug.h; sourceTree = SOURCE_ROOT; };
+ 43B35116194F04E00038C140 /* device_connection_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = device_connection_control.h; path = ../device_connection_control.h; sourceTree = SOURCE_ROOT; };
+ 43B35117194F04E00038C140 /* edit_note_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = edit_note_dialog.h; path = ../edit_note_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B35118194F04E00038C140 /* editing_syms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editing_syms.h; path = ../editing_syms.h; sourceTree = SOURCE_ROOT; };
+ 43B35119194F04E00038C140 /* editing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editing.h; path = ../editing.h; sourceTree = SOURCE_ROOT; };
+ 43B3511A194F04E00038C140 /* editor_component.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editor_component.h; path = ../editor_component.h; sourceTree = SOURCE_ROOT; };
+ 43B3511B194F04E00038C140 /* editor_cursors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editor_cursors.h; path = ../editor_cursors.h; sourceTree = SOURCE_ROOT; };
+ 43B3511C194F04E00038C140 /* editor_drag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editor_drag.h; path = ../editor_drag.h; sourceTree = SOURCE_ROOT; };
+ 43B3511D194F04E00038C140 /* editor_enums.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editor_enums.h; path = ../editor_enums.h; sourceTree = SOURCE_ROOT; };
+ 43B3511E194F04E00038C140 /* editor_group_tabs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editor_group_tabs.h; path = ../editor_group_tabs.h; sourceTree = SOURCE_ROOT; };
+ 43B3511F194F04E00038C140 /* editor_items.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editor_items.h; path = ../editor_items.h; sourceTree = SOURCE_ROOT; };
+ 43B35120194F04E00038C140 /* editor_locations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editor_locations.h; path = ../editor_locations.h; sourceTree = SOURCE_ROOT; };
+ 43B35121194F04E00038C140 /* editor_regions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editor_regions.h; path = ../editor_regions.h; sourceTree = SOURCE_ROOT; };
+ 43B35122194F04E00038C140 /* editor_route_groups.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editor_route_groups.h; path = ../editor_route_groups.h; sourceTree = SOURCE_ROOT; };
+ 43B35123194F04E00038C140 /* editor_routes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editor_routes.h; path = ../editor_routes.h; sourceTree = SOURCE_ROOT; };
+ 43B35124194F04E00038C140 /* editor_snapshots.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editor_snapshots.h; path = ../editor_snapshots.h; sourceTree = SOURCE_ROOT; };
+ 43B35125194F04E00038C140 /* editor_summary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editor_summary.h; path = ../editor_summary.h; sourceTree = SOURCE_ROOT; };
+ 43B35126194F04E00038C140 /* editor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editor.h; path = ../editor.h; sourceTree = SOURCE_ROOT; };
+ 43B35127194F04E00038C140 /* engine_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = engine_dialog.h; path = ../engine_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B35128194F04E00038C140 /* enums.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = enums.h; path = ../enums.h; sourceTree = SOURCE_ROOT; };
+ 43B3512A194F04E00038C140 /* export_channel_selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_channel_selector.h; path = ../export_channel_selector.h; sourceTree = SOURCE_ROOT; };
+ 43B3512B194F04E00038C140 /* export_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_dialog.h; path = ../export_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B3512C194F04E00038C140 /* export_file_notebook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_file_notebook.h; path = ../export_file_notebook.h; sourceTree = SOURCE_ROOT; };
+ 43B3512D194F04E00038C140 /* export_filename_selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_filename_selector.h; path = ../export_filename_selector.h; sourceTree = SOURCE_ROOT; };
+ 43B3512E194F04E00038C140 /* export_format_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_format_dialog.h; path = ../export_format_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B3512F194F04E00038C140 /* export_format_selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_format_selector.h; path = ../export_format_selector.h; sourceTree = SOURCE_ROOT; };
+ 43B35130194F04E00038C140 /* export_preset_selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_preset_selector.h; path = ../export_preset_selector.h; sourceTree = SOURCE_ROOT; };
+ 43B35131194F04E00038C140 /* export_range_markers_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_range_markers_dialog.h; path = ../export_range_markers_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B35132194F04E00038C140 /* export_timespan_selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_timespan_selector.h; path = ../export_timespan_selector.h; sourceTree = SOURCE_ROOT; };
+ 43B35133194F04E00038C140 /* export_video_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_video_dialog.h; path = ../export_video_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B35134194F04E00038C140 /* export_video_infobox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_video_infobox.h; path = ../export_video_infobox.h; sourceTree = SOURCE_ROOT; };
+ 43B35135194F04E00038C140 /* fft_graph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fft_graph.h; path = ../fft_graph.h; sourceTree = SOURCE_ROOT; };
+ 43B35136194F04E00038C140 /* fft_result.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fft_result.h; path = ../fft_result.h; sourceTree = SOURCE_ROOT; };
+ 43B35137194F04E00038C140 /* fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fft.h; path = ../fft.h; sourceTree = SOURCE_ROOT; };
+ 43B35138194F04E00038C140 /* fix_carbon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fix_carbon.h; path = ../fix_carbon.h; sourceTree = SOURCE_ROOT; };
+ 43B35139194F04E00038C140 /* gain_meter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gain_meter.h; path = ../gain_meter.h; sourceTree = SOURCE_ROOT; };
+ 43B3513A194F04E00038C140 /* gettext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gettext.h; path = ../gettext.h; sourceTree = SOURCE_ROOT; };
+ 43B3513B194F04E00038C140 /* ghostregion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ghostregion.h; path = ../ghostregion.h; sourceTree = SOURCE_ROOT; };
+ 43B3513C194F04E00038C140 /* global_port_matrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = global_port_matrix.h; path = ../global_port_matrix.h; sourceTree = SOURCE_ROOT; };
+ 43B3513D194F04E00038C140 /* global_signals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = global_signals.h; path = ../global_signals.h; sourceTree = SOURCE_ROOT; };
+ 43B3513E194F04E00038C140 /* group_tabs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = group_tabs.h; path = ../group_tabs.h; sourceTree = SOURCE_ROOT; };
+ 43B3513F194F04E00038C140 /* gtk_pianokeyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gtk_pianokeyboard.h; path = ../gtk_pianokeyboard.h; sourceTree = SOURCE_ROOT; };
+ 43B35142194F04E00038C140 /* gui_object.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gui_object.h; path = ../gui_object.h; sourceTree = SOURCE_ROOT; };
+ 43B35143194F04E00038C140 /* gui_thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gui_thread.h; path = ../gui_thread.h; sourceTree = SOURCE_ROOT; };
+ 43B35144194F04E00038C140 /* hit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hit.h; path = ../hit.h; sourceTree = SOURCE_ROOT; };
+ 43B35145194F04E00038C140 /* i18n.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = i18n.h; path = ../i18n.h; sourceTree = SOURCE_ROOT; };
+ 43B35146194F04E00038C140 /* insert_time_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = insert_time_dialog.h; path = ../insert_time_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B35147194F04E00038C140 /* interthread_progress_window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = interthread_progress_window.h; path = ../interthread_progress_window.h; sourceTree = SOURCE_ROOT; };
+ 43B35148194F04E00038C140 /* io_selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = io_selector.h; path = ../io_selector.h; sourceTree = SOURCE_ROOT; };
+ 43B35149194F04E00038C140 /* keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = keyboard.h; path = ../keyboard.h; sourceTree = SOURCE_ROOT; };
+ 43B3514A194F04E00038C140 /* keyeditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = keyeditor.h; path = ../keyeditor.h; sourceTree = SOURCE_ROOT; };
+ 43B3514B194F04E00038C140 /* latency_gui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = latency_gui.h; path = ../latency_gui.h; sourceTree = SOURCE_ROOT; };
+ 43B3514C194F04E00038C140 /* led.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = led.h; path = ../led.h; sourceTree = SOURCE_ROOT; };
+ 43B3514D194F04E00038C140 /* level_meter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = level_meter.h; path = ../level_meter.h; sourceTree = SOURCE_ROOT; };
+ 43B3514E194F04E00038C140 /* location_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = location_ui.h; path = ../location_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B3514F194F04E00038C140 /* logmeter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = logmeter.h; path = ../logmeter.h; sourceTree = SOURCE_ROOT; };
+ 43B35150194F04E00038C140 /* lv2_external_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lv2_external_ui.h; path = ../lv2_external_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B35151194F04E00038C140 /* lv2_plugin_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lv2_plugin_ui.h; path = ../lv2_plugin_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B35152194F04E00038C140 /* lxvst_plugin_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lxvst_plugin_ui.h; path = ../lxvst_plugin_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B35153194F04E00038C140 /* main_clock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = main_clock.h; path = ../main_clock.h; sourceTree = SOURCE_ROOT; };
+ 43B35154194F04E00038C140 /* marker_selection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = marker_selection.h; path = ../marker_selection.h; sourceTree = SOURCE_ROOT; };
+ 43B35155194F04E00038C140 /* marker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = marker.h; path = ../marker.h; sourceTree = SOURCE_ROOT; };
+ 43B35156194F04E00038C140 /* meter_patterns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = meter_patterns.h; path = ../meter_patterns.h; sourceTree = SOURCE_ROOT; };
+ 43B35157194F04E00038C140 /* meter_strip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = meter_strip.h; path = ../meter_strip.h; sourceTree = SOURCE_ROOT; };
+ 43B35158194F04E00038C140 /* meterbridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = meterbridge.h; path = ../meterbridge.h; sourceTree = SOURCE_ROOT; };
+ 43B35159194F04E00038C140 /* midi_automation_line.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_automation_line.h; path = ../midi_automation_line.h; sourceTree = SOURCE_ROOT; };
+ 43B3515A194F04E00038C140 /* midi_channel_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_channel_dialog.h; path = ../midi_channel_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B3515B194F04E00038C140 /* midi_channel_selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_channel_selector.h; path = ../midi_channel_selector.h; sourceTree = SOURCE_ROOT; };
+ 43B3515C194F04E00038C140 /* midi_cut_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_cut_buffer.h; path = ../midi_cut_buffer.h; sourceTree = SOURCE_ROOT; };
+ 43B3515D194F04E00038C140 /* midi_device_connection_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_device_connection_control.h; path = ../midi_device_connection_control.h; sourceTree = SOURCE_ROOT; };
+ 43B3515E194F04E00038C140 /* midi_export_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_export_dialog.h; path = ../midi_export_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B3515F194F04E00038C140 /* midi_list_editor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_list_editor.h; path = ../midi_list_editor.h; sourceTree = SOURCE_ROOT; };
+ 43B35160194F04E00038C140 /* midi_port_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_port_dialog.h; path = ../midi_port_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B35161194F04E00038C140 /* midi_region_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_region_view.h; path = ../midi_region_view.h; sourceTree = SOURCE_ROOT; };
+ 43B35162194F04E00038C140 /* midi_scroomer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_scroomer.h; path = ../midi_scroomer.h; sourceTree = SOURCE_ROOT; };
+ 43B35163194F04E00038C140 /* midi_selection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_selection.h; path = ../midi_selection.h; sourceTree = SOURCE_ROOT; };
+ 43B35164194F04E00038C140 /* midi_streamview.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_streamview.h; path = ../midi_streamview.h; sourceTree = SOURCE_ROOT; };
+ 43B35165194F04E00038C140 /* midi_time_axis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_time_axis.h; path = ../midi_time_axis.h; sourceTree = SOURCE_ROOT; };
+ 43B35166194F04E00038C140 /* midi_tracer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_tracer.h; path = ../midi_tracer.h; sourceTree = SOURCE_ROOT; };
+ 43B35167194F04E00038C140 /* midi_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_util.h; path = ../midi_util.h; sourceTree = SOURCE_ROOT; };
+ 43B35168194F04E00038C140 /* midi_velocity_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_velocity_dialog.h; path = ../midi_velocity_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B35169194F04E00038C140 /* missing_file_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = missing_file_dialog.h; path = ../missing_file_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B3516A194F04E00038C140 /* missing_plugin_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = missing_plugin_dialog.h; path = ../missing_plugin_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B3516B194F04E00038C140 /* mixer_actor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mixer_actor.h; path = ../mixer_actor.h; sourceTree = SOURCE_ROOT; };
+ 43B3516C194F04E00038C140 /* mixer_group_tabs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mixer_group_tabs.h; path = ../mixer_group_tabs.h; sourceTree = SOURCE_ROOT; };
+ 43B3516D194F04E00038C140 /* mixer_strip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mixer_strip.h; path = ../mixer_strip.h; sourceTree = SOURCE_ROOT; };
+ 43B3516E194F04E00038C140 /* mixer_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mixer_ui.h; path = ../mixer_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B3516F194F04E00038C140 /* monitor_section.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = monitor_section.h; path = ../monitor_section.h; sourceTree = SOURCE_ROOT; };
+ 43B35170194F04E00038C140 /* mono_panner_editor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mono_panner_editor.h; path = ../mono_panner_editor.h; sourceTree = SOURCE_ROOT; };
+ 43B35171194F04E00038C140 /* mono_panner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mono_panner.h; path = ../mono_panner.h; sourceTree = SOURCE_ROOT; };
+ 43B35172194F04E00038C140 /* mouse_cursors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mouse_cursors.h; path = ../mouse_cursors.h; sourceTree = SOURCE_ROOT; };
+ 43B35173194F04E00038C140 /* nag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = nag.h; path = ../nag.h; sourceTree = SOURCE_ROOT; };
+ 43B35174194F04E00038C140 /* new_plugin_preset_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = new_plugin_preset_dialog.h; path = ../new_plugin_preset_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B35175194F04E00038C140 /* normalize_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = normalize_dialog.h; path = ../normalize_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B35176194F04E00038C140 /* note_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = note_base.h; path = ../note_base.h; sourceTree = SOURCE_ROOT; };
+ 43B35177194F04E00038C140 /* note_player.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = note_player.h; path = ../note_player.h; sourceTree = SOURCE_ROOT; };
+ 43B35178194F04E00038C140 /* note.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = note.h; path = ../note.h; sourceTree = SOURCE_ROOT; };
+ 43B35179194F04E00038C140 /* nsm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = nsm.h; path = ../nsm.h; sourceTree = SOURCE_ROOT; };
+ 43B3517A194F04E00038C140 /* nsmclient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = nsmclient.h; path = ../nsmclient.h; sourceTree = SOURCE_ROOT; };
+ 43B3517B194F04E00038C140 /* open_file_dialog_proxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = open_file_dialog_proxy.h; path = ../open_file_dialog_proxy.h; sourceTree = SOURCE_ROOT; };
+ 43B3517C194F04E00038C140 /* open_file_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = open_file_dialog.h; path = ../open_file_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B3517D194F04E00038C140 /* option_editor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = option_editor.h; path = ../option_editor.h; sourceTree = SOURCE_ROOT; };
+ 43B3517E194F04E00038C140 /* opts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = opts.h; path = ../opts.h; sourceTree = SOURCE_ROOT; };
+ 43B3517F194F04E00038C140 /* panner_editor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = panner_editor.h; path = ../panner_editor.h; sourceTree = SOURCE_ROOT; };
+ 43B35180194F04E00038C140 /* panner_interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = panner_interface.h; path = ../panner_interface.h; sourceTree = SOURCE_ROOT; };
+ 43B35181194F04E00038C140 /* panner_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = panner_ui.h; path = ../panner_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B35182194F04E00038C140 /* panner2d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = panner2d.h; path = ../panner2d.h; sourceTree = SOURCE_ROOT; };
+ 43B35183194F04E00038C140 /* patch_change_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = patch_change_dialog.h; path = ../patch_change_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B35184194F04E00038C140 /* patch_change.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = patch_change.h; path = ../patch_change.h; sourceTree = SOURCE_ROOT; };
+ 43B35185194F04E00038C140 /* piano_roll_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = piano_roll_header.h; path = ../piano_roll_header.h; sourceTree = SOURCE_ROOT; };
+ 43B35186194F04E00038C140 /* pingback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pingback.h; path = ../pingback.h; sourceTree = SOURCE_ROOT; };
+ 43B35187194F04E00038C140 /* playlist_selection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = playlist_selection.h; path = ../playlist_selection.h; sourceTree = SOURCE_ROOT; };
+ 43B35188194F04E00038C140 /* playlist_selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = playlist_selector.h; path = ../playlist_selector.h; sourceTree = SOURCE_ROOT; };
+ 43B35189194F04E00038C140 /* plugin_eq_gui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = plugin_eq_gui.h; path = ../plugin_eq_gui.h; sourceTree = SOURCE_ROOT; };
+ 43B3518A194F04E00038C140 /* plugin_interest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = plugin_interest.h; path = ../plugin_interest.h; sourceTree = SOURCE_ROOT; };
+ 43B3518B194F04E00038C140 /* plugin_selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = plugin_selector.h; path = ../plugin_selector.h; sourceTree = SOURCE_ROOT; };
+ 43B3518C194F04E00038C140 /* plugin_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = plugin_ui.h; path = ../plugin_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B3518D194F04E00038C140 /* point_selection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = point_selection.h; path = ../point_selection.h; sourceTree = SOURCE_ROOT; };
+ 43B3518E194F04E00038C140 /* port_group.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = port_group.h; path = ../port_group.h; sourceTree = SOURCE_ROOT; };
+ 43B3518F194F04E00038C140 /* port_insert_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = port_insert_ui.h; path = ../port_insert_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B35190194F04E00038C140 /* port_matrix_body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = port_matrix_body.h; path = ../port_matrix_body.h; sourceTree = SOURCE_ROOT; };
+ 43B35191194F04E00038C140 /* port_matrix_column_labels.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = port_matrix_column_labels.h; path = ../port_matrix_column_labels.h; sourceTree = SOURCE_ROOT; };
+ 43B35192194F04E00038C140 /* port_matrix_component.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = port_matrix_component.h; path = ../port_matrix_component.h; sourceTree = SOURCE_ROOT; };
+ 43B35193194F04E00038C140 /* port_matrix_grid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = port_matrix_grid.h; path = ../port_matrix_grid.h; sourceTree = SOURCE_ROOT; };
+ 43B35194194F04E00038C140 /* port_matrix_labels.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = port_matrix_labels.h; path = ../port_matrix_labels.h; sourceTree = SOURCE_ROOT; };
+ 43B35195194F04E00038C140 /* port_matrix_row_labels.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = port_matrix_row_labels.h; path = ../port_matrix_row_labels.h; sourceTree = SOURCE_ROOT; };
+ 43B35196194F04E00038C140 /* port_matrix_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = port_matrix_types.h; path = ../port_matrix_types.h; sourceTree = SOURCE_ROOT; };
+ 43B35197194F04E00038C140 /* port_matrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = port_matrix.h; path = ../port_matrix.h; sourceTree = SOURCE_ROOT; };
+ 43B35198194F04E00038C140 /* processor_box.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = processor_box.h; path = ../processor_box.h; sourceTree = SOURCE_ROOT; };
+ 43B35199194F04E00038C140 /* processor_selection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = processor_selection.h; path = ../processor_selection.h; sourceTree = SOURCE_ROOT; };
+ 43B3519A194F04E00038C140 /* progress_reporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = progress_reporter.h; path = ../progress_reporter.h; sourceTree = SOURCE_ROOT; };
+ 43B3519B194F04E00038C140 /* prompter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = prompter.h; path = ../prompter.h; sourceTree = SOURCE_ROOT; };
+ 43B3519C194F04E00038C140 /* public_editor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = public_editor.h; path = ../public_editor.h; sourceTree = SOURCE_ROOT; };
+ 43B3519D194F04E00038C140 /* quantize_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = quantize_dialog.h; path = ../quantize_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B3519E194F04E00038C140 /* rc_option_editor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rc_option_editor.h; path = ../rc_option_editor.h; sourceTree = SOURCE_ROOT; };
+ 43B3519F194F04E00038C140 /* region_editor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = region_editor.h; path = ../region_editor.h; sourceTree = SOURCE_ROOT; };
+ 43B351A0194F04E00038C140 /* region_gain_line.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = region_gain_line.h; path = ../region_gain_line.h; sourceTree = SOURCE_ROOT; };
+ 43B351A1194F04E00038C140 /* region_layering_order_editor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = region_layering_order_editor.h; path = ../region_layering_order_editor.h; sourceTree = SOURCE_ROOT; };
+ 43B351A2194F04E00038C140 /* region_selection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = region_selection.h; path = ../region_selection.h; sourceTree = SOURCE_ROOT; };
+ 43B351A3194F04E00038C140 /* region_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = region_view.h; path = ../region_view.h; sourceTree = SOURCE_ROOT; };
+ 43B351A4194F04E00038C140 /* return_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = return_ui.h; path = ../return_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B351A5194F04E00038C140 /* rgb_macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rgb_macros.h; path = ../rgb_macros.h; sourceTree = SOURCE_ROOT; };
+ 43B351A6194F04E00038C140 /* rhythm_ferret.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rhythm_ferret.h; path = ../rhythm_ferret.h; sourceTree = SOURCE_ROOT; };
+ 43B351A7194F04E00038C140 /* route_group_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = route_group_dialog.h; path = ../route_group_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B351A8194F04E00038C140 /* route_group_menu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = route_group_menu.h; path = ../route_group_menu.h; sourceTree = SOURCE_ROOT; };
+ 43B351A9194F04E00038C140 /* route_params_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = route_params_ui.h; path = ../route_params_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B351AA194F04E00038C140 /* route_processor_selection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = route_processor_selection.h; path = ../route_processor_selection.h; sourceTree = SOURCE_ROOT; };
+ 43B351AB194F04E00038C140 /* route_sorter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = route_sorter.h; path = ../route_sorter.h; sourceTree = SOURCE_ROOT; };
+ 43B351AC194F04E00038C140 /* route_time_axis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = route_time_axis.h; path = ../route_time_axis.h; sourceTree = SOURCE_ROOT; };
+ 43B351AD194F04E00038C140 /* route_ui_selection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = route_ui_selection.h; path = ../route_ui_selection.h; sourceTree = SOURCE_ROOT; };
+ 43B351AE194F04E00038C140 /* route_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = route_ui.h; path = ../route_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B351AF194F04E00038C140 /* search_path_option.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = search_path_option.h; path = ../search_path_option.h; sourceTree = SOURCE_ROOT; };
+ 43B351B0194F04E00038C140 /* selectable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = selectable.h; path = ../selectable.h; sourceTree = SOURCE_ROOT; };
+ 43B351B1194F04E00038C140 /* selection_templates.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = selection_templates.h; path = ../selection_templates.h; sourceTree = SOURCE_ROOT; };
+ 43B351B2194F04E00038C140 /* selection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = selection.h; path = ../selection.h; sourceTree = SOURCE_ROOT; };
+ 43B351B3194F04E00038C140 /* send_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = send_ui.h; path = ../send_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B351B4194F04E00038C140 /* session_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_dialog.h; path = ../session_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B351B5194F04E00038C140 /* session_dialog.logic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_dialog.logic.h; path = ../session_dialog.logic.h; sourceTree = SOURCE_ROOT; };
+ 43B351B6194F04E00038C140 /* session_import_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_import_dialog.h; path = ../session_import_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B351B7194F04E00038C140 /* session_lock_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_lock_dialog.h; path = ../session_lock_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B351B8194F04E00038C140 /* session_metadata_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_metadata_dialog.h; path = ../session_metadata_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B351B9194F04E00038C140 /* session_option_editor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_option_editor.h; path = ../session_option_editor.h; sourceTree = SOURCE_ROOT; };
+ 43B351BA194F04E00038C140 /* sfdb_freesound_mootcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sfdb_freesound_mootcher.h; path = ../sfdb_freesound_mootcher.h; sourceTree = SOURCE_ROOT; };
+ 43B351BB194F04E00038C140 /* sfdb_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sfdb_ui.h; path = ../sfdb_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B351BC194F04E00038C140 /* shuttle_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = shuttle_control.h; path = ../shuttle_control.h; sourceTree = SOURCE_ROOT; };
+ 43B351BD194F04E00038C140 /* speaker_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = speaker_dialog.h; path = ../speaker_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B351BE194F04E00038C140 /* splash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = splash.h; path = ../splash.h; sourceTree = SOURCE_ROOT; };
+ 43B351BF194F04E00038C140 /* startup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = startup.h; path = ../startup.h; sourceTree = SOURCE_ROOT; };
+ 43B351C0194F04E00038C140 /* step_editing.bindings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = step_editing.bindings; path = ../step_editing.bindings; sourceTree = SOURCE_ROOT; };
+ 43B351C1194F04E00038C140 /* step_editor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = step_editor.h; path = ../step_editor.h; sourceTree = SOURCE_ROOT; };
+ 43B351C2194F04E00038C140 /* step_entry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = step_entry.h; path = ../step_entry.h; sourceTree = SOURCE_ROOT; };
+ 43B351C3194F04E00038C140 /* stereo_panner_editor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stereo_panner_editor.h; path = ../stereo_panner_editor.h; sourceTree = SOURCE_ROOT; };
+ 43B351C4194F04E00038C140 /* stereo_panner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stereo_panner.h; path = ../stereo_panner.h; sourceTree = SOURCE_ROOT; };
+ 43B351C5194F04E00038C140 /* streamview.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = streamview.h; path = ../streamview.h; sourceTree = SOURCE_ROOT; };
+ 43B351C6194F04E00038C140 /* strip_selection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = strip_selection.h; path = ../strip_selection.h; sourceTree = SOURCE_ROOT; };
+ 43B351C7194F04E00038C140 /* strip_silence_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = strip_silence_dialog.h; path = ../strip_silence_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B351C8194F04E00038C140 /* sys_ex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sys_ex.h; path = ../sys_ex.h; sourceTree = SOURCE_ROOT; };
+ 43B351C9194F04E00038C140 /* tape_region_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tape_region_view.h; path = ../tape_region_view.h; sourceTree = SOURCE_ROOT; };
+ 43B351CA194F04E00038C140 /* tempo_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tempo_dialog.h; path = ../tempo_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B351CB194F04E00038C140 /* tempo_lines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tempo_lines.h; path = ../tempo_lines.h; sourceTree = SOURCE_ROOT; };
+ 43B351CC194F04E00038C140 /* theme_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = theme_manager.h; path = ../theme_manager.h; sourceTree = SOURCE_ROOT; };
+ 43B351CD194F04E00038C140 /* time_axis_view_item.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = time_axis_view_item.h; path = ../time_axis_view_item.h; sourceTree = SOURCE_ROOT; };
+ 43B351CE194F04E00038C140 /* time_axis_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = time_axis_view.h; path = ../time_axis_view.h; sourceTree = SOURCE_ROOT; };
+ 43B351CF194F04E00038C140 /* time_fx_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = time_fx_dialog.h; path = ../time_fx_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B351D0194F04E00038C140 /* time_info_box.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = time_info_box.h; path = ../time_info_box.h; sourceTree = SOURCE_ROOT; };
+ 43B351D1194F04E00038C140 /* time_selection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = time_selection.h; path = ../time_selection.h; sourceTree = SOURCE_ROOT; };
+ 43B351D2194F04E00038C140 /* track_selection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = track_selection.h; path = ../track_selection.h; sourceTree = SOURCE_ROOT; };
+ 43B351D3194F04E00038C140 /* track_view_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = track_view_list.h; path = ../track_view_list.h; sourceTree = SOURCE_ROOT; };
+ 43B351D4194F04E00038C140 /* tracks_control_panel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tracks_control_panel.h; path = ../tracks_control_panel.h; sourceTree = SOURCE_ROOT; };
+ 43B351D5194F04E00038C140 /* tracks_control_panel.logic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tracks_control_panel.logic.h; path = ../tracks_control_panel.logic.h; sourceTree = SOURCE_ROOT; };
+ 43B351D6194F04E00038C140 /* transcode_ffmpeg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = transcode_ffmpeg.h; path = ../transcode_ffmpeg.h; sourceTree = SOURCE_ROOT; };
+ 43B351D7194F04E00038C140 /* transcode_video_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = transcode_video_dialog.h; path = ../transcode_video_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B351D8194F04E00038C140 /* transpose_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = transpose_dialog.h; path = ../transpose_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B351D9194F04E00038C140 /* ui_config_vars.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ui_config_vars.h; path = ../ui_config_vars.h; sourceTree = SOURCE_ROOT; };
+ 43B351DA194F04E00038C140 /* ui_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ui_config.h; path = ../ui_config.h; sourceTree = SOURCE_ROOT; };
+ 43B351DB194F04E00038C140 /* utils_videotl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils_videotl.h; path = ../utils_videotl.h; sourceTree = SOURCE_ROOT; };
+ 43B351DC194F04E00038C140 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../utils.h; sourceTree = SOURCE_ROOT; };
+ 43B351DD194F04E00038C140 /* verbose_cursor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = verbose_cursor.h; path = ../verbose_cursor.h; sourceTree = SOURCE_ROOT; };
+ 43B351DE194F04E00038C140 /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = version.h; path = ../version.h; sourceTree = SOURCE_ROOT; };
+ 43B351DF194F04E00038C140 /* video_image_frame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = video_image_frame.h; path = ../video_image_frame.h; sourceTree = SOURCE_ROOT; };
+ 43B351E0194F04E00038C140 /* video_monitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = video_monitor.h; path = ../video_monitor.h; sourceTree = SOURCE_ROOT; };
+ 43B351E1194F04E00038C140 /* video_server_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = video_server_dialog.h; path = ../video_server_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B351E2194F04E00038C140 /* video_timeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = video_timeline.h; path = ../video_timeline.h; sourceTree = SOURCE_ROOT; };
+ 43B351E3194F04E00038C140 /* visibility_group.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = visibility_group.h; path = ../visibility_group.h; sourceTree = SOURCE_ROOT; };
+ 43B351E4194F04E00038C140 /* volume_controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = volume_controller.h; path = ../volume_controller.h; sourceTree = SOURCE_ROOT; };
+ 43B351E5194F04E00038C140 /* vst_plugin_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vst_plugin_ui.h; path = ../vst_plugin_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B351E6194F04E00038C140 /* waves_button.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_button.h; path = ../waves_button.h; sourceTree = SOURCE_ROOT; };
+ 43B351E7194F04E00038C140 /* waves_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_dialog.h; path = ../waves_dialog.h; sourceTree = SOURCE_ROOT; };
+ 43B351E8194F04E00038C140 /* waves_icon_button.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_icon_button.h; path = ../waves_icon_button.h; sourceTree = SOURCE_ROOT; };
+ 43B351E9194F04E00038C140 /* waves_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_ui.h; path = ../waves_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B351EA194F04E00038C140 /* window_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = window_manager.h; path = ../window_manager.h; sourceTree = SOURCE_ROOT; };
+ 43B351EB194F04E00038C140 /* windows_vst_plugin_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = windows_vst_plugin_ui.h; path = ../windows_vst_plugin_ui.h; sourceTree = SOURCE_ROOT; };
+ 43B351EE194F12FB0038C140 /* waves_audiobackend.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = waves_audiobackend.xcodeproj; path = ../../libs/backends/wavesaudio/macosx/waves_audiobackend.xcodeproj; sourceTree = "<group>"; };
+ 43B351F4194F130C0038C140 /* libardour.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = libardour.xcodeproj; path = ../../libs/ardour/macosx/libardour.xcodeproj; sourceTree = "<group>"; };
+ 43B351FA194F131D0038C140 /* pbd.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = pbd.xcodeproj; path = ../../libs/pbd/macosx/pbd.xcodeproj; sourceTree = "<group>"; };
+ 5BC24BA91A64328D006A2400 /* trackslive.menus.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = trackslive.menus.in; path = ../trackslive.menus.in; sourceTree = "<group>"; };
+ 5BC67E581A408FCE00F29ABA /* progress_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = progress_dialog.xml; sourceTree = "<group>"; };
+ 5BC67E5D1A4090AA00F29ABA /* progress_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = progress_dialog.h; path = ../progress_dialog.h; sourceTree = "<group>"; };
+ 5BC67E5E1A4090BD00F29ABA /* progress_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = progress_dialog.cc; path = ../progress_dialog.cc; sourceTree = "<group>"; };
+ 95176F781A08E6D800E32046 /* file_sample_rate_mismatch_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = file_sample_rate_mismatch_dialog.h; path = ../file_sample_rate_mismatch_dialog.h; sourceTree = "<group>"; };
+ 95176F791A08E6E800E32046 /* file_sample_rate_mismatch_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = file_sample_rate_mismatch_dialog.cc; path = ../file_sample_rate_mismatch_dialog.cc; sourceTree = "<group>"; };
+ 95176F7D1A08E76F00E32046 /* file_sample_rate_mismatch_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = file_sample_rate_mismatch_dialog.xml; sourceTree = "<group>"; };
+ 952E0B3B1A0A1D7000F375D0 /* buildlog.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = buildlog.txt; path = ../../../buildlog.txt; sourceTree = "<group>"; };
+ 954DCFBC1A0239DA00B7160E /* about_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = about_dialog.cc; path = ../about_dialog.cc; sourceTree = "<group>"; };
+ 954DCFBE1A0239EC00B7160E /* about_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = about_dialog.h; path = ../about_dialog.h; sourceTree = "<group>"; };
+ 954DCFBF1A023AAB00B7160E /* about_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = about_dialog.xml; sourceTree = "<group>"; };
+ 954DCFC01A023AAB00B7160E /* license_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = license_dialog.xml; sourceTree = "<group>"; };
+ 954DCFDD1A07A14E00B7160E /* read_only_session_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = read_only_session_dialog.xml; sourceTree = "<group>"; };
+ 956D3F891A851805004F328C /* waves_import_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_import_dialog.xml; sourceTree = "<group>"; };
+ 957EF44A1A30BFB300F1500E /* waves_message_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_message_dialog.cc; path = ../waves_message_dialog.cc; sourceTree = "<group>"; };
+ 957EF44F1A30BFBF00F1500E /* waves_message_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_message_dialog.h; path = ../waves_message_dialog.h; sourceTree = "<group>"; };
+ 95A134DD1A0239080008E3D6 /* license_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = license_dialog.cc; path = ../license_dialog.cc; sourceTree = "<group>"; };
+ 95A134DF1A02391F0008E3D6 /* license_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = license_dialog.h; path = ../license_dialog.h; sourceTree = "<group>"; };
+ 95D1C51A1A78ED1100BE28DB /* waves_edit_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_edit_dialog.h; path = ../waves_edit_dialog.h; sourceTree = "<group>"; };
+ 95D1C51E1A78ED2100BE28DB /* waves_edit_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_edit_dialog.cc; path = ../waves_edit_dialog.cc; sourceTree = "<group>"; };
+ 95D1C5201A78ED3A00BE28DB /* waves_edit_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_edit_dialog.xml; sourceTree = "<group>"; };
+ 95D4986B1AEA363E006E065D /* audio_engine_reset_info_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = audio_engine_reset_info_dialog.xml; sourceTree = "<group>"; };
+ 95D4986C1AEA363E006E065D /* crash_recovery_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = crash_recovery_dialog.xml; sourceTree = "<group>"; };
+ 95D4986D1AEA363E006E065D /* waves_save_template_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_save_template_dialog.xml; sourceTree = "<group>"; };
+ 95D5D1321A8A514300407F98 /* waves_numeric_edit_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_numeric_edit_dialog.h; path = ../waves_numeric_edit_dialog.h; sourceTree = "<group>"; };
+ 95D5D1361A8A514300407F98 /* waves_numeric_edit_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_numeric_edit_dialog.cc; path = ../waves_numeric_edit_dialog.cc; sourceTree = "<group>"; };
+ 95D5D1381A8A514300407F98 /* waves_numeric_edit_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_numeric_edit_dialog.xml; sourceTree = "<group>"; };
+ 95D6A67A1A8E22E80030CDD0 /* waves_keyeditor.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_keyeditor.xml; sourceTree = "<group>"; };
+ 95D71D501A4C66DF00DE5B3B /* waves_track_color_dialog.logic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_track_color_dialog.logic.h; path = ../waves_track_color_dialog.logic.h; sourceTree = "<group>"; };
+ 95D71D541A4C66F600DE5B3B /* waves_track_color_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_track_color_dialog.cc; path = ../waves_track_color_dialog.cc; sourceTree = "<group>"; };
+ 95D71D561A4C697700DE5B3B /* waves_track_color_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_track_color_dialog.h; path = ../waves_track_color_dialog.h; sourceTree = "<group>"; };
+ 95D71D571A4C69AE00DE5B3B /* waves_track_color_dialog.logic.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_track_color_dialog.logic.cc; path = ../waves_track_color_dialog.logic.cc; sourceTree = "<group>"; };
+ 95D795DB1A7BB40C00120A4F /* marker_inspector_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = marker_inspector_dialog.xml; sourceTree = "<group>"; };
+ 95D795DD1A7BB40C00120A4F /* waves_export_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_export_dialog.xml; sourceTree = "<group>"; };
+ 95D795DE1A7BB40C00120A4F /* waves_export_file_notebook_page.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_export_file_notebook_page.xml; sourceTree = "<group>"; };
+ 95D795DF1A7BB40C00120A4F /* waves_export_file_notebook.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_export_file_notebook.xml; sourceTree = "<group>"; };
+ 95D795E01A7BB40C00120A4F /* waves_export_filename_selector.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_export_filename_selector.xml; sourceTree = "<group>"; };
+ 95D795E11A7BB40C00120A4F /* waves_export_format_selector.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_export_format_selector.xml; sourceTree = "<group>"; };
+ 95D795E21A7BB40C00120A4F /* waves_export_preset_selector.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_export_preset_selector.xml; sourceTree = "<group>"; };
+ 95D795E31A7BB40C00120A4F /* waves_export_timespan_selector.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_export_timespan_selector.xml; sourceTree = "<group>"; };
+ 95D795E41A7BB40C00120A4F /* waves_port_export_channel_selector.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_port_export_channel_selector.xml; sourceTree = "<group>"; };
+ 95D795E51A7BB40C00120A4F /* waves_region_export_channel_selector.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_region_export_channel_selector.xml; sourceTree = "<group>"; };
+ 95D795E61A7BB40C00120A4F /* waves_track_color_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_track_color_dialog.xml; sourceTree = "<group>"; };
+ 95D795E71A7BB40C00120A4F /* waves_track_export_channel_selector.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_track_export_channel_selector.xml; sourceTree = "<group>"; };
+ 95D795FF1A7BB9E000120A4F /* floating_text_entry.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = floating_text_entry.cc; path = ../floating_text_entry.cc; sourceTree = "<group>"; };
+ 95D796001A7BB9E000120A4F /* marker_inspector_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = marker_inspector_dialog.cc; path = ../marker_inspector_dialog.cc; sourceTree = "<group>"; };
+ 95D796011A7BB9E000120A4F /* marker_inspector_dialog.logic.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = marker_inspector_dialog.logic.cc; path = ../marker_inspector_dialog.logic.cc; sourceTree = "<group>"; };
+ 95D796021A7BB9E000120A4F /* route_inspector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = route_inspector.cc; path = ../route_inspector.cc; sourceTree = "<group>"; };
+ 95D796031A7BB9E000120A4F /* waves_export_channel_selector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_export_channel_selector.cc; path = ../waves_export_channel_selector.cc; sourceTree = "<group>"; };
+ 95D796041A7BB9E000120A4F /* waves_export_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_export_dialog.cc; path = ../waves_export_dialog.cc; sourceTree = "<group>"; };
+ 95D796051A7BB9E000120A4F /* waves_export_file_notebook.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_export_file_notebook.cc; path = ../waves_export_file_notebook.cc; sourceTree = "<group>"; };
+ 95D796061A7BB9E000120A4F /* waves_export_filename_selector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_export_filename_selector.cc; path = ../waves_export_filename_selector.cc; sourceTree = "<group>"; };
+ 95D796071A7BB9E000120A4F /* waves_export_format_selector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_export_format_selector.cc; path = ../waves_export_format_selector.cc; sourceTree = "<group>"; };
+ 95D796081A7BB9E000120A4F /* waves_export_preset_selector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_export_preset_selector.cc; path = ../waves_export_preset_selector.cc; sourceTree = "<group>"; };
+ 95D796091A7BB9E000120A4F /* waves_export_timespan_selector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_export_timespan_selector.cc; path = ../waves_export_timespan_selector.cc; sourceTree = "<group>"; };
+ 95D7960A1A7BB9E000120A4F /* waves_import_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_import_dialog.cc; path = ../waves_import_dialog.cc; sourceTree = "<group>"; };
+ 95D7961A1A7BBA4E00120A4F /* floating_text_entry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = floating_text_entry.h; path = ../floating_text_entry.h; sourceTree = "<group>"; };
+ 95D7961B1A7BBA4E00120A4F /* marker_inspector_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = marker_inspector_dialog.h; path = ../marker_inspector_dialog.h; sourceTree = "<group>"; };
+ 95D7961C1A7BBA4E00120A4F /* marker_inspector_dialog.logic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = marker_inspector_dialog.logic.h; path = ../marker_inspector_dialog.logic.h; sourceTree = "<group>"; };
+ 95D7961D1A7BBA4E00120A4F /* product_definition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = product_definition.h; path = ../product_definition.h; sourceTree = "<group>"; };
+ 95D7961E1A7BBA4E00120A4F /* ruler_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ruler_dialog.h; path = ../ruler_dialog.h; sourceTree = "<group>"; };
+ 95D7961F1A7BBA4E00120A4F /* trackslive_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = trackslive_resource.h; path = ../trackslive_resource.h; sourceTree = "<group>"; };
+ 95D796201A7BBA4E00120A4F /* waves_export_channel_selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_export_channel_selector.h; path = ../waves_export_channel_selector.h; sourceTree = "<group>"; };
+ 95D796211A7BBA4E00120A4F /* waves_export_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_export_dialog.h; path = ../waves_export_dialog.h; sourceTree = "<group>"; };
+ 95D796221A7BBA4E00120A4F /* waves_export_file_notebook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_export_file_notebook.h; path = ../waves_export_file_notebook.h; sourceTree = "<group>"; };
+ 95D796231A7BBA4E00120A4F /* waves_export_filename_selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_export_filename_selector.h; path = ../waves_export_filename_selector.h; sourceTree = "<group>"; };
+ 95D796241A7BBA4E00120A4F /* waves_export_format_selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_export_format_selector.h; path = ../waves_export_format_selector.h; sourceTree = "<group>"; };
+ 95D796251A7BBA4E00120A4F /* waves_export_preset_selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_export_preset_selector.h; path = ../waves_export_preset_selector.h; sourceTree = "<group>"; };
+ 95D796261A7BBA4E00120A4F /* waves_export_timespan_selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_export_timespan_selector.h; path = ../waves_export_timespan_selector.h; sourceTree = "<group>"; };
+ 95D796271A7BBA4E00120A4F /* waves_grid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_grid.h; path = ../waves_grid.h; sourceTree = "<group>"; };
+ 95D796281A7BBA4E00120A4F /* waves_import_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_import_dialog.h; path = ../waves_import_dialog.h; sourceTree = "<group>"; };
+ 95D9E3771A8D1B3B00A0DA46 /* waves_ambiguous_file_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_ambiguous_file_dialog.xml; sourceTree = "<group>"; };
+ 95D9E3781A8D1B3B00A0DA46 /* waves_missing_file_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_missing_file_dialog.xml; sourceTree = "<group>"; };
+ 95D9E37B1A8D1B5200A0DA46 /* waves_ambiguous_file_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_ambiguous_file_dialog.h; path = ../waves_ambiguous_file_dialog.h; sourceTree = "<group>"; };
+ 95D9E37C1A8D1B5200A0DA46 /* waves_missing_file_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_missing_file_dialog.h; path = ../waves_missing_file_dialog.h; sourceTree = "<group>"; };
+ 95D9E37D1A8D1B6600A0DA46 /* waves_ambiguous_file_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_ambiguous_file_dialog.cc; path = ../waves_ambiguous_file_dialog.cc; sourceTree = "<group>"; };
+ 95D9E37E1A8D1B6600A0DA46 /* waves_missing_file_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_missing_file_dialog.cc; path = ../waves_missing_file_dialog.cc; sourceTree = "<group>"; };
+ 95E2A7AA1A8F652F0080BD79 /* waves_radio_item.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_radio_item.xml; sourceTree = "<group>"; };
+ 95E5E9411AE9462B0000E2CE /* waves_tooltip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_tooltip.h; path = ../waves_tooltip.h; sourceTree = "<group>"; };
+ 95E5E9451AE946510000E2CE /* waves_tooltip.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_tooltip.cc; path = ../waves_tooltip.cc; sourceTree = "<group>"; };
+ 95ED5FF61A95F285006D39E4 /* route_inspector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = route_inspector.h; path = ../route_inspector.h; sourceTree = "<group>"; };
+ 95F9DFD61A35A8BD0007E953 /* waves_message_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_message_dialog.xml; sourceTree = "<group>"; };
+ 95F9DFD81A35F3310007E953 /* waves_clean_up_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_clean_up_dialog.xml; sourceTree = "<group>"; };
+ 95F9DFD91A35F3310007E953 /* waves_connect_to_backend_error_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_connect_to_backend_error_dialog.xml; sourceTree = "<group>"; };
+ 95F9DFDA1A35F3310007E953 /* waves_excessive_split_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_excessive_split_dialog.xml; sourceTree = "<group>"; };
+ 95F9DFDC1A35F3310007E953 /* waves_file_exists_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_file_exists_dialog.xml; sourceTree = "<group>"; };
+ 95F9DFDD1A35F3310007E953 /* waves_how_to_import_dialog_1.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_how_to_import_dialog_1.xml; sourceTree = "<group>"; };
+ 95F9DFDE1A35F3310007E953 /* waves_how_to_import_dialog_2.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_how_to_import_dialog_2.xml; sourceTree = "<group>"; };
+ 95F9DFDF1A35F3310007E953 /* waves_route_rename_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = waves_route_rename_dialog.xml; sourceTree = "<group>"; };
+ CE1A9079199A37AE00ECA62B /* add_tracks_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = add_tracks_dialog.cc; path = ../add_tracks_dialog.cc; sourceTree = "<group>"; };
+ CE1A907E199A37BF00ECA62B /* add_tracks_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = add_tracks_dialog.h; path = ../add_tracks_dialog.h; sourceTree = "<group>"; };
+ CE1C6DCC19879F04006BDB03 /* compact_meter_bridge.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = compact_meter_bridge.cc; path = ../compact_meter_bridge.cc; sourceTree = "<group>"; };
+ CE1C6DCD19879F04006BDB03 /* compact_meter_strip.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = compact_meter_strip.cc; path = ../compact_meter_strip.cc; sourceTree = "<group>"; };
+ CE1C6DD319879F1B006BDB03 /* compact_meter_bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = compact_meter_bridge.h; path = ../compact_meter_bridge.h; sourceTree = "<group>"; };
+ CE1C6DD419879F1B006BDB03 /* compact_meter_strip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = compact_meter_strip.h; path = ../compact_meter_strip.h; sourceTree = "<group>"; };
+ CE1C6DDB1987A910006BDB03 /* master_bus_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = master_bus_ui.h; path = ../master_bus_ui.h; sourceTree = "<group>"; };
+ CE1C6DDF1987A924006BDB03 /* master_bus_ui.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = master_bus_ui.cc; path = ../master_bus_ui.cc; sourceTree = "<group>"; };
+ CE294C5719CAD4E300D12768 /* add_tracks_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = add_tracks_dialog.xml; sourceTree = "<group>"; };
+ CE294C5819CAD4E300D12768 /* compact_meter_bridge.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = compact_meter_bridge.xml; sourceTree = "<group>"; };
+ CE294C5919CAD4E300D12768 /* compact_meter_strip.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = compact_meter_strip.xml; sourceTree = "<group>"; };
+ CE294C5A19CAD4E300D12768 /* marker_io_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = marker_io_dialog.xml; sourceTree = "<group>"; };
+ CE294C5B19CAD4E300D12768 /* meter_bridge_view.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = meter_bridge_view.xml; sourceTree = "<group>"; };
+ CE294C5C19CAD4E300D12768 /* meter_strip_gain_meter.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = meter_strip_gain_meter.xml; sourceTree = "<group>"; };
+ CE294C5D19CAD4E300D12768 /* mixer_bridge_view.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = mixer_bridge_view.xml; sourceTree = "<group>"; };
+ CE294C5E19CAD4E300D12768 /* time_info_box.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = time_info_box.xml; sourceTree = "<group>"; };
+ CE294C6B19CAD54500D12768 /* marker_io_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = marker_io_dialog.cc; path = ../marker_io_dialog.cc; sourceTree = "<group>"; };
+ CE294C6C19CAD54500D12768 /* mixer_bridge_view.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mixer_bridge_view.cc; path = ../mixer_bridge_view.cc; sourceTree = "<group>"; };
+ CE294C6D19CAD54500D12768 /* open_file_dialog_nix.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = open_file_dialog_nix.cc; path = ../open_file_dialog_nix.cc; sourceTree = "<group>"; };
+ CE294C6E19CAD54500D12768 /* open_file_dialog_windows.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = open_file_dialog_windows.cc; path = ../open_file_dialog_windows.cc; sourceTree = "<group>"; };
+ CE294C6F19CAD54500D12768 /* ruler_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ruler_dialog.cc; path = ../ruler_dialog.cc; sourceTree = "<group>"; };
+ CE294C7019CAD54500D12768 /* soundcloud_export_selector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = soundcloud_export_selector.cc; path = ../soundcloud_export_selector.cc; sourceTree = "<group>"; };
+ CE294C7119CAD54500D12768 /* waves_dropdown.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_dropdown.cc; path = ../waves_dropdown.cc; sourceTree = "<group>"; };
+ CE294C7219CAD54500D12768 /* waves_grid.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_grid.cc; path = ../waves_grid.cc; sourceTree = "<group>"; };
+ CE294C7319CAD54500D12768 /* waves_zoom_control.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_zoom_control.cc; path = ../waves_zoom_control.cc; sourceTree = "<group>"; };
+ CE294C7E19CAD58500D12768 /* ardour_dropdown.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ardour_dropdown.h; path = ../ardour_dropdown.h; sourceTree = "<group>"; };
+ CE294C7F19CAD58500D12768 /* marker_io_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = marker_io_dialog.h; path = ../marker_io_dialog.h; sourceTree = "<group>"; };
+ CE294C8019CAD58500D12768 /* mixer_bridge_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mixer_bridge_view.h; path = ../mixer_bridge_view.h; sourceTree = "<group>"; };
+ CE294C8119CAD58500D12768 /* soundcloud_export_selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = soundcloud_export_selector.h; path = ../soundcloud_export_selector.h; sourceTree = "<group>"; };
+ CE294C8219CAD58500D12768 /* waves_dropdown.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_dropdown.h; path = ../waves_dropdown.h; sourceTree = "<group>"; };
+ CE294C8319CAD58500D12768 /* waves_zoom_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_zoom_control.h; path = ../waves_zoom_control.h; sourceTree = "<group>"; };
+ CEAFC76E195445560016ACF0 /* bbt_time.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bbt_time.cc; path = ../../libs/timecode/src/bbt_time.cc; sourceTree = "<group>"; };
+ CEAFC76F195445560016ACF0 /* time.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = time.cc; path = ../../libs/timecode/src/time.cc; sourceTree = "<group>"; };
+ CEAFC775195445D90016ACF0 /* bbt_time.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bbt_time.h; path = ../../libs/timecode/timecode/bbt_time.h; sourceTree = "<group>"; };
+ CEAFC776195445D90016ACF0 /* time.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = time.h; path = ../../libs/timecode/timecode/time.h; sourceTree = "<group>"; };
+ CEAFC777195445D90016ACF0 /* visibility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = visibility.h; path = ../../libs/timecode/timecode/visibility.h; sourceTree = "<group>"; };
+ CEB0A45A19583F3F006D269A /* session_close_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_close_dialog.h; path = ../session_close_dialog.h; sourceTree = "<group>"; };
+ CEB0A9F119583F96006D269A /* session_close_dialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_close_dialog.cc; path = ../session_close_dialog.cc; sourceTree = "<group>"; };
+ CEB0A9F31958447C006D269A /* session_close_dialog.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = session_close_dialog.xml; sourceTree = "<group>"; };
+ CEB9D787197516BE00B21780 /* audio_time_axis.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = audio_time_axis.xml; sourceTree = "<group>"; };
+ CEB9D788197516BE00B21780 /* automation_time_axis.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = automation_time_axis.xml; sourceTree = "<group>"; };
+ CEB9D789197516BE00B21780 /* editor_mixer.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = editor_mixer.xml; sourceTree = "<group>"; };
+ CEB9D78A197516BE00B21780 /* inspector_gain_meter.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = inspector_gain_meter.xml; sourceTree = "<group>"; };
+ CEB9D78C197516BE00B21780 /* master_ui.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = master_ui.xml; sourceTree = "<group>"; };
+ CEB9D78D197516BE00B21780 /* meter_strip.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = meter_strip.xml; sourceTree = "<group>"; };
+ CEB9D78E197516BE00B21780 /* mixer_gain_meter.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = mixer_gain_meter.xml; sourceTree = "<group>"; };
+ CEB9D78F197516BE00B21780 /* mixer_strip.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = mixer_strip.xml; sourceTree = "<group>"; };
+ CEB9D790197516BE00B21780 /* track_header_gain_meter.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = track_header_gain_meter.xml; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 43279241194EFFF1003C9FEA /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 43279248194EFFF1003C9FEA /* Cocoa.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 43279039194EFF24003C9FEA = {
+ isa = PBXGroup;
+ children = (
+ 5BC24BA91A64328D006A2400 /* trackslive.menus.in */,
+ 435E66781A4AB60C00472D50 /* audiographer.xcodeproj */,
+ 952E0B3B1A0A1D7000F375D0 /* buildlog.txt */,
+ 4397599619CB06AC00740098 /* gtkmm2ext.xcodeproj */,
+ 4397595019CADAFC00740098 /* canvas.xcodeproj */,
+ 43B351FA194F131D0038C140 /* pbd.xcodeproj */,
+ 43B351F4194F130C0038C140 /* libardour.xcodeproj */,
+ 43B351EE194F12FB0038C140 /* waves_audiobackend.xcodeproj */,
+ 43279480194F00CB003C9FEA /* headers */,
+ 43279461194F007F003C9FEA /* menus */,
+ 43279429194F0062003C9FEA /* ui */,
+ 432793FF194F0062003C9FEA /* pixmaps */,
+ 4327923F194EFFC3003C9FEA /* Resources */,
+ 43279040194EFF38003C9FEA /* source */,
+ 4327924D194EFFF1003C9FEA /* Tracks */,
+ 43279246194EFFF1003C9FEA /* Frameworks */,
+ 43279245194EFFF1003C9FEA /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ 43279040194EFF38003C9FEA /* source */ = {
+ isa = PBXGroup;
+ children = (
+ 95E5E9451AE946510000E2CE /* waves_tooltip.cc */,
+ 95D9E37D1A8D1B6600A0DA46 /* waves_ambiguous_file_dialog.cc */,
+ 95D9E37E1A8D1B6600A0DA46 /* waves_missing_file_dialog.cc */,
+ 95D5D1361A8A514300407F98 /* waves_numeric_edit_dialog.cc */,
+ 95D795FF1A7BB9E000120A4F /* floating_text_entry.cc */,
+ 95D796001A7BB9E000120A4F /* marker_inspector_dialog.cc */,
+ 95D796011A7BB9E000120A4F /* marker_inspector_dialog.logic.cc */,
+ 95D796021A7BB9E000120A4F /* route_inspector.cc */,
+ 95D796031A7BB9E000120A4F /* waves_export_channel_selector.cc */,
+ 95D796041A7BB9E000120A4F /* waves_export_dialog.cc */,
+ 95D796051A7BB9E000120A4F /* waves_export_file_notebook.cc */,
+ 95D796061A7BB9E000120A4F /* waves_export_filename_selector.cc */,
+ 95D796071A7BB9E000120A4F /* waves_export_format_selector.cc */,
+ 95D796081A7BB9E000120A4F /* waves_export_preset_selector.cc */,
+ 95D796091A7BB9E000120A4F /* waves_export_timespan_selector.cc */,
+ 95D7960A1A7BB9E000120A4F /* waves_import_dialog.cc */,
+ 95D1C51E1A78ED2100BE28DB /* waves_edit_dialog.cc */,
+ 95D71D571A4C69AE00DE5B3B /* waves_track_color_dialog.logic.cc */,
+ 95D71D541A4C66F600DE5B3B /* waves_track_color_dialog.cc */,
+ 5BC67E5E1A4090BD00F29ABA /* progress_dialog.cc */,
+ 957EF44A1A30BFB300F1500E /* waves_message_dialog.cc */,
+ 95176F791A08E6E800E32046 /* file_sample_rate_mismatch_dialog.cc */,
+ 954DCFBC1A0239DA00B7160E /* about_dialog.cc */,
+ 95A134DD1A0239080008E3D6 /* license_dialog.cc */,
+ CE294C6B19CAD54500D12768 /* marker_io_dialog.cc */,
+ CE294C6C19CAD54500D12768 /* mixer_bridge_view.cc */,
+ CE294C6D19CAD54500D12768 /* open_file_dialog_nix.cc */,
+ CE294C6E19CAD54500D12768 /* open_file_dialog_windows.cc */,
+ CE294C6F19CAD54500D12768 /* ruler_dialog.cc */,
+ CE294C7019CAD54500D12768 /* soundcloud_export_selector.cc */,
+ CE294C7119CAD54500D12768 /* waves_dropdown.cc */,
+ CE294C7219CAD54500D12768 /* waves_grid.cc */,
+ CE294C7319CAD54500D12768 /* waves_zoom_control.cc */,
+ CE1A9079199A37AE00ECA62B /* add_tracks_dialog.cc */,
+ CE1C6DDF1987A924006BDB03 /* master_bus_ui.cc */,
+ CE1C6DCC19879F04006BDB03 /* compact_meter_bridge.cc */,
+ CE1C6DCD19879F04006BDB03 /* compact_meter_strip.cc */,
+ CEB0A9F119583F96006D269A /* session_close_dialog.cc */,
+ CEAFC76E195445560016ACF0 /* bbt_time.cc */,
+ CEAFC76F195445560016ACF0 /* time.cc */,
+ 43279210194EFFBA003C9FEA /* tracks_control_panel.cc */,
+ 43279212194EFFBA003C9FEA /* tracks_control_panel.logic.cc */,
+ 43279043194EFFB9003C9FEA /* actions.cc */,
+ 43279045194EFFB9003C9FEA /* add_route_dialog.cc */,
+ 43279047194EFFB9003C9FEA /* add_video_dialog.cc */,
+ 43279049194EFFB9003C9FEA /* ambiguous_file_dialog.cc */,
+ 4327904B194EFFB9003C9FEA /* analysis_window.cc */,
+ 4327904D194EFFB9003C9FEA /* ardour_button.cc */,
+ 4327904F194EFFB9003C9FEA /* ardour_dialog.cc */,
+ 43279051194EFFB9003C9FEA /* ardour_ui_dependents.cc */,
+ 43279052194EFFB9003C9FEA /* ardour_ui_dialogs.cc */,
+ 43279053194EFFB9003C9FEA /* ardour_ui_ed.cc */,
+ 43279054194EFFB9003C9FEA /* ardour_ui_mixer.cc */,
+ 43279055194EFFB9003C9FEA /* ardour_ui_options.cc */,
+ 43279056194EFFB9003C9FEA /* ardour_ui.cc */,
+ 43279058194EFFB9003C9FEA /* ardour_ui2.cc */,
+ 43279059194EFFB9003C9FEA /* ardour_window.cc */,
+ 4327905C194EFFB9003C9FEA /* au_pluginui.mm */,
+ 4327905D194EFFB9003C9FEA /* audio_clock.cc */,
+ 4327905F194EFFB9003C9FEA /* audio_region_editor.cc */,
+ 43279061194EFFB9003C9FEA /* audio_region_view.cc */,
+ 43279063194EFFB9003C9FEA /* audio_streamview.cc */,
+ 43279065194EFFB9003C9FEA /* audio_time_axis.cc */,
+ 43279067194EFFB9003C9FEA /* automation_controller.cc */,
+ 43279069194EFFB9003C9FEA /* automation_line.cc */,
+ 4327906B194EFFB9003C9FEA /* automation_region_view.cc */,
+ 4327906E194EFFB9003C9FEA /* automation_streamview.cc */,
+ 43279070194EFFB9003C9FEA /* automation_time_axis.cc */,
+ 43279072194EFFB9003C9FEA /* axis_view.cc */,
+ 43279074194EFFB9003C9FEA /* big_clock_window.cc */,
+ 43279076194EFFB9003C9FEA /* bundle_env_cocoa.cc */,
+ 43279077194EFFB9003C9FEA /* bundle_env_linux.cc */,
+ 43279078194EFFB9003C9FEA /* bundle_env_mingw.cc */,
+ 43279079194EFFB9003C9FEA /* bundle_env_msvc.cc */,
+ 4327907B194EFFB9003C9FEA /* bundle_manager.cc */,
+ 4327907D194EFFB9003C9FEA /* button_joiner.cc */,
+ 4327907F194EFFB9003C9FEA /* canvas_patch_change.cc */,
+ 43279081194EFFB9003C9FEA /* canvas-simpleline.c */,
+ 43279082194EFFB9003C9FEA /* canvas-simplerect.c */,
+ 43279083194EFFB9003C9FEA /* canvas-waveview.c */,
+ 43279085194EFFB9003C9FEA /* clock_group.cc */,
+ 43279087194EFFB9003C9FEA /* cocoacarbon.mm */,
+ 43279088194EFFB9003C9FEA /* configinfo.cc */,
+ 4327908A194EFFB9003C9FEA /* control_point_dialog.cc */,
+ 4327908C194EFFB9003C9FEA /* control_point.cc */,
+ 4327908E194EFFB9003C9FEA /* crossfade_edit.cc */,
+ 43279092194EFFB9003C9FEA /* curvetest.cc */,
+ 43279094194EFFB9003C9FEA /* debug.cc */,
+ 43279096194EFFB9003C9FEA /* device_connection_control.cc */,
+ 43279098194EFFB9003C9FEA /* edit_note_dialog.cc */,
+ 4327909B194EFFB9003C9FEA /* editing.cc */,
+ 4327909D194EFFB9003C9FEA /* editor_actions.cc */,
+ 4327909E194EFFB9003C9FEA /* editor_audio_import.cc */,
+ 4327909F194EFFB9003C9FEA /* editor_audiotrack.cc */,
+ 432790A0194EFFB9003C9FEA /* editor_canvas_events.cc */,
+ 432790A1194EFFB9003C9FEA /* editor_canvas.cc */,
+ 432790A2194EFFB9003C9FEA /* editor_component.cc */,
+ 432790A4194EFFB9003C9FEA /* editor_cursors.cc */,
+ 432790A6194EFFB9003C9FEA /* editor_drag.cc */,
+ 432790A9194EFFB9003C9FEA /* editor_export_audio.cc */,
+ 432790AA194EFFB9003C9FEA /* editor_group_tabs.cc */,
+ 432790AD194EFFB9003C9FEA /* editor_keys.cc */,
+ 432790AE194EFFB9003C9FEA /* editor_locations.cc */,
+ 432790B0194EFFB9003C9FEA /* editor_markers.cc */,
+ 432790B1194EFFB9003C9FEA /* editor_mixer.cc */,
+ 432790B2194EFFB9003C9FEA /* editor_mouse.cc */,
+ 432790B3194EFFB9003C9FEA /* editor_ops.cc */,
+ 432790B4194EFFB9003C9FEA /* editor_regions.cc */,
+ 432790B6194EFFB9003C9FEA /* editor_route_groups.cc */,
+ 432790B8194EFFB9003C9FEA /* editor_routes.cc */,
+ 432790BA194EFFB9003C9FEA /* editor_rulers.cc */,
+ 432790BB194EFFB9003C9FEA /* editor_selection.cc */,
+ 432790BC194EFFB9003C9FEA /* editor_snapshots.cc */,
+ 432790BE194EFFB9003C9FEA /* editor_summary.cc */,
+ 432790C0194EFFB9003C9FEA /* editor_tempodisplay.cc */,
+ 432790C1194EFFB9003C9FEA /* editor_timefx.cc */,
+ 432790C2194EFFB9003C9FEA /* editor_videotimeline.cc */,
+ 432790C5194EFFB9003C9FEA /* editor.cc */,
+ 432790C7194EFFB9003C9FEA /* engine_dialog.cc */,
+ 432790C9194EFFB9003C9FEA /* enums.cc */,
+ 432790CB194EFFB9003C9FEA /* evtest.cc */,
+ 432790CC194EFFB9003C9FEA /* export_channel_selector.cc */,
+ 432790CE194EFFB9003C9FEA /* export_dialog.cc */,
+ 432790D0194EFFB9003C9FEA /* export_file_notebook.cc */,
+ 432790D2194EFFB9003C9FEA /* export_filename_selector.cc */,
+ 432790D4194EFFB9003C9FEA /* export_format_dialog.cc */,
+ 432790D6194EFFB9003C9FEA /* export_format_selector.cc */,
+ 432790D8194EFFB9003C9FEA /* export_preset_selector.cc */,
+ 432790DA194EFFB9003C9FEA /* export_range_markers_dialog.cc */,
+ 432790DC194EFFB9003C9FEA /* export_timespan_selector.cc */,
+ 432790DE194EFFB9003C9FEA /* export_video_dialog.cc */,
+ 432790E0194EFFB9003C9FEA /* export_video_infobox.cc */,
+ 432790E2194EFFB9003C9FEA /* fft_graph.cc */,
+ 432790E4194EFFB9003C9FEA /* fft_result.cc */,
+ 432790E6194EFFB9003C9FEA /* fft.cc */,
+ 432790E9194EFFB9003C9FEA /* gain_meter.cc */,
+ 432790EB194EFFB9003C9FEA /* generic_pluginui.cc */,
+ 432790ED194EFFB9003C9FEA /* ghostregion.cc */,
+ 432790EF194EFFB9003C9FEA /* global_port_matrix.cc */,
+ 432790F2194EFFB9003C9FEA /* gprofhelper.c */,
+ 432790F3194EFFB9003C9FEA /* group_tabs.cc */,
+ 432790F5194EFFB9003C9FEA /* gtk_pianokeyboard.c */,
+ 432790FB194EFFB9003C9FEA /* gui_object.cc */,
+ 432790FE194EFFB9003C9FEA /* hit.cc */,
+ 43279101194EFFB9003C9FEA /* insert_time_dialog.cc */,
+ 43279103194EFFB9003C9FEA /* interthread_progress_window.cc */,
+ 43279105194EFFB9003C9FEA /* io_selector.cc */,
+ 43279107194EFFB9003C9FEA /* keyboard.cc */,
+ 43279109194EFFB9003C9FEA /* keyeditor.cc */,
+ 4327910B194EFFB9003C9FEA /* latency_gui.cc */,
+ 4327910D194EFFB9003C9FEA /* led.cc */,
+ 4327910F194EFFB9003C9FEA /* level_meter.cc */,
+ 43279111194EFFB9003C9FEA /* linux_vst_gui_support.cc */,
+ 43279112194EFFB9003C9FEA /* location_ui.cc */,
+ 43279116194EFFB9003C9FEA /* lv2_plugin_ui.cc */,
+ 43279118194EFFB9003C9FEA /* lxvst_plugin_ui.cc */,
+ 4327911A194EFFB9003C9FEA /* main_clock.cc */,
+ 4327911C194EFFB9003C9FEA /* main.cc */,
+ 4327911E194EFFB9003C9FEA /* marker.cc */,
+ 43279120194EFFB9003C9FEA /* meter_patterns.cc */,
+ 43279122194EFFB9003C9FEA /* meter_strip.cc */,
+ 43279124194EFFB9003C9FEA /* meterbridge.cc */,
+ 43279126194EFFB9003C9FEA /* midi_automation_line.cc */,
+ 43279128194EFFB9003C9FEA /* midi_channel_dialog.cc */,
+ 4327912A194EFFB9003C9FEA /* midi_channel_selector.cc */,
+ 4327912C194EFFB9003C9FEA /* midi_cut_buffer.cc */,
+ 4327912E194EFFB9003C9FEA /* midi_device_connection_control.cc */,
+ 43279130194EFFB9003C9FEA /* midi_export_dialog.cc */,
+ 43279132194EFFB9003C9FEA /* midi_list_editor.cc */,
+ 43279134194EFFB9003C9FEA /* midi_port_dialog.cc */,
+ 43279136194EFFB9003C9FEA /* midi_region_view.cc */,
+ 43279138194EFFB9003C9FEA /* midi_scroomer.cc */,
+ 4327913A194EFFB9003C9FEA /* midi_selection.cc */,
+ 4327913C194EFFB9003C9FEA /* midi_streamview.cc */,
+ 4327913E194EFFB9003C9FEA /* midi_time_axis.cc */,
+ 43279140194EFFB9003C9FEA /* midi_tracer.cc */,
+ 43279143194EFFB9003C9FEA /* midi_velocity_dialog.cc */,
+ 43279145194EFFB9003C9FEA /* missing_file_dialog.cc */,
+ 43279147194EFFB9003C9FEA /* missing_plugin_dialog.cc */,
+ 43279149194EFFB9003C9FEA /* mixer_actor.cc */,
+ 4327914B194EFFB9003C9FEA /* mixer_group_tabs.cc */,
+ 4327914D194EFFB9003C9FEA /* mixer_strip.cc */,
+ 4327914F194EFFB9003C9FEA /* mixer_ui.cc */,
+ 43279151194EFFB9003C9FEA /* monitor_section.cc */,
+ 43279153194EFFB9003C9FEA /* mono_panner_editor.cc */,
+ 43279155194EFFB9003C9FEA /* mono_panner.cc */,
+ 43279157194EFFB9003C9FEA /* mouse_cursors.cc */,
+ 43279159194EFFB9003C9FEA /* mtest.cc */,
+ 4327915A194EFFB9003C9FEA /* nag.cc */,
+ 4327915C194EFFB9003C9FEA /* new_plugin_preset_dialog.cc */,
+ 4327915E194EFFB9003C9FEA /* normalize_dialog.cc */,
+ 43279160194EFFB9003C9FEA /* note_base.cc */,
+ 43279162194EFFB9003C9FEA /* note_player.cc */,
+ 43279164194EFFB9003C9FEA /* note.cc */,
+ 43279166194EFFB9003C9FEA /* nsm.cc */,
+ 43279168194EFFB9003C9FEA /* nsmclient.cc */,
+ 4327916D194EFFB9003C9FEA /* open_file_dialog.mm */,
+ 4327916E194EFFB9003C9FEA /* option_editor.cc */,
+ 43279170194EFFB9003C9FEA /* opts.cc */,
+ 43279172194EFFB9003C9FEA /* panner_editor.cc */,
+ 43279174194EFFB9003C9FEA /* panner_interface.cc */,
+ 43279176194EFFB9003C9FEA /* panner_ui.cc */,
+ 43279178194EFFB9003C9FEA /* panner2d.cc */,
+ 4327917A194EFFB9003C9FEA /* patch_change_dialog.cc */,
+ 4327917C194EFFB9003C9FEA /* patch_change.cc */,
+ 4327917E194EFFB9003C9FEA /* piano_roll_header.cc */,
+ 43279180194EFFB9003C9FEA /* pingback.cc */,
+ 43279183194EFFB9003C9FEA /* playlist_selector.cc */,
+ 43279185194EFFB9003C9FEA /* plugin_eq_gui.cc */,
+ 43279188194EFFBA003C9FEA /* plugin_selector.cc */,
+ 4327918A194EFFBA003C9FEA /* plugin_ui.cc */,
+ 4327918D194EFFBA003C9FEA /* port_group.cc */,
+ 4327918F194EFFBA003C9FEA /* port_insert_ui.cc */,
+ 43279191194EFFBA003C9FEA /* port_matrix_body.cc */,
+ 43279193194EFFBA003C9FEA /* port_matrix_column_labels.cc */,
+ 43279195194EFFBA003C9FEA /* port_matrix_component.cc */,
+ 43279197194EFFBA003C9FEA /* port_matrix_grid.cc */,
+ 43279199194EFFBA003C9FEA /* port_matrix_labels.cc */,
+ 4327919B194EFFBA003C9FEA /* port_matrix_row_labels.cc */,
+ 4327919E194EFFBA003C9FEA /* port_matrix.cc */,
+ 432791A0194EFFBA003C9FEA /* processor_box.cc */,
+ 432791A3194EFFBA003C9FEA /* progress_reporter.cc */,
+ 432791A5194EFFBA003C9FEA /* prompter.cc */,
+ 432791A7194EFFBA003C9FEA /* public_editor.cc */,
+ 432791A9194EFFBA003C9FEA /* quantize_dialog.cc */,
+ 432791AB194EFFBA003C9FEA /* rc_option_editor.cc */,
+ 432791AD194EFFBA003C9FEA /* region_editor.cc */,
+ 432791AF194EFFBA003C9FEA /* region_gain_line.cc */,
+ 432791B1194EFFBA003C9FEA /* region_layering_order_editor.cc */,
+ 432791B3194EFFBA003C9FEA /* region_selection.cc */,
+ 432791B5194EFFBA003C9FEA /* region_view.cc */,
+ 432791B7194EFFBA003C9FEA /* return_ui.cc */,
+ 432791BA194EFFBA003C9FEA /* rhythm_ferret.cc */,
+ 432791BC194EFFBA003C9FEA /* route_group_dialog.cc */,
+ 432791BE194EFFBA003C9FEA /* route_group_menu.cc */,
+ 432791C0194EFFBA003C9FEA /* route_params_ui.cc */,
+ 432791C2194EFFBA003C9FEA /* route_processor_selection.cc */,
+ 432791C5194EFFBA003C9FEA /* route_time_axis.cc */,
+ 432791C8194EFFBA003C9FEA /* route_ui.cc */,
+ 432791CA194EFFBA003C9FEA /* search_path_option.cc */,
+ 432791CE194EFFBA003C9FEA /* selection.cc */,
+ 432791D0194EFFBA003C9FEA /* send_ui.cc */,
+ 432791D2194EFFBA003C9FEA /* session_dialog.cc */,
+ 432791D4194EFFBA003C9FEA /* session_dialog.logic.cc */,
+ 432791D6194EFFBA003C9FEA /* session_import_dialog.cc */,
+ 432791D8194EFFBA003C9FEA /* session_lock_dialog.cc */,
+ 432791DA194EFFBA003C9FEA /* session_metadata_dialog.cc */,
+ 432791DC194EFFBA003C9FEA /* session_option_editor.cc */,
+ 432791DE194EFFBA003C9FEA /* sfdb_freesound_mootcher.cc */,
+ 432791E0194EFFBA003C9FEA /* sfdb_ui.cc */,
+ 432791E2194EFFBA003C9FEA /* shuttle_control.cc */,
+ 432791E4194EFFBA003C9FEA /* speaker_dialog.cc */,
+ 432791E6194EFFBA003C9FEA /* splash.cc */,
+ 432791EA194EFFBA003C9FEA /* step_editor.cc */,
+ 432791EC194EFFBA003C9FEA /* step_entry.cc */,
+ 432791EE194EFFBA003C9FEA /* stereo_panner_editor.cc */,
+ 432791F0194EFFBA003C9FEA /* stereo_panner.cc */,
+ 432791F2194EFFBA003C9FEA /* streamview.cc */,
+ 432791F5194EFFBA003C9FEA /* strip_silence_dialog.cc */,
+ 432791F7194EFFBA003C9FEA /* sys_ex.cc */,
+ 432791F9194EFFBA003C9FEA /* tape_region_view.cc */,
+ 432791FB194EFFBA003C9FEA /* tempo_dialog.cc */,
+ 432791FD194EFFBA003C9FEA /* tempo_lines.cc */,
+ 432791FF194EFFBA003C9FEA /* theme_manager.cc */,
+ 43279201194EFFBA003C9FEA /* time_axis_view_item.cc */,
+ 43279203194EFFBA003C9FEA /* time_axis_view.cc */,
+ 43279205194EFFBA003C9FEA /* time_fx_dialog.cc */,
+ 43279207194EFFBA003C9FEA /* time_info_box.cc */,
+ 43279209194EFFBA003C9FEA /* time_selection.cc */,
+ 4327920B194EFFBA003C9FEA /* timecode_tester.cc */,
+ 4327920C194EFFBA003C9FEA /* track_selection.cc */,
+ 4327920E194EFFBA003C9FEA /* track_view_list.cc */,
+ 43279214194EFFBA003C9FEA /* transcode_ffmpeg.cc */,
+ 43279216194EFFBA003C9FEA /* transcode_video_dialog.cc */,
+ 43279218194EFFBA003C9FEA /* transpose_dialog.cc */,
+ 4327921B194EFFBA003C9FEA /* ui_config.cc */,
+ 4327921D194EFFBA003C9FEA /* utils_videotl.cc */,
+ 4327921F194EFFBA003C9FEA /* utils.cc */,
+ 43279221194EFFBA003C9FEA /* verbose_cursor.cc */,
+ 43279223194EFFBA003C9FEA /* version.cc */,
+ 43279225194EFFBA003C9FEA /* video_image_frame.cc */,
+ 43279227194EFFBA003C9FEA /* video_monitor.cc */,
+ 43279229194EFFBA003C9FEA /* video_server_dialog.cc */,
+ 4327922B194EFFBA003C9FEA /* video_timeline.cc */,
+ 4327922D194EFFBA003C9FEA /* visibility_group.cc */,
+ 4327922F194EFFBA003C9FEA /* volume_controller.cc */,
+ 43279231194EFFBA003C9FEA /* vst_plugin_ui.cc */,
+ 43279233194EFFBA003C9FEA /* waves_button.cc */,
+ 43279235194EFFBA003C9FEA /* waves_dialog.cc */,
+ 43279237194EFFBA003C9FEA /* waves_icon_button.cc */,
+ 43279239194EFFBA003C9FEA /* waves_ui.cc */,
+ 4327923B194EFFBA003C9FEA /* window_manager.cc */,
+ 4327923D194EFFBA003C9FEA /* windows_vst_plugin_ui.cc */,
+ );
+ name = source;
+ sourceTree = "<group>";
+ };
+ 4327923F194EFFC3003C9FEA /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 43279427194F0062003C9FEA /* small-splash.png */,
+ 43279428194F0062003C9FEA /* splash.png */,
+ 43279262194F0039003C9FEA /* icons */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 43279245194EFFF1003C9FEA /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 43279244194EFFF1003C9FEA /* Tracks.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 43279246194EFFF1003C9FEA /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 43279247194EFFF1003C9FEA /* Cocoa.framework */,
+ 43279249194EFFF1003C9FEA /* Other Frameworks */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ 43279249194EFFF1003C9FEA /* Other Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 4327924A194EFFF1003C9FEA /* AppKit.framework */,
+ 4327924B194EFFF1003C9FEA /* CoreData.framework */,
+ 4327924C194EFFF1003C9FEA /* Foundation.framework */,
+ );
+ name = "Other Frameworks";
+ sourceTree = "<group>";
+ };
+ 4327924D194EFFF1003C9FEA /* Tracks */ = {
+ isa = PBXGroup;
+ children = (
+ 43279259194EFFF1003C9FEA /* AppDelegate.h */,
+ 4327925A194EFFF1003C9FEA /* AppDelegate.m */,
+ 4327925C194EFFF1003C9FEA /* MainMenu.xib */,
+ 4327924E194EFFF1003C9FEA /* Supporting Files */,
+ );
+ path = Tracks;
+ sourceTree = "<group>";
+ };
+ 4327924E194EFFF1003C9FEA /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 4327924F194EFFF1003C9FEA /* Tracks-Info.plist */,
+ 43279250194EFFF1003C9FEA /* InfoPlist.strings */,
+ 43279253194EFFF1003C9FEA /* main.m */,
+ 43279255194EFFF1003C9FEA /* Tracks-Prefix.pch */,
+ 43279256194EFFF1003C9FEA /* Credits.rtf */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+ 43279262194F0039003C9FEA /* icons */ = {
+ isa = PBXGroup;
+ children = (
+ 43279263194F0039003C9FEA /* act-disabled.png */,
+ 43279264194F0039003C9FEA /* add.png */,
+ 43279265194F0039003C9FEA /* application-x-ardour_16px.png */,
+ 43279266194F0039003C9FEA /* application-x-ardour_22px.png */,
+ 43279267194F0039003C9FEA /* application-x-ardour_32px.png */,
+ 43279268194F0039003C9FEA /* application-x-ardour_48px.png */,
+ 43279269194F0039003C9FEA /* ardour-app-icon_osx.png */,
+ 4327926A194F0039003C9FEA /* ardour-app-icon_osx_mask.png */,
+ 4327926B194F0039003C9FEA /* ardour_icon_16px.png */,
+ 4327926C194F0039003C9FEA /* ardour_icon_22px.png */,
+ 4327926D194F0039003C9FEA /* ardour_icon_256px.png */,
+ 4327926E194F0039003C9FEA /* ardour_icon_32px.png */,
+ 4327926F194F0039003C9FEA /* ardour_icon_48px.png */,
+ 43279270194F0039003C9FEA /* chord.png */,
+ 43279271194F0039003C9FEA /* close.png */,
+ 43279272194F0039003C9FEA /* computer_keyboard.png */,
+ 43279273194F0039003C9FEA /* computer_keyboard_active.png */,
+ 43279274194F0039003C9FEA /* display_clock_mockup.png */,
+ 43279275194F0039003C9FEA /* display_metrics_mockup.png */,
+ 43279276194F0039003C9FEA /* eighthnote.png */,
+ 43279277194F0039003C9FEA /* expand_left_right_cursor.png */,
+ 43279278194F0039003C9FEA /* expand_up_down_cursor.png */,
+ 43279279194F0039003C9FEA /* export_icons.sh */,
+ 4327927A194F0039003C9FEA /* fade_in_cursor.png */,
+ 4327927B194F0039003C9FEA /* fade_out_cursor.png */,
+ 4327927C194F0039003C9FEA /* fadein-constant-power.png */,
+ 4327927D194F0039003C9FEA /* fadein-fast-cut.png */,
+ 4327927E194F0039003C9FEA /* fadein-linear.png */,
+ 4327927F194F0039003C9FEA /* fadein-long-cut.png */,
+ 43279280194F0039003C9FEA /* fadein-S1.png */,
+ 43279281194F0039003C9FEA /* fadein-S2.png */,
+ 43279282194F0039003C9FEA /* fadein-short-cut.png */,
+ 43279283194F0039003C9FEA /* fadein-slow-cut.png */,
+ 43279284194F0039003C9FEA /* fadeout-constant-power.png */,
+ 43279285194F0039003C9FEA /* fadeout-fast-cut.png */,
+ 43279286194F0039003C9FEA /* fadeout-linear.png */,
+ 43279287194F0039003C9FEA /* fadeout-long-cut.png */,
+ 43279288194F0039003C9FEA /* fadeout-S1.png */,
+ 43279289194F0039003C9FEA /* fadeout-S2.png */,
+ 4327928A194F0039003C9FEA /* fadeout-short-cut.png */,
+ 4327928B194F0039003C9FEA /* fadeout-slow-cut.png */,
+ 4327928C194F0039003C9FEA /* fader_belt.png */,
+ 4327928D194F0039003C9FEA /* fader_belt_desensitised.png */,
+ 4327928E194F0039003C9FEA /* fader_belt_h.png */,
+ 4327928F194F0039003C9FEA /* fader_belt_h_desensitised.png */,
+ 43279290194F0039003C9FEA /* fader_belt_h_medium.png */,
+ 43279291194F0039003C9FEA /* fader_belt_h_medium_desensitised.png */,
+ 43279292194F0039003C9FEA /* fader_belt_h_thin.png */,
+ 43279293194F0039003C9FEA /* fader_belt_h_thin_desensitised.png */,
+ 43279294194F0039003C9FEA /* fader_handle.png */,
+ 43279295194F0039003C9FEA /* ferret_02.png */,
+ 43279296194F0039003C9FEA /* forte.png */,
+ 43279297194F0039003C9FEA /* fortissimo.png */,
+ 43279298194F0039003C9FEA /* fortississimo.png */,
+ 43279299194F0039003C9FEA /* grabber.png */,
+ 4327929A194F0039003C9FEA /* grabber_edit_point.png */,
+ 4327929B194F0039003C9FEA /* grabber_note.png */,
+ 4327929C194F0039003C9FEA /* halfnote.png */,
+ 4327929D194F0039003C9FEA /* hide.png */,
+ 4327929E194F0039003C9FEA /* horizontal_zoom_fader_face.png */,
+ 4327929F194F0039003C9FEA /* i_beam_cursor.png */,
+ 432792A0194F0039003C9FEA /* inspector_on.png */,
+ 432792A1194F0039003C9FEA /* inspector_on_active.png */,
+ 432792A2194F0039003C9FEA /* inspector_on_prelight.png */,
+ 432792A3194F0039003C9FEA /* join_tools.png */,
+ 432792A4194F0039003C9FEA /* knob.png */,
+ 432792A5194F0039003C9FEA /* lock_session.png */,
+ 432792A6194F0039003C9FEA /* lock_session_active.png */,
+ 432792A7194F0039003C9FEA /* lock_session_prelight.png */,
+ 432792A8194F0039003C9FEA /* media_button.png */,
+ 432792A9194F0039003C9FEA /* media_button_active.png */,
+ 432792AA194F0039003C9FEA /* media_button_prelight.png */,
+ 432792AB194F0039003C9FEA /* meter_bridge_on.png */,
+ 432792AC194F0039003C9FEA /* meter_bridge_on_active.png */,
+ 432792AD194F0039003C9FEA /* meter_bridge_on_prelight.png */,
+ 432792AE194F0039003C9FEA /* metronome.png */,
+ 432792AF194F0039003C9FEA /* mezzforte.png */,
+ 432792B0194F0039003C9FEA /* mezzoforte.png */,
+ 432792B1194F0039003C9FEA /* mezzopiano.png */,
+ 432792B2194F0039003C9FEA /* midi-input-active.png */,
+ 432792B3194F0039003C9FEA /* midi-input-inactive.png */,
+ 432792B4194F0039003C9FEA /* midi_panic.png */,
+ 432792B5194F0039003C9FEA /* midi_socket_small.png */,
+ 432792B6194F0039003C9FEA /* midi_sound_notes.png */,
+ 432792B7194F0039003C9FEA /* midi_tool_erase.png */,
+ 432792B8194F0039003C9FEA /* midi_tool_pencil.png */,
+ 432792B9194F0039003C9FEA /* midi_tool_select.png */,
+ 432792BA194F0039003C9FEA /* mixer_on.png */,
+ 432792BB194F0039003C9FEA /* mixer_on_active.png */,
+ 432792BC194F0039003C9FEA /* mixer_on_prelight.png */,
+ 432792BD194F0039003C9FEA /* mode_multi_out.png */,
+ 432792BE194F0039003C9FEA /* mode_multi_out_active.png */,
+ 432792BF194F0039003C9FEA /* mode_multi_out_prelight.png */,
+ 432792C0194F0039003C9FEA /* mode_stereo_out.png */,
+ 432792C1194F0039003C9FEA /* mode_stereo_out_active.png */,
+ 432792C2194F0039003C9FEA /* mode_stereo_out_prelight.png */,
+ 432792C3194F0039003C9FEA /* move_cursor.png */,
+ 432792C4194F0039003C9FEA /* mute-disabled.png */,
+ 432792C5194F0039003C9FEA /* mute-enabled.png */,
+ 432792C6194F0039003C9FEA /* muted-by-others.png */,
+ 432792C7194F0039003C9FEA /* nudge_left.png */,
+ 432792C8194F0039003C9FEA /* nudge_right.png */,
+ 432792C9194F0039003C9FEA /* pianissimo.png */,
+ 432792CA194F0039003C9FEA /* pianississimo.png */,
+ 432792CB194F0039003C9FEA /* piano.png */,
+ 432792CC194F0039003C9FEA /* quarternote.png */,
+ 432792CD194F0039003C9FEA /* rec-enabled.png */,
+ 432792CE194F0039003C9FEA /* rec-in-progress.png */,
+ 432792CF194F0039003C9FEA /* record-normal-disabled.png */,
+ 432792D0194F0039003C9FEA /* record-normal-enabled.png */,
+ 432792D1194F0039003C9FEA /* record-normal-in-progress.png */,
+ 432792D2194F0039003C9FEA /* record-step.png */,
+ 432792D3194F0039003C9FEA /* record_disabled_grey.png */,
+ 432792D4194F0039003C9FEA /* record_normal_red.png */,
+ 432792D5194F0039003C9FEA /* record_tape_red.png */,
+ 432792D6194F0039003C9FEA /* resize_bottom_cursor.png */,
+ 432792D7194F0039003C9FEA /* resize_bottom_left_cursor.png */,
+ 432792D8194F0039003C9FEA /* resize_bottom_right_cursor.png */,
+ 432792D9194F0039003C9FEA /* resize_left_cursor.png */,
+ 432792DA194F0039003C9FEA /* resize_right_cursor.png */,
+ 432792DB194F0039003C9FEA /* resize_top_cursor.png */,
+ 432792DC194F0039003C9FEA /* resize_top_left_cursor.png */,
+ 432792DD194F0039003C9FEA /* resize_top_right_cursor.png */,
+ 432792DE194F0039003C9FEA /* sae.png */,
+ 432792DF194F0039003C9FEA /* sessionlock.png */,
+ 432792E0194F0039003C9FEA /* sixteenthnote.png */,
+ 432792E1194F0039003C9FEA /* sixtyfourthnote.png */,
+ 432792E2194F0039003C9FEA /* slider_controller_fader.png */,
+ 432792E3194F0039003C9FEA /* slider_controller_fader_handle.png */,
+ 432792E4194F0039003C9FEA /* solo-disabled.png */,
+ 432792E5194F0039003C9FEA /* solo-enabled.png */,
+ 432792E6194F0039003C9FEA /* solo-isolate-disabled.png */,
+ 432792E7194F0039003C9FEA /* solo-isolate-enabled.png */,
+ 432792E8194F0039003C9FEA /* solo-isolated.png */,
+ 432792E9194F0039003C9FEA /* solo-safe-disabled.png */,
+ 432792EA194F0039003C9FEA /* solo-safe-enabled.png */,
+ 432792EB194F0039003C9FEA /* solo-safe-icon.png */,
+ 432792EC194F0039003C9FEA /* soloed-by-others.png */,
+ 432792ED194F0039003C9FEA /* step-editing.png */,
+ 432792EE194F0039003C9FEA /* strip_width.png */,
+ 432792EF194F0039003C9FEA /* systemlock.png */,
+ 432792F0194F0039003C9FEA /* tav_exp.png */,
+ 432792F1194F0039003C9FEA /* tav_shrink.png */,
+ 432792F2194F0039003C9FEA /* thirtysecondnote.png */,
+ 432792F3194F0039003C9FEA /* tool_arrow.png */,
+ 432792F4194F0039003C9FEA /* tool_arrow_active.png */,
+ 432792F5194F0039003C9FEA /* tool_arrow_prelight.png */,
+ 432792F6194F0039003C9FEA /* tool_audition.png */,
+ 432792F7194F0039003C9FEA /* tool_cut.png */,
+ 432792F8194F0039003C9FEA /* tool_cut_active.png */,
+ 432792F9194F0039003C9FEA /* tool_cut_prelight.png */,
+ 432792FA194F0039003C9FEA /* tool_gain.png */,
+ 432792FB194F0039003C9FEA /* tool_marker.png */,
+ 432792FC194F0039003C9FEA /* tool_marker_active.png */,
+ 432792FD194F0039003C9FEA /* tool_marker_prelight.png */,
+ 432792FE194F0039003C9FEA /* tool_note.png */,
+ 432792FF194F0039003C9FEA /* tool_object.png */,
+ 43279300194F0039003C9FEA /* tool_object_range.png */,
+ 43279301194F0039003C9FEA /* tool_range.png */,
+ 43279302194F0039003C9FEA /* tool_stretch.png */,
+ 43279303194F0039003C9FEA /* tool_waveform_zoom.png */,
+ 43279304194F0039003C9FEA /* tool_waveform_zoom_active.png */,
+ 43279305194F0039003C9FEA /* tool_waveform_zoom_prelight.png */,
+ 43279306194F0039003C9FEA /* tool_zoom.png */,
+ 43279307194F0039003C9FEA /* tool_zoom_active.png */,
+ 43279308194F0039003C9FEA /* tool_zoom_ardour.png */,
+ 43279309194F0039003C9FEA /* tool_zoom_prelight.png */,
+ 4327930A194F003A003C9FEA /* tracks.png */,
+ 4327930B194F003A003C9FEA /* tracks_active.png */,
+ 4327930C194F003A003C9FEA /* tracks_prelight.png */,
+ 4327930D194F003A003C9FEA /* transport_end.png */,
+ 4327930E194F003A003C9FEA /* transport_end_active.png */,
+ 4327930F194F003A003C9FEA /* transport_end_prelight.png */,
+ 43279310194F003A003C9FEA /* transport_loop.png */,
+ 43279311194F003A003C9FEA /* transport_loop_active.png */,
+ 43279312194F003A003C9FEA /* transport_loop_prelight.png */,
+ 43279313194F003A003C9FEA /* transport_play.png */,
+ 43279314194F003A003C9FEA /* transport_play_active.png */,
+ 43279315194F003A003C9FEA /* transport_play_prelight.png */,
+ 43279316194F003A003C9FEA /* transport_range.png */,
+ 43279317194F003A003C9FEA /* transport_record.png */,
+ 43279318194F003A003C9FEA /* transport_record_active.png */,
+ 43279319194F003A003C9FEA /* transport_record_prelight.png */,
+ 4327931A194F003A003C9FEA /* transport_start.png */,
+ 4327931B194F003A003C9FEA /* transport_start_active.png */,
+ 4327931C194F003A003C9FEA /* transport_start_prelight.png */,
+ 4327931D194F003A003C9FEA /* transport_stop.png */,
+ 4327931E194F003A003C9FEA /* transport_stop_active.png */,
+ 4327931F194F003A003C9FEA /* transport_stop_prelight.png */,
+ 43279320194F003A003C9FEA /* trim_bottom_cursor.png */,
+ 43279321194F003A003C9FEA /* trim_left_cursor.png */,
+ 43279322194F003A003C9FEA /* trim_left_cursor_5.png */,
+ 43279323194F003A003C9FEA /* trim_left_cursor_right_only.png */,
+ 43279324194F003A003C9FEA /* trim_right_cursor.png */,
+ 43279325194F003A003C9FEA /* trim_right_cursor_5.png */,
+ 43279326194F003A003C9FEA /* trim_right_cursor_left_only.png */,
+ 43279327194F003A003C9FEA /* trim_top_cursor.png */,
+ 43279328194F003A003C9FEA /* vertical_zoom_fader_face.png */,
+ 43279329194F003A003C9FEA /* wholenote.png */,
+ 4327932A194F003A003C9FEA /* zoom_fader_handle.png */,
+ 4327932B194F003A003C9FEA /* zoom_fader_handle_active.png */,
+ 4327932C194F003A003C9FEA /* zoom_full.png */,
+ 4327932D194F003A003C9FEA /* zoom_in.png */,
+ 4327932E194F003A003C9FEA /* zoom_in_cursor.png */,
+ 4327932F194F003A003C9FEA /* zoom_out.png */,
+ 43279330194F003A003C9FEA /* zoom_out_cursor.png */,
+ );
+ name = icons;
+ path = ../icons;
+ sourceTree = "<group>";
+ };
+ 432793FF194F0062003C9FEA /* pixmaps */ = {
+ isa = PBXGroup;
+ children = (
+ 43279400194F0062003C9FEA /* forwardblarrow.xpm */,
+ 43279401194F0062003C9FEA /* h_meter_strip.xpm */,
+ 43279402194F0062003C9FEA /* hiin.xpm */,
+ 43279403194F0062003C9FEA /* hiout.xpm */,
+ 43279404194F0062003C9FEA /* hslider00.xpm */,
+ 43279405194F0062003C9FEA /* hslider01.xpm */,
+ 43279406194F0062003C9FEA /* left_arrow.xpm */,
+ 43279407194F0062003C9FEA /* linin.xpm */,
+ 43279408194F0062003C9FEA /* linout.xpm */,
+ 43279409194F0062003C9FEA /* loin.xpm */,
+ 4327940A194F0062003C9FEA /* loop.xpm */,
+ 4327940B194F0062003C9FEA /* loout.xpm */,
+ 4327940C194F0062003C9FEA /* lr.xpm */,
+ 4327940D194F0062003C9FEA /* regin.xpm */,
+ 4327940E194F0062003C9FEA /* regin2.xpm */,
+ 4327940F194F0062003C9FEA /* regout.xpm */,
+ 43279410194F0062003C9FEA /* regout2.xpm */,
+ 43279411194F0062003C9FEA /* revdblarrow.xpm */,
+ 43279412194F0062003C9FEA /* right_arrow.xpm */,
+ 43279413194F0062003C9FEA /* set-next-button.xpm */,
+ 43279414194F0062003C9FEA /* small-round-button-01.xpm */,
+ 43279415194F0062003C9FEA /* small_x.xpm */,
+ 43279416194F0062003C9FEA /* toggle-button-00.xpm */,
+ 43279417194F0062003C9FEA /* toggle-button-01.xpm */,
+ 43279418194F0062003C9FEA /* tool_audition.xpm */,
+ 43279419194F0062003C9FEA /* tool_gain.xpm */,
+ 4327941A194F0062003C9FEA /* tool_object.xpm */,
+ 4327941B194F0062003C9FEA /* tool_range.xpm */,
+ 4327941C194F0062003C9FEA /* tool_stretch.xpm */,
+ 4327941D194F0062003C9FEA /* tool_zoom.xpm */,
+ 4327941E194F0062003C9FEA /* v_meter_strip.xpm */,
+ 4327941F194F0062003C9FEA /* vslider00.xpm */,
+ 43279420194F0062003C9FEA /* vslider01.xpm */,
+ 43279421194F0062003C9FEA /* vslider02_rail.xpm */,
+ 43279422194F0062003C9FEA /* vslider02_slider.xpm */,
+ 43279423194F0062003C9FEA /* vslider_slider_16wide.xpm */,
+ 43279424194F0062003C9FEA /* zoom_full.xpm */,
+ 43279425194F0062003C9FEA /* zoom_in.xpm */,
+ 43279426194F0062003C9FEA /* zoom_out.xpm */,
+ );
+ name = pixmaps;
+ path = ../pixmaps;
+ sourceTree = "<group>";
+ };
+ 43279429194F0062003C9FEA /* ui */ = {
+ isa = PBXGroup;
+ children = (
+ 95D4986B1AEA363E006E065D /* audio_engine_reset_info_dialog.xml */,
+ 95D4986C1AEA363E006E065D /* crash_recovery_dialog.xml */,
+ 95D4986D1AEA363E006E065D /* waves_save_template_dialog.xml */,
+ 95E2A7AA1A8F652F0080BD79 /* waves_radio_item.xml */,
+ 95D6A67A1A8E22E80030CDD0 /* waves_keyeditor.xml */,
+ 95D9E3771A8D1B3B00A0DA46 /* waves_ambiguous_file_dialog.xml */,
+ 95D9E3781A8D1B3B00A0DA46 /* waves_missing_file_dialog.xml */,
+ 95D5D1381A8A514300407F98 /* waves_numeric_edit_dialog.xml */,
+ 956D3F891A851805004F328C /* waves_import_dialog.xml */,
+ 95D795DB1A7BB40C00120A4F /* marker_inspector_dialog.xml */,
+ 95D795DD1A7BB40C00120A4F /* waves_export_dialog.xml */,
+ 95D795DE1A7BB40C00120A4F /* waves_export_file_notebook_page.xml */,
+ 95D795DF1A7BB40C00120A4F /* waves_export_file_notebook.xml */,
+ 95D795E01A7BB40C00120A4F /* waves_export_filename_selector.xml */,
+ 95D795E11A7BB40C00120A4F /* waves_export_format_selector.xml */,
+ 95D795E21A7BB40C00120A4F /* waves_export_preset_selector.xml */,
+ 95D795E31A7BB40C00120A4F /* waves_export_timespan_selector.xml */,
+ 95D795E41A7BB40C00120A4F /* waves_port_export_channel_selector.xml */,
+ 95D795E51A7BB40C00120A4F /* waves_region_export_channel_selector.xml */,
+ 95D795E61A7BB40C00120A4F /* waves_track_color_dialog.xml */,
+ 95D795E71A7BB40C00120A4F /* waves_track_export_channel_selector.xml */,
+ 95D1C5201A78ED3A00BE28DB /* waves_edit_dialog.xml */,
+ 5BC67E581A408FCE00F29ABA /* progress_dialog.xml */,
+ 95F9DFD81A35F3310007E953 /* waves_clean_up_dialog.xml */,
+ 95F9DFD91A35F3310007E953 /* waves_connect_to_backend_error_dialog.xml */,
+ 95F9DFDA1A35F3310007E953 /* waves_excessive_split_dialog.xml */,
+ 95F9DFDC1A35F3310007E953 /* waves_file_exists_dialog.xml */,
+ 95F9DFDD1A35F3310007E953 /* waves_how_to_import_dialog_1.xml */,
+ 95F9DFDE1A35F3310007E953 /* waves_how_to_import_dialog_2.xml */,
+ 95F9DFDF1A35F3310007E953 /* waves_route_rename_dialog.xml */,
+ 95F9DFD61A35A8BD0007E953 /* waves_message_dialog.xml */,
+ 95176F7D1A08E76F00E32046 /* file_sample_rate_mismatch_dialog.xml */,
+ 954DCFDD1A07A14E00B7160E /* read_only_session_dialog.xml */,
+ 954DCFBF1A023AAB00B7160E /* about_dialog.xml */,
+ 954DCFC01A023AAB00B7160E /* license_dialog.xml */,
+ CE294C5719CAD4E300D12768 /* add_tracks_dialog.xml */,
+ CE294C5819CAD4E300D12768 /* compact_meter_bridge.xml */,
+ CE294C5919CAD4E300D12768 /* compact_meter_strip.xml */,
+ CE294C5A19CAD4E300D12768 /* marker_io_dialog.xml */,
+ CE294C5B19CAD4E300D12768 /* meter_bridge_view.xml */,
+ CE294C5C19CAD4E300D12768 /* meter_strip_gain_meter.xml */,
+ CE294C5D19CAD4E300D12768 /* mixer_bridge_view.xml */,
+ CE294C5E19CAD4E300D12768 /* time_info_box.xml */,
+ CEB9D787197516BE00B21780 /* audio_time_axis.xml */,
+ CEB9D788197516BE00B21780 /* automation_time_axis.xml */,
+ CEB9D789197516BE00B21780 /* editor_mixer.xml */,
+ CEB9D78A197516BE00B21780 /* inspector_gain_meter.xml */,
+ CEB9D78C197516BE00B21780 /* master_ui.xml */,
+ CEB9D78D197516BE00B21780 /* meter_strip.xml */,
+ CEB9D78E197516BE00B21780 /* mixer_gain_meter.xml */,
+ CEB9D78F197516BE00B21780 /* mixer_strip.xml */,
+ CEB9D790197516BE00B21780 /* track_header_gain_meter.xml */,
+ CEB0A9F31958447C006D269A /* session_close_dialog.xml */,
+ 4327942A194F0062003C9FEA /* device_capture_control.xml */,
+ 4327942B194F0062003C9FEA /* device_playback_control.xml */,
+ 4327942C194F0062003C9FEA /* editor_window.xml */,
+ 4327942D194F0062003C9FEA /* midi_device_control.xml */,
+ 4327942E194F0062003C9FEA /* session_dialog.xml */,
+ 4327942F194F0062003C9FEA /* session_lock_dialog.xml */,
+ 43279430194F0062003C9FEA /* tracks_preferences.xml */,
+ );
+ name = ui;
+ path = ../ui;
+ sourceTree = "<group>";
+ };
+ 43279461194F007F003C9FEA /* menus */ = {
+ isa = PBXGroup;
+ children = (
+ 43279475194F009E003C9FEA /* tracks.menus.in */,
+ );
+ name = menus;
+ sourceTree = "<group>";
+ };
+ 43279480194F00CB003C9FEA /* headers */ = {
+ isa = PBXGroup;
+ children = (
+ 95E5E9411AE9462B0000E2CE /* waves_tooltip.h */,
+ 95ED5FF61A95F285006D39E4 /* route_inspector.h */,
+ 95D9E37B1A8D1B5200A0DA46 /* waves_ambiguous_file_dialog.h */,
+ 95D9E37C1A8D1B5200A0DA46 /* waves_missing_file_dialog.h */,
+ 95D5D1321A8A514300407F98 /* waves_numeric_edit_dialog.h */,
+ 95D7961A1A7BBA4E00120A4F /* floating_text_entry.h */,
+ 95D7961B1A7BBA4E00120A4F /* marker_inspector_dialog.h */,
+ 95D7961C1A7BBA4E00120A4F /* marker_inspector_dialog.logic.h */,
+ 95D7961D1A7BBA4E00120A4F /* product_definition.h */,
+ 95D7961E1A7BBA4E00120A4F /* ruler_dialog.h */,
+ 95D7961F1A7BBA4E00120A4F /* trackslive_resource.h */,
+ 95D796201A7BBA4E00120A4F /* waves_export_channel_selector.h */,
+ 95D796211A7BBA4E00120A4F /* waves_export_dialog.h */,
+ 95D796221A7BBA4E00120A4F /* waves_export_file_notebook.h */,
+ 95D796231A7BBA4E00120A4F /* waves_export_filename_selector.h */,
+ 95D796241A7BBA4E00120A4F /* waves_export_format_selector.h */,
+ 95D796251A7BBA4E00120A4F /* waves_export_preset_selector.h */,
+ 95D796261A7BBA4E00120A4F /* waves_export_timespan_selector.h */,
+ 95D796271A7BBA4E00120A4F /* waves_grid.h */,
+ 95D796281A7BBA4E00120A4F /* waves_import_dialog.h */,
+ 95D1C51A1A78ED1100BE28DB /* waves_edit_dialog.h */,
+ 95D71D561A4C697700DE5B3B /* waves_track_color_dialog.h */,
+ 95D71D501A4C66DF00DE5B3B /* waves_track_color_dialog.logic.h */,
+ 5BC67E5D1A4090AA00F29ABA /* progress_dialog.h */,
+ 957EF44F1A30BFBF00F1500E /* waves_message_dialog.h */,
+ 95176F781A08E6D800E32046 /* file_sample_rate_mismatch_dialog.h */,
+ 954DCFBE1A0239EC00B7160E /* about_dialog.h */,
+ 95A134DF1A02391F0008E3D6 /* license_dialog.h */,
+ CE294C7E19CAD58500D12768 /* ardour_dropdown.h */,
+ CE294C7F19CAD58500D12768 /* marker_io_dialog.h */,
+ CE294C8019CAD58500D12768 /* mixer_bridge_view.h */,
+ CE294C8119CAD58500D12768 /* soundcloud_export_selector.h */,
+ CE294C8219CAD58500D12768 /* waves_dropdown.h */,
+ CE294C8319CAD58500D12768 /* waves_zoom_control.h */,
+ CE1A907E199A37BF00ECA62B /* add_tracks_dialog.h */,
+ CE1C6DDB1987A910006BDB03 /* master_bus_ui.h */,
+ CE1C6DD319879F1B006BDB03 /* compact_meter_bridge.h */,
+ CE1C6DD419879F1B006BDB03 /* compact_meter_strip.h */,
+ CEB0A45A19583F3F006D269A /* session_close_dialog.h */,
+ CEAFC775195445D90016ACF0 /* bbt_time.h */,
+ CEAFC776195445D90016ACF0 /* time.h */,
+ CEAFC777195445D90016ACF0 /* visibility.h */,
+ 43B351D4194F04E00038C140 /* tracks_control_panel.h */,
+ 43B351D5194F04E00038C140 /* tracks_control_panel.logic.h */,
+ 43B350F1194F04E00038C140 /* actions.h */,
+ 43B350F2194F04E00038C140 /* add_route_dialog.h */,
+ 43B350F3194F04E00038C140 /* add_video_dialog.h */,
+ 43B350F4194F04E00038C140 /* ambiguous_file_dialog.h */,
+ 43B350F5194F04E00038C140 /* analysis_window.h */,
+ 43B350F6194F04E00038C140 /* ardour_button.h */,
+ 43B350F7194F04E00038C140 /* ardour_dialog.h */,
+ 43B350F8194F04E00038C140 /* ardour_ui.h */,
+ 43B350F9194F04E00038C140 /* ardour_window.h */,
+ 43B350FA194F04E00038C140 /* au_pluginui.h */,
+ 43B350FB194F04E00038C140 /* audio_clock.h */,
+ 43B350FC194F04E00038C140 /* audio_region_editor.h */,
+ 43B350FD194F04E00038C140 /* audio_region_view.h */,
+ 43B350FE194F04E00038C140 /* audio_streamview.h */,
+ 43B350FF194F04E00038C140 /* audio_time_axis.h */,
+ 43B35100194F04E00038C140 /* automation_controller.h */,
+ 43B35101194F04E00038C140 /* automation_line.h */,
+ 43B35102194F04E00038C140 /* automation_region_view.h */,
+ 43B35103194F04E00038C140 /* automation_selection.h */,
+ 43B35104194F04E00038C140 /* automation_streamview.h */,
+ 43B35105194F04E00038C140 /* automation_time_axis.h */,
+ 43B35106194F04E00038C140 /* axis_view.h */,
+ 43B35107194F04E00038C140 /* big_clock_window.h */,
+ 43B35108194F04E00038C140 /* bundle_env.h */,
+ 43B35109194F04E00038C140 /* bundle_manager.h */,
+ 43B3510A194F04E00038C140 /* button_joiner.h */,
+ 43B3510B194F04E00038C140 /* canvas_vars.h */,
+ 43B3510C194F04E00038C140 /* canvas-waveview.h */,
+ 43B3510D194F04E00038C140 /* clock_group.h */,
+ 43B3510E194F04E00038C140 /* configinfo.h */,
+ 43B3510F194F04E00038C140 /* control_point_dialog.h */,
+ 43B35110194F04E00038C140 /* control_point.h */,
+ 43B35111194F04E00038C140 /* crossfade_edit.h */,
+ 43B35112194F04E00038C140 /* crossfade_view.h */,
+ 43B35113194F04E00038C140 /* crossfade_xpms.h */,
+ 43B35114194F04E00038C140 /* dbg_msg.h */,
+ 43B35115194F04E00038C140 /* debug.h */,
+ 43B35116194F04E00038C140 /* device_connection_control.h */,
+ 43B35117194F04E00038C140 /* edit_note_dialog.h */,
+ 43B35118194F04E00038C140 /* editing_syms.h */,
+ 43B35119194F04E00038C140 /* editing.h */,
+ 43B3511A194F04E00038C140 /* editor_component.h */,
+ 43B3511B194F04E00038C140 /* editor_cursors.h */,
+ 43B3511C194F04E00038C140 /* editor_drag.h */,
+ 43B3511D194F04E00038C140 /* editor_enums.h */,
+ 43B3511E194F04E00038C140 /* editor_group_tabs.h */,
+ 43B3511F194F04E00038C140 /* editor_items.h */,
+ 43B35120194F04E00038C140 /* editor_locations.h */,
+ 43B35121194F04E00038C140 /* editor_regions.h */,
+ 43B35122194F04E00038C140 /* editor_route_groups.h */,
+ 43B35123194F04E00038C140 /* editor_routes.h */,
+ 43B35124194F04E00038C140 /* editor_snapshots.h */,
+ 43B35125194F04E00038C140 /* editor_summary.h */,
+ 43B35126194F04E00038C140 /* editor.h */,
+ 43B35127194F04E00038C140 /* engine_dialog.h */,
+ 43B35128194F04E00038C140 /* enums.h */,
+ 43B3512A194F04E00038C140 /* export_channel_selector.h */,
+ 43B3512B194F04E00038C140 /* export_dialog.h */,
+ 43B3512C194F04E00038C140 /* export_file_notebook.h */,
+ 43B3512D194F04E00038C140 /* export_filename_selector.h */,
+ 43B3512E194F04E00038C140 /* export_format_dialog.h */,
+ 43B3512F194F04E00038C140 /* export_format_selector.h */,
+ 43B35130194F04E00038C140 /* export_preset_selector.h */,
+ 43B35131194F04E00038C140 /* export_range_markers_dialog.h */,
+ 43B35132194F04E00038C140 /* export_timespan_selector.h */,
+ 43B35133194F04E00038C140 /* export_video_dialog.h */,
+ 43B35134194F04E00038C140 /* export_video_infobox.h */,
+ 43B35135194F04E00038C140 /* fft_graph.h */,
+ 43B35136194F04E00038C140 /* fft_result.h */,
+ 43B35137194F04E00038C140 /* fft.h */,
+ 43B35138194F04E00038C140 /* fix_carbon.h */,
+ 43B35139194F04E00038C140 /* gain_meter.h */,
+ 43B3513A194F04E00038C140 /* gettext.h */,
+ 43B3513B194F04E00038C140 /* ghostregion.h */,
+ 43B3513C194F04E00038C140 /* global_port_matrix.h */,
+ 43B3513D194F04E00038C140 /* global_signals.h */,
+ 43B3513E194F04E00038C140 /* group_tabs.h */,
+ 43B3513F194F04E00038C140 /* gtk_pianokeyboard.h */,
+ 43B35142194F04E00038C140 /* gui_object.h */,
+ 43B35143194F04E00038C140 /* gui_thread.h */,
+ 43B35144194F04E00038C140 /* hit.h */,
+ 43B35145194F04E00038C140 /* i18n.h */,
+ 43B35146194F04E00038C140 /* insert_time_dialog.h */,
+ 43B35147194F04E00038C140 /* interthread_progress_window.h */,
+ 43B35148194F04E00038C140 /* io_selector.h */,
+ 43B35149194F04E00038C140 /* keyboard.h */,
+ 43B3514A194F04E00038C140 /* keyeditor.h */,
+ 43B3514B194F04E00038C140 /* latency_gui.h */,
+ 43B3514C194F04E00038C140 /* led.h */,
+ 43B3514D194F04E00038C140 /* level_meter.h */,
+ 43B3514E194F04E00038C140 /* location_ui.h */,
+ 43B3514F194F04E00038C140 /* logmeter.h */,
+ 43B35150194F04E00038C140 /* lv2_external_ui.h */,
+ 43B35151194F04E00038C140 /* lv2_plugin_ui.h */,
+ 43B35152194F04E00038C140 /* lxvst_plugin_ui.h */,
+ 43B35153194F04E00038C140 /* main_clock.h */,
+ 43B35154194F04E00038C140 /* marker_selection.h */,
+ 43B35155194F04E00038C140 /* marker.h */,
+ 43B35156194F04E00038C140 /* meter_patterns.h */,
+ 43B35157194F04E00038C140 /* meter_strip.h */,
+ 43B35158194F04E00038C140 /* meterbridge.h */,
+ 43B35159194F04E00038C140 /* midi_automation_line.h */,
+ 43B3515A194F04E00038C140 /* midi_channel_dialog.h */,
+ 43B3515B194F04E00038C140 /* midi_channel_selector.h */,
+ 43B3515C194F04E00038C140 /* midi_cut_buffer.h */,
+ 43B3515D194F04E00038C140 /* midi_device_connection_control.h */,
+ 43B3515E194F04E00038C140 /* midi_export_dialog.h */,
+ 43B3515F194F04E00038C140 /* midi_list_editor.h */,
+ 43B35160194F04E00038C140 /* midi_port_dialog.h */,
+ 43B35161194F04E00038C140 /* midi_region_view.h */,
+ 43B35162194F04E00038C140 /* midi_scroomer.h */,
+ 43B35163194F04E00038C140 /* midi_selection.h */,
+ 43B35164194F04E00038C140 /* midi_streamview.h */,
+ 43B35165194F04E00038C140 /* midi_time_axis.h */,
+ 43B35166194F04E00038C140 /* midi_tracer.h */,
+ 43B35167194F04E00038C140 /* midi_util.h */,
+ 43B35168194F04E00038C140 /* midi_velocity_dialog.h */,
+ 43B35169194F04E00038C140 /* missing_file_dialog.h */,
+ 43B3516A194F04E00038C140 /* missing_plugin_dialog.h */,
+ 43B3516B194F04E00038C140 /* mixer_actor.h */,
+ 43B3516C194F04E00038C140 /* mixer_group_tabs.h */,
+ 43B3516D194F04E00038C140 /* mixer_strip.h */,
+ 43B3516E194F04E00038C140 /* mixer_ui.h */,
+ 43B3516F194F04E00038C140 /* monitor_section.h */,
+ 43B35170194F04E00038C140 /* mono_panner_editor.h */,
+ 43B35171194F04E00038C140 /* mono_panner.h */,
+ 43B35172194F04E00038C140 /* mouse_cursors.h */,
+ 43B35173194F04E00038C140 /* nag.h */,
+ 43B35174194F04E00038C140 /* new_plugin_preset_dialog.h */,
+ 43B35175194F04E00038C140 /* normalize_dialog.h */,
+ 43B35176194F04E00038C140 /* note_base.h */,
+ 43B35177194F04E00038C140 /* note_player.h */,
+ 43B35178194F04E00038C140 /* note.h */,
+ 43B35179194F04E00038C140 /* nsm.h */,
+ 43B3517A194F04E00038C140 /* nsmclient.h */,
+ 43B3517B194F04E00038C140 /* open_file_dialog_proxy.h */,
+ 43B3517C194F04E00038C140 /* open_file_dialog.h */,
+ 43B3517D194F04E00038C140 /* option_editor.h */,
+ 43B3517E194F04E00038C140 /* opts.h */,
+ 43B3517F194F04E00038C140 /* panner_editor.h */,
+ 43B35180194F04E00038C140 /* panner_interface.h */,
+ 43B35181194F04E00038C140 /* panner_ui.h */,
+ 43B35182194F04E00038C140 /* panner2d.h */,
+ 43B35183194F04E00038C140 /* patch_change_dialog.h */,
+ 43B35184194F04E00038C140 /* patch_change.h */,
+ 43B35185194F04E00038C140 /* piano_roll_header.h */,
+ 43B35186194F04E00038C140 /* pingback.h */,
+ 43B35187194F04E00038C140 /* playlist_selection.h */,
+ 43B35188194F04E00038C140 /* playlist_selector.h */,
+ 43B35189194F04E00038C140 /* plugin_eq_gui.h */,
+ 43B3518A194F04E00038C140 /* plugin_interest.h */,
+ 43B3518B194F04E00038C140 /* plugin_selector.h */,
+ 43B3518C194F04E00038C140 /* plugin_ui.h */,
+ 43B3518D194F04E00038C140 /* point_selection.h */,
+ 43B3518E194F04E00038C140 /* port_group.h */,
+ 43B3518F194F04E00038C140 /* port_insert_ui.h */,
+ 43B35190194F04E00038C140 /* port_matrix_body.h */,
+ 43B35191194F04E00038C140 /* port_matrix_column_labels.h */,
+ 43B35192194F04E00038C140 /* port_matrix_component.h */,
+ 43B35193194F04E00038C140 /* port_matrix_grid.h */,
+ 43B35194194F04E00038C140 /* port_matrix_labels.h */,
+ 43B35195194F04E00038C140 /* port_matrix_row_labels.h */,
+ 43B35196194F04E00038C140 /* port_matrix_types.h */,
+ 43B35197194F04E00038C140 /* port_matrix.h */,
+ 43B35198194F04E00038C140 /* processor_box.h */,
+ 43B35199194F04E00038C140 /* processor_selection.h */,
+ 43B3519A194F04E00038C140 /* progress_reporter.h */,
+ 43B3519B194F04E00038C140 /* prompter.h */,
+ 43B3519C194F04E00038C140 /* public_editor.h */,
+ 43B3519D194F04E00038C140 /* quantize_dialog.h */,
+ 43B3519E194F04E00038C140 /* rc_option_editor.h */,
+ 43B3519F194F04E00038C140 /* region_editor.h */,
+ 43B351A0194F04E00038C140 /* region_gain_line.h */,
+ 43B351A1194F04E00038C140 /* region_layering_order_editor.h */,
+ 43B351A2194F04E00038C140 /* region_selection.h */,
+ 43B351A3194F04E00038C140 /* region_view.h */,
+ 43B351A4194F04E00038C140 /* return_ui.h */,
+ 43B351A5194F04E00038C140 /* rgb_macros.h */,
+ 43B351A6194F04E00038C140 /* rhythm_ferret.h */,
+ 43B351A7194F04E00038C140 /* route_group_dialog.h */,
+ 43B351A8194F04E00038C140 /* route_group_menu.h */,
+ 43B351A9194F04E00038C140 /* route_params_ui.h */,
+ 43B351AA194F04E00038C140 /* route_processor_selection.h */,
+ 43B351AB194F04E00038C140 /* route_sorter.h */,
+ 43B351AC194F04E00038C140 /* route_time_axis.h */,
+ 43B351AD194F04E00038C140 /* route_ui_selection.h */,
+ 43B351AE194F04E00038C140 /* route_ui.h */,
+ 43B351AF194F04E00038C140 /* search_path_option.h */,
+ 43B351B0194F04E00038C140 /* selectable.h */,
+ 43B351B1194F04E00038C140 /* selection_templates.h */,
+ 43B351B2194F04E00038C140 /* selection.h */,
+ 43B351B3194F04E00038C140 /* send_ui.h */,
+ 43B351B4194F04E00038C140 /* session_dialog.h */,
+ 43B351B5194F04E00038C140 /* session_dialog.logic.h */,
+ 43B351B6194F04E00038C140 /* session_import_dialog.h */,
+ 43B351B7194F04E00038C140 /* session_lock_dialog.h */,
+ 43B351B8194F04E00038C140 /* session_metadata_dialog.h */,
+ 43B351B9194F04E00038C140 /* session_option_editor.h */,
+ 43B351BA194F04E00038C140 /* sfdb_freesound_mootcher.h */,
+ 43B351BB194F04E00038C140 /* sfdb_ui.h */,
+ 43B351BC194F04E00038C140 /* shuttle_control.h */,
+ 43B351BD194F04E00038C140 /* speaker_dialog.h */,
+ 43B351BE194F04E00038C140 /* splash.h */,
+ 43B351BF194F04E00038C140 /* startup.h */,
+ 43B351C0194F04E00038C140 /* step_editing.bindings */,
+ 43B351C1194F04E00038C140 /* step_editor.h */,
+ 43B351C2194F04E00038C140 /* step_entry.h */,
+ 43B351C3194F04E00038C140 /* stereo_panner_editor.h */,
+ 43B351C4194F04E00038C140 /* stereo_panner.h */,
+ 43B351C5194F04E00038C140 /* streamview.h */,
+ 43B351C6194F04E00038C140 /* strip_selection.h */,
+ 43B351C7194F04E00038C140 /* strip_silence_dialog.h */,
+ 43B351C8194F04E00038C140 /* sys_ex.h */,
+ 43B351C9194F04E00038C140 /* tape_region_view.h */,
+ 43B351CA194F04E00038C140 /* tempo_dialog.h */,
+ 43B351CB194F04E00038C140 /* tempo_lines.h */,
+ 43B351CC194F04E00038C140 /* theme_manager.h */,
+ 43B351CD194F04E00038C140 /* time_axis_view_item.h */,
+ 43B351CE194F04E00038C140 /* time_axis_view.h */,
+ 43B351CF194F04E00038C140 /* time_fx_dialog.h */,
+ 43B351D0194F04E00038C140 /* time_info_box.h */,
+ 43B351D1194F04E00038C140 /* time_selection.h */,
+ 43B351D2194F04E00038C140 /* track_selection.h */,
+ 43B351D3194F04E00038C140 /* track_view_list.h */,
+ 43B351D6194F04E00038C140 /* transcode_ffmpeg.h */,
+ 43B351D7194F04E00038C140 /* transcode_video_dialog.h */,
+ 43B351D8194F04E00038C140 /* transpose_dialog.h */,
+ 43B351D9194F04E00038C140 /* ui_config_vars.h */,
+ 43B351DA194F04E00038C140 /* ui_config.h */,
+ 43B351DB194F04E00038C140 /* utils_videotl.h */,
+ 43B351DC194F04E00038C140 /* utils.h */,
+ 43B351DD194F04E00038C140 /* verbose_cursor.h */,
+ 43B351DE194F04E00038C140 /* version.h */,
+ 43B351DF194F04E00038C140 /* video_image_frame.h */,
+ 43B351E0194F04E00038C140 /* video_monitor.h */,
+ 43B351E1194F04E00038C140 /* video_server_dialog.h */,
+ 43B351E2194F04E00038C140 /* video_timeline.h */,
+ 43B351E3194F04E00038C140 /* visibility_group.h */,
+ 43B351E4194F04E00038C140 /* volume_controller.h */,
+ 43B351E5194F04E00038C140 /* vst_plugin_ui.h */,
+ 43B351E6194F04E00038C140 /* waves_button.h */,
+ 43B351E7194F04E00038C140 /* waves_dialog.h */,
+ 43B351E8194F04E00038C140 /* waves_icon_button.h */,
+ 43B351E9194F04E00038C140 /* waves_ui.h */,
+ 43B351EA194F04E00038C140 /* window_manager.h */,
+ 43B351EB194F04E00038C140 /* windows_vst_plugin_ui.h */,
+ );
+ name = headers;
+ sourceTree = "<group>";
+ };
+ 435E66791A4AB60C00472D50 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 4397595119CADAFC00740098 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 4397599719CB06AC00740098 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 43B351EF194F12FB0038C140 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 43B351F3194F12FB0038C140 /* libwaves_audiobackend.dylib */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 43B351F5194F130C0038C140 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 43B351F9194F130D0038C140 /* liblibardour.dylib */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 43B351FB194F131D0038C140 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 43B351FF194F131E0038C140 /* pbd.framework */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 43279243194EFFF1003C9FEA /* Tracks */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 4327925F194EFFF1003C9FEA /* Build configuration list for PBXNativeTarget "Tracks" */;
+ buildPhases = (
+ 43279240194EFFF1003C9FEA /* Sources */,
+ 43279241194EFFF1003C9FEA /* Frameworks */,
+ 43279242194EFFF1003C9FEA /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Tracks;
+ productName = Tracks;
+ productReference = 43279244194EFFF1003C9FEA /* Tracks.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 4327903A194EFF24003C9FEA /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0460;
+ };
+ buildConfigurationList = 4327903D194EFF24003C9FEA /* Build configuration list for PBXProject "tracks" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 43279039194EFF24003C9FEA;
+ productRefGroup = 43279245194EFFF1003C9FEA /* Products */;
+ projectDirPath = "";
+ projectReferences = (
+ {
+ ProductGroup = 435E66791A4AB60C00472D50 /* Products */;
+ ProjectRef = 435E66781A4AB60C00472D50 /* audiographer.xcodeproj */;
+ },
+ {
+ ProductGroup = 4397595119CADAFC00740098 /* Products */;
+ ProjectRef = 4397595019CADAFC00740098 /* canvas.xcodeproj */;
+ },
+ {
+ ProductGroup = 4397599719CB06AC00740098 /* Products */;
+ ProjectRef = 4397599619CB06AC00740098 /* gtkmm2ext.xcodeproj */;
+ },
+ {
+ ProductGroup = 43B351F5194F130C0038C140 /* Products */;
+ ProjectRef = 43B351F4194F130C0038C140 /* libardour.xcodeproj */;
+ },
+ {
+ ProductGroup = 43B351FB194F131D0038C140 /* Products */;
+ ProjectRef = 43B351FA194F131D0038C140 /* pbd.xcodeproj */;
+ },
+ {
+ ProductGroup = 43B351EF194F12FB0038C140 /* Products */;
+ ProjectRef = 43B351EE194F12FB0038C140 /* waves_audiobackend.xcodeproj */;
+ },
+ );
+ projectRoot = "";
+ targets = (
+ 43279243194EFFF1003C9FEA /* Tracks */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXReferenceProxy section */
+ 43B351F3194F12FB0038C140 /* libwaves_audiobackend.dylib */ = {
+ isa = PBXReferenceProxy;
+ fileType = "compiled.mach-o.dylib";
+ path = libwaves_audiobackend.dylib;
+ remoteRef = 43B351F2194F12FB0038C140 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 43B351F9194F130D0038C140 /* liblibardour.dylib */ = {
+ isa = PBXReferenceProxy;
+ fileType = "compiled.mach-o.dylib";
+ path = liblibardour.dylib;
+ remoteRef = 43B351F8194F130D0038C140 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 43B351FF194F131E0038C140 /* pbd.framework */ = {
+ isa = PBXReferenceProxy;
+ fileType = wrapper.framework;
+ path = pbd.framework;
+ remoteRef = 43B351FE194F131E0038C140 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+/* End PBXReferenceProxy section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 43279242194EFFF1003C9FEA /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 43279252194EFFF1003C9FEA /* InfoPlist.strings in Resources */,
+ 43279258194EFFF1003C9FEA /* Credits.rtf in Resources */,
+ 4327925E194EFFF1003C9FEA /* MainMenu.xib in Resources */,
+ 43279331194F003A003C9FEA /* act-disabled.png in Resources */,
+ 43279332194F003A003C9FEA /* add.png in Resources */,
+ 43279333194F003A003C9FEA /* application-x-ardour_16px.png in Resources */,
+ 43279334194F003A003C9FEA /* application-x-ardour_22px.png in Resources */,
+ 43279335194F003A003C9FEA /* application-x-ardour_32px.png in Resources */,
+ 43279336194F003A003C9FEA /* application-x-ardour_48px.png in Resources */,
+ 43279337194F003A003C9FEA /* ardour-app-icon_osx.png in Resources */,
+ 43279338194F003A003C9FEA /* ardour-app-icon_osx_mask.png in Resources */,
+ 95F9DFE71A35F3310007E953 /* waves_route_rename_dialog.xml in Resources */,
+ 43279339194F003A003C9FEA /* ardour_icon_16px.png in Resources */,
+ 4327933A194F003A003C9FEA /* ardour_icon_22px.png in Resources */,
+ 4327933B194F003A003C9FEA /* ardour_icon_256px.png in Resources */,
+ 4327933C194F003A003C9FEA /* ardour_icon_32px.png in Resources */,
+ 4327933D194F003A003C9FEA /* ardour_icon_48px.png in Resources */,
+ 95D795F41A7BB40C00120A4F /* waves_track_export_channel_selector.xml in Resources */,
+ 4327933E194F003A003C9FEA /* chord.png in Resources */,
+ 95D795EE1A7BB40C00120A4F /* waves_export_format_selector.xml in Resources */,
+ 4327933F194F003A003C9FEA /* close.png in Resources */,
+ 43279340194F003A003C9FEA /* computer_keyboard.png in Resources */,
+ 43279341194F003A003C9FEA /* computer_keyboard_active.png in Resources */,
+ 43279342194F003A003C9FEA /* display_clock_mockup.png in Resources */,
+ 43279343194F003A003C9FEA /* display_metrics_mockup.png in Resources */,
+ 43279344194F003A003C9FEA /* eighthnote.png in Resources */,
+ 43279345194F003A003C9FEA /* expand_left_right_cursor.png in Resources */,
+ 43279346194F003A003C9FEA /* expand_up_down_cursor.png in Resources */,
+ 43279347194F003A003C9FEA /* export_icons.sh in Resources */,
+ 43279348194F003A003C9FEA /* fade_in_cursor.png in Resources */,
+ 43279349194F003A003C9FEA /* fade_out_cursor.png in Resources */,
+ 4327934A194F003A003C9FEA /* fadein-constant-power.png in Resources */,
+ 4327934B194F003A003C9FEA /* fadein-fast-cut.png in Resources */,
+ 4327934C194F003A003C9FEA /* fadein-linear.png in Resources */,
+ 4327934D194F003A003C9FEA /* fadein-long-cut.png in Resources */,
+ 95F9DFE11A35F3310007E953 /* waves_connect_to_backend_error_dialog.xml in Resources */,
+ 4327934E194F003A003C9FEA /* fadein-S1.png in Resources */,
+ 4327934F194F003A003C9FEA /* fadein-S2.png in Resources */,
+ 43279350194F003A003C9FEA /* fadein-short-cut.png in Resources */,
+ 43279351194F003A003C9FEA /* fadein-slow-cut.png in Resources */,
+ 43279352194F003A003C9FEA /* fadeout-constant-power.png in Resources */,
+ 43279353194F003A003C9FEA /* fadeout-fast-cut.png in Resources */,
+ 43279354194F003A003C9FEA /* fadeout-linear.png in Resources */,
+ 43279355194F003A003C9FEA /* fadeout-long-cut.png in Resources */,
+ 43279356194F003A003C9FEA /* fadeout-S1.png in Resources */,
+ 43279357194F003A003C9FEA /* fadeout-S2.png in Resources */,
+ 43279358194F003A003C9FEA /* fadeout-short-cut.png in Resources */,
+ 43279359194F003A003C9FEA /* fadeout-slow-cut.png in Resources */,
+ 4327935A194F003A003C9FEA /* fader_belt.png in Resources */,
+ 4327935B194F003A003C9FEA /* fader_belt_desensitised.png in Resources */,
+ 4327935C194F003A003C9FEA /* fader_belt_h.png in Resources */,
+ 4327935D194F003A003C9FEA /* fader_belt_h_desensitised.png in Resources */,
+ 4327935E194F003A003C9FEA /* fader_belt_h_medium.png in Resources */,
+ 4327935F194F003A003C9FEA /* fader_belt_h_medium_desensitised.png in Resources */,
+ 43279360194F003A003C9FEA /* fader_belt_h_thin.png in Resources */,
+ 43279361194F003A003C9FEA /* fader_belt_h_thin_desensitised.png in Resources */,
+ 43279362194F003A003C9FEA /* fader_handle.png in Resources */,
+ 43279363194F003A003C9FEA /* ferret_02.png in Resources */,
+ 43279364194F003A003C9FEA /* forte.png in Resources */,
+ 43279365194F003A003C9FEA /* fortissimo.png in Resources */,
+ 43279366194F003A003C9FEA /* fortississimo.png in Resources */,
+ 43279367194F003A003C9FEA /* grabber.png in Resources */,
+ 43279368194F003A003C9FEA /* grabber_edit_point.png in Resources */,
+ 43279369194F003A003C9FEA /* grabber_note.png in Resources */,
+ 4327936A194F003A003C9FEA /* halfnote.png in Resources */,
+ 4327936B194F003A003C9FEA /* hide.png in Resources */,
+ 4327936C194F003A003C9FEA /* horizontal_zoom_fader_face.png in Resources */,
+ 4327936D194F003A003C9FEA /* i_beam_cursor.png in Resources */,
+ 4327936E194F003A003C9FEA /* inspector_on.png in Resources */,
+ 4327936F194F003A003C9FEA /* inspector_on_active.png in Resources */,
+ 43279370194F003A003C9FEA /* inspector_on_prelight.png in Resources */,
+ 43279371194F003A003C9FEA /* join_tools.png in Resources */,
+ 43279372194F003A003C9FEA /* knob.png in Resources */,
+ 43279373194F003A003C9FEA /* lock_session.png in Resources */,
+ 43279374194F003A003C9FEA /* lock_session_active.png in Resources */,
+ 43279375194F003A003C9FEA /* lock_session_prelight.png in Resources */,
+ 43279376194F003A003C9FEA /* media_button.png in Resources */,
+ 43279377194F003A003C9FEA /* media_button_active.png in Resources */,
+ 43279378194F003A003C9FEA /* media_button_prelight.png in Resources */,
+ 954DCFC21A023AAB00B7160E /* license_dialog.xml in Resources */,
+ 43279379194F003A003C9FEA /* meter_bridge_on.png in Resources */,
+ 4327937A194F003A003C9FEA /* meter_bridge_on_active.png in Resources */,
+ 4327937B194F003A003C9FEA /* meter_bridge_on_prelight.png in Resources */,
+ 4327937C194F003A003C9FEA /* metronome.png in Resources */,
+ 4327937D194F003A003C9FEA /* mezzforte.png in Resources */,
+ 4327937E194F003A003C9FEA /* mezzoforte.png in Resources */,
+ 4327937F194F003A003C9FEA /* mezzopiano.png in Resources */,
+ 43279380194F003A003C9FEA /* midi-input-active.png in Resources */,
+ 43279381194F003A003C9FEA /* midi-input-inactive.png in Resources */,
+ 43279382194F003A003C9FEA /* midi_panic.png in Resources */,
+ 43279383194F003A003C9FEA /* midi_socket_small.png in Resources */,
+ 43279384194F003A003C9FEA /* midi_sound_notes.png in Resources */,
+ 43279385194F003A003C9FEA /* midi_tool_erase.png in Resources */,
+ 43279386194F003A003C9FEA /* midi_tool_pencil.png in Resources */,
+ 43279387194F003A003C9FEA /* midi_tool_select.png in Resources */,
+ 43279388194F003A003C9FEA /* mixer_on.png in Resources */,
+ 43279389194F003A003C9FEA /* mixer_on_active.png in Resources */,
+ 4327938A194F003A003C9FEA /* mixer_on_prelight.png in Resources */,
+ 4327938B194F003A003C9FEA /* mode_multi_out.png in Resources */,
+ 4327938C194F003A003C9FEA /* mode_multi_out_active.png in Resources */,
+ 4327938D194F003A003C9FEA /* mode_multi_out_prelight.png in Resources */,
+ 4327938E194F003A003C9FEA /* mode_stereo_out.png in Resources */,
+ 4327938F194F003A003C9FEA /* mode_stereo_out_active.png in Resources */,
+ 95D795EB1A7BB40C00120A4F /* waves_export_file_notebook_page.xml in Resources */,
+ 43279390194F003A003C9FEA /* mode_stereo_out_prelight.png in Resources */,
+ 95D795F21A7BB40C00120A4F /* waves_region_export_channel_selector.xml in Resources */,
+ 43279391194F003A003C9FEA /* move_cursor.png in Resources */,
+ 43279392194F003A003C9FEA /* mute-disabled.png in Resources */,
+ 43279393194F003A003C9FEA /* mute-enabled.png in Resources */,
+ 95D795E81A7BB40C00120A4F /* marker_inspector_dialog.xml in Resources */,
+ 43279394194F003A003C9FEA /* muted-by-others.png in Resources */,
+ 43279395194F003A003C9FEA /* nudge_left.png in Resources */,
+ 43279396194F003A003C9FEA /* nudge_right.png in Resources */,
+ 43279397194F003A003C9FEA /* pianissimo.png in Resources */,
+ 95D4986F1AEA363E006E065D /* crash_recovery_dialog.xml in Resources */,
+ 43279398194F003A003C9FEA /* pianississimo.png in Resources */,
+ 43279399194F003A003C9FEA /* piano.png in Resources */,
+ 4327939A194F003A003C9FEA /* quarternote.png in Resources */,
+ 4327939B194F003A003C9FEA /* rec-enabled.png in Resources */,
+ 95D6A67C1A8E22E80030CDD0 /* waves_keyeditor.xml in Resources */,
+ 4327939C194F003A003C9FEA /* rec-in-progress.png in Resources */,
+ 4327939D194F003A003C9FEA /* record-normal-disabled.png in Resources */,
+ 4327939E194F003A003C9FEA /* record-normal-enabled.png in Resources */,
+ 4327939F194F003A003C9FEA /* record-normal-in-progress.png in Resources */,
+ 432793A0194F003A003C9FEA /* record-step.png in Resources */,
+ 432793A1194F003A003C9FEA /* record_disabled_grey.png in Resources */,
+ 432793A2194F003A003C9FEA /* record_normal_red.png in Resources */,
+ 432793A3194F003A003C9FEA /* record_tape_red.png in Resources */,
+ 432793A4194F003A003C9FEA /* resize_bottom_cursor.png in Resources */,
+ 432793A5194F003A003C9FEA /* resize_bottom_left_cursor.png in Resources */,
+ 432793A6194F003A003C9FEA /* resize_bottom_right_cursor.png in Resources */,
+ 432793A7194F003A003C9FEA /* resize_left_cursor.png in Resources */,
+ 432793A8194F003A003C9FEA /* resize_right_cursor.png in Resources */,
+ 432793A9194F003A003C9FEA /* resize_top_cursor.png in Resources */,
+ 432793AA194F003A003C9FEA /* resize_top_left_cursor.png in Resources */,
+ 95D5D1391A8A514300407F98 /* waves_numeric_edit_dialog.xml in Resources */,
+ 432793AB194F003A003C9FEA /* resize_top_right_cursor.png in Resources */,
+ 432793AC194F003A003C9FEA /* sae.png in Resources */,
+ 432793AD194F003A003C9FEA /* sessionlock.png in Resources */,
+ 432793AE194F003A003C9FEA /* sixteenthnote.png in Resources */,
+ 432793AF194F003A003C9FEA /* sixtyfourthnote.png in Resources */,
+ 432793B0194F003A003C9FEA /* slider_controller_fader.png in Resources */,
+ 432793B1194F003A003C9FEA /* slider_controller_fader_handle.png in Resources */,
+ 954DCFDE1A07A14E00B7160E /* read_only_session_dialog.xml in Resources */,
+ 432793B2194F003A003C9FEA /* solo-disabled.png in Resources */,
+ 432793B3194F003A003C9FEA /* solo-enabled.png in Resources */,
+ 432793B4194F003A003C9FEA /* solo-isolate-disabled.png in Resources */,
+ 432793B5194F003A003C9FEA /* solo-isolate-enabled.png in Resources */,
+ 432793B6194F003A003C9FEA /* solo-isolated.png in Resources */,
+ 432793B7194F003A003C9FEA /* solo-safe-disabled.png in Resources */,
+ 432793B8194F003A003C9FEA /* solo-safe-enabled.png in Resources */,
+ 432793B9194F003A003C9FEA /* solo-safe-icon.png in Resources */,
+ 432793BA194F003A003C9FEA /* soloed-by-others.png in Resources */,
+ 432793BB194F003A003C9FEA /* step-editing.png in Resources */,
+ 432793BC194F003A003C9FEA /* strip_width.png in Resources */,
+ 954DCFC11A023AAB00B7160E /* about_dialog.xml in Resources */,
+ 95D1C5211A78ED3A00BE28DB /* waves_edit_dialog.xml in Resources */,
+ 432793BD194F003A003C9FEA /* systemlock.png in Resources */,
+ 432793BE194F003A003C9FEA /* tav_exp.png in Resources */,
+ 432793BF194F003A003C9FEA /* tav_shrink.png in Resources */,
+ 432793C0194F003A003C9FEA /* thirtysecondnote.png in Resources */,
+ 432793C1194F003A003C9FEA /* tool_arrow.png in Resources */,
+ 432793C2194F003A003C9FEA /* tool_arrow_active.png in Resources */,
+ 432793C3194F003A003C9FEA /* tool_arrow_prelight.png in Resources */,
+ 432793C4194F003A003C9FEA /* tool_audition.png in Resources */,
+ 432793C5194F003A003C9FEA /* tool_cut.png in Resources */,
+ 432793C6194F003A003C9FEA /* tool_cut_active.png in Resources */,
+ 95D795EF1A7BB40C00120A4F /* waves_export_preset_selector.xml in Resources */,
+ 432793C7194F003A003C9FEA /* tool_cut_prelight.png in Resources */,
+ 432793C8194F003A003C9FEA /* tool_gain.png in Resources */,
+ 5BC24BAA1A64328D006A2400 /* trackslive.menus.in in Resources */,
+ 432793C9194F003A003C9FEA /* tool_marker.png in Resources */,
+ 432793CA194F003A003C9FEA /* tool_marker_active.png in Resources */,
+ 95D498701AEA363E006E065D /* waves_save_template_dialog.xml in Resources */,
+ 95D795EC1A7BB40C00120A4F /* waves_export_file_notebook.xml in Resources */,
+ 432793CB194F003A003C9FEA /* tool_marker_prelight.png in Resources */,
+ 432793CC194F003A003C9FEA /* tool_note.png in Resources */,
+ 432793CD194F003A003C9FEA /* tool_object.png in Resources */,
+ 432793CE194F003A003C9FEA /* tool_object_range.png in Resources */,
+ 432793CF194F003A003C9FEA /* tool_range.png in Resources */,
+ 432793D0194F003A003C9FEA /* tool_stretch.png in Resources */,
+ 432793D1194F003A003C9FEA /* tool_waveform_zoom.png in Resources */,
+ 432793D2194F003A003C9FEA /* tool_waveform_zoom_active.png in Resources */,
+ 432793D3194F003A003C9FEA /* tool_waveform_zoom_prelight.png in Resources */,
+ 432793D4194F003A003C9FEA /* tool_zoom.png in Resources */,
+ 95176F7E1A08E76F00E32046 /* file_sample_rate_mismatch_dialog.xml in Resources */,
+ 432793D5194F003A003C9FEA /* tool_zoom_active.png in Resources */,
+ 432793D6194F003A003C9FEA /* tool_zoom_ardour.png in Resources */,
+ 432793D7194F003A003C9FEA /* tool_zoom_prelight.png in Resources */,
+ 432793D8194F003A003C9FEA /* tracks.png in Resources */,
+ 432793D9194F003A003C9FEA /* tracks_active.png in Resources */,
+ 432793DA194F003A003C9FEA /* tracks_prelight.png in Resources */,
+ 956D3F8A1A851805004F328C /* waves_import_dialog.xml in Resources */,
+ 432793DB194F003A003C9FEA /* transport_end.png in Resources */,
+ 432793DC194F003A003C9FEA /* transport_end_active.png in Resources */,
+ 432793DD194F003A003C9FEA /* transport_end_prelight.png in Resources */,
+ 432793DE194F003A003C9FEA /* transport_loop.png in Resources */,
+ 432793DF194F003A003C9FEA /* transport_loop_active.png in Resources */,
+ 432793E0194F003A003C9FEA /* transport_loop_prelight.png in Resources */,
+ 432793E1194F003A003C9FEA /* transport_play.png in Resources */,
+ 432793E2194F003A003C9FEA /* transport_play_active.png in Resources */,
+ 432793E3194F003A003C9FEA /* transport_play_prelight.png in Resources */,
+ 95D795F11A7BB40C00120A4F /* waves_port_export_channel_selector.xml in Resources */,
+ 432793E4194F003A003C9FEA /* transport_range.png in Resources */,
+ 432793E5194F003A003C9FEA /* transport_record.png in Resources */,
+ 432793E6194F003A003C9FEA /* transport_record_active.png in Resources */,
+ 432793E7194F003A003C9FEA /* transport_record_prelight.png in Resources */,
+ 432793E8194F003A003C9FEA /* transport_start.png in Resources */,
+ 432793E9194F003A003C9FEA /* transport_start_active.png in Resources */,
+ 95D4986E1AEA363E006E065D /* audio_engine_reset_info_dialog.xml in Resources */,
+ 432793EA194F003A003C9FEA /* transport_start_prelight.png in Resources */,
+ 432793EB194F003A003C9FEA /* transport_stop.png in Resources */,
+ 432793EC194F003A003C9FEA /* transport_stop_active.png in Resources */,
+ 432793ED194F003A003C9FEA /* transport_stop_prelight.png in Resources */,
+ 432793EE194F003A003C9FEA /* trim_bottom_cursor.png in Resources */,
+ 432793EF194F003A003C9FEA /* trim_left_cursor.png in Resources */,
+ 432793F0194F003A003C9FEA /* trim_left_cursor_5.png in Resources */,
+ 432793F1194F003A003C9FEA /* trim_left_cursor_right_only.png in Resources */,
+ 432793F2194F003A003C9FEA /* trim_right_cursor.png in Resources */,
+ 432793F3194F003A003C9FEA /* trim_right_cursor_5.png in Resources */,
+ 95D795F31A7BB40C00120A4F /* waves_track_color_dialog.xml in Resources */,
+ 432793F4194F003A003C9FEA /* trim_right_cursor_left_only.png in Resources */,
+ 432793F5194F003A003C9FEA /* trim_top_cursor.png in Resources */,
+ 432793F6194F003A003C9FEA /* vertical_zoom_fader_face.png in Resources */,
+ 432793F7194F003A003C9FEA /* wholenote.png in Resources */,
+ 432793F8194F003A003C9FEA /* zoom_fader_handle.png in Resources */,
+ 95F9DFE61A35F3310007E953 /* waves_how_to_import_dialog_2.xml in Resources */,
+ 432793F9194F003A003C9FEA /* zoom_fader_handle_active.png in Resources */,
+ 432793FA194F003A003C9FEA /* zoom_full.png in Resources */,
+ 432793FB194F003A003C9FEA /* zoom_in.png in Resources */,
+ 432793FC194F003A003C9FEA /* zoom_in_cursor.png in Resources */,
+ 432793FD194F003A003C9FEA /* zoom_out.png in Resources */,
+ 432793FE194F003A003C9FEA /* zoom_out_cursor.png in Resources */,
+ 95F9DFE41A35F3310007E953 /* waves_file_exists_dialog.xml in Resources */,
+ 43279431194F0062003C9FEA /* forwardblarrow.xpm in Resources */,
+ 43279432194F0062003C9FEA /* h_meter_strip.xpm in Resources */,
+ 43279433194F0062003C9FEA /* hiin.xpm in Resources */,
+ 43279434194F0062003C9FEA /* hiout.xpm in Resources */,
+ 43279435194F0062003C9FEA /* hslider00.xpm in Resources */,
+ 43279436194F0062003C9FEA /* hslider01.xpm in Resources */,
+ 43279437194F0062003C9FEA /* left_arrow.xpm in Resources */,
+ 43279438194F0062003C9FEA /* linin.xpm in Resources */,
+ 43279439194F0062003C9FEA /* linout.xpm in Resources */,
+ 4327943A194F0062003C9FEA /* loin.xpm in Resources */,
+ 4327943B194F0062003C9FEA /* loop.xpm in Resources */,
+ 4327943C194F0062003C9FEA /* loout.xpm in Resources */,
+ 4327943D194F0062003C9FEA /* lr.xpm in Resources */,
+ 4327943E194F0062003C9FEA /* regin.xpm in Resources */,
+ 4327943F194F0062003C9FEA /* regin2.xpm in Resources */,
+ 43279440194F0062003C9FEA /* regout.xpm in Resources */,
+ 43279441194F0062003C9FEA /* regout2.xpm in Resources */,
+ 43279442194F0062003C9FEA /* revdblarrow.xpm in Resources */,
+ 43279443194F0062003C9FEA /* right_arrow.xpm in Resources */,
+ 43279444194F0062003C9FEA /* set-next-button.xpm in Resources */,
+ 43279445194F0062003C9FEA /* small-round-button-01.xpm in Resources */,
+ 43279446194F0062003C9FEA /* small_x.xpm in Resources */,
+ 43279447194F0062003C9FEA /* toggle-button-00.xpm in Resources */,
+ 43279448194F0062003C9FEA /* toggle-button-01.xpm in Resources */,
+ 43279449194F0062003C9FEA /* tool_audition.xpm in Resources */,
+ 95D795ED1A7BB40C00120A4F /* waves_export_filename_selector.xml in Resources */,
+ 95F9DFE51A35F3310007E953 /* waves_how_to_import_dialog_1.xml in Resources */,
+ 95F9DFE21A35F3310007E953 /* waves_excessive_split_dialog.xml in Resources */,
+ 4327944A194F0062003C9FEA /* tool_gain.xpm in Resources */,
+ 4327944B194F0062003C9FEA /* tool_object.xpm in Resources */,
+ 95F9DFE01A35F3310007E953 /* waves_clean_up_dialog.xml in Resources */,
+ 4327944C194F0062003C9FEA /* tool_range.xpm in Resources */,
+ 4327944D194F0062003C9FEA /* tool_stretch.xpm in Resources */,
+ 4327944E194F0062003C9FEA /* tool_zoom.xpm in Resources */,
+ 4327944F194F0062003C9FEA /* v_meter_strip.xpm in Resources */,
+ 43279450194F0062003C9FEA /* vslider00.xpm in Resources */,
+ 43279451194F0062003C9FEA /* vslider01.xpm in Resources */,
+ 43279452194F0062003C9FEA /* vslider02_rail.xpm in Resources */,
+ 43279453194F0062003C9FEA /* vslider02_slider.xpm in Resources */,
+ 43279454194F0062003C9FEA /* vslider_slider_16wide.xpm in Resources */,
+ 43279455194F0062003C9FEA /* zoom_full.xpm in Resources */,
+ 95D9E37A1A8D1B3B00A0DA46 /* waves_missing_file_dialog.xml in Resources */,
+ 43279456194F0062003C9FEA /* zoom_in.xpm in Resources */,
+ 43279457194F0062003C9FEA /* zoom_out.xpm in Resources */,
+ 95D795EA1A7BB40C00120A4F /* waves_export_dialog.xml in Resources */,
+ 43279458194F0062003C9FEA /* small-splash.png in Resources */,
+ 95E2A7AB1A8F652F0080BD79 /* waves_radio_item.xml in Resources */,
+ 43279459194F0062003C9FEA /* splash.png in Resources */,
+ 4327945A194F0062003C9FEA /* device_capture_control.xml in Resources */,
+ 4327945B194F0062003C9FEA /* device_playback_control.xml in Resources */,
+ 4327945C194F0062003C9FEA /* editor_window.xml in Resources */,
+ 4327945D194F0062003C9FEA /* midi_device_control.xml in Resources */,
+ 95D9E3791A8D1B3B00A0DA46 /* waves_ambiguous_file_dialog.xml in Resources */,
+ 4327945E194F0062003C9FEA /* session_dialog.xml in Resources */,
+ 4327945F194F0062003C9FEA /* session_lock_dialog.xml in Resources */,
+ 43279460194F0062003C9FEA /* tracks_preferences.xml in Resources */,
+ 4327947F194F009E003C9FEA /* tracks.menus.in in Resources */,
+ 43B351ED194F04E00038C140 /* step_editing.bindings in Resources */,
+ CEB0A9F41958447C006D269A /* session_close_dialog.xml in Resources */,
+ CEB9D791197516BE00B21780 /* audio_time_axis.xml in Resources */,
+ CEB9D792197516BE00B21780 /* automation_time_axis.xml in Resources */,
+ CEB9D793197516BE00B21780 /* editor_mixer.xml in Resources */,
+ 952E0B3C1A0A1D7000F375D0 /* buildlog.txt in Resources */,
+ 95F9DFD71A35A8BD0007E953 /* waves_message_dialog.xml in Resources */,
+ CEB9D794197516BE00B21780 /* inspector_gain_meter.xml in Resources */,
+ 5BC67E591A408FCE00F29ABA /* progress_dialog.xml in Resources */,
+ CEB9D796197516BE00B21780 /* master_ui.xml in Resources */,
+ CEB9D797197516BE00B21780 /* meter_strip.xml in Resources */,
+ CEB9D798197516BE00B21780 /* mixer_gain_meter.xml in Resources */,
+ CEB9D799197516BE00B21780 /* mixer_strip.xml in Resources */,
+ CEB9D79A197516BE00B21780 /* track_header_gain_meter.xml in Resources */,
+ CE294C5F19CAD4E300D12768 /* add_tracks_dialog.xml in Resources */,
+ 95D795F01A7BB40C00120A4F /* waves_export_timespan_selector.xml in Resources */,
+ CE294C6019CAD4E300D12768 /* compact_meter_bridge.xml in Resources */,
+ CE294C6119CAD4E300D12768 /* compact_meter_strip.xml in Resources */,
+ CE294C6219CAD4E300D12768 /* marker_io_dialog.xml in Resources */,
+ CE294C6319CAD4E300D12768 /* meter_bridge_view.xml in Resources */,
+ CE294C6419CAD4E300D12768 /* meter_strip_gain_meter.xml in Resources */,
+ CE294C6519CAD4E300D12768 /* mixer_bridge_view.xml in Resources */,
+ CE294C6619CAD4E300D12768 /* time_info_box.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 43279240194EFFF1003C9FEA /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 95D796151A7BB9E000120A4F /* waves_export_timespan_selector.cc in Sources */,
+ 43279254194EFFF1003C9FEA /* main.m in Sources */,
+ 4327925B194EFFF1003C9FEA /* AppDelegate.m in Sources */,
+ CEAFC770195445560016ACF0 /* bbt_time.cc in Sources */,
+ CEAFC771195445560016ACF0 /* time.cc in Sources */,
+ 95D7960C1A7BB9E000120A4F /* marker_inspector_dialog.cc in Sources */,
+ 95D71D581A4C69AE00DE5B3B /* waves_track_color_dialog.logic.cc in Sources */,
+ 95D796121A7BB9E000120A4F /* waves_export_filename_selector.cc in Sources */,
+ 95D7960F1A7BB9E000120A4F /* waves_export_channel_selector.cc in Sources */,
+ CEB0A9F219583F96006D269A /* session_close_dialog.cc in Sources */,
+ 95D796141A7BB9E000120A4F /* waves_export_preset_selector.cc in Sources */,
+ 95D7960B1A7BB9E000120A4F /* floating_text_entry.cc in Sources */,
+ CE1C6DCE19879F04006BDB03 /* compact_meter_bridge.cc in Sources */,
+ 95D9E37F1A8D1B6600A0DA46 /* waves_ambiguous_file_dialog.cc in Sources */,
+ 95D7960E1A7BB9E000120A4F /* route_inspector.cc in Sources */,
+ CE1C6DCF19879F04006BDB03 /* compact_meter_strip.cc in Sources */,
+ 95A134DE1A0239080008E3D6 /* license_dialog.cc in Sources */,
+ CE1C6DE01987A924006BDB03 /* master_bus_ui.cc in Sources */,
+ 95D796101A7BB9E000120A4F /* waves_export_dialog.cc in Sources */,
+ 954DCFBD1A0239DA00B7160E /* about_dialog.cc in Sources */,
+ 95D5D1371A8A514300407F98 /* waves_numeric_edit_dialog.cc in Sources */,
+ CE1A907A199A37AE00ECA62B /* add_tracks_dialog.cc in Sources */,
+ 95176F7A1A08E6E800E32046 /* file_sample_rate_mismatch_dialog.cc in Sources */,
+ 95D7960D1A7BB9E000120A4F /* marker_inspector_dialog.logic.cc in Sources */,
+ 95D71D551A4C66F600DE5B3B /* waves_track_color_dialog.cc in Sources */,
+ 95D1C51F1A78ED2100BE28DB /* waves_edit_dialog.cc in Sources */,
+ CE294C7519CAD54500D12768 /* marker_io_dialog.cc in Sources */,
+ 957EF44B1A30BFB300F1500E /* waves_message_dialog.cc in Sources */,
+ CE294C7619CAD54500D12768 /* mixer_bridge_view.cc in Sources */,
+ CE294C7719CAD54500D12768 /* open_file_dialog_nix.cc in Sources */,
+ CE294C7819CAD54500D12768 /* open_file_dialog_windows.cc in Sources */,
+ 5BC67E5F1A4090BD00F29ABA /* progress_dialog.cc in Sources */,
+ 95D796161A7BB9E000120A4F /* waves_import_dialog.cc in Sources */,
+ CE294C7919CAD54500D12768 /* ruler_dialog.cc in Sources */,
+ 95D9E3801A8D1B6600A0DA46 /* waves_missing_file_dialog.cc in Sources */,
+ 95D796131A7BB9E000120A4F /* waves_export_format_selector.cc in Sources */,
+ 95D796111A7BB9E000120A4F /* waves_export_file_notebook.cc in Sources */,
+ CE294C7A19CAD54500D12768 /* soundcloud_export_selector.cc in Sources */,
+ 95E5E9461AE946510000E2CE /* waves_tooltip.cc in Sources */,
+ CE294C7B19CAD54500D12768 /* waves_dropdown.cc in Sources */,
+ CE294C7C19CAD54500D12768 /* waves_grid.cc in Sources */,
+ CE294C7D19CAD54500D12768 /* waves_zoom_control.cc in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 43279250194EFFF1003C9FEA /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 43279251194EFFF1003C9FEA /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ 43279256194EFFF1003C9FEA /* Credits.rtf */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 43279257194EFFF1003C9FEA /* en */,
+ );
+ name = Credits.rtf;
+ sourceTree = "<group>";
+ };
+ 4327925C194EFFF1003C9FEA /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 4327925D194EFFF1003C9FEA /* en */,
+ );
+ name = MainMenu.xib;
+ path = Tracks;
+ sourceTree = SOURCE_ROOT;
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 4327903E194EFF24003C9FEA /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ 4327903F194EFF24003C9FEA /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ 43279260194EFFF1003C9FEA /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Tracks/Tracks-Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ INFOPLIST_FILE = "Tracks/Tracks-Info.plist";
+ MACOSX_DEPLOYMENT_TARGET = 10.8;
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = macosx;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ 43279261194EFFF1003C9FEA /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Tracks/Tracks-Prefix.pch";
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ INFOPLIST_FILE = "Tracks/Tracks-Info.plist";
+ MACOSX_DEPLOYMENT_TARGET = 10.8;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = macosx;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 4327903D194EFF24003C9FEA /* Build configuration list for PBXProject "tracks" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 4327903E194EFF24003C9FEA /* Debug */,
+ 4327903F194EFF24003C9FEA /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 4327925F194EFFF1003C9FEA /* Build configuration list for PBXNativeTarget "Tracks" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 43279260194EFFF1003C9FEA /* Debug */,
+ 43279261194EFFF1003C9FEA /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 4327903A194EFF24003C9FEA /* Project object */;
+}
diff --git a/gtk2_ardour/main.cc b/gtk2_ardour/main.cc
index f43d1bd..441b2dc 100644
--- a/gtk2_ardour/main.cc
+++ b/gtk2_ardour/main.cc
@@ -99,6 +99,28 @@ gui_jack_error ()
win.run ();
}
+#ifndef NDEBUG
+static void ardour_g_log (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data) {
+ switch (log_level) {
+ case G_LOG_FLAG_FATAL:
+ case G_LOG_LEVEL_CRITICAL:
+ fatal << "g_log: " << message << endmsg;
+ break;
+ case G_LOG_LEVEL_ERROR:
+ error << "g_log: " << message << endmsg;
+ break;
+ case G_LOG_LEVEL_WARNING:
+ warning << "g_log: " << message << endmsg;
+ break;
+ case G_LOG_LEVEL_MESSAGE:
+ case G_LOG_LEVEL_INFO:
+ default:
+ info << "g_log: " << message << endmsg;
+ break;
+ }
+}
+#endif
+
static gboolean
tell_about_backend_death (void* /* ignored */)
{
@@ -359,6 +381,12 @@ int main (int argc, char *argv[])
exit (1);
}
+#ifndef NDEBUG
+ g_log_set_handler (NULL,
+ GLogLevelFlags (G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL | G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_RECURSION),
+ &ardour_g_log, NULL);
+#endif
+
ui->run (text_receiver);
Gtkmm2ext::Application::instance()->cleanup();
delete ui;
diff --git a/gtk2_ardour/marker.cc b/gtk2_ardour/marker.cc
index 97664d3..0c73769 100644
--- a/gtk2_ardour/marker.cc
+++ b/gtk2_ardour/marker.cc
@@ -50,16 +50,16 @@ using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
using namespace Gtkmm2ext;
-PBD::Signal1<void,Marker*> Marker::CatchDeletion;
+PBD::Signal1<void,ArdourMarker*> ArdourMarker::CatchDeletion;
static double marker_height = 13.0;
-void Marker::setup_sizes(const double timebar_height)
+void ArdourMarker::setup_sizes(const double timebar_height)
{
marker_height = floor (timebar_height) - 2;
}
-Marker::Marker (PublicEditor& ed, ArdourCanvas::Container& parent, guint32 rgba, const string& annotation,
+ArdourMarker::ArdourMarker (PublicEditor& ed, ArdourCanvas::Container& parent, guint32 rgba, const string& annotation,
Type type, framepos_t frame, bool handle_events)
: editor (ed)
@@ -284,14 +284,14 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Container& parent, guint32 rgba,
Gtkmm2ext::get_ink_pixel_size (layout, width, name_height);
_name_item = new ArdourCanvas::Text (group);
- CANVAS_DEBUG_NAME (_name_item, string_compose ("Marker::_name_item for %1", annotation));
+ CANVAS_DEBUG_NAME (_name_item, string_compose ("ArdourMarker::_name_item for %1", annotation));
_name_item->set_font_description (name_font);
_name_item->set_color (RGBA_TO_UINT (0,0,0,255));
_name_item->set_position (ArdourCanvas::Duple (_label_offset, (marker_height - name_height - 1) * .5 ));
set_name (annotation.c_str());
- editor.ZoomChanged.connect (sigc::mem_fun (*this, &Marker::reposition));
+ editor.ZoomChanged.connect (sigc::mem_fun (*this, &ArdourMarker::reposition));
/* events will be handled by both the group and the mark itself, so
* make sure they can both be used to lookup this object.
@@ -305,7 +305,7 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Container& parent, guint32 rgba,
}
}
-Marker::~Marker ()
+ArdourMarker::~ArdourMarker ()
{
CatchDeletion (this); /* EMIT SIGNAL */
@@ -314,28 +314,28 @@ Marker::~Marker ()
delete _track_canvas_line;
}
-void Marker::reparent(ArdourCanvas::Container & parent)
+void ArdourMarker::reparent(ArdourCanvas::Container & parent)
{
group->reparent (&parent);
_parent = &parent;
}
void
-Marker::set_selected (bool s)
+ArdourMarker::set_selected (bool s)
{
_selected = s;
setup_line ();
}
void
-Marker::set_show_line (bool s)
+ArdourMarker::set_show_line (bool s)
{
_line_shown = s;
setup_line ();
}
void
-Marker::setup_line ()
+ArdourMarker::setup_line ()
{
if (_shown && (_selected || _line_shown)) {
@@ -365,20 +365,20 @@ Marker::setup_line ()
}
void
-Marker::canvas_height_set (double h)
+ArdourMarker::canvas_height_set (double h)
{
_canvas_height = h;
setup_line ();
}
ArdourCanvas::Item&
-Marker::the_item() const
+ArdourMarker::the_item() const
{
return *group;
}
void
-Marker::set_name (const string& new_name)
+ArdourMarker::set_name (const string& new_name)
{
_name = new_name;
@@ -387,13 +387,13 @@ Marker::set_name (const string& new_name)
/** @return true if our label is on the left of the mark, otherwise false */
bool
-Marker::label_on_left () const
+ArdourMarker::label_on_left () const
{
return (_type == SessionEnd || _type == RangeEnd || _type == LoopEnd || _type == PunchOut);
}
void
-Marker::setup_name_display ()
+ArdourMarker::setup_name_display ()
{
double limit = DBL_MAX;
@@ -438,7 +438,7 @@ Marker::setup_name_display ()
}
void
-Marker::set_position (framepos_t frame)
+ArdourMarker::set_position (framepos_t frame)
{
unit_position = editor.sample_to_pixel (frame) - _shift;
group->set_x_position (unit_position);
@@ -447,13 +447,13 @@ Marker::set_position (framepos_t frame)
}
void
-Marker::reposition ()
+ArdourMarker::reposition ()
{
set_position (frame_position);
}
void
-Marker::show ()
+ArdourMarker::show ()
{
_shown = true;
@@ -462,7 +462,7 @@ Marker::show ()
}
void
-Marker::hide ()
+ArdourMarker::hide ()
{
_shown = false;
@@ -471,7 +471,7 @@ Marker::hide ()
}
void
-Marker::set_color_rgba (uint32_t c)
+ArdourMarker::set_color_rgba (uint32_t c)
{
_color = c;
mark->set_fill_color (_color);
@@ -488,7 +488,7 @@ Marker::set_color_rgba (uint32_t c)
/** Set the number of pixels that are available for a label to the left of the centre of this marker */
void
-Marker::set_left_label_limit (double p)
+ArdourMarker::set_left_label_limit (double p)
{
/* Account for the size of the marker */
_left_label_limit = p - marker_height;
@@ -503,7 +503,7 @@ Marker::set_left_label_limit (double p)
/** Set the number of pixels that are available for a label to the right of the centre of this marker */
void
-Marker::set_right_label_limit (double p)
+ArdourMarker::set_right_label_limit (double p)
{
/* Account for the size of the marker */
_right_label_limit = p - marker_height;
@@ -520,7 +520,7 @@ Marker::set_right_label_limit (double p)
TempoMarker::TempoMarker (PublicEditor& editor, ArdourCanvas::Container& parent, guint32 rgba, const string& text,
ARDOUR::TempoSection& temp)
- : Marker (editor, parent, rgba, text, Tempo, 0, false),
+ : ArdourMarker (editor, parent, rgba, text, Tempo, 0, false),
_tempo (temp)
{
set_position (_tempo.frame());
@@ -535,7 +535,7 @@ TempoMarker::~TempoMarker ()
MeterMarker::MeterMarker (PublicEditor& editor, ArdourCanvas::Container& parent, guint32 rgba, const string& text,
ARDOUR::MeterSection& m)
- : Marker (editor, parent, rgba, text, Meter, 0, false),
+ : ArdourMarker (editor, parent, rgba, text, Meter, 0, false),
_meter (m)
{
set_position (_meter.frame());
diff --git a/gtk2_ardour/marker.h b/gtk2_ardour/marker.h
index daa44bf..b769f8d 100644
--- a/gtk2_ardour/marker.h
+++ b/gtk2_ardour/marker.h
@@ -38,7 +38,7 @@ namespace ARDOUR {
class PublicEditor;
-class Marker : public sigc::trackable
+class ArdourMarker : public sigc::trackable
{
public:
enum Type {
@@ -56,12 +56,12 @@ class Marker : public sigc::trackable
};
- Marker (PublicEditor& editor, ArdourCanvas::Container &, guint32 rgba, const std::string& text, Type,
+ ArdourMarker (PublicEditor& editor, ArdourCanvas::Container &, guint32 rgba, const std::string& text, Type,
framepos_t frame = 0, bool handle_events = true);
- virtual ~Marker ();
+ virtual ~ArdourMarker ();
- static PBD::Signal1<void,Marker*> CatchDeletion;
+ static PBD::Signal1<void,ArdourMarker*> CatchDeletion;
static void setup_sizes (const double timebar_height);
@@ -129,11 +129,11 @@ class Marker : public sigc::trackable
private:
/* disallow copy construction */
- Marker (Marker const &);
- Marker & operator= (Marker const &);
+ ArdourMarker (ArdourMarker const &);
+ ArdourMarker & operator= (ArdourMarker const &);
};
-class TempoMarker : public Marker
+class TempoMarker : public ArdourMarker
{
public:
TempoMarker (PublicEditor& editor, ArdourCanvas::Container &, guint32 rgba, const std::string& text, ARDOUR::TempoSection&);
@@ -145,7 +145,7 @@ class TempoMarker : public Marker
ARDOUR::TempoSection& _tempo;
};
-class MeterMarker : public Marker
+class MeterMarker : public ArdourMarker
{
public:
MeterMarker (PublicEditor& editor, ArdourCanvas::Container &, guint32 rgba, const std::string& text, ARDOUR::MeterSection&);
diff --git a/gtk2_ardour/marker_selection.h b/gtk2_ardour/marker_selection.h
index eea0a3a..6d4749f 100644
--- a/gtk2_ardour/marker_selection.h
+++ b/gtk2_ardour/marker_selection.h
@@ -24,7 +24,7 @@
#include "marker.h"
-struct MarkerSelection : public std::list<Marker*>
+struct MarkerSelection : public std::list<ArdourMarker*>
{
void range (ARDOUR::framepos_t& start, ARDOUR::framepos_t& end);
};
diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc
index 675e567..b9653e6 100644
--- a/gtk2_ardour/meter_patterns.cc
+++ b/gtk2_ardour/meter_patterns.cc
@@ -79,10 +79,10 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt)
{
switch (mt) {
case MeterPeak:
- return _("Peak");
+ return _("Peak (+6dBFS)");
break;
case MeterPeak0dB:
- return _("Peak 0dB");
+ return _("Peak (0dBFS)");
break;
case MeterKrms:
return _("RMS + Peak");
@@ -100,13 +100,13 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt)
return _("IEC2/EBU");
break;
case MeterK20:
- return _("K20");
+ return _("K20/RMS");
break;
case MeterK14:
- return _("K14");
+ return _("K14/RMS");
break;
case MeterK12:
- return _("K12");
+ return _("K12/RMS");
break;
case MeterVU:
return _("VU");
diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc
index 08604b0..aaf1842 100644
--- a/gtk2_ardour/meterbridge.cc
+++ b/gtk2_ardour/meterbridge.cc
@@ -111,7 +111,6 @@ Meterbridge::Meterbridge ()
assert(max_height % 16 == 0);
set_geometry_hints(*((Gtk::Window*) this), geom, Gdk::HINT_MIN_SIZE | Gdk::HINT_MAX_SIZE | Gdk::HINT_RESIZE_INC);
- set_keep_above (true);
set_border_width (0);
metrics_vpacker_left.pack_start (metrics_left, true, true);
@@ -439,7 +438,7 @@ Meterbridge::set_session (Session* s)
if (_visible) {
show_window();
- ActionManager::check_toggleaction ("<Actions>/Common/toggle-meterbridge");
+ present ();
}
start_updating ();
}
diff --git a/gtk2_ardour/midi_list_editor.cc b/gtk2_ardour/midi_list_editor.cc
index 4c7a30c..047dcf2 100644
--- a/gtk2_ardour/midi_list_editor.cc
+++ b/gtk2_ardour/midi_list_editor.cc
@@ -777,7 +777,7 @@ MidiListEditor::redisplay_model ()
bbt.beats = dur.get_beats ();
bbt.ticks = dur.get_ticks ();
- int len_ticks = (*i)->length().to_ticks();
+ uint64_t len_ticks = (*i)->length().to_ticks();
std::map<int,string>::iterator x = note_length_map.find (len_ticks);
if (x != note_length_map.end()) {
diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc
index be47521..e412b82 100644
--- a/gtk2_ardour/midi_time_axis.cc
+++ b/gtk2_ardour/midi_time_axis.cc
@@ -1509,8 +1509,9 @@ boost::shared_ptr<MidiRegion>
MidiTimeAxisView::add_region (framepos_t pos, framecnt_t length, bool commit)
{
Editor* real_editor = dynamic_cast<Editor*> (&_editor);
-
- real_editor->begin_reversible_command (Operations::create_region);
+ if (commit) {
+ real_editor->begin_reversible_command (Operations::create_region);
+ }
playlist()->clear_changes ();
real_editor->snap_to (pos, RoundNearest);
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index a011d2e..661d1f6 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -1179,6 +1179,7 @@ MixerStrip::update_io_button (boost::shared_ptr<ARDOUR::Route> route, Width widt
uint32_t ardour_connection_count = 0;
uint32_t system_connection_count = 0;
uint32_t other_connection_count = 0;
+ uint32_t typed_connection_count = 0;
ostringstream label;
@@ -1196,8 +1197,12 @@ MixerStrip::update_io_button (boost::shared_ptr<ARDOUR::Route> route, Width widt
//to avoid confusion, the button caption should only show connections that match the datatype of the track
DataType dt = DataType::AUDIO;
- if ( boost::dynamic_pointer_cast<MidiTrack>(route) != 0 )
+ if ( boost::dynamic_pointer_cast<MidiTrack>(route) != 0 ) {
dt = DataType::MIDI;
+ // avoid further confusion with Midi-tracks that have a synth.
+ // Audio-ports may be connected, but button says "Disconnected"
+ tooltip << _("MIDI ");
+ }
if (for_input) {
io_count = route->n_inputs().n_total();
@@ -1215,12 +1220,17 @@ MixerStrip::update_io_button (boost::shared_ptr<ARDOUR::Route> route, Width widt
port = route->output()->nth (io_index);
}
- //ignore any port connections that don't match our DataType
- if (port->type() != dt)
- continue;
-
port_connections.clear ();
port->get_connections(port_connections);
+
+ //ignore any port connections that don't match our DataType
+ if (port->type() != dt) {
+ if (!port_connections.empty()) {
+ ++typed_connection_count;
+ }
+ continue;
+ }
+
io_connection_count = 0;
if (!port_connections.empty()) {
@@ -1360,6 +1370,9 @@ MixerStrip::update_io_button (boost::shared_ptr<ARDOUR::Route> route, Width widt
// Odd configuration
label << "*" << total_connection_count << "*";
}
+ if (typed_connection_count > 0) {
+ label << "\u2295"; // circled plus
+ }
}
if (for_input) {
diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc
index 2314409..a1cb236 100644
--- a/gtk2_ardour/mixer_ui.cc
+++ b/gtk2_ardour/mixer_ui.cc
@@ -777,12 +777,6 @@ Mixer_UI::set_session (Session* sess)
if (_visible) {
show_window();
-
- /* Bit of a hack; if we're here, we're opening the mixer because of our
- instant XML state having a show-mixer property. Fix up the corresponding
- action state.
- */
- ActionManager::check_toggleaction ("<Actions>/Common/toggle-mixer");
}
start_updating ();
@@ -951,7 +945,7 @@ Mixer_UI::set_all_strips_visibility (bool yn)
void
-Mixer_UI::set_all_audio_visibility (int tracks, bool yn)
+Mixer_UI::set_all_audio_midi_visibility (int tracks, bool yn)
{
TreeModel::Children rows = track_model->children();
TreeModel::Children::iterator i;
@@ -972,6 +966,7 @@ Mixer_UI::set_all_audio_visibility (int tracks, bool yn)
}
boost::shared_ptr<AudioTrack> at = strip->audio_track();
+ boost::shared_ptr<MidiTrack> mt = strip->midi_track();
switch (tracks) {
case 0:
@@ -985,7 +980,13 @@ Mixer_UI::set_all_audio_visibility (int tracks, bool yn)
break;
case 2:
- if (!at) { /* bus */
+ if (!at && !mt) { /* bus */
+ (*i)[track_columns.visible] = yn;
+ }
+ break;
+
+ case 3:
+ if (mt) { /* midi-track */
(*i)[track_columns.visible] = yn;
}
break;
@@ -1011,26 +1012,38 @@ Mixer_UI::show_all_routes ()
void
Mixer_UI::show_all_audiobus ()
{
- set_all_audio_visibility (2, true);
+ set_all_audio_midi_visibility (2, true);
}
void
Mixer_UI::hide_all_audiobus ()
{
- set_all_audio_visibility (2, false);
+ set_all_audio_midi_visibility (2, false);
}
void
Mixer_UI::show_all_audiotracks()
{
- set_all_audio_visibility (1, true);
+ set_all_audio_midi_visibility (1, true);
}
void
Mixer_UI::hide_all_audiotracks ()
{
- set_all_audio_visibility (1, false);
+ set_all_audio_midi_visibility (1, false);
}
void
+Mixer_UI::show_all_miditracks()
+{
+ set_all_audio_midi_visibility (3, true);
+}
+void
+Mixer_UI::hide_all_miditracks ()
+{
+ set_all_audio_midi_visibility (3, false);
+}
+
+
+void
Mixer_UI::track_list_reorder (const TreeModel::Path&, const TreeModel::iterator&, int* /*new_order*/)
{
DEBUG_TRACE (DEBUG::OrderKeys, "mixer UI treeview reordered\n");
@@ -1202,6 +1215,8 @@ Mixer_UI::build_track_menu ()
items.push_back (MenuElem (_("Hide All Audio Tracks"), sigc::mem_fun(*this, &Mixer_UI::hide_all_audiotracks)));
items.push_back (MenuElem (_("Show All Audio Busses"), sigc::mem_fun(*this, &Mixer_UI::show_all_audiobus)));
items.push_back (MenuElem (_("Hide All Audio Busses"), sigc::mem_fun(*this, &Mixer_UI::hide_all_audiobus)));
+ items.push_back (MenuElem (_("Show All Midi Tracks"), sigc::mem_fun (*this, &Mixer_UI::show_all_miditracks)));
+ items.push_back (MenuElem (_("Hide All Midi Tracks"), sigc::mem_fun (*this, &Mixer_UI::hide_all_miditracks)));
}
diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h
index 4ab48ff..a56bb39 100644
--- a/gtk2_ardour/mixer_ui.h
+++ b/gtk2_ardour/mixer_ui.h
@@ -179,7 +179,7 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
void show_track_list_menu ();
void set_all_strips_visibility (bool yn);
- void set_all_audio_visibility (int tracks, bool yn);
+ void set_all_audio_midi_visibility (int, bool);
void track_visibility_changed (std::string const & path);
void update_track_visibility ();
@@ -189,6 +189,8 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
void hide_all_audiobus ();
void show_all_audiotracks();
void hide_all_audiotracks ();
+ void show_all_miditracks();
+ void hide_all_miditracks ();
bool in_group_row_change;
diff --git a/gtk2_ardour/mnemonic-us.bindings.in b/gtk2_ardour/mnemonic-us.bindings.in
index e2e8bd4..6819ef9 100644
--- a/gtk2_ardour/mnemonic-us.bindings.in
+++ b/gtk2_ardour/mnemonic-us.bindings.in
@@ -132,11 +132,14 @@ This mode provides many different operations on both regions and control points,
@rop|Region/boost-region-gain|<@SECONDARY@>6|increase region gain
@rop|Region/cut-region-gain|<@SECONDARY@>7|reduce region gain
@rop|Region/pitch-shift-region|<@SECONDARY@>8|transpose
+ at rop|Region/lower-region|<@SECONDARY@>9|lower region layer
+ at rop|Region/raise-region|<@SECONDARY@>0|raise region layer
;; letters
;; TOP ROW
@sess|Common/Quit|<@PRIMARY@>q|quit
+ at sess|Common/Hide|<@PRIMARY@>h|hide
@movp|Editor/jump-forward-to-mark|w|to next mark
@movp|Editor/jump-backward-to-mark|q|to previous mark
@@ -213,12 +216,14 @@ This mode provides many different operations on both regions and control points,
@mmode|MouseMode/set-mouse-mode-cut|c|cut mode
@edit|Editor/editor-cut|<@PRIMARY@>x|cut
@edit|Editor/editor-copy|<@PRIMARY@>c|copy
- at -group|Editor/crop|<@SECONDARY@>c|some text
+ at wvis|Window/toggle-big-clock|<@SECONDARY@>c|toggle big clock
+ at -group|Editor/crop<@PRIMARY@><@TERTIARY@>c|crop
@rop|Region/set-region-sync-position|v|set region sync point
@edit|Editor/editor-paste|<@PRIMARY@>v|paste
+ at edit|Editor/ToggleJadeo|<@SECONDARY@>v|video window
@-group|Editor/brush-at-mouse|<@PRIMARY@>b|some text
+ at wvis|Common/toggle-meterbridge|<@SECONDARY@>b|show meter bridge
@trans|Editor/track-record-enable-toggle|<@TERTIARY@>b|toggle track rec-enable
- at wvis|Window/toggle-big-clock|<@SECONDARY@>b|toggle big clock
@sess|Main/AddTrackBus|<@PRIMARY@><@TERTIARY@>n|add track(s) or bus(ses)
@wvis|Window/toggle-audio-connection-manager|<@SECONDARY@>n|toggle global audio patchbay
@sess|Main/New|<@PRIMARY@>n|open a new session
diff --git a/gtk2_ardour/opts.cc b/gtk2_ardour/opts.cc
index 4596b5c..f544ade 100644
--- a/gtk2_ardour/opts.cc
+++ b/gtk2_ardour/opts.cc
@@ -74,7 +74,7 @@ print_help (const char *execname)
#endif
<< _(" -E, --save <file> Load the specified session, save it to <file> and then quit\n")
<< _(" -C, --curvetest filename Curve algorithm debugger\n")
- << _(" -k, --keybindings filename Name of key bindings to load (default is ~/.ardour3/ardour.bindings)\n")
+ << _(" -k, --keybindings filename Name of key bindings to load\n")
;
return 1;
diff --git a/gtk2_ardour/panner2d.cc b/gtk2_ardour/panner2d.cc
index 29806ca..23c4976 100644
--- a/gtk2_ardour/panner2d.cc
+++ b/gtk2_ardour/panner2d.cc
@@ -36,9 +36,11 @@
#include "canvas/colors.h"
#include "ardour_ui.h"
+#include "global_signals.h"
#include "panner2d.h"
#include "keyboard.h"
#include "gui_thread.h"
+#include "rgb_macros.h"
#include "utils.h"
#include "public_editor.h"
@@ -51,6 +53,9 @@ using namespace ARDOUR_UI_UTILS;
using namespace PBD;
using Gtkmm2ext::Keyboard;
+Panner2d::ColorScheme Panner2d::colors;
+bool Panner2d::have_colors = false;
+
static const int large_size_threshold = 100;
static const int large_border_width = 25;
static const int small_border_width = 8;
@@ -81,6 +86,13 @@ Panner2d::Panner2d (boost::shared_ptr<PannerShell> p, int32_t h)
, have_elevation (false)
, _send_mode (false)
{
+ if (!have_colors) {
+ set_colors ();
+ have_colors = true;
+ }
+
+ ColorsChanged.connect (sigc::mem_fun (*this, &Panner2d::color_handler));
+
panner_shell->Changed.connect (panshell_connections, invalidator (*this), boost::bind (&Panner2d::handle_state_change, this), gui_context());
panner_shell->panner()->SignalPositionChanged.connect (panner_connections, invalidator(*this), boost::bind (&Panner2d::handle_position_change, this), gui_context());
@@ -100,6 +112,31 @@ Panner2d::~Panner2d()
}
void
+Panner2d::set_colors ()
+{
+ // TODO get all colors from theme, resolve dups
+ colors.background = ARDOUR_UI::config()->color ("mono panner bg");
+ colors.crosshairs = 0x4884a9ff; // 0.282, 0.517, 0.662, 1.0
+ colors.signalcircle_border = 0x84c5e1ff; // 0.517, 0.772, 0.882, 1.0
+ colors.signalcircle = 0x4884a9ff; // 0.282, 0.517, 0.662, 1.0 // also used with a = 0.9
+ colors.diffusion = 0x4884a973; // 0.282, 0.517, 0.662, 0.45
+ colors.diffusion_inv = 0xff6b6b73; // 1.0, 0.419, 0.419, 0.45
+ colors.pos_outline = 0xffe7e7d9; // 1.0, 0.905, 0.905, 0.85
+ colors.pos_fill = 0xff6b6bd9; // 1.0, 0.419, 0.419, 0.85
+ colors.signal_outline = 0x84c5e1cc; // 0.517, 0.772, 0.882, 0.8
+ colors.signal_fill = 0x4884a9bf; // 0.282, 0.517, 0.662, 0.75
+ colors.speaker_fill = 0x4884a9ff; // 0.282, 0.517, 0.662, 1.0
+ colors.text = 0x84c5e1e6; // 0.517, 0.772, 0.882, 0.9
+}
+
+void
+Panner2d::color_handler ()
+{
+ set_colors ();
+ queue_draw ();
+}
+
+void
Panner2d::reset (uint32_t n_inputs)
{
uint32_t nouts = panner_shell->panner()->out().n_audio();
@@ -413,6 +450,11 @@ Panner2d::on_motion_notify_event (GdkEventMotion *ev)
return handle_motion (x, y, state);
}
+#define CSSRGBA(CL) \
+ cairo_set_source_rgba (cr, UINT_RGBA_R_FLT(CL), UINT_RGBA_G_FLT(CL), UINT_RGBA_B_FLT(CL), UINT_RGBA_A_FLT(CL));
+
+#define CSSRGB(CL, A) \
+ cairo_set_source_rgba (cr, UINT_RGBA_R_FLT(CL), UINT_RGBA_G_FLT(CL), UINT_RGBA_B_FLT(CL), A);
bool
Panner2d::on_expose_event (GdkEventExpose *event)
{
@@ -427,14 +469,15 @@ Panner2d::on_expose_event (GdkEventExpose *event)
cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
- double r, g, b, a;
+ uint32_t bg = colors.background;
if (_send_mode) {
- ArdourCanvas::color_to_rgba (ARDOUR_UI::config()->color ("send bg"), r, g, b, a);
+ bg = ARDOUR_UI::config()->color ("send bg");
}
+
if (!panner_shell->bypassed()) {
- cairo_set_source_rgba (cr, r, g, b, 1.0);
+ CSSRGBA(bg);
} else {
- cairo_set_source_rgba (cr, r, g, b , 0.2);
+ CSSRGB(bg, 0.2);
}
cairo_fill_preserve (cr);
cairo_clip (cr);
@@ -447,7 +490,7 @@ Panner2d::on_expose_event (GdkEventExpose *event)
/* horizontal line of "crosshairs" */
- cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 1.0);
+ CSSRGBA(colors.crosshairs);
cairo_move_to (cr, 0.0, radius);
cairo_line_to (cr, diameter, radius);
cairo_stroke (cr);
@@ -461,16 +504,16 @@ Panner2d::on_expose_event (GdkEventExpose *event)
/* the circle on which signals live */
cairo_set_line_width (cr, 1.5);
- cairo_set_source_rgba (cr, 0.517, 0.772, 0.882, 1.0);
+ CSSRGBA(colors.signalcircle_border);
cairo_arc (cr, radius, radius, radius, 0.0, 2.0 * M_PI);
cairo_stroke (cr);
for (uint32_t rad = 15; rad < 90; rad += 15) {
cairo_set_line_width (cr, .5 + (float)rad / 150.0);
if (rad == 45) {
- cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 1.0);
+ CSSRGBA(colors.signalcircle);
} else {
- cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 0.8);
+ CSSRGB(colors.signalcircle, 0.9);
}
cairo_new_path (cr);
cairo_arc (cr, radius, radius, radius * sin(M_PI * (float) rad / 180.0), 0, 2.0 * M_PI);
@@ -495,10 +538,10 @@ Panner2d::on_expose_event (GdkEventExpose *event)
cairo_close_path (cr);
if (panner_shell->pannable()->pan_width_control->get_value() >= 0.0) {
/* normal width */
- cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 0.45);
+ CSSRGBA(colors.diffusion);
} else {
/* inverse width */
- cairo_set_source_rgba (cr, 1.0, 0.419, 0.419, 0.45);
+ CSSRGBA(colors.diffusion_inv);
}
cairo_fill (cr);
cairo_restore (cr);
@@ -525,9 +568,9 @@ Panner2d::on_expose_event (GdkEventExpose *event)
cairo_new_path (cr);
cairo_arc (cr, c.x, c.y, arc_radius + 1.0, 0, 2.0 * M_PI);
- cairo_set_source_rgba (cr, 1.0, 0.419, 0.419, 0.85);
+ CSSRGBA(colors.pos_fill);
cairo_fill_preserve (cr);
- cairo_set_source_rgba (cr, 1.0, 0.905, 0.905, 0.85);
+ CSSRGBA(colors.pos_outline);
cairo_stroke (cr);
/* signals */
@@ -549,13 +592,13 @@ Panner2d::on_expose_event (GdkEventExpose *event)
cairo_new_path (cr);
cairo_arc (cr, c.x, c.y, arc_radius, 0, 2.0 * M_PI);
- cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 0.75);
+ CSSRGBA(colors.signal_fill);
cairo_fill_preserve (cr);
- cairo_set_source_rgba (cr, 0.517, 0.772, 0.882, 0.8);
+ CSSRGBA(colors.signal_outline);
cairo_stroke (cr);
if (!xsmall && !signal->text.empty()) {
- cairo_set_source_rgba (cr, 0.517, 0.772, 0.882, .9);
+ CSSRGBA(colors.text);
/* the +/- adjustments are a hack to try to center the text in the circle
* TODO use pango get_pixel_size() -- see mono_panner.cc
*/
@@ -608,7 +651,7 @@ Panner2d::on_expose_event (GdkEventExpose *event)
cairo_rel_line_to (cr, -5, +5);
cairo_rel_line_to (cr, 0, -7);
cairo_close_path (cr);
- cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 1.0);
+ CSSRGBA(colors.speaker_fill);
cairo_fill (cr);
cairo_restore (cr);
diff --git a/gtk2_ardour/panner2d.h b/gtk2_ardour/panner2d.h
index 99377bd..f307718 100644
--- a/gtk2_ardour/panner2d.h
+++ b/gtk2_ardour/panner2d.h
@@ -100,6 +100,26 @@ class Panner2d : public Gtk::DrawingArea
bool _selected;
};
+ struct ColorScheme {
+ uint32_t background;
+ uint32_t crosshairs;
+ uint32_t signalcircle_border;
+ uint32_t signalcircle;
+ uint32_t diffusion;
+ uint32_t diffusion_inv;
+ uint32_t pos_outline;
+ uint32_t pos_fill;
+ uint32_t signal_outline;
+ uint32_t signal_fill;
+ uint32_t speaker_fill;
+ uint32_t text;
+ };
+
+ static ColorScheme colors;
+ static void set_colors ();
+ static bool have_colors;
+ void color_handler ();
+
boost::shared_ptr<ARDOUR::PannerShell> panner_shell;
Glib::RefPtr<Pango::Layout> layout;
diff --git a/gtk2_ardour/panner_interface.cc b/gtk2_ardour/panner_interface.cc
index 0fcba4c..0091cf5 100644
--- a/gtk2_ardour/panner_interface.cc
+++ b/gtk2_ardour/panner_interface.cc
@@ -119,7 +119,7 @@ PannerInterface::set_send_drawing_mode(bool onoff) {
}
PannerPersistentTooltip::PannerPersistentTooltip (Gtk::Widget* w)
- : PersistentTooltip (w)
+ : PersistentTooltip (w, true)
, _dragging (false)
{
diff --git a/gtk2_ardour/pingback.cc b/gtk2_ardour/pingback.cc
index 8e4a326..3c46a0c 100644
--- a/gtk2_ardour/pingback.cc
+++ b/gtk2_ardour/pingback.cc
@@ -23,7 +23,10 @@
#include <fstream>
#include <cstring>
-#ifndef PLATFORM_WINDOWS
+#ifdef PLATFORM_WINDOWS
+#include <windows.h>
+#include <glibmm.h>
+#else
#include <sys/utsname.h>
#endif
@@ -42,7 +45,6 @@
using std::string;
using namespace ARDOUR;
-#ifndef PLATFORM_WINDOWS // no pingback for windows, so far
static size_t
curl_write_data (char *bufptr, size_t size, size_t nitems, void *ptr)
{
@@ -62,7 +64,6 @@ curl_write_data (char *bufptr, size_t size, size_t nitems, void *ptr)
return size * nitems;
}
-#endif
struct ping_call {
std::string version;
@@ -72,19 +73,40 @@ struct ping_call {
: version (v), announce_path (a) {}
};
+#ifdef PLATFORM_WINDOWS
+static bool
+_query_registry (const char *regkey, const char *regval, std::string &rv) {
+ HKEY key;
+ DWORD size = PATH_MAX;
+ char tmp[PATH_MAX+1];
+
+ if ( (ERROR_SUCCESS == RegOpenKeyExA (HKEY_LOCAL_MACHINE, regkey, 0, KEY_READ, &key))
+ && (ERROR_SUCCESS == RegQueryValueExA (key, regval, 0, NULL, reinterpret_cast<LPBYTE>(tmp), &size))
+ )
+ {
+ rv = Glib::locale_to_utf8 (tmp);
+ return true;
+ }
+
+ if ( (ERROR_SUCCESS == RegOpenKeyExA (HKEY_LOCAL_MACHINE, regkey, 0, KEY_READ | KEY_WOW64_32KEY, &key))
+ && (ERROR_SUCCESS == RegQueryValueExA (key, regval, 0, NULL, reinterpret_cast<LPBYTE>(tmp), &size))
+ )
+ {
+ rv = Glib::locale_to_utf8 (tmp);
+ return true;
+ }
+
+ return false;
+}
+#endif
+
+
static void*
_pingback (void *arg)
{
-#ifndef PLATFORM_WINDOWS
ping_call* cm = static_cast<ping_call*> (arg);
CURL* c;
- struct utsname utb;
string return_str;
-
- if (uname (&utb)) {
- return 0;
- }
-
//initialize curl
curl_global_init (CURL_GLOBAL_NOTHING);
@@ -99,16 +121,31 @@ _pingback (void *arg)
#ifdef __APPLE__
url = Config->get_osx_pingback_url ();
+#elif defined PLATFORM_WINDOWS
+ url = Config->get_windows_pingback_url ();
#else
url = Config->get_linux_pingback_url ();
#endif
+ if (url.compare (0, 4, "http") != 0) {
+ delete cm;
+ return 0;
+ }
+
char* v = curl_easy_escape (c, cm->version.c_str(), cm->version.length());
url += v;
url += '?';
free (v);
- string uts = string_compose ("%1 %2 %3 %4", utb.sysname, utb.release, utb.version, utb.machine);
+#ifndef PLATFORM_WINDOWS
+ struct utsname utb;
+
+ if (uname (&utb)) {
+ delete cm;
+ return 0;
+ }
+
+ //string uts = string_compose ("%1 %2 %3 %4", utb.sysname, utb.release, utb.version, utb.machine);
string s;
char* query;
@@ -128,6 +165,40 @@ _pingback (void *arg)
s = string_compose ("m=%1", query);
url += s;
free (query);
+#else
+ std::string val;
+ if (_query_registry("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "ProductName", val)) {
+ char* query = curl_easy_escape (c, val.c_str(), strlen (val.c_str()));
+ url += "r=";
+ url += query;
+ url += '&';
+ free (query);
+ } else {
+ url += "r=&";
+ }
+
+ if (_query_registry("Hardware\\Description\\System\\CentralProcessor\\0", "Identifier", val)) {
+ // remove "Family X Model YY Stepping Z" tail
+ size_t cut = val.find (" Family ");
+ if (string::npos != cut) {
+ val = val.substr (0, cut);
+ }
+ char* query = curl_easy_escape (c, val.c_str(), strlen (val.c_str()));
+ url += "m=";
+ url += query;
+ url += '&';
+ free (query);
+ } else {
+ url += "m=&";
+ }
+
+# if ( defined(__x86_64__) || defined(_M_X64) )
+ url += "s=Windows64";
+# else
+ url += "s=Windows32";
+# endif
+
+#endif /* PLATFORM_WINDOWS */
curl_easy_setopt (c, CURLOPT_URL, url.c_str());
@@ -163,9 +234,6 @@ _pingback (void *arg)
curl_easy_cleanup (c);
delete cm;
-
-#endif /* PLATFORM_WINDOWS */
-
return 0;
}
diff --git a/gtk2_ardour/plugin_eq_gui.cc b/gtk2_ardour/plugin_eq_gui.cc
index 13c475e..09e72ac 100644
--- a/gtk2_ardour/plugin_eq_gui.cc
+++ b/gtk2_ardour/plugin_eq_gui.cc
@@ -344,6 +344,7 @@ PluginEqGui::run_impulse_analysis()
ARDOUR::ChanMapping in_map(_plugin->get_info()->n_inputs);
ARDOUR::ChanMapping out_map(_plugin->get_info()->n_outputs);
+ _plugin->set_block_size (_buffer_size);
_plugin->connect_and_run(_bufferset, in_map, out_map, _buffer_size, 0);
framecnt_t f = _plugin->signal_latency ();
// Adding user_latency() could be interesting
diff --git a/gtk2_ardour/plugin_selector.cc b/gtk2_ardour/plugin_selector.cc
index 2a1ce85..3c3d08c 100644
--- a/gtk2_ardour/plugin_selector.cc
+++ b/gtk2_ardour/plugin_selector.cc
@@ -131,8 +131,6 @@ PluginSelector::PluginSelector (PluginManager& mgr)
btn_remove = manage(new Gtk::Button(Stock::REMOVE));
btn_remove->set_sensitive (false);
ARDOUR_UI::instance()->set_tip(*btn_remove, _("Remove a plugin from the effect list"));
- Gtk::Button *btn_update = manage(new Gtk::Button(Stock::REFRESH));
- ARDOUR_UI::instance()->set_tip(*btn_update, _("Update available plugins"));
btn_add->set_name("PluginSelectorButton");
btn_remove->set_name("PluginSelectorButton");
@@ -163,8 +161,7 @@ PluginSelector::PluginSelector (PluginManager& mgr)
table->attach (*filter_box, 0, 7, 5, 6, FILL|EXPAND, FILL, 5, 5);
table->attach(*btn_add, 1, 2, 6, 7, FILL, FILL, 5, 5);
- table->attach(*btn_remove, 3, 4, 6, 7, FILL, FILL, 5, 5);
- table->attach(*btn_update, 5, 6, 6, 7, FILL, FILL, 5, 5);
+ table->attach(*btn_remove, 5, 6, 6, 7, FILL, FILL, 5, 5);
table->attach(ascroller, 0, 7, 8, 10);
@@ -183,7 +180,6 @@ PluginSelector::PluginSelector (PluginManager& mgr)
plugin_display.get_selection()->signal_changed().connect (sigc::mem_fun(*this, &PluginSelector::display_selection_changed));
plugin_display.grab_focus();
- btn_update->signal_clicked().connect (sigc::mem_fun(*this, &PluginSelector::btn_update_clicked));
btn_add->signal_clicked().connect(sigc::mem_fun(*this, &PluginSelector::btn_add_clicked));
btn_remove->signal_clicked().connect(sigc::mem_fun(*this, &PluginSelector::btn_remove_clicked));
added_list.get_selection()->signal_changed().connect (sigc::mem_fun(*this, &PluginSelector::added_list_selection_changed));
@@ -447,12 +443,6 @@ PluginSelector::btn_remove_clicked()
}
void
-PluginSelector::btn_update_clicked()
-{
- manager.refresh ();
-}
-
-void
PluginSelector::display_selection_changed()
{
if (plugin_display.get_selection()->count_selected_rows() != 0) {
diff --git a/gtk2_ardour/plugin_selector.h b/gtk2_ardour/plugin_selector.h
index 84c1651..9a71d28 100644
--- a/gtk2_ardour/plugin_selector.h
+++ b/gtk2_ardour/plugin_selector.h
@@ -121,7 +121,6 @@ class PluginSelector : public ArdourDialog
void row_activated(Gtk::TreeModel::Path path, Gtk::TreeViewColumn* col);
void btn_add_clicked();
void btn_remove_clicked();
- void btn_update_clicked();
void added_list_selection_changed();
void added_row_clicked(GdkEventButton* event);
void display_selection_changed();
diff --git a/gtk2_ardour/po/de.po b/gtk2_ardour/po/de.po
index 2100d88..44dae72 100644
--- a/gtk2_ardour/po/de.po
+++ b/gtk2_ardour/po/de.po
@@ -1,13722 +1,14068 @@
-# German translations for gtk-ardour
-# Copyright (C) 2003 Paul Davis
-# This file is distributed under the same license as the gtk-ardour package.
-#
-# Karsten Petersen <kapet at kapet.de>, 2003.
-# Edgar Aichinger <edgar.aichinger at aon.at>, 2008, 2012, 2013, 2014, 2015.
-# Benjamin Scherrer <benjamin at wagnerbrutal.de>, 2015.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: gtk-ardour 0.347.2\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-11 19:33+0200\n"
-"PO-Revision-Date: 2015-04-12 15:35+0200\n"
-"Last-Translator: Benjamin Scherrer <benjamin at wagnerbrutal.de>\n"
-"Language-Team: Deutsch <>\n"
-"Language: de\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Gtranslator 2.91.6\n"
-"X-Poedit-Basepath: ../../\n"
-"X-Poedit-SearchPath-0: gtk2_ardour\n"
-
-#: about.cc:125
-msgid "Brian Ahr"
-msgstr "Brian Ahr"
-
-#: about.cc:126
-msgid "John Anderson"
-msgstr "John Anderson"
-
-#: about.cc:127
-msgid "Marcus Andersson"
-msgstr "Marcus Andersson"
-
-#: about.cc:128
-msgid "Nedko Arnaudov"
-msgstr "Nedko Arnaudov"
-
-#: about.cc:129
-msgid "Hans Baier"
-msgstr "Hans Baier"
-
-#: about.cc:130
-msgid "Ben Bell"
-msgstr "Ben Bell"
-
-#: about.cc:131
-msgid "Sakari Bergen"
-msgstr "Sakari Bergen"
-
-#: about.cc:132
-msgid "Christian Borss"
-msgstr "Christian Borss"
-
-#: about.cc:133
-msgid "Chris Cannam"
-msgstr "Chris Cannam"
-
-#: about.cc:134
-msgid "Jeremy Carter"
-msgstr "Jeremy Carter"
-
-#: about.cc:135
-msgid "Jesse Chappell"
-msgstr "Jesse Chappell"
-
-#: about.cc:136
-msgid "Thomas Charbonnel"
-msgstr "Thomas Charbonnel"
-
-#: about.cc:137
-msgid "Sam Chessman"
-msgstr "Sam Chessman"
-
-#: about.cc:138
-msgid "André Colomb"
-msgstr "André Colomb"
-
-#: about.cc:139
-msgid "Paul Davis"
-msgstr "Paul Davis"
-
-#: about.cc:140
-msgid "Gerard van Dongen"
-msgstr "Gerard van Dongen"
-
-#: about.cc:141
-msgid "John Emmas"
-msgstr "John Emmas"
-
-#: about.cc:142
-msgid "Colin Fletcher"
-msgstr "Colin Fletcher"
-
-#: about.cc:143
-msgid "Dave Flick"
-msgstr "Dave Flick"
-
-#: about.cc:144
-msgid "Hans Fugal"
-msgstr "Hans Fugal"
-
-#: about.cc:145
-msgid "Robin Gareus"
-msgstr "Robin Gareus"
-
-#: about.cc:146
-msgid "Christopher George"
-msgstr "Christopher George"
-
-#: about.cc:147
-msgid "Chris Goddard"
-msgstr "Chris Goddard"
-
-#: about.cc:148
-msgid "J. Abelardo Gutierrez"
-msgstr "J. Abelardo Gutierrez"
-
-#: about.cc:149
-msgid "Jeremy Hall"
-msgstr "Jeremy Hall"
-
-#: about.cc:150
-msgid "Audun Halland"
-msgstr "Audun Halland"
-
-#: about.cc:151
-msgid "David Halter"
-msgstr "David Halter"
-
-#: about.cc:152
-msgid "Steve Harris"
-msgstr "Steve Harris"
-
-#: about.cc:153
-msgid "Melvin Ray Herr"
-msgstr "Melvin Ray Herr"
-
-#: about.cc:154
-msgid "Carl Hetherington"
-msgstr "Carl Hetherington"
-
-#: about.cc:155
-msgid "Rob Holland"
-msgstr "Rob Holland"
-
-#: about.cc:156
-msgid "Robert Jordens"
-msgstr "Robert Jordens"
-
-#: about.cc:157
-msgid "Stefan Kersten"
-msgstr "Stefan Kersten"
-
-#: about.cc:158
-msgid "Armand Klenk"
-msgstr "Armand Klenk"
-
-#: about.cc:159
-msgid "Julien de Kozak"
-msgstr "Julien de Kozak"
-
-#: about.cc:160
-msgid "Matt Krai"
-msgstr "Matt Krai"
-
-#: about.cc:161
-msgid "Georg Krause"
-msgstr "Georg Krause"
-
-#: about.cc:162
-msgid "Nick Lanham"
-msgstr "Nick Lanham"
-
-#: about.cc:163
-msgid "Colin Law"
-msgstr "Colin Law"
-
-#: about.cc:164
-msgid "Joshua Leach"
-msgstr "Joshua Leach"
-
-#: about.cc:165
-msgid "Ben Loftis"
-msgstr "Ben Loftis"
-
-#: about.cc:166
-msgid "Nick Mainsbridge"
-msgstr "Nick Mainsbridge"
-
-#: about.cc:167
-msgid "Tim Mayberry"
-msgstr "Tim Mayberry"
-
-#: about.cc:168
-msgid "Doug Mclain"
-msgstr "Doug Mclain"
-
-#: about.cc:169
-msgid "Todd Naugle"
-msgstr "Todd Naugle"
-
-#: about.cc:170
-msgid "Jack O'Quin"
-msgstr "Jack O'Quin"
-
-#: about.cc:171
-msgid "Nimal Ratnayake"
-msgstr "Nimal Ratnayake"
-
-#: about.cc:172
-msgid "David Robillard"
-msgstr "David Robillard"
-
-#: about.cc:173
-msgid "Taybin Rutkin"
-msgstr "Taybin Rutkin"
-
-#: about.cc:174
-msgid "Andreas Ruge"
-msgstr "Andreas Ruge"
-
-#: about.cc:175
-msgid "Sampo Savolainen"
-msgstr "Sampo Savolainen"
-
-#: about.cc:176
-msgid "Rodrigo Severo"
-msgstr "Rodrigo Severo"
-
-#: about.cc:177
-msgid "Per Sigmond"
-msgstr "Per Sigmond"
-
-#: about.cc:178
-msgid "Lincoln Spiteri"
-msgstr "Lincoln Spiteri"
-
-#: about.cc:179
-msgid "Mike Start"
-msgstr "Mike Start"
-
-#: about.cc:180
-msgid "Mark Stewart"
-msgstr "Mark Stewart"
-
-#: about.cc:181
-msgid "Roland Stigge"
-msgstr "Roland Stigge"
-
-#: about.cc:182
-msgid "Petter Sundlöf"
-msgstr "Petter Sundlöf"
-
-#: about.cc:183
-msgid "Mike Täht"
-msgstr "Mike Täht"
-
-#: about.cc:184
-msgid "Roy Vegard"
-msgstr "Roy Vegard"
-
-#: about.cc:185
-msgid "Thorsten Wilms"
-msgstr "Thorsten Wilms"
-
-#: about.cc:186
-msgid "Grygorii Zharun"
-msgstr "Grygorii Zharun"
-
-#: about.cc:191
-msgid ""
-"French:\n"
-"\tAlain Fréhel <alain.frehel at free.fr>\n"
-"\tChristophe Combelles <ccomb at free.fr>\n"
-"\tMartin Blanchard\n"
-"\tRomain Arnaud <roming22 at gmail.com>\n"
-msgstr ""
-"Französisch:\n"
-"\tAlain Fréhel <alain.frehel at free.fr>\n"
-"\tChristophe Combelles <ccomb at free.fr>\n"
-"\tMartin Blanchard\n"
-"\tRomain Arnaud <roming22 at gmail.com>\n"
-
-#: about.cc:192
-msgid ""
-"German:\n"
-"\tKarsten Petersen <kapet at kapet.de>\n"
-"\tSebastian Arnold <mail at sebastian-arnold.net>\n"
-"\tRobert Schwede <schwede at ironshark.com>\n"
-"\tBenjamin Scherrer <realhangman at web.de>\n"
-"\tEdgar Aichinger <edogawa at aon.at>\n"
-"\tRichard Oax <richard at pagliacciempire.de>\n"
-"\tRobin Gloster <robin at loc-com.de>\n"
-msgstr ""
-"Deutsch:\n"
-"\tKarsten Petersen <kapet at kapet.de>\n"
-"\tSebastian Arnold <mail at sebastian-arnold.net>\n"
-"\tRobert Schwede <schwede at ironshark.com>\n"
-"\tBenjamin Scherrer <realhangman at web.de>\n"
-"\tEdgar Aichinger <edogawa at aon.at>\n"
-"\tRichard Oax <richard at pagliacciempire.de>\n"
-"\tRobin Gloster <robin at loc-com.de>\n"
-
-#: about.cc:199
-msgid ""
-"Italian:\n"
-"\tFilippo Pappalardo <filippo at email.it>\n"
-"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
-msgstr ""
-"Italienisch:\n"
-"\tFilippo Pappalardo <filippo at email.it>\n"
-"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
-
-#: about.cc:200
-msgid ""
-"Portuguese:\n"
-"\tRui Nuno Capela <rncbc at rncbc.org>\n"
-msgstr ""
-"Portugiesisch:\n"
-"\tRui Nuno Capela <rncbc at rncbc.org>\n"
-
-#: about.cc:201
-msgid ""
-"Brazilian Portuguese:\n"
-"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
-"\tChris Ross <chris at tebibyte.org>\n"
-msgstr ""
-"Brasilianisches Portugiesisch:\n"
-"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
-"\tChris Ross <chris at tebibyte.org>\n"
-
-#: about.cc:203
-msgid ""
-"Spanish:\n"
-"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
-"\tPablo Fernández <pablo.fbus at gmail.com>\n"
-msgstr ""
-"Spanisch:\n"
-"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
-"\tPablo Fernández <pablo.fbus at gmail.com>\n"
-
-#: about.cc:204
-msgid ""
-"Russian:\n"
-"\t Igor Blinov <pitstop at nm.ru>\n"
-"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
-msgstr ""
-"Russisch:\n"
-"\t Igor Blinov <pitstop at nm.ru>\n"
-"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
-
-#: about.cc:206
-msgid ""
-"Greek:\n"
-"\t Klearchos Gourgourinis <muadib at in.gr>\n"
-msgstr ""
-"Griechisch:\n"
-"\t Klearchos Gourgourinis <muadib at in.gr>\n"
-
-#: about.cc:207
-msgid ""
-"Swedish:\n"
-"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
-msgstr ""
-"Schwedisch:\n"
-"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
-
-#: about.cc:208
-msgid ""
-"Polish:\n"
-"\t Piotr Zaryk <pzaryk at gmail.com>\n"
-msgstr ""
-"Polnisch:\n"
-"\t Piotr Zaryk <pzaryk at gmail.com>\n"
-
-#: about.cc:209
-msgid ""
-"Czech:\n"
-"\t Pavel Fric <pavelfric at seznam.cz>\n"
-msgstr ""
-"Tschechisch:\n"
-"\t Pavel Fric <pavelfric at seznam.cz>\n"
-
-#: about.cc:210
-msgid ""
-"Norwegian:\n"
-"\t Eivind Ødegård\n"
-msgstr ""
-"Norwegisch:\n"
-"\t Eivind Ødegård\n"
-
-#: about.cc:211
-msgid ""
-"Chinese:\n"
-"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
-msgstr ""
-"Chinesisch:\n"
-"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
-
-#: about.cc:591
-msgid "Copyright (C) 1999-2015 Paul Davis\n"
-msgstr "Copyright (C) 1999-2015 Paul Davis\n"
-
-#: about.cc:595
-msgid "http://ardour.org/"
-msgstr "http://ardour.org/"
-
-#: about.cc:596
-msgid ""
-"%1%2\n"
-"(built from revision %3)"
-msgstr ""
-"%1%2\n"
-"(kompiliert aus Revision %3)"
-
-#: about.cc:600
-msgid "Config"
-msgstr "Konfiguration"
-
-#: actions.cc:85
-msgid "Loading menus from %1"
-msgstr "Lade Menüs von %1"
-
-#: actions.cc:88 actions.cc:89
-msgid "badly formatted menu definition file: %1"
-msgstr "schlecht formatierte Menüdefinitions-Datei: %1"
-
-#: actions.cc:91
-msgid "%1 menu definition file not found"
-msgstr "Konnte die %1 Menü-Definitionsdatei nicht finden"
-
-#: actions.cc:95 actions.cc:96
-msgid "%1 will not work without a valid menu definition file"
-msgstr "%1 wird ohne gültige Menüdefinitions-Datei nicht funktionieren"
-
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "Spur/Bus hinzufügen"
-
-#: add_route_dialog.cc:57
-msgid "Configuration:"
-msgstr "Kanaleinstellungen:"
-
-#: add_route_dialog.cc:58
-msgid "Record Mode:"
-msgstr "Aufnahmemodus:"
-
-#: add_route_dialog.cc:59
-msgid "Instrument:"
-msgstr "Instrument:"
-
-#: add_route_dialog.cc:77
-msgid "Audio Tracks"
-msgstr "Audiospuren"
-
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
-msgid "MIDI Tracks"
-msgstr "Midispuren"
-
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
-msgid "Audio+MIDI Tracks"
-msgstr "Audio+MIDI-Spuren"
-
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "Audiobusse"
-
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
-msgid "First"
-msgstr "Zuerst"
-
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
-msgstr "Nach Auswahl im Editor"
-
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
-msgstr "Nach auswahl im Mixer"
-
-#: add_route_dialog.cc:86
-msgid "Last"
-msgstr "Zuletzt"
-
-#: add_route_dialog.cc:103
-msgid "Add:"
-msgstr "Erstelle:"
-
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
-msgid "<b>Options</b>"
-msgstr "<b>Optionen</b>"
-
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
-msgid "Name:"
-msgstr "Name:"
-
-#: add_route_dialog.cc:156
-msgid "Group:"
-msgstr "Gruppe:"
-
-#: add_route_dialog.cc:162
-msgid "Insert:"
-msgstr "Insert:"
-
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
-msgid "Audio"
-msgstr "Audio"
-
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
-msgid "MIDI"
-msgstr "MIDI"
-
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
-msgid "Audio+MIDI"
-msgstr "Audio+MIDI"
-
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
-msgid "Bus"
-msgstr "Bus"
-
-#: add_route_dialog.cc:268
-msgid ""
-"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
-"both audio and MIDI input data\n"
-"\n"
-"If you do not plan to use such a plugin, then use a normal audio or MIDI "
-"track instead."
-msgstr ""
-"Audio+MIDI Spuren sind <b>NUR</b> für den Gebrauch mit Plugins gedacht, die "
-"sowohl Audio als auch MIDI Eingangsdaten benutzen\n"
-"\n"
-"Falls Sie nicht vorhaben, so ein Plugin zu benutzen, verwenden Sie "
-"stattdessen eine normale Audio- oder MIDI-Spur"
-
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:420
-#: editor_rulers.cc:251 time_axis_view.cc:1374
-msgid "Normal"
-msgstr "Normal"
-
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
-msgid "Non Layered"
-msgstr "Non Layered"
-
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
-msgid "Tape"
-msgstr "Band"
-
-#: add_route_dialog.cc:431 monitor_section.cc:290
-msgid "Mono"
-msgstr "Mono"
-
-#: add_route_dialog.cc:435
-msgid "Stereo"
-msgstr "Stereo"
-
-#: add_route_dialog.cc:459
-msgid "3 Channel"
-msgstr "3 Kanäle"
-
-#: add_route_dialog.cc:463
-msgid "4 Channel"
-msgstr "4 Kanäle"
-
-#: add_route_dialog.cc:467
-msgid "5 Channel"
-msgstr "5 Kanäle"
-
-#: add_route_dialog.cc:471
-msgid "6 Channel"
-msgstr "6 Kanäle"
-
-#: add_route_dialog.cc:475
-msgid "8 Channel"
-msgstr "8 Kanäle"
-
-#: add_route_dialog.cc:479
-msgid "12 Channel"
-msgstr "12 Kanäle"
-
-#: add_route_dialog.cc:483 mixer_strip.cc:1843 mixer_strip.cc:2251
-msgid "Custom"
-msgstr "Benutzerdefiniert"
-
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
-msgid "New Group..."
-msgstr "Neue Gruppe..."
-
-#: add_route_dialog.cc:520 route_group_menu.cc:85
-msgid "No Group"
-msgstr "Keine Gruppe"
-
-#: ambiguous_file_dialog.cc:30
-msgid "Ambiguous File"
-msgstr "Mehrmals gefundene Datei"
-
-#: ambiguous_file_dialog.cc:35
-msgid ""
-"%1 has found the file <i>%2</i> in the following places:\n"
-"\n"
-msgstr ""
-"%1 hat die Datei <i>%2</i> an den folgenden Orten gefunden:\n"
-"\n"
-
-#: ambiguous_file_dialog.cc:44
-msgid ""
-"\n"
-"\n"
-"Please select the path that you want to get the file from."
-msgstr ""
-"\n"
-"\n"
-"Bitte wähle den Pfad der gewünschten Datei aus."
-
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
-msgid "Done"
-msgstr "Fertig"
-
-#: analysis_window.cc:46
-msgid "Signal source"
-msgstr "Signalquelle"
-
-#: analysis_window.cc:47
-msgid "Selected ranges"
-msgstr "Ausgewählte Bereiche"
-
-#: analysis_window.cc:48
-msgid "Selected regions"
-msgstr "Ausgewählte Regionen"
-
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Anzeigetyp"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "Graphen für jede Spur einzeln"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "Graphen aller Spuren zusammenfassen"
-
-#: analysis_window.cc:54
-msgid "Show frequency power range"
-msgstr "Leistungsspektrum anzeigen"
-
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normalisieren"
-
-#: analysis_window.cc:59
-msgid "FFT analysis window"
-msgstr "FFT-Analysefenster"
-
-#: analysis_window.cc:60 editor.cc:1823
-msgid "Spectral Analysis"
-msgstr "FFT-Analyse"
-
-#: analysis_window.cc:67 editor_actions.cc:142 session_metadata_dialog.cc:667
-msgid "Track"
-msgstr "Spur"
-
-#: analysis_window.cc:68 editor_actions.cc:646 mixer_ui.cc:131
-#: mixer_ui.cc:1854
-msgid "Show"
-msgstr "Anzeigen"
-
-#: analysis_window.cc:135
-msgid "Re-analyze data"
-msgstr "Daten erneut analysieren"
-
-#: ardour_button.cc:1116
-msgid "button cannot watch state of non-existing Controllable\n"
-msgstr ""
-"Schaltfläche kann den Status des nichtexistenten Kontrollzieles nicht "
-"verfolgen\n"
-
-#: ardour_button.cc:1384
-msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-
-#: ardour_ui.cc:164
-msgid ""
-"%1 %2.x has discovered configuration files from %1 %3.x.\n"
-"\n"
-"Would you like these files to be copied and used for %1 %2.x?\n"
-"\n"
-"(This will require you to restart %1.)"
-msgstr ""
-"%1 %2.x hat Konfigurationsdateien von %1 %3.x gefunden.\n"
-"\n"
-"Möchten Sie diese Dateien zur Benutzung von %1 %2.x kopieren?\n"
-"\n"
-"(Dies erfordert einen Neustart von %1.)"
-
-#: ardour_ui.cc:216 editor_actions.cc:640 region_editor.cc:51
-msgid "Audition"
-msgstr "Vorhören"
-
-#: ardour_ui.cc:217 editor_actions.cc:136 mixer_strip.cc:2023
-#: monitor_section.cc:357 rc_option_editor.cc:1959 route_time_axis.cc:252
-#: route_time_axis.cc:2707
-msgid "Solo"
-msgstr "Solo"
-
-#: ardour_ui.cc:218 rc_option_editor.cc:741
-msgid "Feedback"
-msgstr "Feedback"
-
-#: ardour_ui.cc:224 speaker_dialog.cc:36
-msgid "Speaker Configuration"
-msgstr "Lautsprechereinstellung"
-
-#: ardour_ui.cc:225 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Tastaturkürzel"
-
-#: ardour_ui.cc:226
-msgid "Preferences"
-msgstr "Globale Einstellungen"
-
-#: ardour_ui.cc:227 ardour_ui.cc:234
-msgid "Add Tracks/Busses"
-msgstr "Spuren/Busse hinzufügen"
-
-#: ardour_ui.cc:228
-msgid "About"
-msgstr "Über..."
-
-#: ardour_ui.cc:229 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "Dateiorte"
-
-#: ardour_ui.cc:230 route_params_ui.cc:59 route_params_ui.cc:630
-msgid "Tracks and Busses"
-msgstr "Spuren/Busse"
-
-#: ardour_ui.cc:231 engine_dialog.cc:70
-msgid "Audio/MIDI Setup"
-msgstr "Audio/MIDI Einstellungen"
-
-#: ardour_ui.cc:232
-msgid "Video Export Dialog"
-msgstr "Videoexport-Dialog"
-
-#: ardour_ui.cc:233
-msgid "Properties"
-msgstr "Projekteinstellungen"
-
-#: ardour_ui.cc:235 bundle_manager.cc:264
-msgid "Bundle Manager"
-msgstr "Bundle Manager"
-
-#: ardour_ui.cc:236 big_clock_window.cc:37
-msgid "Big Clock"
-msgstr "Große Zeitanzeige"
-
-#: ardour_ui.cc:237
-msgid "Audio Connections"
-msgstr "Audio-Verbindungen"
-
-#: ardour_ui.cc:238
-msgid "MIDI Connections"
-msgstr "MIDI-Verbindungen"
-
-#: ardour_ui.cc:247
-msgid "Your configuration files were copied. You can now restart %1."
-msgstr ""
-"Ihre Konfigurationsdateien wurden kopiert. Sie können jetzt %1 neu starten."
-
-#: ardour_ui.cc:486
-msgid ""
-"The audio backend was shutdown because:\n"
-"\n"
-"%1"
-msgstr ""
-"Das Audiobackend wurde aus folgendem Grund beendet:\n"
-"\n"
-"%1"
-
-#: ardour_ui.cc:488
-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 hat\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:512
-msgid ""
-"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
-"Please see the log window for further details."
-msgstr ""
-"Audio Unit Plugin Scan fehlgeschlagen. Automatische AU Scans wurden "
-"deaktiviert. Weitere Einzelheiten finden Sie im Logfenster."
-
-#: ardour_ui.cc:513
-msgid "Audio Unit Plugin Scan Failed:"
-msgstr "Audio Unit Plugin Scan fehlgeschlagen:"
-
-#: ardour_ui.cc:833
-msgid "NSM server did not announce itself"
-msgstr "Der NSM Server hat sich nicht angemeldet"
-
-#: ardour_ui.cc:846
-msgid "NSM: no client ID provided"
-msgstr "NSM: keine Client-ID verfügbar"
-
-#: ardour_ui.cc:853
-msgid "NSM: no session created"
-msgstr "NSM: kein Projekt erzeugt"
-
-#: ardour_ui.cc:876
-msgid "NSM: initialization failed"
-msgstr "NSM: Initialisierung gescheitert"
-
-#: ardour_ui.cc:906
-msgid "Free/Demo Version Warning"
-msgstr "Demoversionswarnung"
-
-#: ardour_ui.cc:908
-msgid "Subscribe and support development of %1"
-msgstr "%1 abonnieren und die Entwicklung unterstützen"
-
-#: ardour_ui.cc:909
-msgid "Don't warn me about this again"
-msgstr "Nicht noch einmal warnen"
-
-#: ardour_ui.cc:911
-msgid ""
-"<span weight=\"bold\" size=\"large\">%1</span>\n"
-"\n"
-"<b>%2</b>\n"
-"\n"
-"<i>%3</i>\n"
-"\n"
-"%4"
-msgstr ""
-"<span weight=\"bold\" size=\"large\">%1</span>\n"
-"\n"
-"<b>%2</b>\n"
-"\n"
-"<i>%3</i>\n"
-"\n"
-"%4"
-
-#: ardour_ui.cc:912
-msgid "This is a free/demo version of %1"
-msgstr "Dies ist eine freie Demoversion von %1"
-
-#: ardour_ui.cc:913
-msgid "It will not restore OR save any plugin settings"
-msgstr "Sie kann keine Plugin-Einstellungen speichern oder laden"
-
-#: ardour_ui.cc:914
-msgid ""
-"If you load an existing session with plugin settings\n"
-"they will not be used and will be lost."
-msgstr ""
-"Wenn Sie ein existierendes Projekt mit Plugin-Einstellungen laden, werden "
-"diese nicht benutzt und beim Speichern verloren gehen."
-
-#: ardour_ui.cc:916 plugin_ui.cc:569
-msgid ""
-"To get full access to updates without this limitation\n"
-"consider becoming a subscriber for a low cost every month."
-msgstr ""
-"Um vollen Zugriff auf Updates ohne diese Einschränkung zu erhalten, erwägen "
-"Sie, uns durch ein Abonnement mit einem geringen monatlichen Betrag zu "
-"unterstützen."
-
-#: ardour_ui.cc:926
-msgid "Quit now"
-msgstr "Jetzt beenden"
-
-#: ardour_ui.cc:927
-msgid "Continue using %1"
-msgstr "%1 weiterhin benutzen"
-
-#: ardour_ui.cc:960 startup.cc:345
-msgid "%1 is ready for use"
-msgstr "%1 ist nun bereit"
-
-#: ardour_ui.cc:1002
-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"
-"\n"
-"You can view the memory limit with 'ulimit -l', and it is normally "
-"controlled by %2"
-msgstr ""
-"WARNUNG: Ihr System hat eine Begrenzung für die Reservierung von "
-"Arbeitsspeicher eingestellt. Dies könnte dazu führen, dass %1 der Speicher "
-"ausgeht bevor die Systembegrenzung erreicht ist.\n"
-"\n"
-"Sie können die Speicherbegrenzung mit 'ulimit -l' einsehen und normalerweise "
-"in %2 verändern."
-
-#: ardour_ui.cc:1019
-msgid "Do not show this window again"
-msgstr "Diese Meldung nicht erneut anzeigen"
-
-#: ardour_ui.cc:1063
-msgid "Don't quit"
-msgstr "Abbrechen"
-
-#: ardour_ui.cc:1064
-msgid "Just quit"
-msgstr "Beenden ohne zu speichern"
-
-#: ardour_ui.cc:1065 ardour_ui.cc:4734
-msgid "Save and quit"
-msgstr "Speichern und beenden"
-
-#: ardour_ui.cc:1075
-msgid ""
-"%1 was unable to save your session.\n"
-"\n"
-"If you still wish to quit, please use the\n"
-"\n"
-"\"Just quit\" option."
-msgstr ""
-"%1 konnte das Projekt nicht speichern.\n"
-"
\n"
-"Wenn Sie trotzdem beenden wollen, wählen Sie bitte\n"
-"\n"
-"\"Trotzdem beenden\"."
-
-#: ardour_ui.cc:1125
-msgid "Unsaved Session"
-msgstr "Nicht gespeichertes Projekt"
-
-#: ardour_ui.cc:1146
-msgid ""
-"The session \"%1\"\n"
-"has not been saved.\n"
-"\n"
-"Any changes made this time\n"
-"will be lost unless you save it.\n"
-"\n"
-"What do you want to do?"
-msgstr ""
-"Das Projekt \"%1\"\n"
-"wurde nicht gespeichert.\n"
-"\n"
-"Alle Änderungen werden verloren\n"
-"gehen, wenn Sie es nicht speichern.\n"
-"\n"
-"Wie wollen Sie vorgehen?"
-
-#: ardour_ui.cc:1149
-msgid ""
-"The snapshot \"%1\"\n"
-"has not been saved.\n"
-"\n"
-"Any changes made this time\n"
-"will be lost unless you save it.\n"
-"\n"
-"What do you want to do?"
-msgstr ""
-"Der Schnappschuss \"%1\"\n"
-"wurde nicht gespeichert.\n"
-"\n"
-"Alle Änderungen werden verloren\n"
-"gehen, wenn Sie ihn nicht speichern.\n"
-"\n"
-"Wie wollen Sie vorgehen?"
-
-#: ardour_ui.cc:1163
-msgid "Prompter"
-msgstr "Frage"
-
-#: ardour_ui.cc:1275 ardour_ui.cc:1283
-msgid "Audio: <span foreground=\"red\">none</span>"
-msgstr "Audio: <span foreground=\"red\">Kein</span>"
-
-#: ardour_ui.cc:1287
-#, c-format
-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:1291
-#, c-format
-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:1309 export_video_dialog.cc:80
-msgid "File:"
-msgstr "Datei:"
-
-#: ardour_ui.cc:1313
-msgid "BWF"
-msgstr "BWF"
-
-#: ardour_ui.cc:1316
-msgid "WAV"
-msgstr "WAV"
-
-#: ardour_ui.cc:1319
-msgid "WAV64"
-msgstr "WAV64"
-
-#: ardour_ui.cc:1322 session_option_editor.cc:185
-msgid "CAF"
-msgstr "CAF"
-
-#: ardour_ui.cc:1325
-msgid "AIFF"
-msgstr "AIFF"
-
-#: ardour_ui.cc:1328
-msgid "iXML"
-msgstr "iXML"
-
-#: ardour_ui.cc:1331
-msgid "RF64"
-msgstr "RF64"
-
-#: ardour_ui.cc:1339
-msgid "32-float"
-msgstr "32-float"
-
-#: ardour_ui.cc:1342
-msgid "24-int"
-msgstr "24-int"
-
-#: ardour_ui.cc:1345
-msgid "16-int"
-msgstr "16-int"
-
-#: ardour_ui.cc:1364
-#, c-format
-msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
-msgstr "DSP: <span foreground=\"%s\">%5.1f%%</span>"
-
-#: ardour_ui.cc:1383
-#, c-format
-msgid ""
-"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
-"%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
-"\">%<PRIu32>%%</span>"
-msgstr ""
-"Puffer: <span foreground=\"green\">p:</span><span foreground=\"%s\">%<PRIu32>"
-"%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s\">"
-"%<PRIu32>%%</span>"
-
-#: ardour_ui.cc:1424
-msgid "Disk: <span foreground=\"green\">Unknown</span>"
-msgstr "Disk: <span foreground=\"green\">Unbekannt</span>"
-
-#: ardour_ui.cc:1426
-msgid "Disk: <span foreground=\"green\">24hrs+</span>"
-msgstr "Disk: <span foreground=\"green\">24h+</span>"
-
-#: ardour_ui.cc:1444
-msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
-msgstr "Disk: <span foreground=\"green\">>24 h</span>"
-
-#: ardour_ui.cc:1455
-#, c-format
-msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
-msgstr "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
-
-#: ardour_ui.cc:1481
-#, c-format
-msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
-msgstr "TC: <span foreground=\"%s\">%s</span>"
-
-#: ardour_ui.cc:1602 ardour_ui.cc:1611 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Zuletzt verwendete Projekte"
-
-#: ardour_ui.cc:1690
-msgid ""
-"%1 is not connected to any audio backend.\n"
-"You cannot open or close sessions in this condition"
-msgstr ""
-"%1 ist derzeit mit keinem Audiobackend verbunden.\n"
-"Daher können keine Projekte geöffnet oder geschlossen werden."
-
-#: ardour_ui.cc:1714
-msgid "Open Session"
-msgstr "Projekt öffnen"
-
-#: ardour_ui.cc:1739 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
-msgid "%1 sessions"
-msgstr "%1 Projekte"
-
-#: ardour_ui.cc:1776
-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:1784
-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:1790 ardour_ui.cc:1851
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-"Es sind nicht genügend Ports verfügbar,\n"
-"um neue Spuren oder Busse zu erzeugen.\n"
-"Sie sollten %1 sichern, beenden und\n"
-" mit mehr Ports neustarten."
-
-#: ardour_ui.cc:1825
-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:1834
-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:1843
-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:1996
-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."
-msgstr ""
-"Bitte fügen Sie, bevor Sie aufnehmen, mindestens \n"
-"eine oder mehrere Spur hinzu. Die geht über \"Spur/Bus hinzufügen\"\n"
-"im Menüpunkt Projekt."
-
-#: ardour_ui.cc:2382
-msgid "Save as..."
-msgstr "Speichern unter..."
-
-#: ardour_ui.cc:2383 ardour_ui.cc:2462
-msgid "New session name"
-msgstr "Neuer Projektname"
-
-#: ardour_ui.cc:2385
-msgid "Take Snapshot"
-msgstr "Schnappschuss machen"
-
-#: ardour_ui.cc:2386
-msgid "Name of new snapshot"
-msgstr "Name für neuen Schnappschuss"
-
-#: ardour_ui.cc:2411
-msgid ""
-"To ensure compatibility with various systems\n"
-"snapshot names may not contain a '%1' character"
-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:2423
-msgid "Confirm Snapshot Overwrite"
-msgstr "Überschreiben des Schnappschusses bestätigen"
-
-#: ardour_ui.cc:2424
-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:2427 utils_videotl.cc:74
-msgid "Overwrite"
-msgstr "Überschreiben"
-
-#: ardour_ui.cc:2461
-msgid "Rename Session"
-msgstr "Projekt umbenennen"
-
-#: ardour_ui.cc:2476 ardour_ui.cc:2890 ardour_ui.cc:2928
-msgid ""
-"To ensure compatibility with various systems\n"
-"session names may not contain a '%1' character"
-msgstr ""
-"Um die Kompatibilität mit verschiedenen Systemen sicher zu stellen,\n"
-"dürfen Projektnamen kein '%1'-Zeichen enthalten"
-
-#: ardour_ui.cc:2484
-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:2493
-msgid ""
-"Renaming this session failed.\n"
-"Things could be seriously messed up at this point"
-msgstr ""
-"Das Umbenennen des Projekts ist fehlgeschlagen.\n"
-"Dies könnte auf schwerwiegende Probleme hinweisen."
-
-#: ardour_ui.cc:2608
-msgid "Save Template"
-msgstr "Als Vorlage Speichern"
-
-#: ardour_ui.cc:2609
-msgid "Name for template:"
-msgstr "Name für Vorlage"
-
-#: ardour_ui.cc:2610
-msgid "-template"
-msgstr "-Vorlage"
-
-#: ardour_ui.cc:2647
-msgid ""
-"This session\n"
-"%1\n"
-"already exists. Do you want to open it?"
-msgstr ""
-"Dieses Projekt\n"
-"%1\n"
-"existiert bereits. Wollen Sie es öffnen?"
-
-#: ardour_ui.cc:2657
-msgid "Open Existing Session"
-msgstr "Vorhandenes Projekt öffnen"
-
-#: ardour_ui.cc:2918
-msgid "There is no existing session at \"%1\""
-msgstr "Es gibt kein Projekt in: \"%1\""
-
-#: ardour_ui.cc:3010
-msgid "Please wait while %1 loads your session"
-msgstr "Bitte warten Sie, während %1 das Projekt lädt"
-
-#: ardour_ui.cc:3025
-msgid "Port Registration Error"
-msgstr "Fehler bei der Registrierung von Ports"
-
-#: ardour_ui.cc:3026
-msgid "Click the Close button to try again."
-msgstr "Klicken Sie auf Schließen, um es erneut zu versuchen."
-
-#: ardour_ui.cc:3047
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "Projekt \"%1 (Schnappschuss %2)\" konnte nicht geladen werden."
-
-#: ardour_ui.cc:3053
-msgid "Loading Error"
-msgstr "Fehler beim Laden"
-
-#: ardour_ui.cc:3072
-msgid ""
-"This session has been opened in read-only mode.\n"
-"\n"
-"You will not be able to record or save."
-msgstr ""
-"Dieses Projekt wurde im Nur-Lesen Modus geöffnet.\n"
-"\n"
-"Aufnehmen oder Speichern wird nicht möglich sein."
-
-#: ardour_ui.cc:3077
-msgid "Read-only Session"
-msgstr "Schreibgeschütztes Projekt"
-
-#: ardour_ui.cc:3143
-msgid "Could not create session in \"%1\""
-msgstr "Konnte kein Projekt in \"%1\" anlegen"
-
-#: ardour_ui.cc:3292
-msgid "No files were ready for clean-up"
-msgstr "Keine Audiodateien zum Aufräumen vorhanden"
-
-#: ardour_ui.cc:3296 ardour_ui.cc:3306 ardour_ui.cc:3439 ardour_ui.cc:3446
-#: ardour_ui_ed.cc:103
-msgid "Clean-up"
-msgstr "Aufräumen"
-
-#: ardour_ui.cc:3297
-msgid ""
-"If this seems suprising, \n"
-"check for any existing snapshots.\n"
-"These may still include regions that\n"
-"require some unused files to continue to exist."
-msgstr ""
-"Falls trotzdem nicht benötigte Dateien\n"
-"existieren, welche hier nicht erkannt werden,\n"
-"sind sie wahrscheinlich noch in einem\n"
-"älteren Schnappschuss als Region eingebunden."
-
-#: ardour_ui.cc:3356
-msgid "kilo"
-msgstr "kilo"
-
-#: ardour_ui.cc:3359
-msgid "mega"
-msgstr "mega"
-
-#: ardour_ui.cc:3362
-msgid "giga"
-msgstr "giga"
-
-#: ardour_ui.cc:3367
-msgid ""
-"The following file was deleted from %2,\n"
-"releasing %3 %4bytes of disk space"
-msgid_plural ""
-"The following %1 files were deleted from %2,\n"
-"releasing %3 %4bytes of disk space"
-msgstr[0] ""
-"Die folgende Datei wurde von %2\n"
-"gelöscht und gab %3 %4bytes Speicherplatz frei"
-msgstr[1] ""
-"Die folgenden %1 Dateien wurden von %2\n"
-"gelöscht und gaben %3 %4bytes Speicherplatz frei"
-
-#: ardour_ui.cc:3374
-msgid ""
-"The following file was not in use and \n"
-"has been moved to: %2\n"
-"\n"
-"After a restart of %5\n"
-"\n"
-"<span face=\"mono\">Session -> Clean-up -> Flush Wastebasket</span>\n"
-"\n"
-"will release an additional %3 %4bytes of disk space.\n"
-msgid_plural ""
-"The following %1 files were not in use and \n"
-"have been moved to: %2\n"
-"\n"
-"After a restart of %5\n"
-"\n"
-"<span face=\"mono\">Session -> Clean-up -> Flush Wastebasket</span>\n"
-"\n"
-"will release an additional %3 %4bytes of disk space.\n"
-msgstr[0] ""
-"Die folgende Datei wurde nicht benutzt\n"
-"und wurde nach %2 verschoben.\n"
-"\n"
-"Nach einem Neustart von %5 kann über\n"
-"\n"
-"<span face=\"mono\">Projekt -> Aufräumen -> Mülleimer leeren</span>\n"
-"\n"
-"%3 %4bytes Speicherplatz freigegeben werden.\n"
-msgstr[1] ""
-"Die folgenden %1 Dateien waren unbenutzt\n"
-"und wurden nach %2 verschoben.\n"
-"\n"
-"Nach einem Neustart von %5 kann über\n"
-"\n"
-"<span face=\"mono\">Projekt -> Aufräumen -> Mülleimer leeren</span>\n"
-"\n"
-"%3 %4bytes Speicherplatz freigegeben werden.\n"
-
-#: ardour_ui.cc:3434
-msgid "Are you sure you want to clean-up?"
-msgstr "Wollen Sie wirklich aufräumen?"
-
-#: ardour_ui.cc:3441
-msgid ""
-"Clean-up is a destructive operation.\n"
-"ALL undo/redo information will be lost if you clean-up.\n"
-"Clean-up will move all unused files to a \"dead\" location."
-msgstr ""
-"Das Aufräumen ist eine destruktive Operation.\n"
-"SÄMTLICHE Wiederherstellungsinformationen gehen verloren, wenn Sie "
-"aufräumen.\n"
-"Nach dem Aufräumen werden alle nicht benötigten Audiodateien in den \"dead "
-"sounds\" Ordner verschoben."
-
-#: ardour_ui.cc:3449
-msgid "CleanupDialog"
-msgstr "Aufräumdialog"
-
-#: ardour_ui.cc:3479
-msgid "Cleaned Files"
-msgstr "Aufgeräumte Dateien"
-
-#: ardour_ui.cc:3496
-msgid "deleted file"
-msgstr "gelöschte Datei"
-
-#: ardour_ui.cc:3641
-msgid "Video-Server was not launched by %1. The request to stop it is ignored."
-msgstr ""
-"Der Video-Server wurde nicht von %1 gestartet. Die Aufforderung ihn zu "
-"beenden wird ignoriert."
-
-#: ardour_ui.cc:3645
-msgid "Stop Video-Server"
-msgstr "Video-Server anhalten"
-
-#: ardour_ui.cc:3646
-msgid "Do you really want to stop the Video Server?"
-msgstr "Wollen Sie den Video-Server wirklich anhalten?"
-
-#: ardour_ui.cc:3649
-msgid "Yes, Stop It"
-msgstr "Ja, anhalten."
-
-#: ardour_ui.cc:3675
-msgid "The Video Server is already started."
-msgstr "Der Video-Server läuft bereits"
-
-#: ardour_ui.cc:3677
-msgid ""
-"An external Video Server is configured and can be reached. Not starting a "
-"new instance."
-msgstr ""
-"Ein externer Video-Server wurde konfiguriert, ist aber nicht erreichbar. Es "
-"wird keine neue Instanz gestartet."
-
-#: ardour_ui.cc:3685 ardour_ui.cc:3790
-msgid ""
-"Could not connect to the Video Server. Start it or configure its access URL "
-"in Preferences."
-msgstr ""
-"Es konnte keine Verbindung zum Video-Server hergestellt werden.Sie müssen "
-"ihn vorher starten oder die URL für den Zugriff in den Einstellungen "
-"anpassen."
-
-#: ardour_ui.cc:3715
-msgid "Specified docroot is not an existing directory."
-msgstr "Das eingestellte Dokumentenverzeichnis existiert nicht."
-
-#: ardour_ui.cc:3721 ardour_ui.cc:3727
-msgid "Given Video Server is not an executable file."
-msgstr "Der eingestellte Video-Server ist keine ausführbare Datei."
-
-#: ardour_ui.cc:3761
-msgid "Cannot launch the video-server"
-msgstr "Kann den Videoserver nicht starten "
-
-#: ardour_ui.cc:3771
-msgid "Video-server was started but does not respond to requests..."
-msgstr "Viideoserver wurde gestartet, reagiert aber nicht auf Anfragen..."
-
-#: ardour_ui.cc:3816 editor_audio_import.cc:641
-msgid "could not open %1"
-msgstr "Konnte %1 nicht öffnen"
-
-#: ardour_ui.cc:3820
-msgid "no video-file selected"
-msgstr "Es wurde keine Videodatei ausgewählt."
-
-#: ardour_ui.cc:4018
-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:4047
-msgid ""
-"The disk system on your computer\n"
-"was not able to keep up with %1.\n"
-"\n"
-"Specifically, it failed to write data to disk\n"
-"quickly enough to keep up with recording.\n"
-msgstr ""
-"Ihre Festplatte war nicht schnell genug,\n"
-"um %1 zu folgen.\n"
-"\n"
-"Die Daten konnten nicht schnell genug geschrieben\n"
-"werden, um die Aufnahme fortzuführen.\n"
-
-#: ardour_ui.cc:4117
-msgid "Scanning for plugins"
-msgstr "Suche nach Plugins"
-
-#: ardour_ui.cc:4119
-msgid "Cancel plugin scan"
-msgstr "Plugin-Suche abbrechen"
-
-#: ardour_ui.cc:4128
-msgid "Stop Timeout"
-msgstr "Stopp-Timeout"
-
-#: ardour_ui.cc:4135
-msgid "Scan Timeout"
-msgstr "Such-Timeout"
-
-#: ardour_ui.cc:4178
-msgid ""
-"The disk system on your computer\n"
-"was not able to keep up with %1.\n"
-"\n"
-"Specifically, it failed to read data from disk\n"
-"quickly enough to keep up with playback.\n"
-msgstr ""
-"Ihre Festplatte war nicht schnell genug,\n"
-"um %1 zu folgen.\n"
-"\n"
-"Die Daten konnten nicht schnell genug gelesen\n"
-"werden, um die Wiedergabe aufrechtzuerhalten.\n"
-
-#: ardour_ui.cc:4218
-msgid "Crash Recovery"
-msgstr "Absturz-Wiederherstellung"
-
-#: ardour_ui.cc:4219
-msgid ""
-"This session appears to have been in the\n"
-"middle of recording when %1 or\n"
-"the computer was shutdown.\n"
-"\n"
-"%1 can recover any captured audio for\n"
-"you, or it can ignore it. Please decide\n"
-"what you would like to do.\n"
-msgstr ""
-"Es scheint, dass dieses Projekt während\n"
-"einer Aufnahme abgebrochen oder\n"
-"geschlossen wurde.\n"
-"\n"
-"%1 kann die aufgenommenen Audiodaten\n"
-"für Sie wiederherstellen oder sie verwerfen.\n"
-"Bitte entscheiden Sie, wie Sie vorgehen möchten.\n"
-
-#: ardour_ui.cc:4231
-msgid "Ignore crash data"
-msgstr "Daten verwerfen"
-
-#: ardour_ui.cc:4232
-msgid "Recover from crash"
-msgstr "Daten wiederherstellen"
-
-#: ardour_ui.cc:4252
-msgid "Sample Rate Mismatch"
-msgstr "Samplerate passt nicht"
-
-#: ardour_ui.cc:4253
-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"
-"audio may be played at the wrong sample rate.\n"
-msgstr ""
-"Dieses Projekt wurde mit einer Samplerate von %1 Hz erstellt.\n"
-"\n"
-"%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:4262
-msgid "Do not load session"
-msgstr "Projekt nicht laden"
-
-#: ardour_ui.cc:4263
-msgid "Load session anyway"
-msgstr "Projekt trotzdem laden"
-
-#: ardour_ui.cc:4290
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr "Konnte Verbindung mit der Audio/MIDI Engine nicht trennen"
-
-#: ardour_ui.cc:4307 ardour_ui.cc:4310
-msgid "Could not reconnect to the Audio/MIDI engine"
-msgstr "Konnte nicht zur Audio/MIDI Engine wiederverbinden"
-
-#: ardour_ui.cc:4594
-msgid ""
-"%4This is a session from an older version of %3%5\n"
-"\n"
-"%3 has copied the old session file\n"
-"\n"
-"%6%1%7\n"
-"\n"
-"to\n"
-"\n"
-"%6%2%7\n"
-"\n"
-"From now on, use the -2000 version with older versions of %3"
-msgstr ""
-"%4Dies ist ein Projekt, das mit einer älteren Version von %3 erstellt wurde"
-"%5\n"
-"\n"
-"%3 hat die alte Projektdatei\n"
-"\n"
-"%6%1%7\n"
-"\n"
-"nach\n"
-"\n"
-"%6%2%7 kopiert.\n"
-"\n"
-"Benutzen Sie von nun an die -2000 Version mit älteren Versionen von %3"
-
-#: ardour_ui.cc:4703
-msgid "This is a free/demo copy of %1. It has just switched to silent mode."
-msgstr ""
-"Dies ist eine freie Demoversion von %1. Sie hat sich gerade stummgeschaltet."
-
-#: ardour_ui.cc:4709
-msgid "%1 is now silent"
-msgstr "%1 ist nun stumm"
-
-#: ardour_ui.cc:4711
-msgid ""
-"Please consider paying for a copy of %1 - you can pay whatever you want."
-msgstr ""
-"Bitte ziehen Sie in Erwägung, für eine Kopie von %1 einen Geldbetrag - in "
-"beliebiger Höhe - zu zahlen."
-
-#: ardour_ui.cc:4712
-msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
-msgstr ""
-"Besser noch, werden Sie ein Abonnent - Abonnements beginnen bei US$1 pro "
-"Monat."
-
-#: ardour_ui.cc:4713
-msgid "Pay for a copy (via the web)"
-msgstr "Für eine Kopie zahlen (über das WWW)"
-
-#: ardour_ui.cc:4714
-msgid "Become a subscriber (via the web)"
-msgstr "Abonnent werden (über das Web)"
-
-#: ardour_ui.cc:4733
-msgid "Remain silent"
-msgstr "Stumm bleiben"
-
-#: ardour_ui.cc:4735
-msgid "Give me more time"
-msgstr "Ich möchte mehr Zeit haben"
-
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "Der Editor konnte nicht initialisiert werden."
-
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "Der Mixer konnte nicht initialisiert werden."
-
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
-msgstr "UI: konnte Meterbridge nicht einrichten."
-
-#: ardour_ui2.cc:128
-msgid "Play from playhead"
-msgstr "Wiedergabe ab Positionszeiger"
-
-#: ardour_ui2.cc:129
-msgid "Stop playback"
-msgstr "Wiedergabe anhalten"
-
-#: ardour_ui2.cc:130
-msgid "Toggle record"
-msgstr "Aufnahme aktivieren"
-
-#: ardour_ui2.cc:131
-msgid "Play range/selection"
-msgstr "Bereich/Auswahl wiedergeben"
-
-#: ardour_ui2.cc:132
-msgid "Go to start of session"
-msgstr "Zum Anfang des Projekts springen"
-
-#: ardour_ui2.cc:133
-msgid "Go to end of session"
-msgstr "Zum Ende des Projekts springen"
-
-#: ardour_ui2.cc:134
-msgid "Play loop range"
-msgstr "Schleife wiedergeben"
-
-#: ardour_ui2.cc:135
-msgid ""
-"MIDI Panic\n"
-"Send note off and reset controller messages on all MIDI channels"
-msgstr ""
-"MIDI Panic\n"
-"Schalte auf allen Midikanälen die Notensignale aus und setzte alle MIDI-"
-"Controller zurück"
-
-#: ardour_ui2.cc:136
-msgid "Return to last playback start when stopped"
-msgstr "Bei Stopp zum letzten Wiedergabepunkt springen"
-
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
-msgstr "Positionszeiger folgt Auswahl und Editierungen"
-
-#: ardour_ui2.cc:138
-msgid "Be sensible about input monitoring"
-msgstr "Automatisches Input Monitoring aktivieren"
-
-#: ardour_ui2.cc:139
-msgid "Enable/Disable audio click"
-msgstr "Aktiviert/Deaktiviert Klick"
-
-#: ardour_ui2.cc:140 monitor_section.cc:111
-msgid ""
-"When active, something is soloed.\n"
-"Click to de-solo everything"
-msgstr ""
-"Wenn aktiv, ist etwas auf Solo geschalten.\n"
-"Klick schaltet Solo überall aus."
-
-#: ardour_ui2.cc:141
-msgid ""
-"When active, auditioning is taking place\n"
-"Click to stop the audition"
-msgstr ""
-"Wird beim Vorhören aktiv.\n"
-"Klicken stoppt das Vorhören."
-
-#: ardour_ui2.cc:142
-msgid "When active, there is a feedback loop."
-msgstr "Wenn aktiv, gibt es eine Rückkopplungsschleife."
-
-#: ardour_ui2.cc:143
-msgid ""
-"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
-"+drag a digit or mouse-over+scroll wheel to modify.\n"
-"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: "
-"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
-msgstr ""
-"<b>Primäre Uhr</b> Rechtsklick um Anzeigemodus zu setzen. Klick zum "
-"Bearbeiten, Klick+Mausbewegung auf eine Ziffer oder Maus-Über+Scrollrad zum "
-"Ändern.\n"
-"Text editieren: überschreibt von rechts nach links <tt>Esc</tt>: Abbruch; "
-"<tt>Eingabe</tt>: Bestätige; hänge '+' or '-' an, um Deltazeiten "
-"einzugeben.\n"
-
-#: ardour_ui2.cc:144
-msgid ""
-"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
-"+drag a digit or mouse-over+scroll wheel to modify.\n"
-"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: "
-"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
-msgstr ""
-"<b>Sekundäre Uhr</b> Rechtsklick um Anzeigemodus zu setzen. Klick zum "
-"Bearbeiten, Klick+Mausbewegung auf eine Ziffer oder Maus-Über+Scrollrad zum "
-"Ändern.\n"
-"Text editieren: überschreibt von rechts nach links <tt>Esc</tt>: Abbruch; "
-"<tt>Eingabe</tt>: Bestätige; hänge '+' or '-' an, um Deltazeiten "
-"einzugeben.\n"
-
-#: ardour_ui2.cc:145
-msgid "Reset All Peak Indicators"
-msgstr "Alle Spitzenwertanzeigen zurücksetzen"
-
-#: ardour_ui2.cc:146
-msgid "Show Error Log and acknowledge warnings"
-msgstr "Zeige Fehlermeldungen und bestätige Warnungen"
-
-#: ardour_ui2.cc:179
-msgid "[ERROR]: "
-msgstr "[FEHLER]:"
-
-#: ardour_ui2.cc:182
-msgid "[WARNING]: "
-msgstr "[WARNUNG]:"
-
-#: ardour_ui2.cc:185
-msgid "[INFO]: "
-msgstr "[INFO]: "
-
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
-msgid "Auto Return"
-msgstr "Auto Return"
-
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
-msgid "Follow Edits"
-msgstr "Folge Bearbeitungen"
-
-#: ardour_ui2.cc:728 rc_option_editor.cc:2300
-msgid "GUI"
-msgstr "GUI"
-
-#: ardour_ui2.cc:745 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
-msgid "Misc"
-msgstr "Allgemein"
-
-#: ardour_ui_dependents.cc:76
-msgid "Setup Editor"
-msgstr "Editor laden"
-
-#: ardour_ui_dependents.cc:78
-msgid "Setup Mixer"
-msgstr "Mixer laden"
-
-#: ardour_ui_dependents.cc:84
-msgid "Reload Session History"
-msgstr "Projekt-Aktionsverlauf laden"
-
-#: ardour_ui_dialogs.cc:250
-msgid "Don't close"
-msgstr "Abbrechen"
-
-#: ardour_ui_dialogs.cc:251
-msgid "Just close"
-msgstr "Ohne speichern schließen"
-
-#: ardour_ui_dialogs.cc:252
-msgid "Save and close"
-msgstr "Speichern und schließen"
-
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
-msgstr ""
-"Dieser Bildschirm ist nicht hoch genug, um das Mixerfenster darzustellen"
-
-#: ardour_ui_ed.cc:102
-msgid "Session"
-msgstr "Projekt"
-
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
-msgid "Sync"
-msgstr "Sync"
-
-#: ardour_ui_ed.cc:106
-msgid "Options"
-msgstr "Optionen"
-
-#: ardour_ui_ed.cc:107
-msgid "Window"
-msgstr "Fenster"
-
-#: ardour_ui_ed.cc:108
-msgid "Help"
-msgstr "Hilfe"
-
-#: ardour_ui_ed.cc:109
-msgid "Misc. Shortcuts"
-msgstr "Verschiedenes"
-
-#: ardour_ui_ed.cc:110
-msgid "Audio File Format"
-msgstr "Audio-Dateiformat"
-
-#: ardour_ui_ed.cc:111
-msgid "File Type"
-msgstr "Dateiformat"
-
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
-msgid "Sample Format"
-msgstr "Sampleformat"
-
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
-msgid "Control Surfaces"
-msgstr "Eingabegeräte / Controller"
-
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
-msgid "Plugins"
-msgstr "Plugins"
-
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
-msgid "Metering"
-msgstr "Pegelanzeige"
-
-#: ardour_ui_ed.cc:116
-msgid "Fall Off Rate"
-msgstr "Abfall der Pegelanzeige"
-
-#: ardour_ui_ed.cc:117
-msgid "Hold Time"
-msgstr "Pegelanzeige halten"
-
-#: ardour_ui_ed.cc:118
-msgid "Denormal Handling"
-msgstr "Umgang mit Denormals"
-
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1673
-msgid "New..."
-msgstr "Neu..."
-
-#: ardour_ui_ed.cc:124
-msgid "Open..."
-msgstr "Öffnen..."
-
-#: ardour_ui_ed.cc:125
-msgid "Recent..."
-msgstr "Zuletzt verwendet..."
-
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
-msgid "Close"
-msgstr "Schließen"
-
-#: ardour_ui_ed.cc:129
-msgid "Add Track or Bus..."
-msgstr "Spur/Bus hinzufügen..."
-
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
-msgstr "Video öffnen"
-
-#: ardour_ui_ed.cc:137
-msgid "Remove Video"
-msgstr "Video entfernen"
-
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
-msgstr "Exportiere Videodatei"
-
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "Schnappschuss..."
-
-#: ardour_ui_ed.cc:148
-msgid "Save As..."
-msgstr "Speichern unter..."
-
-#: ardour_ui_ed.cc:152 editor_actions.cc:1769 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1521 route_time_axis.cc:1669
-msgid "Rename..."
-msgstr "Umbenennen..."
-
-#: ardour_ui_ed.cc:156
-msgid "Save Template..."
-msgstr "Als Vorlage Speichern..."
-
-#: ardour_ui_ed.cc:159
-msgid "Metadata"
-msgstr "Metadaten"
-
-#: ardour_ui_ed.cc:162
-msgid "Edit Metadata..."
-msgstr "Metadaten bearbeiten..."
-
-#: ardour_ui_ed.cc:165
-msgid "Import Metadata..."
-msgstr "Metadaten importieren..."
-
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
-msgstr "Exportiere Audiodatei(en)..."
-
-#: ardour_ui_ed.cc:171
-msgid "Stem export..."
-msgstr "Stems exportieren..."
-
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65
-#: export_channel_selector.cc:182 export_channel_selector.cc:564
-#: export_dialog.cc:129 export_video_dialog.cc:84
-msgid "Export"
-msgstr "Exportieren"
-
-#: ardour_ui_ed.cc:177
-msgid "Clean-up Unused Sources..."
-msgstr "Nicht benutzte Dateien entfernen..."
-
-#: ardour_ui_ed.cc:181
-msgid "Flush Wastebasket"
-msgstr "Müll leeren"
-
-#: ardour_ui_ed.cc:188
-msgid "Quit"
-msgstr "Beenden"
-
-#: ardour_ui_ed.cc:192
-msgid "Maximise Editor Space"
-msgstr "Editor maximieren"
-
-#: ardour_ui_ed.cc:193
-msgid "Maximise Mixer Space"
-msgstr "Mixerfenster maximieren"
-
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
-msgstr "Zeige Werkzeugleisten"
-
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
-msgstr "Mehr UI-Einstellungen anzeigen"
-
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1925 mixer_ui.cc:1931
-msgid "Window|Mixer"
-msgstr "Mixer"
-
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
-msgstr "Editor+Mixer umschalten"
-
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
-msgid "Window|Meterbridge"
-msgstr "Meterbridge"
-
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr "Alle Abreißmenüs wieder anheften"
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
-msgid "MIDI Tracer"
-msgstr "Midisignale verfolgen"
-
-#: ardour_ui_ed.cc:208
-msgid "Chat"
-msgstr "Chat"
-
-#: ardour_ui_ed.cc:210
-msgid "Help|Manual"
-msgstr "Handbuch"
-
-#: ardour_ui_ed.cc:211
-msgid "Reference"
-msgstr "Referenz"
-
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
-msgstr "Einen Fehler melden"
-
-#: ardour_ui_ed.cc:213
-msgid "Cheat Sheet"
-msgstr "Cheat Sheet"
-
-#: ardour_ui_ed.cc:214
-msgid "Ardour Website"
-msgstr "Ardour Website"
-
-#: ardour_ui_ed.cc:215
-msgid "Ardour Development"
-msgstr "Ardour Entwicklung"
-
-#: ardour_ui_ed.cc:216
-msgid "User Forums"
-msgstr "Userforen"
-
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
-msgstr "Wie man einen Fehler meldet"
-
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
-msgid "Save"
-msgstr "Speichern"
-
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
-msgid "Transport"
-msgstr "Transport"
-
-#: ardour_ui_ed.cc:233
-msgid "Stop"
-msgstr "Stopp"
-
-#: ardour_ui_ed.cc:236
-msgid "Roll"
-msgstr "Wiedergabe"
-
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
-msgid "Start/Stop"
-msgstr "Start/Stopp"
-
-#: ardour_ui_ed.cc:246
-msgid "Start/Continue/Stop"
-msgstr "Start/Stopp"
-
-#: ardour_ui_ed.cc:249
-msgid "Stop and Forget Capture"
-msgstr "Stopp + Aufnahme verwerfen"
-
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
-msgstr "Vorwärts (normal)"
-
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
-msgstr "Rückwärts (normal)"
-
-#: ardour_ui_ed.cc:267
-msgid "Play Loop Range"
-msgstr "Schleife wiedergeben"
-
-#: ardour_ui_ed.cc:270
-msgid "Play Selection"
-msgstr "Auswahl abspielen"
-
-#: ardour_ui_ed.cc:273
-msgid "Play Selection w/Preroll"
-msgstr "Ausgewählten Bereich mit Vorlauf wiedergeben"
-
-#: ardour_ui_ed.cc:277
-msgid "Enable Record"
-msgstr "Aufnahme aktivieren"
-
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
-msgid "Start Recording"
-msgstr "Aufnahme starten"
-
-#: ardour_ui_ed.cc:288
-msgid "Rewind"
-msgstr "Rückwärts (beschleunigen)"
-
-#: ardour_ui_ed.cc:291
-msgid "Rewind (Slow)"
-msgstr "Rückwärts (langsam)"
-
-#: ardour_ui_ed.cc:294
-msgid "Rewind (Fast)"
-msgstr "Rückwärts (schnell)"
-
-#: ardour_ui_ed.cc:297
-msgid "Forward"
-msgstr "Vorwärts (beschleunigen)"
-
-#: ardour_ui_ed.cc:300
-msgid "Forward (Slow)"
-msgstr "Vorwärts (langsam)"
-
-#: ardour_ui_ed.cc:303
-msgid "Forward (Fast)"
-msgstr "Vorwärts (schnell)"
-
-#: ardour_ui_ed.cc:306
-msgid "Go to Zero"
-msgstr "Zum Nullpunkt springen"
-
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
-msgid "Go to Start"
-msgstr "Zum Anfang springen"
-
-#: ardour_ui_ed.cc:315
-msgid "Go to End"
-msgstr "Zum Ende springen"
-
-#: ardour_ui_ed.cc:318
-msgid "Go to Wall Clock"
-msgstr "Zur lokalen Uhrzeit springen"
-
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
-msgid "Numpad Decimal"
-msgstr "Nummernblock Dezimalpunkt"
-
-#: ardour_ui_ed.cc:329
-msgid "Numpad 0"
-msgstr "Nummernblock 0"
-
-#: ardour_ui_ed.cc:332
-msgid "Numpad 1"
-msgstr "Nummernblock 1"
-
-#: ardour_ui_ed.cc:335
-msgid "Numpad 2"
-msgstr "Nummernblock 2"
-
-#: ardour_ui_ed.cc:338
-msgid "Numpad 3"
-msgstr "Nummernblock 3"
-
-#: ardour_ui_ed.cc:341
-msgid "Numpad 4"
-msgstr "Nummernblock 4"
-
-#: ardour_ui_ed.cc:344
-msgid "Numpad 5"
-msgstr "Nummernblock 5"
-
-#: ardour_ui_ed.cc:347
-msgid "Numpad 6"
-msgstr "Nummernblock 6"
-
-#: ardour_ui_ed.cc:350
-msgid "Numpad 7"
-msgstr "Nummernblock 7"
-
-#: ardour_ui_ed.cc:353
-msgid "Numpad 8"
-msgstr "Nummernblock 8"
-
-#: ardour_ui_ed.cc:356
-msgid "Numpad 9"
-msgstr "Nummernblock 9"
-
-#: ardour_ui_ed.cc:360
-msgid "Focus On Clock"
-msgstr "Fokus auf Zeitanzeige setzen"
-
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:567 editor_actions.cc:576 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
-#: session_option_editor.cc:109 session_option_editor.cc:122
-#: session_option_editor.cc:124 session_option_editor.cc:126
-msgid "Timecode"
-msgstr "Timecode"
-
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:565
-msgid "Bars & Beats"
-msgstr "Takte & Schläge"
-
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
-msgid "Minutes & Seconds"
-msgstr "Minuten & Sekunden"
-
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:566
-msgid "Samples"
-msgstr "Samples"
-
-#: ardour_ui_ed.cc:382
-msgid "Punch In"
-msgstr "Punch In"
-
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1826 mixer_strip.cc:2014 route_ui.cc:165
-#: time_info_box.cc:116
-msgid "In"
-msgstr "In"
-
-#: ardour_ui_ed.cc:386
-msgid "Punch Out"
-msgstr "Punch Out"
-
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1838 time_info_box.cc:117
-msgid "Out"
-msgstr "Out"
-
-#: ardour_ui_ed.cc:390
-msgid "Punch In/Out"
-msgstr "Punch In/Out"
-
-#: ardour_ui_ed.cc:391
-msgid "In/Out"
-msgstr "In/Out"
-
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
-msgid "Click"
-msgstr "Klick"
-
-#: ardour_ui_ed.cc:397
-msgid "Auto Input"
-msgstr "Auto Input"
-
-#: ardour_ui_ed.cc:400
-msgid "Auto Play"
-msgstr "Auto Play"
-
-#: ardour_ui_ed.cc:411
-msgid "Sync Startup to Video"
-msgstr "Start mit Video synchronisieren"
-
-#: ardour_ui_ed.cc:413
-msgid "Time Master"
-msgstr "Time Master"
-
-#: ardour_ui_ed.cc:420
-msgid "Toggle Record Enable Track %1"
-msgstr "Aufnahme auf Spur %1 aktivieren"
-
-#: ardour_ui_ed.cc:427
-msgid "Percentage"
-msgstr "Prozent"
-
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
-msgid "Semitones"
-msgstr "Halbtöne"
-
-#: ardour_ui_ed.cc:432
-msgid "Send MTC"
-msgstr "MTC senden"
-
-#: ardour_ui_ed.cc:434
-msgid "Send MMC"
-msgstr "MMC senden"
-
-#: ardour_ui_ed.cc:436
-msgid "Use MMC"
-msgstr "Benutze MMC"
-
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
-msgid "Send MIDI Clock"
-msgstr "MIDI Clock senden"
-
-#: ardour_ui_ed.cc:440
-msgid "Send MIDI Feedback"
-msgstr "MIDI Feedback senden"
-
-#: ardour_ui_ed.cc:446
-msgid "Panic"
-msgstr "Panic"
-
-#: ardour_ui_ed.cc:534
-msgid "Wall Clock"
-msgstr "Uhrzeit"
-
-#: ardour_ui_ed.cc:536
-msgid "Disk Space"
-msgstr "Speicherplatz"
-
-#: ardour_ui_ed.cc:537
-msgid "DSP"
-msgstr "DSP"
-
-#: ardour_ui_ed.cc:538
-msgid "Buffers"
-msgstr "Puffer"
-
-#: ardour_ui_ed.cc:540
-msgid "Timecode Format"
-msgstr "Timecode-Format"
-
-#: ardour_ui_ed.cc:541
-msgid "File Format"
-msgstr "Dateiformat"
-
-#: ardour_ui_options.cc:63
-msgid ""
-"It is not possible to use JACK as the the sync source\n"
-"when the pull up/down setting is non-zero."
-msgstr ""
-"Es ist nicht möglich, JACK als Synchronisationsquelle zu verwenden,\n"
-"wenn die Pull-up/down Einstellung nicht 0 ist."
-
-#: ardour_ui_options.cc:317
-msgid "Internal"
-msgstr "Intern"
-
-#: ardour_ui_options.cc:498
-msgid "Enable/Disable external positional sync"
-msgstr "Aktiviere/Deaktiviere externe Positionssynchronisierung"
-
-#: ardour_ui_options.cc:500
-msgid "Sync to JACK is not possible: video pull up/down is set"
-msgstr "Synchronisation ist nicht möglich: Video pull-up/down ist aktiviert"
-
-#: audio_clock.cc:1047 audio_clock.cc:1066
-msgid "--pending--"
-msgstr "--wartend--"
-
-#: audio_clock.cc:1118
-msgid "SR"
-msgstr "SR"
-
-#: audio_clock.cc:1124 audio_clock.cc:1128
-msgid "Pull"
-msgstr "Ziehen"
-
-#: audio_clock.cc:1126
-#, c-format
-msgid "%+.4f%%"
-msgstr "%+.4f%%"
-
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:559
-msgid "Tempo"
-msgstr "Tempo"
-
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:560
-msgid "Meter"
-msgstr "Taktart"
-
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1087
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
-msgid "programming error: %1"
-msgstr "Programmierfehler: %1"
-
-#: audio_clock.cc:1997 audio_clock.cc:2025
-msgid "programming error: %1 %2"
-msgstr "Programmierfehler: %1 %2"
-
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
-msgid "Bars:Beats"
-msgstr "Takte:Schläge"
-
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
-msgid "Minutes:Seconds"
-msgstr "Minuten:Sekunden"
-
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
-msgstr "Ab Positionszeiger"
-
-#: audio_clock.cc:2100
-msgid "Locate to This Time"
-msgstr "Positionszeiger hierhin setzen"
-
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
-msgid "dB"
-msgstr "dB"
-
-#: audio_region_editor.cc:67
-msgid "Region gain:"
-msgstr "Regionen-Lautstärke:"
-
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
-msgid "dBFS"
-msgstr "dBFS"
-
-#: audio_region_editor.cc:80
-msgid "Peak amplitude:"
-msgstr "Spitzenamplitude"
-
-#: audio_region_editor.cc:91
-msgid "Calculating..."
-msgstr "Berechne..."
-
-#: audio_region_view.cc:1243
-msgid "add gain control point"
-msgstr "Lautstärkekurve bearbeiten"
-
-#: automation_controller.cc:287 automation_controller.cc:303
-msgid "Select Note..."
-msgstr "Note selektieren..."
-
-#: automation_controller.cc:294
-msgid "Halve"
-msgstr "Halbiere"
-
-#: automation_controller.cc:297
-msgid "Double"
-msgstr "Verdopple"
-
-#: automation_controller.cc:308
-msgid "Set to %1 beat"
-msgid_plural "Set to %1 beats"
-msgstr[0] "Setze auf %1 Schlag"
-msgstr[1] "Setze auf %1 Schläge"
-
-#: automation_line.cc:286 automation_line.cc:462
-msgid "automation event move"
-msgstr "Automationspunkt bewegen"
-
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr "Automationsbereich bewegen"
-
-#: automation_line.cc:880 region_gain_line.cc:72
-msgid "remove control point"
-msgstr "Automationspunkt entfernen"
-
-#: automation_line.cc:1003
-msgid "Ignoring illegal points on AutomationLine \"%1\""
-msgstr "Unzulässige Automationspunkte werden ignoriert: \"%1\""
-
-#: automation_region_view.cc:190 automation_time_axis.cc:645
-msgid "add automation event"
-msgstr "Automationspunkt einfügen"
-
-#: automation_streamview.cc:95
-msgid "unable to display automation region for control without list"
-msgstr ""
-"die Automationsspur für diesen Parameter kann ohne Liste nicht dargestellt "
-"werden"
-
-#: automation_time_axis.cc:164
-msgid "automation state"
-msgstr "Automationsmodus"
-
-#: automation_time_axis.cc:165
-msgid "hide track"
-msgstr "Diese Spur verbergen"
-
-#: automation_time_axis.cc:309 automation_time_axis.cc:361
-#: automation_time_axis.cc:555 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
-msgid "Automation|Manual"
-msgstr "Manuell"
-
-#: automation_time_axis.cc:311 automation_time_axis.cc:372
-#: automation_time_axis.cc:560 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1918 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
-#: panner_ui.cc:154
-msgid "Play"
-msgstr "Wiedergabe"
-
-#: automation_time_axis.cc:313 automation_time_axis.cc:383
-#: automation_time_axis.cc:565 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
-msgid "Write"
-msgstr "Schreiben"
-
-#: automation_time_axis.cc:315 automation_time_axis.cc:394
-#: automation_time_axis.cc:570 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
-msgid "Touch"
-msgstr "Ändern"
-
-#: automation_time_axis.cc:405 generic_pluginui.cc:535 meter_patterns.cc:112
-msgid "???"
-msgstr "???"
-
-#: automation_time_axis.cc:446
-msgid "clear automation"
-msgstr "Automation zurücksetzen"
-
-#: automation_time_axis.cc:544 editor_actions.cc:643 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Verbergen"
-
-#: automation_time_axis.cc:546
-msgid "Clear"
-msgstr "Leeren"
-
-#: automation_time_axis.cc:577
-msgid "State"
-msgstr "Automationssmodus"
-
-#: automation_time_axis.cc:593
-msgid "Discrete"
-msgstr "Diskret"
-
-#: automation_time_axis.cc:599 export_format_dialog.cc:485
-msgid "Linear"
-msgstr "Linear"
-
-#: automation_time_axis.cc:605 rhythm_ferret.cc:109 shuttle_control.cc:197
-msgid "Mode"
-msgstr "Modus"
-
-#: bundle_manager.cc:182
-msgid "Disassociate"
-msgstr "Trenne"
-
-#: bundle_manager.cc:186
-msgid "Edit Bundle"
-msgstr "Bundle editieren"
-
-#: bundle_manager.cc:201
-msgid "Direction:"
-msgstr "Richtung:"
-
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:666
-#: mixer_strip.cc:164 mixer_strip.cc:369 mixer_strip.cc:2247
-#: rc_option_editor.cc:2326
-msgid "Input"
-msgstr "Eingang"
-
-#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:668 mixer_strip.cc:168 mixer_strip.cc:373
-#: mixer_strip.cc:2250 rc_option_editor.cc:2330
-msgid "Output"
-msgstr "Ausgang"
-
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
-msgid "Edit"
-msgstr "Bearbeiten"
-
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 plugin_ui.cc:420 processor_box.cc:2458
-msgid "Delete"
-msgstr "Löschen"
-
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
-msgid "Name"
-msgstr "Name"
-
-#: bundle_manager.cc:283
-msgid "New"
-msgstr "Neu"
-
-#: bundle_manager.cc:333
-msgid "Bundle"
-msgstr "Bundle"
-
-#: bundle_manager.cc:418
-msgid "Add Channel"
-msgstr "Kanal hinzufügen"
-
-#: bundle_manager.cc:425
-msgid "Rename Channel"
-msgstr "Kanal umbenennen"
-
-#: configinfo.cc:28
-msgid "Build Configuration"
-msgstr "Build Configuration"
-
-#: control_point_dialog.cc:33
-msgid "Control point"
-msgstr "Automationspunkt"
-
-#: control_point_dialog.cc:45
-msgid "Value"
-msgstr "Wert"
-
-#: edit_note_dialog.cc:42
-msgid "Note"
-msgstr "Note"
-
-#: edit_note_dialog.cc:45
-msgid "Set selected notes to this channel"
-msgstr "Ausgewählte Noten auf diesen Kanal setzen"
-
-#: edit_note_dialog.cc:46
-msgid "Set selected notes to this pitch"
-msgstr "Ausgewählte Noten auf diese Tonhöhe setzen"
-
-#: edit_note_dialog.cc:47
-msgid "Set selected notes to this velocity"
-msgstr "Ausgewählte Noten auf diese Velocity setzen"
-
-#: edit_note_dialog.cc:49
-msgid "Set selected notes to this time"
-msgstr "Ausgewählte Noten auf diesen Zeitpunkt setzen"
-
-#: edit_note_dialog.cc:51
-msgid "Set selected notes to this length"
-msgstr "Ausgewählte Noten auf diese Notenlänge setzen"
-
-#: edit_note_dialog.cc:58 midi_list_editor.cc:105 patch_change_dialog.cc:90
-#: step_entry.cc:394
-msgid "Channel"
-msgstr "Kanal"
-
-#: edit_note_dialog.cc:68
-msgid "Pitch"
-msgstr "Tonhöhe"
-
-#: edit_note_dialog.cc:78 step_entry.cc:408
-msgid "Velocity"
-msgstr "Velocity"
-
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
-msgid "Time"
-msgstr "Zeitpunkt"
-
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
-msgid "Length"
-msgstr "Länge"
-
-#: edit_note_dialog.cc:165
-msgid "edit note"
-msgstr "Note bearbeiten"
-
-#: editor.cc:147
-msgid "CD Frames"
-msgstr "CD-Frames"
-
-#: editor.cc:148
-msgid "TC Frames"
-msgstr "TC Frames"
-
-#: editor.cc:149
-msgid "TC Seconds"
-msgstr "TC Sekunden"
-
-#: editor.cc:150
-msgid "TC Minutes"
-msgstr "TC Minuten"
-
-#: editor.cc:151
-msgid "Seconds"
-msgstr "Sekunden"
-
-#: editor.cc:152
-msgid "Minutes"
-msgstr "Minuten"
-
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
-msgid "Beats/128"
-msgstr "Schläge/128"
-
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
-msgid "Beats/64"
-msgstr "Schläge/64"
-
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
-msgid "Beats/32"
-msgstr "Schläge/32"
-
-#: editor.cc:156
-msgid "Beats/28"
-msgstr "Schläge/28"
-
-#: editor.cc:157
-msgid "Beats/24"
-msgstr "Schläge/24"
-
-#: editor.cc:158
-msgid "Beats/20"
-msgstr "Schläge/20"
-
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
-msgid "Beats/16"
-msgstr "Schläge/16"
-
-#: editor.cc:160
-msgid "Beats/14"
-msgstr "Schläge/14"
-
-#: editor.cc:161
-msgid "Beats/12"
-msgstr "Schläge/12"
-
-#: editor.cc:162
-msgid "Beats/10"
-msgstr "Schläge/10"
-
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
-msgid "Beats/8"
-msgstr "Schläge/8"
-
-#: editor.cc:164
-msgid "Beats/7"
-msgstr "Schläge/7"
-
-#: editor.cc:165
-msgid "Beats/6"
-msgstr "Schläge/6"
-
-#: editor.cc:166
-msgid "Beats/5"
-msgstr "Schläge/5"
-
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
-msgid "Beats/4"
-msgstr "Schläge/4"
-
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
-msgid "Beats/3"
-msgstr "Schläge/3"
-
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
-msgid "Beats/2"
-msgstr "Schläge/2"
-
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
-msgid "Beats"
-msgstr "Schläge"
-
-#: editor.cc:171
-msgid "Bars"
-msgstr "Takte"
-
-#: editor.cc:172
-msgid "Marks"
-msgstr "Marker"
-
-#: editor.cc:173
-msgid "Region starts"
-msgstr "Regionen-Anfang"
-
-#: editor.cc:174
-msgid "Region ends"
-msgstr "Regionen-Ende"
-
-#: editor.cc:175
-msgid "Region syncs"
-msgstr "Regionen-Sync"
-
-#: editor.cc:176
-msgid "Region bounds"
-msgstr "Regionengrenzen"
-
-#: editor.cc:181 editor_actions.cc:508
-msgid "No Grid"
-msgstr "Raster aus"
-
-#: editor.cc:182 editor_actions.cc:509
-msgid "Grid"
-msgstr "Einrasten"
-
-#: editor.cc:183 editor_actions.cc:510
-msgid "Magnetic"
-msgstr "Magnetisch"
-
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:491
-msgid "Playhead"
-msgstr "Positionszeiger"
-
-#: editor.cc:189 editor_actions.cc:493
-msgid "Marker"
-msgstr "Marker"
-
-#: editor.cc:190 editor.cc:207 editor_actions.cc:492
-msgid "Mouse"
-msgstr "Maus"
-
-#: editor.cc:195 editor_actions.cc:500
-msgid "Slide"
-msgstr "Slide"
-
-#: editor.cc:196
-msgid "Splice"
-msgstr "Splice"
-
-#: editor.cc:197 editor_actions.cc:499
-msgid "Ripple"
-msgstr "Ripple"
-
-#: editor.cc:198 editor_actions.cc:1787 editor_markers.cc:905
-#: editor_rulers.cc:260 location_ui.cc:58
-msgid "Lock"
-msgstr "Lock"
-
-#: editor.cc:203 mono_panner_editor.cc:42
-msgid "Left"
-msgstr "Links"
-
-#: editor.cc:204 mono_panner_editor.cc:47
-msgid "Right"
-msgstr "Rechts"
-
-#: editor.cc:205
-msgid "Center"
-msgstr "Mitte"
-
-#: editor.cc:208 editor.cc:3231
-msgid "Edit point"
-msgstr "Arbeitspunkt"
-
-#: editor.cc:214
-msgid "Mushy"
-msgstr "Matschig"
-
-#: editor.cc:215
-msgid "Smooth"
-msgstr "Klar"
-
-#: editor.cc:216
-msgid "Balanced multitimbral mixture"
-msgstr "Ausgewogene multitimbrale Mischung"
-
-#: editor.cc:217
-msgid "Unpitched percussion with stable notes"
-msgstr "Ungestimmte Perkussion mit stabilen Tönen"
-
-#: editor.cc:218
-msgid "Crisp monophonic instrumental"
-msgstr "Klare monophone Instrumentalmusik"
-
-#: editor.cc:219
-msgid "Unpitched solo percussion"
-msgstr "Ungestimmte Perkussion (solo)"
-
-#: editor.cc:220
-msgid "Resample without preserving pitch"
-msgstr "Resampeln, ohne die Tonhöhe zu erhalten"
-
-#: editor.cc:256
-msgid "Mins:Secs"
-msgstr "Min:Sek"
-
-#: editor.cc:262
-msgid "Location Markers"
-msgstr "Positionsmarker"
-
-#: editor.cc:263
-msgid "Range Markers"
-msgstr "Bereiche"
-
-#: editor.cc:264
-msgid "Loop/Punch Ranges"
-msgstr "Schleifen/Punchbereiche"
-
-#: editor.cc:265 editor_actions.cc:563
-msgid "CD Markers"
-msgstr "CD-Marker"
-
-#: editor.cc:266
-msgid "Video Timeline"
-msgstr "Video Zeitleiste"
-
-#: editor.cc:283
-msgid "mode"
-msgstr "Modus"
-
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:562
-msgid "Markers"
-msgstr "Marker"
-
-#: editor.cc:577 rc_option_editor.cc:1939
-msgid "Regions"
-msgstr "Regionen"
-
-#: editor.cc:578
-msgid "Tracks & Busses"
-msgstr "Spuren & Busse"
-
-#: editor.cc:579
-msgid "Snapshots"
-msgstr "Schnappschüsse"
-
-#: editor.cc:580
-msgid "Track & Bus Groups"
-msgstr "Spuren & Bus-Gruppen"
-
-#: editor.cc:581
-msgid "Ranges & Marks"
-msgstr "Bereiche & Marker"
-
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "Editor"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1863
-msgid "Loop"
-msgstr "Schleife"
-
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
-msgid "Punch"
-msgstr "Punch"
-
-#: editor.cc:1449 rc_option_editor.cc:1661
-msgid "Linear (for highly correlated material)"
-msgstr "Linear (für stark korreliertes Material)"
-
-#: editor.cc:1459 rc_option_editor.cc:1662
-msgid "Constant power"
-msgstr "Konstante Energie"
-
-#: editor.cc:1468 rc_option_editor.cc:1663
-msgid "Symmetric"
-msgstr "Symmetrisch"
-
-#: editor.cc:1478 rc_option_editor.cc:1664
-msgid "Slow"
-msgstr "Langsam"
-
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
-msgid "Fast"
-msgstr "Schnell"
-
-#: editor.cc:1509 editor.cc:1534
-msgid "Deactivate"
-msgstr "Deaktivieren"
-
-#: editor.cc:1511 editor.cc:1536
-msgid "Activate"
-msgstr "Aktivieren"
-
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
-msgid "Freeze"
-msgstr "Einfrieren"
-
-#: editor.cc:1641
-msgid "Unfreeze"
-msgstr "Auftauen"
-
-#: editor.cc:1780
-msgid "Selected Regions"
-msgstr "Ausgewählte Regionen"
-
-#: editor.cc:1816 editor_markers.cc:940
-msgid "Play Range"
-msgstr "Bereich wiedergeben"
-
-#: editor.cc:1817 editor_markers.cc:943
-msgid "Loop Range"
-msgstr "Bereich in Schleife wiedergeben"
-
-#: editor.cc:1820 editor_markers.cc:950
-msgid "Zoom to Range"
-msgstr "Auf Bereich zoomen"
-
-#: editor.cc:1829 editor_actions.cc:369
-msgid "Move Range Start to Previous Region Boundary"
-msgstr "Anfang des Bereiches zur vorherigen Regiongrenze verschieben"
-
-#: editor.cc:1836 editor_actions.cc:376
-msgid "Move Range Start to Next Region Boundary"
-msgstr "Anfang des Bereiches zur nächsten Regiongrenze verschieben"
-
-#: editor.cc:1843 editor_actions.cc:383
-msgid "Move Range End to Previous Region Boundary"
-msgstr "Ende des Bereiches zur vorherigen Regiongrenze verschieben"
-
-#: editor.cc:1850 editor_actions.cc:390
-msgid "Move Range End to Next Region Boundary"
-msgstr "Ende des Bereiches zur nächsten Regiongrenze verschieben"
-
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
-msgid "Separate"
-msgstr "Teilen"
-
-#: editor.cc:1857
-msgid "Convert to Region in Region List"
-msgstr "In Region umwanden (in Regionenliste hinzufügen)"
-
-#: editor.cc:1860 editor_markers.cc:970
-msgid "Select All in Range"
-msgstr "Alles im Bereich auswählen"
-
-#: editor.cc:1863 editor_actions.cc:297
-msgid "Set Loop from Selection"
-msgstr "Schleife aus Auswahl bilden"
-
-#: editor.cc:1864 editor_actions.cc:298
-msgid "Set Punch from Selection"
-msgstr "Punch aus Auswahl bilden"
-
-#: editor.cc:1865 editor_actions.cc:299
-msgid "Set Session Start/End from Selection"
-msgstr "Projektstart/ende auf Auswahl setzen"
-
-#: editor.cc:1868
-msgid "Add Range Markers"
-msgstr "Bereichsmarker einfügen"
-
-#: editor.cc:1871
-msgid "Crop Region to Range"
-msgstr "Region auf Bereich kürzen"
-
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr "Bereich mit Region füllen"
-
-#: editor.cc:1873 editor_actions.cc:311
-msgid "Duplicate Range"
-msgstr "Bereich duplizieren"
-
-#: editor.cc:1876
-msgid "Consolidate Range"
-msgstr "Bereich als neue Region pre-Mixer"
-
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
-msgstr "Bereich als neue Region post-mixer"
-
-#: editor.cc:1878
-msgid "Bounce Range to Region List"
-msgstr "Auswahl zur Regionenliste bouncen"
-
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
-msgstr "Auswahl zur Regionenliste bouncen (Post-Fader)"
-
-#: editor.cc:1880 editor_markers.cc:953
-msgid "Export Range..."
-msgstr "Bereich exportieren..."
-
-#: editor.cc:1882
-msgid "Export Video Range..."
-msgstr "Videobereich exportieren..."
-
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
-msgstr "Wiedergabe ab Arbeitspunkt"
-
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
-msgstr "Wiedergabe ab Anfang"
-
-#: editor.cc:1900
-msgid "Play Region"
-msgstr "Region wiedergeben"
-
-#: editor.cc:1902
-msgid "Loop Region"
-msgstr "Region in Schleife wiedergeben"
-
-#: editor.cc:1912 editor.cc:1989
-msgid "Select All in Track"
-msgstr "Alles in der Spur auswählen"
-
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
-msgid "Select All Objects"
-msgstr "Alle Objekte auswählen"
-
-#: editor.cc:1914 editor.cc:1991
-msgid "Invert Selection in Track"
-msgstr "Auswahl in der Spur umkehren"
-
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
-msgid "Invert Selection"
-msgstr "Auswahl umkehren"
-
-#: editor.cc:1917
-msgid "Set Range to Loop Range"
-msgstr "Bereich als Schleife auswählen"
-
-#: editor.cc:1918
-msgid "Set Range to Punch Range"
-msgstr "Bereich als Punchbereich"
-
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
-msgid "Select All After Edit Point"
-msgstr "Alle Regionen nach dem Arbeitspunkt auswählen"
-
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
-msgid "Select All Before Edit Point"
-msgstr "Alle Regionen vor dem Arbeitspunkt auswählen"
-
-#: editor.cc:1922 editor.cc:1996
-msgid "Select All After Playhead"
-msgstr "Alle Regionen nach dem Positionszeiger auswählen"
-
-#: editor.cc:1923 editor.cc:1997
-msgid "Select All Before Playhead"
-msgstr "Alle Regionen vor dem Positionszeiger auswählen"
-
-#: editor.cc:1924
-msgid "Select All Between Playhead and Edit Point"
-msgstr "Alle zwischen Positionszeiger und Arbeitspunkt auswählen"
-
-#: editor.cc:1925
-msgid "Select All Within Playhead and Edit Point"
-msgstr "Alles zwischen Positionszeiger und Arbeitspunkt auswählen"
-
-#: editor.cc:1926
-msgid "Select Range Between Playhead and Edit Point"
-msgstr "Wähle Bereich zwischen Positionszeiger und Arbeitspunkt aus"
-
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
-msgid "Select"
-msgstr "Auswahl"
-
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
-msgid "Cut"
-msgstr "Ausschneiden"
-
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
-msgid "Copy"
-msgstr "Kopieren"
-
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
-msgid "Paste"
-msgstr "Einfügen"
-
-#: editor.cc:1942 editor_actions.cc:91
-msgid "Align"
-msgstr "Ausrichten"
-
-#: editor.cc:1943
-msgid "Align Relative"
-msgstr "Relativ ausrichten"
-
-#: editor.cc:1950
-msgid "Insert Selected Region"
-msgstr "Ausgewählte Region einfügen"
-
-#: editor.cc:1951
-msgid "Insert Existing Media"
-msgstr "Vorhandenes Material importieren"
-
-#: editor.cc:1960 editor.cc:2016
-msgid "Nudge Entire Track Later"
-msgstr "Gesamte Spur schrittweise nach hinten"
-
-#: editor.cc:1961 editor.cc:2017
-msgid "Nudge Track After Edit Point Later"
-msgstr "Spur nach Arbeitspunkt schrittweise nach hinten"
-
-#: editor.cc:1962 editor.cc:2018
-msgid "Nudge Entire Track Earlier"
-msgstr "Gesamte Spur schrittweise nach vorne"
-
-#: editor.cc:1963 editor.cc:2019
-msgid "Nudge Track After Edit Point Earlier"
-msgstr "Spur nach Arbeitspunkt schrittweise nach vorne"
-
-#: editor.cc:1965 editor.cc:2021
-msgid "Nudge"
-msgstr "Verschieben"
-
-#: editor.cc:2235
-msgid ""
-"Playhead position stored with a negative value - ignored (use zero instead)"
-msgstr ""
-"Positionzeiger mit negativer Position - ignoriert (benutze stattdessen Null)"
-
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
-#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
-msgid "All"
-msgstr "Alle"
-
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
-msgstr "Smart-Modus (zusätzliche Bereichsfunktionen im Greifmodus)"
-
-#: editor.cc:3211
-msgid "Grab Mode (select/move objects)"
-msgstr "Greifmodus (Objekte auswählen/bewegen)"
-
-#: editor.cc:3212
-msgid "Cut Mode (split regions)"
-msgstr "Schneidemodus (Regionen teilen)"
-
-#: editor.cc:3213
-msgid "Range Mode (select time ranges)"
-msgstr "Bereichsmodus (Zeitbereiche auswählen)"
-
-#: editor.cc:3214
-msgid "Draw Mode (draw and edit gain/notes/automation)"
-msgstr "Zeichenmodus (zeichne und editiere Lautstärken/Noten/Automationen)"
-
-#: editor.cc:3215
-msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
-msgstr ""
-"Streckmodus (Audio- und MIDI-Regionen zeitstrecken, ohne die Tonhöhe zu "
-"ändern)"
-
-#: editor.cc:3216
-msgid "Audition Mode (listen to regions)"
-msgstr "Vorhörmodus (Regionen anhören)"
-
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
-msgstr ""
-"Interner Editiermodus (Noten und Lautstärkekurven innerhalb der Regionen "
-"editieren)"
-
-#: editor.cc:3218
-msgid ""
-"Groups: click to (de)activate\n"
-"Context-click for other operations"
-msgstr ""
-"Gruppen: Klicken zum (De)aktivieren\n"
-"Rechtsklick für Optionen"
-
-#: editor.cc:3219
-msgid "Nudge Region/Selection Later"
-msgstr "Region/Auswahl schrittweise nach hinten"
-
-#: editor.cc:3220
-msgid "Nudge Region/Selection Earlier"
-msgstr "Region/Auswahl schrittweise nach vorne"
-
-#: editor.cc:3221 editor_actions.cc:262
-msgid "Zoom In"
-msgstr "Vergrößern"
-
-#: editor.cc:3222 editor_actions.cc:261
-msgid "Zoom Out"
-msgstr "Verkleinern"
-
-#: editor.cc:3223
-msgid "Zoom to Time Scale"
-msgstr "Zu einer Zeitspanne zoomen"
-
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
-msgid "Zoom to Session"
-msgstr "Auf ganzes Projekt zoomen"
-
-#: editor.cc:3225
-msgid "Zoom focus"
-msgstr "Zoom-Mittelpunkt"
-
-#: editor.cc:3226
-msgid "Expand Tracks"
-msgstr "Spuren vergrößern"
-
-#: editor.cc:3227
-msgid "Shrink Tracks"
-msgstr "Spuren verkleinern"
-
-#: editor.cc:3228
-msgid "Number of visible tracks"
-msgstr "Anzahl der sichtbaren Spuren"
-
-#: editor.cc:3229
-msgid "Snap/Grid Units"
-msgstr "Rastereinheiten"
-
-#: editor.cc:3230
-msgid "Snap/Grid Mode"
-msgstr "Einrastmodus"
-
-#: editor.cc:3232
-msgid "Edit Mode"
-msgstr "Bearbeitungsmodus"
-
-#: editor.cc:3233
-msgid ""
-"Nudge Clock\n"
-"(controls distance used to nudge regions and selections)"
-msgstr ""
-"Uhr für Schrittweite\n"
-"(bestimmt den Abstand für das schrittweise Verschieben von Regionen und "
-"Bereichen)"
-
-#: editor.cc:3501 editor_actions.cc:313
-msgid "Command|Undo"
-msgstr "Rückgängig"
-
-#: editor.cc:3503
-msgid "Command|Undo (%1)"
-msgstr "Rückgängig (%1)"
-
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
-msgid "Redo"
-msgstr "Wiederherstellen"
-
-#: editor.cc:3512
-msgid "Redo (%1)"
-msgstr "Wiederherstellen (%1)"
-
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1844
-msgid "Duplicate"
-msgstr "Duplizieren"
-
-#: editor.cc:3532
-msgid "Number of duplications:"
-msgstr "Anzahl der Duplikate:"
-
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
-msgid "Selection"
-msgstr "Auswahl"
-
-#: editor.cc:3709
-msgid "Fit 1 track"
-msgstr "1 Spur einpassen"
-
-#: editor.cc:3710
-msgid "Fit 2 tracks"
-msgstr "2 Spuren einpassen"
-
-#: editor.cc:3711
-msgid "Fit 4 tracks"
-msgstr "4 Spuren einpassen"
-
-#: editor.cc:3712
-msgid "Fit 8 tracks"
-msgstr "8 Spuren einpassen"
-
-#: editor.cc:3713
-msgid "Fit 16 tracks"
-msgstr "16 Spuren einpassen"
-
-#: editor.cc:3714
-msgid "Fit 24 tracks"
-msgstr "24 Spuren einpassen"
-
-#: editor.cc:3715
-msgid "Fit 32 tracks"
-msgstr "32 Spuren einpassen"
-
-#: editor.cc:3716
-msgid "Fit 48 tracks"
-msgstr "48 Spuren einpassen"
-
-#: editor.cc:3717
-msgid "Fit All tracks"
-msgstr "Alle Spuren einpassen"
-
-#: editor.cc:3718
-msgid "Fit Selection"
-msgstr "Passe Auswahl ein"
-
-#: editor.cc:3720
-msgid "Zoom to 10 ms"
-msgstr "Zoome auf 10 ms"
-
-#: editor.cc:3721
-msgid "Zoom to 100 ms"
-msgstr "Zoome auf 100 ms"
-
-#: editor.cc:3722
-msgid "Zoom to 1 sec"
-msgstr "Zoome auf 1 Sek."
-
-#: editor.cc:3723
-msgid "Zoom to 10 sec"
-msgstr "Zoome auf 10 Sek."
-
-#: editor.cc:3724
-msgid "Zoom to 1 min"
-msgstr "Zoome auf 1 Min."
-
-#: editor.cc:3725
-msgid "Zoom to 10 min"
-msgstr "Zoome auf 10 Min."
-
-#: editor.cc:3726
-msgid "Zoom to 1 hour"
-msgstr "Zoome auf 1 Stunde"
-
-#: editor.cc:3727
-msgid "Zoom to 8 hours"
-msgstr "Zoome auf 8 Stunden"
-
-#: editor.cc:3728
-msgid "Zoom to 24 hours"
-msgstr "Zoome auf 24 Stunden"
-
-#: editor.cc:3730
-msgid "Zoom to Range/Region Selection"
-msgstr "Zoome auf Bereichs-/Regionenauswahl"
-
-#: editor.cc:3800
-msgid "*"
-msgstr "*"
-
-#: editor.cc:4120
-msgid "Playlist Deletion"
-msgstr "Löschen von Wiedergabelisten"
-
-#: editor.cc:4121
-msgid ""
-"Playlist %1 is currently unused.\n"
-"If it is kept, its audio files will not be cleaned.\n"
-"If it is deleted, audio files used by it alone will be cleaned."
-msgstr ""
-"Die Wiedergabeliste %1 wird momentan nicht verwendet.\n"
-"Wenn sie nicht gelöscht wird, können keine Audiodateien aufgeräumt werden, "
-"die von ihr verwendet werden.\n"
-"Falls sie gelöscht wird, werden die ausschließlich von ihr verwendeten "
-"Audiodateien gelöscht."
-
-#: editor.cc:4131
-msgid "Delete Playlist"
-msgstr "Wiedergabeliste löschen"
-
-#: editor.cc:4132
-msgid "Keep Playlist"
-msgstr "Wiedergabeliste behalten"
-
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2087 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
-msgid "Cancel"
-msgstr "Abbrechen"
-
-#: editor.cc:4275
-msgid "new playlists"
-msgstr "Neue Wiedergabelisten"
-
-#: editor.cc:4291
-msgid "copy playlists"
-msgstr "Wiedergabelisten kopieren"
-
-#: editor.cc:4306
-msgid "clear playlists"
-msgstr "Wiedergabelisten zurücksetzen"
-
-#: editor.cc:5046
-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:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
-msgid "Edit..."
-msgstr "Bearbeiten..."
-
-#: editor.cc:5934 editor_actions.cc:1939
-msgid "Legatize"
-msgstr "überbinden (Legato)"
-
-#: editor.cc:5936 editor_actions.cc:1938
-msgid "Quantize..."
-msgstr "Quantisieren.."
-
-#: editor.cc:5938 editor_actions.cc:1941
-msgid "Remove Overlap"
-msgstr "Überlappung entfernen (Legato)"
-
-#: editor.cc:5940 editor_actions.cc:1940
-msgid "Transform..."
-msgstr "Transformiere..."
-
-#: editor_actions.cc:92
-msgid "Autoconnect"
-msgstr "Automatisch verbinden"
-
-#: editor_actions.cc:93
-msgid "Crossfades"
-msgstr "Crossfades"
-
-#: editor_actions.cc:95
-msgid "Move Selected Marker"
-msgstr "Ausgewählten Positionsmarker verschieben"
-
-#: editor_actions.cc:96
-msgid "Select Range Operations"
-msgstr "Bereichs"
-
-#: editor_actions.cc:97
-msgid "Select Regions"
-msgstr "Region auswählen"
-
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "Arbeitspunkt"
-
-#: editor_actions.cc:99
-msgid "Fade"
-msgstr "Fade"
-
-#: editor_actions.cc:100
-msgid "Latch"
-msgstr "Latch"
-
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
-msgid "Region"
-msgstr "Region"
-
-#: editor_actions.cc:102
-msgid "Layering"
-msgstr "Layering"
-
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
-msgid "Position"
-msgstr "Position"
-
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
-msgid "Trim"
-msgstr "Anpassen"
-
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
-msgid "Gain"
-msgstr "Lautstärke"
-
-#: editor_actions.cc:107 editor_actions.cc:561
-msgid "Ranges"
-msgstr "Bereiche"
-
-#: editor_actions.cc:108 editor_actions.cc:1840 session_option_editor.cc:135
-#: session_option_editor.cc:144 session_option_editor.cc:151
-msgid "Fades"
-msgstr "Fades"
-
-#: editor_actions.cc:111
-msgid "Link"
-msgstr "Verknüpfen"
-
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Zoom Fokus"
-
-#: editor_actions.cc:113
-msgid "Locate to Markers"
-msgstr "Positionszeiger zu Marker setzen"
-
-#: editor_actions.cc:115
-msgid "Meter falloff"
-msgstr "Abfall der Pegelanzeigen"
-
-#: editor_actions.cc:116
-msgid "Meter hold"
-msgstr "Pegelanzeige halten"
-
-#: editor_actions.cc:117 session_option_editor.cc:321
-msgid "MIDI Options"
-msgstr "MIDI Optionen"
-
-#: editor_actions.cc:118
-msgid "Misc Options"
-msgstr "Sonstiges"
-
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
-msgid "Monitoring"
-msgstr "Monitoring"
-
-#: editor_actions.cc:120
-msgid "Active Mark"
-msgstr "Aktiver Marker"
-
-#: editor_actions.cc:123
-msgid "Primary Clock"
-msgstr "Erste Zeitanzeige"
-
-#: editor_actions.cc:124
-msgid "Pullup / Pulldown"
-msgstr "Pull-Up / Pull-Down"
-
-#: editor_actions.cc:125
-msgid "Region operations"
-msgstr "Region(en)"
-
-#: editor_actions.cc:127 ruler_dialog.cc:28
-msgid "Rulers"
-msgstr "Markierungsleisten"
-
-#: editor_actions.cc:128
-msgid "Views"
-msgstr "Ansichten"
-
-#: editor_actions.cc:129
-msgid "Scroll"
-msgstr "Scrollen"
-
-#: editor_actions.cc:130
-msgid "Secondary Clock"
-msgstr "Zweite Zeitanzeige"
-
-#: editor_actions.cc:137
-msgid "Subframes"
-msgstr "Subframes"
-
-#: editor_actions.cc:140
-msgid "Timecode fps"
-msgstr "Timecode FPS"
-
-#: editor_actions.cc:141 route_time_axis.cc:575
-msgid "Height"
-msgstr "Höhe"
-
-#: editor_actions.cc:143
-msgid "Tools"
-msgstr "Werkzeuge"
-
-#: editor_actions.cc:144
-msgid "View"
-msgstr "Ansicht"
-
-#: editor_actions.cc:146
-msgid "Zoom"
-msgstr "Zoom"
-
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
-msgstr "Ziehen abbrechen oder alles deselektieren"
-
-#: editor_actions.cc:157
-msgid "Session|Lock"
-msgstr "Sperren"
-
-#: editor_actions.cc:159
-msgid "Show Editor Mixer"
-msgstr "Mixer-Panel zeigen"
-
-#: editor_actions.cc:160
-msgid "Show Editor List"
-msgstr "Seitenleiste anzeigen"
-
-#: editor_actions.cc:162
-msgid "Playhead to Next Region Boundary"
-msgstr "Positionszeiger zur nächsten Regiongrenze"
-
-#: editor_actions.cc:163
-msgid "Playhead to Next Region Boundary (No Track Selection)"
-msgstr "Positionszeiger zur nächsten Regiongrenze (ohne Spurauswahl)"
-
-#: editor_actions.cc:164
-msgid "Playhead to Previous Region Boundary"
-msgstr "Positionszeiger zur vorherigen Regiongrenze"
-
-#: editor_actions.cc:165
-msgid "Playhead to Previous Region Boundary (No Track Selection)"
-msgstr "Positionszeiger zur vorherigen Regiongrenze (ohne Spurauswahl)"
-
-#: editor_actions.cc:167
-msgid "Playhead to Next Region Start"
-msgstr "Positionszeiger zum Anfang der nächsten Region"
-
-#: editor_actions.cc:168
-msgid "Playhead to Next Region End"
-msgstr "Positionszeiger zum Ende der nächsten Region"
-
-#: editor_actions.cc:169
-msgid "Playhead to Next Region Sync"
-msgstr "Positionszeiger zum Einrastpunkt der nächsten Region"
-
-#: editor_actions.cc:171
-msgid "Playhead to Previous Region Start"
-msgstr "Positionszeiger zum Anfang der vorherigen Region"
-
-#: editor_actions.cc:172
-msgid "Playhead to Previous Region End"
-msgstr "Positionszeiger zum Ende der vorherigen Region"
-
-#: editor_actions.cc:173
-msgid "Playhead to Previous Region Sync"
-msgstr "Positionszeiger zum Einrastpunkt der vorherigen Region"
-
-#: editor_actions.cc:175
-msgid "To Next Region Boundary"
-msgstr "Zur nächsten Regiongrenze"
-
-#: editor_actions.cc:176
-msgid "To Next Region Boundary (No Track Selection)"
-msgstr "Zur nächsten Regiongrenze (ohne Spurauswahl)"
-
-#: editor_actions.cc:177
-msgid "To Previous Region Boundary"
-msgstr "Zur vorherigen Regiongrenze"
-
-#: editor_actions.cc:178
-msgid "To Previous Region Boundary (No Track Selection)"
-msgstr "Zur vorherigen Regiongrenze (ohne Spurauswahl)"
-
-#: editor_actions.cc:180
-msgid "To Next Region Start"
-msgstr "Zum nächsten Regionen-Anfang"
-
-#: editor_actions.cc:181
-msgid "To Next Region End"
-msgstr "Zum nächsten Regionen-Ende"
-
-#: editor_actions.cc:182
-msgid "To Next Region Sync"
-msgstr "Zum nächsten Regionen-Synchronisationspunkt"
-
-#: editor_actions.cc:184
-msgid "To Previous Region Start"
-msgstr "Zum vorherigen Anfang einer Region"
-
-#: editor_actions.cc:185
-msgid "To Previous Region End"
-msgstr "Zum vorherigen Ende einer Region"
-
-#: editor_actions.cc:186
-msgid "To Previous Region Sync"
-msgstr "Zum vorherigen Synchronisationspunkt einer Region"
-
-#: editor_actions.cc:188
-msgid "To Range Start"
-msgstr "Zum Anfang des Auswahlbereichs"
-
-#: editor_actions.cc:189
-msgid "To Range End"
-msgstr "Zum Ende des Auswahlbereichs"
-
-#: editor_actions.cc:191
-msgid "Playhead to Range Start"
-msgstr "Positionszeiger zum Anfang des Auswahlbereichs"
-
-#: editor_actions.cc:192
-msgid "Playhead to Range End"
-msgstr "Positionszeiger zum Ende des Auswahlbereichs"
-
-#: editor_actions.cc:195
-msgid "Select All Tracks"
-msgstr "Alle Spuren auswählen"
-
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
-msgid "Deselect All"
-msgstr "Nichts auswählen"
-
-#: editor_actions.cc:204
-msgid "Select All Overlapping Edit Range"
-msgstr "Alle Regionen des Bearbeitungsbereichs auswählen "
-
-#: editor_actions.cc:205
-msgid "Select All Inside Edit Range"
-msgstr "Alles inerhalb des Bearbeitungsbereichs auswählen"
-
-#: editor_actions.cc:207
-msgid "Select Edit Range"
-msgstr "Editierbereich auswählen"
-
-#: editor_actions.cc:209
-msgid "Select All in Punch Range"
-msgstr "Alle Regionen im Punchbereich auswählen"
-
-#: editor_actions.cc:210
-msgid "Select All in Loop Range"
-msgstr "Alle Regionen innerhalb der Schleife auswählen"
-
-#: editor_actions.cc:212
-msgid "Select Next Track or Bus"
-msgstr "Nächste Spur/Bus auswählen"
-
-#: editor_actions.cc:213
-msgid "Select Previous Track or Bus"
-msgstr "Vorherige Spur/Bus auswählen"
-
-#: editor_actions.cc:215
-msgid "Toggle Record Enable"
-msgstr "Aufnahme aktivieren"
-
-#: editor_actions.cc:217
-msgid "Toggle Solo"
-msgstr "Solo umschalten"
-
-#: editor_actions.cc:219
-msgid "Toggle Mute"
-msgstr "Mute umschalten"
-
-#: editor_actions.cc:221
-msgid "Toggle Solo Isolate"
-msgstr "Isoliertes Solo umschalten"
-
-#: editor_actions.cc:226
-msgid "Save View %1"
-msgstr "Ansicht %1 speichern"
-
-#: editor_actions.cc:232
-msgid "Go to View %1"
-msgstr "Ansicht %1 aufrufen"
-
-#: editor_actions.cc:238
-msgid "Locate to Mark %1"
-msgstr "Positionszeiger zu Marker %1 setzen"
-
-#: editor_actions.cc:242 editor_actions.cc:243
-msgid "Jump to Next Mark"
-msgstr "Zu nächstem Marker springen"
-
-#: editor_actions.cc:244 editor_actions.cc:245
-msgid "Jump to Previous Mark"
-msgstr "Zur vorherigen Marker springen"
-
-#: editor_actions.cc:247 editor_actions.cc:248
-msgid "Add Mark from Playhead"
-msgstr "Marker am Positionszeiger setzen"
-
-#: editor_actions.cc:250 editor_actions.cc:251
-msgid "Remove Mark at Playhead"
-msgstr "Marker beim Positionszeiger entfernen"
-
-#: editor_actions.cc:253
-msgid "Nudge Next Later"
-msgstr "Nächste Region schrittweise nach hinten"
-
-#: editor_actions.cc:254
-msgid "Nudge Next Earlier"
-msgstr "Nächste Region schrittweise nach vorne"
-
-#: editor_actions.cc:256
-msgid "Nudge Playhead Forward"
-msgstr "Positionszeiger vorwärts"
-
-#: editor_actions.cc:257
-msgid "Nudge Playhead Backward"
-msgstr "Positionszeiger rückwärts"
-
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
-msgstr "Positionszeiger zum nächsten Rasterpunkt"
-
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
-msgstr "Positionszeiger zum vorherigen Rasterpunkt"
-
-#: editor_actions.cc:264
-msgid "Zoom to Selection"
-msgstr "Zoome zu Auswahl"
-
-#: editor_actions.cc:265
-msgid "Toggle Zoom State"
-msgstr "Letzten Zoom wählen"
-
-#: editor_actions.cc:267
-msgid "Expand Track Height"
-msgstr "Spurhöhe vergrößern"
-
-#: editor_actions.cc:268
-msgid "Shrink Track Height"
-msgstr "Spurhöhe verkleinern"
-
-#: editor_actions.cc:270
-msgid "Move Selected Tracks Up"
-msgstr "Ausgewählte Spuren nach oben verschieben"
-
-#: editor_actions.cc:272
-msgid "Move Selected Tracks Down"
-msgstr "Ausgewählte Spuren nach unten verschieben"
-
-#: editor_actions.cc:275
-msgid "Scroll Tracks Up"
-msgstr "Spuren nach oben scrollen"
-
-#: editor_actions.cc:277
-msgid "Scroll Tracks Down"
-msgstr "Spuren nach unten scrollen"
-
-#: editor_actions.cc:279
-msgid "Step Tracks Up"
-msgstr "Spuren langsam nach oben scrollen"
-
-#: editor_actions.cc:281
-msgid "Step Tracks Down"
-msgstr "Spuren langsam nach unten scrollen"
-
-#: editor_actions.cc:284
-msgid "Scroll Backward"
-msgstr "Nach rechts scrollen"
-
-#: editor_actions.cc:285
-msgid "Scroll Forward"
-msgstr "Nach links scrollen"
-
-#: editor_actions.cc:286
-msgid "Center Playhead"
-msgstr "Positionszeiger zentrieren"
-
-#: editor_actions.cc:287
-msgid "Center Edit Point"
-msgstr "Arbeitspunkt zentrieren"
-
-#: editor_actions.cc:289
-msgid "Playhead Forward"
-msgstr "Positionszeiger vorwärts"
-
-#: editor_actions.cc:290
-msgid "Playhead Backward"
-msgstr "Positionszeiger rückwärts"
-
-#: editor_actions.cc:292
-msgid "Playhead to Active Mark"
-msgstr "Positionszeiger zur aktiven Markierung"
-
-#: editor_actions.cc:293
-msgid "Active Mark to Playhead"
-msgstr "Aktiven Marker zum Positionszeiger verschieben"
-
-#: editor_actions.cc:295
-msgid "Use Skip Ranges"
-msgstr "Benutze Sprungbereiche"
-
-#: editor_actions.cc:302
-msgid "Play Selected Regions"
-msgstr "Ausgewählte Regionen wiedergeben"
-
-#: editor_actions.cc:304
-msgid "Play from Edit Point and Return"
-msgstr "Wiedergabe ab Arbeitspunkt & Zurück"
-
-#: editor_actions.cc:306
-msgid "Play Edit Range"
-msgstr "Editierbereich wiedergeben"
-
-#: editor_actions.cc:308
-msgid "Playhead to Mouse"
-msgstr "Positionszeiger zur Mausposition"
-
-#: editor_actions.cc:309
-msgid "Active Marker to Mouse"
-msgstr "Aktiven Marker zur Mausposition"
-
-#: editor_actions.cc:319
-msgid "Undo Selection Change"
-msgstr "Auswahländerung rückgängig machen"
-
-#: editor_actions.cc:320
-msgid "Redo Selection Change"
-msgstr "Auswahländerung wiederherstellen"
-
-#: editor_actions.cc:322
-msgid "Export Audio"
-msgstr "Audio exportieren"
-
-#: editor_actions.cc:323 export_dialog.cc:396
-msgid "Export Range"
-msgstr "Bereich exportieren"
-
-#: editor_actions.cc:328
-msgid "Separate Using Punch Range"
-msgstr "an Punch-Bereichsgrenzen teilen"
-
-#: editor_actions.cc:331
-msgid "Separate Using Loop Range"
-msgstr "an Schleifengrenzen teilen"
-
-#: editor_actions.cc:334 editor_actions.cc:356
-msgid "Crop"
-msgstr "Auf Bereich zuschneiden"
-
-#: editor_actions.cc:344
-msgid "Fade Range Selection"
-msgstr "Bereichsauswahl faden"
-
-#: editor_actions.cc:346
-msgid "Set Tempo from Edit Range = Bar"
-msgstr "Editierbereich = Taktlänge setzen"
-
-#: editor_actions.cc:348
-msgid "Log"
-msgstr "Log"
-
-#: editor_actions.cc:351 editor_actions.cc:353
-msgid "Move to Next Transient"
-msgstr "Zum nächsten Transienten bewegen"
-
-#: editor_actions.cc:352 editor_actions.cc:354
-msgid "Move to Previous Transient"
-msgstr "Zum vorigen Transienten bewegen"
-
-#: editor_actions.cc:358 editor_actions.cc:361
-msgid "Start Range"
-msgstr "Bereich beginnen"
-
-#: editor_actions.cc:359 editor_actions.cc:362
-msgid "Finish Range"
-msgstr "Bereich beenden"
-
-#: editor_actions.cc:394
-msgid "Follow Playhead"
-msgstr "Positionszeiger folgen"
-
-#: editor_actions.cc:395
-msgid "Remove Last Capture"
-msgstr "Letzte Aufnahme entfernen"
-
-#: editor_actions.cc:397
-msgid "Stationary Playhead"
-msgstr "stehender Positionszeiger"
-
-#: editor_actions.cc:399 insert_time_dialog.cc:32
-msgid "Insert Time"
-msgstr "Stille Einfügen"
-
-#: editor_actions.cc:402
-msgid "Toggle Active"
-msgstr "Spur Aktivieren / Deaktivieren"
-
-#: editor_actions.cc:404 editor_actions.cc:1766 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1550
-#: route_time_axis.cc:856
-msgid "Remove"
-msgstr "Löschen"
-
-#: editor_actions.cc:409
-msgid "Fit Selection (Vertical)"
-msgstr "Auswahl einpassen (vertikal)"
-
-#: editor_actions.cc:411 time_axis_view.cc:1371
-msgid "Largest"
-msgstr "Am größten"
-
-#: editor_actions.cc:414 time_axis_view.cc:1372
-msgid "Larger"
-msgstr "Größer"
-
-#: editor_actions.cc:417 editor_rulers.cc:249 time_axis_view.cc:1373
-msgid "Large"
-msgstr "Groß"
-
-#: editor_actions.cc:423 editor_rulers.cc:253 time_axis_view.cc:1375
-msgid "Small"
-msgstr "Klein"
-
-#: editor_actions.cc:427
-msgid "Sound Selected MIDI Notes"
-msgstr "ausgewählte Noten abspielen"
-
-#: editor_actions.cc:432
-msgid "Zoom Focus Left"
-msgstr "Am linken Rand ausrichten"
-
-#: editor_actions.cc:433
-msgid "Zoom Focus Right"
-msgstr "Am rechten Rand ausrichten"
-
-#: editor_actions.cc:434
-msgid "Zoom Focus Center"
-msgstr "Zentriert ausrichten"
-
-#: editor_actions.cc:435
-msgid "Zoom Focus Playhead"
-msgstr "Am Positionszeiger ausrichten"
-
-#: editor_actions.cc:436
-msgid "Zoom Focus Mouse"
-msgstr "Zoom Fokus zur Maus"
-
-#: editor_actions.cc:437
-msgid "Zoom Focus Edit Point"
-msgstr "Zoom Fokus zu Arbeitspunkt"
-
-#: editor_actions.cc:439
-msgid "Next Zoom Focus"
-msgstr "Zoom FokusNächster "
-
-#: editor_actions.cc:445
-msgid "Smart Object Mode"
-msgstr "Smarter Objektmodus"
-
-#: editor_actions.cc:448
-msgid "Smart"
-msgstr "Smart"
-
-#: editor_actions.cc:451
-msgid "Object Tool"
-msgstr "Objektwerkzeug"
-
-#: editor_actions.cc:456
-msgid "Range Tool"
-msgstr "Bereich-Werkzeug (Range)"
-
-#: editor_actions.cc:461
-msgid "Note Drawing Tool"
-msgstr "Noten-Malwerkzeug"
-
-#: editor_actions.cc:466
-msgid "Audition Tool"
-msgstr "Vorhör-Werkzeug"
-
-#: editor_actions.cc:471
-msgid "Time FX Tool"
-msgstr "TimeFX-Werkzeug"
-
-#: editor_actions.cc:476
-msgid "Content Tool"
-msgstr "Inhaltswerkzeug"
-
-#: editor_actions.cc:482
-msgid "Cut Tool"
-msgstr "Schneidewerkzeug"
-
-#: editor_actions.cc:488
-msgid "Step Mouse Mode"
-msgstr "Schritt-Mausmodus"
-
-#: editor_actions.cc:495
-msgid "Change Edit Point"
-msgstr "Arbeitspunkt ändern"
-
-#: editor_actions.cc:496
-msgid "Change Edit Point Including Marker"
-msgstr "Arbeitspunkt ändern (auch auf Marker wechseln)"
-
-#: editor_actions.cc:501
-msgid "EditMode|Lock"
-msgstr "Sperren"
-
-#: editor_actions.cc:502
-msgid "Cycle Edit Mode"
-msgstr "Editiermodus weiterschalten"
-
-#: editor_actions.cc:504
-msgid "Snap to"
-msgstr "Einrasten"
-
-#: editor_actions.cc:505
-msgid "Snap Mode"
-msgstr "Einrastmodus"
-
-#: editor_actions.cc:512
-msgid "Next Snap Mode"
-msgstr "Nächster Einrastmodus"
-
-#: editor_actions.cc:513
-msgid "Next Snap Choice"
-msgstr "Nächste Einrastmöglichkeit"
-
-#: editor_actions.cc:514
-msgid "Next Musical Snap Choice"
-msgstr "Nächster Einrastmöglichkeit (musikalisch)"
-
-#: editor_actions.cc:515
-msgid "Previous Snap Choice"
-msgstr "Vorige Einrastmöglichkeit"
-
-#: editor_actions.cc:516
-msgid "Previous Musical Snap Choice"
-msgstr " Vorige Einrastmöglichkeit (musikalisch)"
-
-#: editor_actions.cc:521
-msgid "Snap to CD Frame"
-msgstr "An CD-Frames einrasten"
-
-#: editor_actions.cc:522
-msgid "Snap to Timecode Frame"
-msgstr "An Timecode-Frames einrasten"
-
-#: editor_actions.cc:523
-msgid "Snap to Timecode Seconds"
-msgstr "An Timecode-Sekunden einrasten"
-
-#: editor_actions.cc:524
-msgid "Snap to Timecode Minutes"
-msgstr "An Timecode-Minuten einrasten"
-
-#: editor_actions.cc:525
-msgid "Snap to Seconds"
-msgstr "An Sekunden einrasten"
-
-#: editor_actions.cc:526
-msgid "Snap to Minutes"
-msgstr "An Minuten einrasten"
-
-#: editor_actions.cc:528
-msgid "Snap to One Twenty Eighths"
-msgstr "An Schläge/28 einrasten"
-
-#: editor_actions.cc:529
-msgid "Snap to Sixty Fourths"
-msgstr "An Schläge/128 einrasten"
-
-#: editor_actions.cc:530
-msgid "Snap to Thirty Seconds"
-msgstr "An Schläge/32 einrasten"
-
-#: editor_actions.cc:531
-msgid "Snap to Twenty Eighths"
-msgstr "An Schläge/28 einrasten"
-
-#: editor_actions.cc:532
-msgid "Snap to Twenty Fourths"
-msgstr "An Schläge/24 einrasten"
-
-#: editor_actions.cc:533
-msgid "Snap to Twentieths"
-msgstr "An Schläge/20 einrasten"
-
-#: editor_actions.cc:534
-msgid "Snap to Sixteenths"
-msgstr "An Schläge/16 einrasten"
-
-#: editor_actions.cc:535
-msgid "Snap to Fourteenths"
-msgstr "An Schläge/14 einrasten"
-
-#: editor_actions.cc:536
-msgid "Snap to Twelfths"
-msgstr "An Schläge/12 einrasten"
-
-#: editor_actions.cc:537
-msgid "Snap to Tenths"
-msgstr "An Schläge/10 einrasten"
-
-#: editor_actions.cc:538
-msgid "Snap to Eighths"
-msgstr "An Schläge/8 einrasten"
-
-#: editor_actions.cc:539
-msgid "Snap to Sevenths"
-msgstr "An Schläge/7 einrasten"
-
-#: editor_actions.cc:540
-msgid "Snap to Sixths"
-msgstr "An Schläge/6 einrasten"
-
-#: editor_actions.cc:541
-msgid "Snap to Fifths"
-msgstr "An Schläge/5 einrasten"
-
-#: editor_actions.cc:542
-msgid "Snap to Quarters"
-msgstr "An Schläge/4 einrasten"
-
-#: editor_actions.cc:543
-msgid "Snap to Thirds"
-msgstr "An Triolen einrasten"
-
-#: editor_actions.cc:544
-msgid "Snap to Halves"
-msgstr "An Schläge/2 einrasten"
-
-#: editor_actions.cc:546
-msgid "Snap to Beat"
-msgstr "An Schlägen einrasten"
-
-#: editor_actions.cc:547
-msgid "Snap to Bar"
-msgstr "An Takten einrasten"
-
-#: editor_actions.cc:548
-msgid "Snap to Mark"
-msgstr "An Markern einrasten"
-
-#: editor_actions.cc:549
-msgid "Snap to Region Start"
-msgstr "An Regionenanfang einrasten"
-
-#: editor_actions.cc:550
-msgid "Snap to Region End"
-msgstr "An Regionenende einrasten"
-
-#: editor_actions.cc:551
-msgid "Snap to Region Sync"
-msgstr "An Regionen-Synchronisationspunkt einrasten"
-
-#: editor_actions.cc:552
-msgid "Snap to Region Boundary"
-msgstr "An Regionengrenzen einrasten"
-
-#: editor_actions.cc:554
-msgid "Show Marker Lines"
-msgstr "Markerlinien anzeigen"
-
-#: editor_actions.cc:564
-msgid "Loop/Punch"
-msgstr "Schleifen/Punchbereiche"
-
-#: editor_actions.cc:568
-msgid "Min:Sec"
-msgstr "Min:Sek"
-
-#: editor_actions.cc:570 editor_actions.cc:573 editor_rulers.cc:271
-msgid "Video Monitor"
-msgstr "Videomonitor"
-
-#: editor_actions.cc:572 rc_option_editor.cc:2260
-msgid "Video"
-msgstr "Video"
-
-#: editor_actions.cc:575
-msgid "Always on Top"
-msgstr "Immer oben"
-
-#: editor_actions.cc:577
-msgid "Frame number"
-msgstr "Framenummer"
-
-#: editor_actions.cc:578
-msgid "Timecode Background"
-msgstr "Timecode-Hintergrund"
-
-#: editor_actions.cc:579
-msgid "Fullscreen"
-msgstr "Vollbild"
-
-#: editor_actions.cc:580
-msgid "Letterbox"
-msgstr "Letterbox"
-
-#: editor_actions.cc:581
-msgid "Original Size"
-msgstr "Originalgröße"
-
-#: editor_actions.cc:638
-msgid "Sort"
-msgstr "Sortieren"
-
-#: editor_actions.cc:649 editor_routes.cc:476 mixer_ui.cc:1196
-msgid "Show All"
-msgstr "Alles anzeigen"
-
-#: editor_actions.cc:650
-msgid "Show Automatic Regions"
-msgstr "Automatische Regionen anzeigen"
-
-#: editor_actions.cc:652
-msgid "Ascending"
-msgstr "aufsteigend"
-
-#: editor_actions.cc:654
-msgid "Descending"
-msgstr "absteigend"
-
-#: editor_actions.cc:657
-msgid "By Region Name"
-msgstr "nach Name der Region"
-
-#: editor_actions.cc:659
-msgid "By Region Length"
-msgstr "nach Länge der Region"
-
-#: editor_actions.cc:661
-msgid "By Region Position"
-msgstr "nach Position der Region"
-
-#: editor_actions.cc:663
-msgid "By Region Timestamp"
-msgstr "nach Zeitstempel der Region"
-
-#: editor_actions.cc:665
-msgid "By Region Start in File"
-msgstr "nach Anfang der Region in der Datei"
-
-#: editor_actions.cc:667
-msgid "By Region End in File"
-msgstr "nach Ende der Region in der Datei"
-
-#: editor_actions.cc:669
-msgid "By Source File Name"
-msgstr "nach Namen der Quelldatei"
-
-#: editor_actions.cc:671
-msgid "By Source File Length"
-msgstr "nach Länge der Quelldatei"
-
-#: editor_actions.cc:673
-msgid "By Source File Creation Date"
-msgstr "nach Erstellungsdatum der Quelldatei"
-
-#: editor_actions.cc:675
-msgid "By Source Filesystem"
-msgstr "nach Dateisystem der Quelle"
-
-#: editor_actions.cc:678
-msgid "Remove Unused"
-msgstr "Ungenutzte entfernen"
-
-#: editor_actions.cc:682 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
-msgid "Import"
-msgstr "Importieren"
-
-#: editor_actions.cc:685
-msgid "Import to Region List..."
-msgstr "In Regionenliste importieren"
-
-#: editor_actions.cc:688 session_import_dialog.cc:44
-msgid "Import From Session"
-msgstr "Aus Projekt importieren"
-
-#: editor_actions.cc:692
-msgid "Bring all media into session folder"
-msgstr "Alle Medien in Projektordner kopieren"
-
-#: editor_actions.cc:695
-msgid "Show Summary"
-msgstr "Projektübersicht anzeigen"
-
-#: editor_actions.cc:697
-msgid "Show Group Tabs"
-msgstr "Gruppierungsleiste anzeigen"
-
-#: editor_actions.cc:699
-msgid "Show Measure Lines"
-msgstr "Zeige Taktlinien"
-
-#: editor_actions.cc:703
-msgid "Show Logo"
-msgstr "Zeige Logo"
-
-#: editor_actions.cc:707
-msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
-msgstr "MIDI Eingang für im Editor ausgewählte Spuren/Busse de/aktivieren"
-
-#: editor_actions.cc:730
-msgid "Loaded editor bindings from %1"
-msgstr "Editor-Tastenkürzel aus %1 geladen"
-
-#: editor_actions.cc:732
-msgid "Could not find editor.bindings in search path %1"
-msgstr "Konnte editor.bindings im Suchpfad %1 nicht finden"
-
-#: editor_actions.cc:1076 editor_actions.cc:1472 editor_actions.cc:1483
-#: editor_actions.cc:1536 editor_actions.cc:1547 editor_actions.cc:1594
-#: editor_actions.cc:1604 editor_regions.cc:1563
-msgid "programming error: %1: %2"
-msgstr "Programmierfehler: %1: %2"
-
-#: editor_actions.cc:1772
-msgid "Raise"
-msgstr "Nach oben"
-
-#: editor_actions.cc:1775
-msgid "Raise to Top"
-msgstr "Ganz nach oben"
-
-#: editor_actions.cc:1778
-msgid "Lower"
-msgstr "Nach unten"
-
-#: editor_actions.cc:1781
-msgid "Lower to Bottom"
-msgstr "Ganz nach unten"
-
-#: editor_actions.cc:1784
-msgid "Move to Original Position"
-msgstr "Zur Ursprungsposition verschieben"
-
-#: editor_actions.cc:1789
-msgid "Lock to Video"
-msgstr "an Video koppeln"
-
-#: editor_actions.cc:1794 editor_markers.cc:912
-msgid "Glue to Bars and Beats"
-msgstr "An Takte und Schläge binden"
-
-#: editor_actions.cc:1799
-msgid "Remove Sync"
-msgstr "Synchronisationspunkt entfernen"
-
-#: editor_actions.cc:1802 mixer_strip.cc:2013 monitor_section.cc:272
-#: monitor_section.cc:349 route_time_axis.cc:253 route_time_axis.cc:526
-msgid "Mute"
-msgstr "Mute"
-
-#: editor_actions.cc:1805
-msgid "Normalize..."
-msgstr "Normalisieren..."
-
-#: editor_actions.cc:1808
-msgid "Reverse"
-msgstr "Umkehren"
-
-#: editor_actions.cc:1811
-msgid "Make Mono Regions"
-msgstr "In Mono-Regionen umwandeln"
-
-#: editor_actions.cc:1814
-msgid "Boost Gain"
-msgstr "Lautstärke erhöhen"
-
-#: editor_actions.cc:1817
-msgid "Cut Gain"
-msgstr "Lautstärke reduzieren"
-
-#: editor_actions.cc:1820
-msgid "Pitch Shift..."
-msgstr "Tonhöhe ändern..."
-
-#: editor_actions.cc:1823
-msgid "Transpose..."
-msgstr "Transponieren..."
-
-#: editor_actions.cc:1826
-msgid "Opaque"
-msgstr "Deckend"
-
-#: editor_actions.cc:1830 editor_regions.cc:117
-msgid "Fade In"
-msgstr "Fade In"
-
-#: editor_actions.cc:1835 editor_regions.cc:118
-msgid "Fade Out"
-msgstr "Fade Out"
-
-#: editor_actions.cc:1850
-msgid "Multi-Duplicate..."
-msgstr "Mehrfach duplizieren..."
-
-#: editor_actions.cc:1855
-msgid "Fill Track"
-msgstr "Spur auffüllen"
-
-#: editor_actions.cc:1859 editor_markers.cc:1000
-msgid "Set Loop Range"
-msgstr "Schleife erstellen"
-
-#: editor_actions.cc:1866
-msgid "Set Punch"
-msgstr "Punchbereich erstellen"
-
-#: editor_actions.cc:1870
-msgid "Add Single Range Marker"
-msgstr "Einzelnen Bereichsmarker einfügen"
-
-#: editor_actions.cc:1875
-msgid "Add Range Marker Per Region"
-msgstr "Einen Bereichsmarker pro Region einfügen"
-
-#: editor_actions.cc:1879
-msgid "Snap Position To Grid"
-msgstr "Positionszeiger einrasten"
-
-#: editor_actions.cc:1882
-msgid "Close Gaps"
-msgstr "Lücken schließen"
-
-#: editor_actions.cc:1885
-msgid "Rhythm Ferret..."
-msgstr "Rhythm Ferret..."
-
-#: editor_actions.cc:1888
-msgid "Export..."
-msgstr "Exportieren..."
-
-#: editor_actions.cc:1894
-msgid "Separate Under"
-msgstr "Bereich unter aktueller Region entfernen"
-
-#: editor_actions.cc:1898 editor_actions.cc:1899
-msgid "Set Fade In Length"
-msgstr "Fade-In bis Positionszeiger"
-
-#: editor_actions.cc:1900 editor_actions.cc:1901
-msgid "Set Fade Out Length"
-msgstr "Fade-Out ab Positionszeiger"
-
-#: editor_actions.cc:1903
-msgid "Set Tempo from Region = Bar"
-msgstr "Regionlänge = Taktlänge setzen"
-
-#: editor_actions.cc:1908
-msgid "Split at Percussion Onsets"
-msgstr "Regionen an perkussiven Schlägen teilen"
-
-#: editor_actions.cc:1913
-msgid "List Editor..."
-msgstr "Eventlisteneditor..."
-
-#: editor_actions.cc:1916
-msgid "Properties..."
-msgstr "Eigenschaften..."
-
-#: editor_actions.cc:1920
-msgid "Bounce (with processing)"
-msgstr "Bounce (Post-Mixer)"
-
-#: editor_actions.cc:1921
-msgid "Bounce (without processing)"
-msgstr "Bounce (Pre-Mixer)"
-
-#: editor_actions.cc:1922
-msgid "Combine"
-msgstr "Verbinden (combine)"
-
-#: editor_actions.cc:1923
-msgid "Uncombine"
-msgstr "Trennen (uncombine)"
-
-#: editor_actions.cc:1925
-msgid "Spectral Analysis..."
-msgstr "FFT-Analyse"
-
-#: editor_actions.cc:1927
-msgid "Reset Envelope"
-msgstr "Lautstärkekurve zurücksetzen"
-
-#: editor_actions.cc:1929
-msgid "Reset Gain"
-msgstr "Lautstärke zurücksetzen"
-
-#: editor_actions.cc:1934
-msgid "Envelope Active"
-msgstr "Lautstärkekurve ist aktiv"
-
-#: editor_actions.cc:1942 editor_actions.cc:1943
-msgid "Insert Patch Change..."
-msgstr "Patch Change einfügen..."
-
-#: editor_actions.cc:1944
-msgid "Unlink from other copies"
-msgstr "Von anderen Kopien entkoppeln"
-
-#: editor_actions.cc:1945
-msgid "Strip Silence..."
-msgstr "Stille entfernen..."
-
-#: editor_actions.cc:1946
-msgid "Set Range Selection"
-msgstr "Bereich auswählen"
-
-#: editor_actions.cc:1948 editor_actions.cc:1949
-msgid "Nudge Later"
-msgstr "Schritt nach hinten"
-
-#: editor_actions.cc:1950 editor_actions.cc:1951
-msgid "Nudge Earlier"
-msgstr "Schritt nach vorne"
-
-#: editor_actions.cc:1953
-msgid "Sequence Regions"
-msgstr "Regionen aneinanderreihen"
-
-#: editor_actions.cc:1958
-msgid "Nudge Later by Capture Offset"
-msgstr "Schritt nach hinten um Aufnahme-Offset"
-
-#: editor_actions.cc:1965
-msgid "Nudge Earlier by Capture Offset"
-msgstr "Schritt nach vorne um Aufnahme-Offset"
-
-#: editor_actions.cc:1969
-msgid "Trim to Loop"
-msgstr "Auf Schleife kürzen"
-
-#: editor_actions.cc:1970
-msgid "Trim to Punch"
-msgstr "Auf Punchbereich kürzen"
-
-#: editor_actions.cc:1972
-msgid "Trim to Previous"
-msgstr "Zur vorherigen Region aufschließen"
-
-#: editor_actions.cc:1973
-msgid "Trim to Next"
-msgstr "Zur nächsten Region aufschließen"
-
-#: editor_actions.cc:1980
-msgid "Insert Region From Region List"
-msgstr "Region von Regionenliste hinzufügen"
-
-#: editor_actions.cc:1986
-msgid "Set Sync Position"
-msgstr "Synchronisationspunkt setzen"
-
-#: editor_actions.cc:1987
-msgid "Place Transient"
-msgstr "Transienten setzen"
-
-#: editor_actions.cc:1988
-msgid "Split/Separate"
-msgstr "Teilen/Auftrennen"
-
-#: editor_actions.cc:1989
-msgid "Trim Start at Edit Point"
-msgstr "Anfang der Region am Arbeitspunkt abschneiden"
-
-#: editor_actions.cc:1990
-msgid "Trim End at Edit Point"
-msgstr "Ende der Region am Arbeitspunkt abschneiden"
-
-#: editor_actions.cc:1995
-msgid "Align Start"
-msgstr "Anfang ausrichten"
-
-#: editor_actions.cc:2002
-msgid "Align Start Relative"
-msgstr "Anfang relativ ausrichten"
-
-#: editor_actions.cc:2006
-msgid "Align End"
-msgstr "Ende ausrichten"
-
-#: editor_actions.cc:2011
-msgid "Align End Relative"
-msgstr "Ende relativ ausrichten"
-
-#: editor_actions.cc:2018
-msgid "Align Sync"
-msgstr "Synchronisationspunkt ausrichten"
-
-#: editor_actions.cc:2025
-msgid "Align Sync Relative"
-msgstr "Synchronisationspunkt relativ ausrichten"
-
-#: editor_actions.cc:2029 editor_actions.cc:2032
-msgid "Choose Top..."
-msgstr "Oberste Region auswählen..."
-
-#: editor_audio_import.cc:77 editor_audio_import.cc:99
-msgid "You can't import or embed an audiofile until you have a session loaded."
-msgstr ""
-"Sie können keine Audiodatei importieren, solange kein Projekt geladen ist."
-
-#: editor_audio_import.cc:83 editor_audio_import.cc:127
-msgid "Add Existing Media"
-msgstr "Vorhandenes Material importieren"
-
-#: editor_audio_import.cc:175
-msgid ""
-"The session already contains a source file named %1. Do you want to import "
-"%1 as a new file, or skip it?"
-msgstr ""
-"Das Projekt enthält bereits eine Datei namens %1. Wollen Sie %1 als neue "
-"Datei importieren, oder überspringen?"
-
-#: editor_audio_import.cc:177
-msgid ""
-"The session already contains a source file named %1. Do you want to import "
-"%2 as a new source, or skip it?"
-msgstr ""
-"Das Projekt enthält bereits eine Datei namens %1. Wollen Sie %2 als neue "
-"Quelle importieren, oder überspringen?"
-
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
-msgid "Cancel Import"
-msgstr "Importieren Abbrechen"
-
-#: editor_audio_import.cc:559
-msgid "Editor: cannot open file \"%1\", (%2)"
-msgstr "Editor: kann die Datei \"%1\" nicht öffnen (%2)"
-
-#: editor_audio_import.cc:567
-msgid "Cancel entire import"
-msgstr "Importieren Abbrechen"
-
-#: editor_audio_import.cc:568
-msgid "Don't embed it"
-msgstr "Nicht einbetten"
-
-#: editor_audio_import.cc:569
-msgid "Embed all without questions"
-msgstr "Alle Importieren ohne nachzufragen"
-
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
-msgid "Sample rate"
-msgstr "Samplerate"
-
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
-msgid ""
-"%1\n"
-"This audiofile's sample rate doesn't match the session sample rate!"
-msgstr ""
-"%1\n"
-"Die Samplerate dieser Audiodatei unterscheidet sich von der Samplerate "
-"dieses Projekts."
-
-#: editor_audio_import.cc:595
-msgid "Embed it anyway"
-msgstr "Trotzdem importieren"
-
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
-msgid "Could not create new track after region placed in the drop zone"
-msgstr ""
-"Konnte keine neue Spur erzeugen, nachdem die Region in der Drop Zone "
-"platziert wurde"
-
-#: editor_drag.cc:1266
-msgid "fixed time region drag"
-msgstr "Region zeitgleich verschieben"
-
-#: editor_drag.cc:2214
-msgid "Ripple drag"
-msgstr "Wellenmodus-Ziehen"
-
-#: editor_drag.cc:2365 midi_region_view.cc:2813
-msgid "resize notes"
-msgstr "Notenlänge ändern"
-
-#: editor_drag.cc:2517
-msgid "Video Start:"
-msgstr "Videostart"
-
-#: editor_drag.cc:2519
-msgid "Diff:"
-msgstr "Diff:"
-
-#: editor_drag.cc:2538
-msgid "Move Video"
-msgstr "Bewege Video"
-
-#: editor_drag.cc:3046
-msgid "copy meter mark"
-msgstr "Taktmarker kopieren"
-
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "Taktwechsel bewegen"
-
-#: editor_drag.cc:3177
-msgid "copy tempo mark"
-msgstr "Tempomarker kopieren"
-
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "Tempowechsel bewegen"
-
-#: editor_drag.cc:3412
-msgid "change fade in length"
-msgstr "Ändere Fade-In Länge"
-
-#: editor_drag.cc:3526
-msgid "change fade out length"
-msgstr "Fade-Out verändern"
-
-#: editor_drag.cc:3880
-msgid "move marker"
-msgstr "Marker bewegen"
-
-#: editor_drag.cc:4490
-msgid "An error occurred while executing time stretch operation"
-msgstr "Beim Ausführen der Timestretch-Operation trat ein Fehler auf"
-
-#: editor_drag.cc:4947
-msgid "programming_error: %1"
-msgstr "Programmierfehler: %1"
-
-#: editor_drag.cc:5016 editor_drag.cc:5026
-msgid "new skip marker"
-msgstr "neuer Sprungmarker"
-
-#: editor_drag.cc:5017
-msgid "skip"
-msgstr "Sprung"
-
-#: editor_drag.cc:5021 location_ui.cc:56
-msgid "CD"
-msgstr "CD"
-
-#: editor_drag.cc:5022
-msgid "new CD marker"
-msgstr "neuer CD Marker"
-
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
-msgid "unnamed"
-msgstr "unbenannt"
-
-#: editor_drag.cc:5309
-msgid "Automation range drag created for invalid region type"
-msgstr "Automationsbereichs-Ziehen für ungültigen Regionstyp erzeugt"
-
-#: editor_route_groups.cc:96
-msgid "Col"
-msgstr "Spalte"
-
-#: editor_route_groups.cc:96
-msgid "Group Tab Color"
-msgstr "Farbe des Gruppen-Reiters"
-
-#: editor_route_groups.cc:97
-msgid "Name of Group"
-msgstr "Gruppenname"
-
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "Visible|V"
-msgstr "V"
-
-#: editor_route_groups.cc:98
-msgid "Group is visible?"
-msgstr "Gruppe sichtbar?"
-
-#: editor_route_groups.cc:99
-msgid "On"
-msgstr "An"
-
-#: editor_route_groups.cc:99
-msgid "Group is enabled?"
-msgstr "Ist die Gruppe aktiviert?"
-
-#: editor_route_groups.cc:100
-msgid "Group|G"
-msgstr "G"
-
-#: editor_route_groups.cc:100
-msgid "Sharing Gain?"
-msgstr "Lautstärke teilen?"
-
-#: editor_route_groups.cc:101
-msgid "Relative|Rel"
-msgstr "Rel"
-
-#: editor_route_groups.cc:101
-msgid "Relative Gain Changes?"
-msgstr "Relative Lautstärke-Änderungen"
-
-#: editor_route_groups.cc:102 editor_regions.cc:121 editor_routes.cc:211
-#: mixer_strip.cc:2039 meter_strip.cc:363 route_time_axis.cc:2709
-#: time_axis_view.cc:1190
-msgid "Mute|M"
-msgstr "M"
-
-#: editor_route_groups.cc:102
-msgid "Sharing Mute?"
-msgstr "Stummschaltung teilen?"
-
-#: editor_route_groups.cc:103 editor_routes.cc:212 mixer_strip.cc:2049
-#: meter_strip.cc:371 route_time_axis.cc:2706
-msgid "Solo|S"
-msgstr "S"
-
-#: editor_route_groups.cc:103
-msgid "Sharing Solo?"
-msgstr "Solo teilen?"
-
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
-msgid "Rec"
-msgstr "Rec"
-
-#: editor_route_groups.cc:104
-msgid "Sharing Record-enable Status?"
-msgstr "Aufnahmebereitschaft teilen?"
-
-#: editor_route_groups.cc:105
-msgid "Monitoring|Mon"
-msgstr "Mon"
-
-#: editor_route_groups.cc:105
-msgid "Sharing Monitoring Choice?"
-msgstr "Monitoring-Wahl teilen?"
-
-#: editor_route_groups.cc:106
-msgid "Selection|Sel"
-msgstr "Sel"
-
-#: editor_route_groups.cc:106
-msgid "Sharing Selected/Editing Status?"
-msgstr "Auswahl-/Editierzustand teilen?"
-
-#: editor_route_groups.cc:107 editor_routes.cc:208
-msgid "Active|A"
-msgstr "A"
-
-#: editor_route_groups.cc:107
-msgid "Sharing Active Status?"
-msgstr "Einschaltzustand teilen?"
-
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
-msgid "programming error: marker canvas item has no marker object pointer!"
-msgstr "Programmierfehler: marker canvas item has no marker object pointer!"
-
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
-msgstr "Datei existiert!"
-
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
-msgstr "Vorhandenes Material überschreiben"
-
-#: editor_group_tabs.cc:176
-msgid "Fit to Window"
-msgstr "An Fenster anpassen"
-
-#: editor_markers.cc:139
-msgid "start"
-msgstr "Start"
-
-#: editor_markers.cc:140
-msgid "end"
-msgstr "Ende"
-
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
-msgid "add marker"
-msgstr "Marker hinzufügen"
-
-#: editor_markers.cc:689 editor_markers.cc:1456
-msgid "set loop range"
-msgstr "Loopbereich festlegen"
-
-#: editor_markers.cc:705 editor_markers.cc:1462
-msgid "set punch range"
-msgstr "Punchbereich festlegen"
-
-#: editor_markers.cc:722 editor_ops.cc:4055
-msgid "range"
-msgstr "Bereich"
-
-#: editor_markers.cc:725
-msgid "new range marker"
-msgstr "Neuer Bereich"
-
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
-msgid "remove marker"
-msgstr "Marker entfernen"
-
-#: editor_markers.cc:894
-msgid "Locate to Here"
-msgstr "Hierhin setzen"
-
-#: editor_markers.cc:895
-msgid "Play from Here"
-msgstr "Wiedergabe ab hier"
-
-#: editor_markers.cc:896
-msgid "Move Mark to Playhead"
-msgstr "Marker zum Positionszeiger verschieben"
-
-#: editor_markers.cc:900
-msgid "Create Range to Next Marker"
-msgstr "Bereich bis zum nächsten Marker erstellen"
-
-#: editor_markers.cc:941
-msgid "Locate to Marker"
-msgstr "Positionszeiger zu Marker setzen"
-
-#: editor_markers.cc:942
-msgid "Play from Marker"
-msgstr "Wiedergabe ab Marker"
-
-#: editor_markers.cc:945
-msgid "Set Marker from Playhead"
-msgstr "Marker beim Positionszeiger erzeugen"
-
-#: editor_markers.cc:947
-msgid "Set Range from Selection"
-msgstr "Bereich aus Auswahl bilden"
-
-#: editor_markers.cc:957
-msgid "Hide Range"
-msgstr "Bereich verbergen"
-
-#: editor_markers.cc:958
-msgid "Rename Range..."
-msgstr "Bereich umbenennen..."
-
-#: editor_markers.cc:962
-msgid "Remove Range"
-msgstr "Bereich entfernen"
-
-#: editor_markers.cc:969
-msgid "Separate Regions in Range"
-msgstr "Regionen an Bereichsgrenzen teilen"
-
-#: editor_markers.cc:972
-msgid "Select Range"
-msgstr "Bereich auswählen"
-
-#: editor_markers.cc:1001
-msgid "Set Punch Range"
-msgstr "Punchbereich erstellen"
-
-#: editor_markers.cc:1407 editor_ops.cc:2040
-msgid "New Name:"
-msgstr "Neuer Name: "
-
-#: editor_markers.cc:1410
-msgid "Rename Mark"
-msgstr "Marker umbenennen"
-
-#: editor_markers.cc:1412
-msgid "Rename Range"
-msgstr "Bereich umbenennen"
-
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1096 route_ui.cc:1571
-msgid "Rename"
-msgstr "Umbenennen"
-
-#: editor_markers.cc:1432
-msgid "rename marker"
-msgstr "Marker umbenennen"
-
-#: editor_mixer.cc:90
-msgid "This screen is not tall enough to display the editor mixer"
-msgstr ""
-"Dieser Bildschirm ist nicht hoch genug, um den Editor-Mixer darzustellen"
-
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
-msgid ""
-"programming error: tempo marker canvas item has no marker object pointer!"
-msgstr ""
-"Programmierfehler: tempo marker canvas item has no marker object pointer!"
-
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
-msgid "programming error: marker for tempo is not a tempo marker!"
-msgstr "Programmierfehler: marker for tempo is not a tempo marker!"
-
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
-msgid "programming error: marker for meter is not a meter marker!"
-msgstr "Programmierfehler: marker for meter is not a meter marker!"
-
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
-msgid ""
-"programming error: control point canvas item has no control point object "
-"pointer!"
-msgstr ""
-"Programmierfehler: control point canvas item has no control point object "
-"pointer!"
-
-#: editor_mouse.cc:2058
-msgid "start point trim"
-msgstr "Startpunkt ändern"
-
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "Endpunkt verändern"
-
-#: editor_mouse.cc:2135
-msgid "Name for region:"
-msgstr "Name für Region:"
-
-#: editor_ops.cc:165
-msgid "split"
-msgstr "teile"
-
-#: editor_ops.cc:339
-msgid "alter selection"
-msgstr "Auswahl ändern"
-
-#: editor_ops.cc:381
-msgid "nudge regions forward"
-msgstr "Regionen Schritt vorwärts"
-
-#: editor_ops.cc:404 editor_ops.cc:489
-msgid "nudge location forward"
-msgstr "Position Schritt vorwärts"
-
-#: editor_ops.cc:462
-msgid "nudge regions backward"
-msgstr "Regionen Schritt nach hinten"
-
-#: editor_ops.cc:551
-msgid "nudge forward"
-msgstr "Schritt vorwärts"
-
-#: editor_ops.cc:575
-msgid "nudge backward"
-msgstr "Schritt nach hinten"
-
-#: editor_ops.cc:618
-msgid "sequence regions"
-msgstr "Regionen aneinanderreihen"
-
-#: editor_ops.cc:694
-msgid "build_region_boundary_cache called with snap_type = %1"
-msgstr "build_region_boundary_cache wurde mit snap_type = %1 aufgerufen"
-
-#: editor_ops.cc:2042
-msgid "New Location Marker"
-msgstr "Neuer Positionsmarker"
-
-#: editor_ops.cc:2164
-msgid "add markers"
-msgstr "Marker hinzufügen"
-
-#: editor_ops.cc:2274
-msgid "clear markers"
-msgstr "Marker zurücksetzen"
-
-#: editor_ops.cc:2289
-msgid "clear ranges"
-msgstr "Bereiche zurücksetzen"
-
-#: editor_ops.cc:2305
-msgid "clear locations"
-msgstr "Positionen zurücksetzen"
-
-#: editor_ops.cc:2368
-msgid "insert region"
-msgstr "Region einfügen"
-
-#: editor_ops.cc:2559
-msgid "raise regions"
-msgstr "Regionen weiter nach oben"
-
-#: editor_ops.cc:2561
-msgid "raise region"
-msgstr "Region weiter nach oben"
-
-#: editor_ops.cc:2567
-msgid "raise regions to top"
-msgstr "Regionen ganz nach oben"
-
-#: editor_ops.cc:2569
-msgid "raise region to top"
-msgstr "Region ganz nach oben"
-
-#: editor_ops.cc:2575
-msgid "lower regions"
-msgstr "Regionen weiter nach unten"
-
-#: editor_ops.cc:2577 editor_ops.cc:2585
-msgid "lower region"
-msgstr "Region weiter nach unten"
-
-#: editor_ops.cc:2583
-msgid "lower regions to bottom"
-msgstr "Regionen ganz nach unten"
-
-#: editor_ops.cc:2668
-msgid "Rename Region"
-msgstr "Region umbenennen"
-
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1569
-msgid "New name:"
-msgstr "Neuer Name: "
-
-#: editor_ops.cc:2987
-msgid "separate"
-msgstr "Teilen"
-
-#: editor_ops.cc:3099
-msgid "separate region under"
-msgstr "Bereich unter aktueller Region entfernen"
-
-#: editor_ops.cc:3220
-msgid "trim to selection"
-msgstr "Auf Auswahl kürzen"
-
-#: editor_ops.cc:3356
-msgid "set sync point"
-msgstr "Einrastpunkt definieren"
-
-#: editor_ops.cc:3380
-msgid "remove region sync"
-msgstr "Synchronisationspunkt löschen"
-
-#: editor_ops.cc:3402
-msgid "move regions to original position"
-msgstr "Regionen zu ihrer Ursprungsposition verschieben"
-
-#: editor_ops.cc:3404
-msgid "move region to original position"
-msgstr "Region zu ihrer Ursprungsposition verschieben"
-
-#: editor_ops.cc:3425
-msgid "align selection"
-msgstr "Auswahl ausrichten"
-
-#: editor_ops.cc:3499
-msgid "align selection (relative)"
-msgstr "Auswahl relativ ausrichten"
-
-#: editor_ops.cc:3533
-msgid "align region"
-msgstr "Region ausrichten"
-
-#: editor_ops.cc:3584
-msgid "trim front"
-msgstr "vorne abschneiden"
-
-#: editor_ops.cc:3584
-msgid "trim back"
-msgstr "hinten Abschneiden"
-
-#: editor_ops.cc:3614
-msgid "trim to loop"
-msgstr "Auf Schleife kürzen"
-
-#: editor_ops.cc:3624
-msgid "trim to punch"
-msgstr "Auf Punchbereich kürzen"
-
-#: editor_ops.cc:3686
-msgid "trim to region"
-msgstr "Auf Region kürzen"
-
-#: editor_ops.cc:3794
-msgid ""
-"This track/bus cannot be frozen because the signal adds or loses channels "
-"before reaching the outputs.\n"
-"This is typically caused by plugins that generate stereo output from mono "
-"input or vice versa."
-msgstr ""
-"Diese Spur/dieser Bus kann nicht eingefroren werden, da sich die Kanalanzahl "
-"des Signals vor dem Ausgang ändert.\n"
-"Typischerweise wird dies durch ein Plugin verursacht, das Stereo aus einer "
-"Monoquelle oder umgekehrt erzeugt."
-
-#: editor_ops.cc:3797
-msgid "Cannot freeze"
-msgstr "Einfrieren nicht möglich"
-
-#: editor_ops.cc:3803
-msgid ""
-"<b>%1</b>\n"
-"\n"
-"This track has at least one send/insert/return as part of its signal flow.\n"
-"\n"
-"Freezing will only process the signal as far as the first send/insert/return."
-msgstr ""
-"<b>%1</b>\n"
-"\n"
-"Der Signalfluss dieser Spur hat mindestens ein Send/Insert/Return.\n"
-"\n"
-"Einfrieren wird das Signal nur bis zum ersten Send/Insert/Return verarbeiten."
-
-#: editor_ops.cc:3807
-msgid "Freeze anyway"
-msgstr "Trotzdem einfrieren"
-
-#: editor_ops.cc:3808
-msgid "Don't freeze"
-msgstr "Nicht einfrieren"
-
-#: editor_ops.cc:3809
-msgid "Freeze Limits"
-msgstr "Einfrier-Grenzen"
-
-#: editor_ops.cc:3824
-msgid "Cancel Freeze"
-msgstr "Einfrieren abbrechen"
-
-#: editor_ops.cc:3854
-msgid ""
-"You can't perform this operation because the processing of the signal will "
-"cause one or more of the tracks to end up with a region with more channels "
-"than this track has inputs.\n"
-"\n"
-"You can do this without processing, which is a different operation."
-msgstr ""
-"Diese Operation kann nicht ausgeführt werden, da durch die "
-"Signalverarbeitung eine oder mehrere Spuren eine Region mit mehr Kanälen "
-"bekäme, als die Spur Eingänge hat.\n"
-"Ohne diese Signalverarbeitung können Sie das tun, das ist aber eine andere "
-"Operation."
-
-#: editor_ops.cc:3858
-msgid "Cannot bounce"
-msgstr "Kann nicht bouncen"
-
-#: editor_ops.cc:3869
-msgid "bounce range"
-msgstr "Bereich bouncen"
-
-#: editor_ops.cc:3971
-msgid "delete"
-msgstr "Löschen"
-
-#: editor_ops.cc:3974
-msgid "cut"
-msgstr "Ausschneiden"
-
-#: editor_ops.cc:3977
-msgid "copy"
-msgstr "Kopieren"
-
-#: editor_ops.cc:3980
-msgid "clear"
-msgstr "Leeren"
-
-#: editor_ops.cc:4028
-msgid "objects"
-msgstr "Objekte"
-
-#: editor_ops.cc:4238 editor_ops.cc:4270
-msgid "remove region"
-msgstr "Region(en) löschen"
-
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "Auswahl duplizieren"
-
-#: editor_ops.cc:4803
-msgid "nudge track"
-msgstr "Spur verschieben"
-
-#: editor_ops.cc:4840
-msgid ""
-"Do you really want to destroy the last capture?\n"
-"(This is destructive and cannot be undone)"
-msgstr ""
-"Wollen Sie wirklich die letzte Aufnahme rückgängig machen?\n"
-"(Dies kann nicht rückgängig gemacht werden!)"
-
-#: editor_ops.cc:4843 editor_ops.cc:6845 editor_regions.cc:462
-#: editor_snapshots.cc:159
-msgid "No, do nothing."
-msgstr "Nein, nichts machen."
-
-#: editor_ops.cc:4844
-msgid "Yes, destroy it."
-msgstr "Ja, entfernen."
-
-#: editor_ops.cc:4846
-msgid "Destroy last capture"
-msgstr "Lösche letzte Aufnahme"
-
-#: editor_ops.cc:4906
-msgid "normalize"
-msgstr "Normalisieren"
-
-#: editor_ops.cc:5000
-msgid "reverse regions"
-msgstr "Regionen umkehren"
-
-#: editor_ops.cc:5034
-msgid "strip silence"
-msgstr "Stille entfernen"
-
-#: editor_ops.cc:5091
-msgid "Fork Region(s)"
-msgstr "Region(en) abzweigen"
-
-#: editor_ops.cc:5112
-msgid "Could not unlink %1"
-msgstr "Konnte die Bindung von %1 nicht lösen"
-
-#: editor_ops.cc:5326
-msgid "reset region gain"
-msgstr "Lautstärkekurve zurücksetzen"
-
-#: editor_ops.cc:5379
-msgid "region gain envelope active"
-msgstr "Lautstärkekurve aktiv"
-
-#: editor_ops.cc:5406
-msgid "toggle region lock"
-msgstr "Regionensperre umschalten"
-
-#: editor_ops.cc:5430
-msgid "Toggle Video Lock"
-msgstr "Videosperre umschalten"
-
-#: editor_ops.cc:5454
-msgid "region lock style"
-msgstr "Art der Regionensperre"
-
-#: editor_ops.cc:5479
-msgid "change region opacity"
-msgstr "Regionen-Deckkraft ändern"
-
-#: editor_ops.cc:5572
-msgid "fade range"
-msgstr "Bereich faden"
-
-#: editor_ops.cc:5610
-msgid "set fade in length"
-msgstr "Ändere Fade-In Länge"
-
-#: editor_ops.cc:5617
-msgid "set fade out length"
-msgstr "Ändere Fade-Out Länge"
-
-#: editor_ops.cc:5662
-msgid "set fade in shape"
-msgstr "Fade-In Kurve bearbeiten"
-
-#: editor_ops.cc:5693
-msgid "set fade out shape"
-msgstr "Fade-Out Kurve ändern"
-
-#: editor_ops.cc:5723
-msgid "set fade in active"
-msgstr "Fade-In aktivieren"
-
-#: editor_ops.cc:5752
-msgid "set fade out active"
-msgstr "Fade-Out aktivieren"
-
-#: editor_ops.cc:5994
-msgid "set loop range from selection"
-msgstr "Schleife aus Auswahl erstellen"
-
-#: editor_ops.cc:6008
-msgid "set loop range from region"
-msgstr "Schleife aus Region erstellen"
-
-#: editor_ops.cc:6027
-msgid "set punch range from selection"
-msgstr "Punchbereich aus Auswahl erstellen"
-
-#: editor_ops.cc:6041
-msgid "set session start/end from selection"
-msgstr "Projektstart/ende auf Auswahl setzen"
-
-#: editor_ops.cc:6066
-msgid "set punch range from region"
-msgstr "Punchbereich aus Region erstellen"
-
-#: editor_ops.cc:6175
-msgid "Add new marker"
-msgstr "Marker hinzufügen"
-
-#: editor_ops.cc:6176
-msgid "Set global tempo"
-msgstr "Globales tempo setzen"
-
-#: editor_ops.cc:6179
-msgid "Define one bar"
-msgstr "Einen Takt definieren"
-
-#: editor_ops.cc:6180
-msgid "Do you want to set the global tempo or add a new tempo marker?"
-msgstr ""
-"Möchten Sie das globale Tempo ändern oder einen neuen Tempo-Marker setzen?"
-
-#: editor_ops.cc:6206
-msgid "set tempo from region"
-msgstr "Tempo anhand von Region setzen"
-
-#: editor_ops.cc:6236
-msgid "split regions"
-msgstr "Region teilen (Split)"
-
-#: editor_ops.cc:6278
-msgid ""
-"You are about to split\n"
-"%1\n"
-"into %2 pieces.\n"
-"This could take a long time."
-msgstr ""
-"Sie versuchen %1 in %2 Teile zu teilen.\n"
-"Das könnte sehr lange dauern."
-
-#: editor_ops.cc:6285
-msgid "Call for the Ferret!"
-msgstr "Call for the Ferret!"
-
-#: editor_ops.cc:6286
-msgid ""
-"Press OK to continue with this split operation\n"
-"or ask the Ferret dialog to tune the analysis"
-msgstr ""
-"Drücken Sie OK um mit der aufteiloperation (Split) fortzufahren\n"
-"oder versuchen sie im Ferret-Fenster die Analyse zu verbessern."
-
-#: editor_ops.cc:6288
-msgid "Press OK to continue with this split operation"
-msgstr "Drücken Sie OK um mit der aufteiloperation (Split) fortzufahren"
-
-#: editor_ops.cc:6291
-msgid "Excessive split?"
-msgstr "Übermäßige Aufteilung?"
-
-#: editor_ops.cc:6443
-msgid "place transient"
-msgstr "Transienten platzieren"
-
-#: editor_ops.cc:6478
-msgid "snap regions to grid"
-msgstr "Regionen an Raster einrasten"
-
-#: editor_ops.cc:6517
-msgid "Close Region Gaps"
-msgstr "Regionenlücken schließen"
-
-#: editor_ops.cc:6522
-msgid "Crossfade length"
-msgstr "Länge des Crossfades"
-
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
-msgid "ms"
-msgstr "ms"
-
-#: editor_ops.cc:6533
-msgid "Pull-back length"
-msgstr "Öffnungslänge vorne"
-
-#: editor_ops.cc:6546
-msgid "Ok"
-msgstr "Ok"
-
-#: editor_ops.cc:6561
-msgid "close region gaps"
-msgstr "Schließe Lücken zwischen Regionen"
-
-#: editor_ops.cc:6803
-msgid "That would be bad news ...."
-msgstr "Lieber nicht!"
-
-#: editor_ops.cc:6808
-msgid ""
-"Removing the master or monitor bus is such a bad idea\n"
-"that %1 is not going to allow it.\n"
-"\n"
-"If you really want to do this sort of thing\n"
-"edit your ardour.rc file to set the\n"
-"\"allow-special-bus-removal\" option to be \"yes\""
-msgstr ""
-"Den Master- oder Monitorbus zu entfernen ist eine so\n"
-"schlechte Idee, dass %1 es nicht zulässt.\n"
-"\n"
-"Um dies dennoch zu tun, kann die Datei ardour.rc\n"
-"bearbeitet werden. \"allow-special-bus-removal\" muss\n"
-"dazu auf \"yes\" gesetzt werden."
-
-#: editor_ops.cc:6824 route_ui.cc:1935
-msgid "track"
-msgid_plural "tracks"
-msgstr[0] "Spur"
-msgstr[1] "Spuren"
-
-#: editor_ops.cc:6825 route_ui.cc:1935
-msgid "bus"
-msgid_plural "busses"
-msgstr[0] "Bus"
-msgstr[1] "Busse"
-
-#: editor_ops.cc:6829
-msgid ""
-"Do you really want to remove %1 %2 and %3 %4?\n"
-"(You may also lose the playlists associated with the %2)\n"
-"\n"
-"This action cannot be undone, and the session file will be overwritten!"
-msgstr ""
-"Wollen Sie wirklich %1 %2 und %3 %4 entfernen?\n"
-"(Sie werden auch die mit der %2 assoziierten Wiedergabelisten verlieren)\n"
-"\n"
-"Dies kann nicht rückgängig gemacht werden, und die Projektdatei wird "
-"überschrieben werden!"
-
-#: editor_ops.cc:6834
-msgid ""
-"Do you really want to remove %1 %2?\n"
-"(You may also lose the playlists associated with the %2)\n"
-"\n"
-"This action cannot be undone, and the session file will be overwritten!"
-msgstr ""
-"Wollen Sie wirklich %1 %2 entfernen?\n"
-"(Sie werden auch die mit der %2 assoziierten Wiedergabelisten verlieren)\n"
-"\n"
-"Dies kann nicht rückgängig gemacht werden, und die Projektdatei wird "
-"überschrieben werden!"
-
-#: editor_ops.cc:6840
-msgid ""
-"Do you really want to remove %1 %2?\n"
-"\n"
-"This action cannot be undone, and the session file will be overwritten"
-msgstr ""
-"Wollen Sie wirklich %1 %2 entfernen\n"
-"\n"
-"Diese Aktion kann nicht rückgängig gemacht werden, und die Projektdatei wird "
-"überschrieben werden"
-
-#: editor_ops.cc:6847
-msgid "Yes, remove them."
-msgstr "Ja, entfernen."
-
-#: editor_ops.cc:6849 editor_snapshots.cc:160
-msgid "Yes, remove it."
-msgstr "Ja, entfernen."
-
-#: editor_ops.cc:6854 editor_ops.cc:6856
-msgid "Remove %1"
-msgstr "Entferne %1"
-
-#: editor_ops.cc:6919
-msgid "insert time"
-msgstr "Stille einfügen"
-
-#: editor_ops.cc:7083
-msgid "There are too many tracks to fit in the current window"
-msgstr "Es gibt zu viele Spuren, sie in das aktuelle Fenster zu einzupassen"
-
-#: editor_ops.cc:7144
-msgid "Sel"
-msgstr "Sel"
-
-#: editor_ops.cc:7183
-#, c-format
-msgid "Saved view %u"
-msgstr "Ansicht %u gespeichert"
-
-#: editor_ops.cc:7208
-msgid "mute regions"
-msgstr "Regionen stummschalten"
-
-#: editor_ops.cc:7210
-msgid "mute region"
-msgstr "Region stummschalten"
-
-#: editor_ops.cc:7247
-msgid "combine regions"
-msgstr "Regionen verbinden (combine)"
-
-#: editor_ops.cc:7285
-msgid "uncombine regions"
-msgstr "Regionen trennen (uncombine)"
-
-#: editor_ops.cc:7322
-msgid "%1: Locked"
-msgstr "%1: Gesperrt"
-
-#: editor_ops.cc:7329
-msgid "Click to unlock"
-msgstr "Klicken, um Sperre aufzuheben"
-
-#: editor_ops.cc:7383
-msgid "Moving embedded files into session folder"
-msgstr "Verschiebe eingebettete Dateien in den Projektordner"
-
-#: editor_regions.cc:112
-msgid "Region name, with number of channels in []'s"
-msgstr "Name der Region, mit Kanalzahl in []"
-
-#: editor_regions.cc:113
-msgid "Position of start of region"
-msgstr "Position des Regionen-Anfangs"
-
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
-msgid "End"
-msgstr "Ende"
-
-#: editor_regions.cc:114
-msgid "Position of end of region"
-msgstr "Position des Regionen-Endes"
-
-#: editor_regions.cc:115
-msgid "Length of the region"
-msgstr "Länge der Region"
-
-#: editor_regions.cc:116
-msgid "Position of region sync point, relative to start of the region"
-msgstr ""
-"Position des Regionen-Synchronisationspunktes, relativ zu Regionenanfang"
-
-#: editor_regions.cc:117
-msgid "Length of region fade-in (units: secondary clock), () if disabled"
-msgstr "Länge des Einblendens (Einheiten: sekundäre Uhr), () falls inaktiv"
-
-#: editor_regions.cc:118
-msgid "Length of region fade-out (units: secondary clock), () if disabled"
-msgstr "Länge des Ausblendens (Einheiten: sekundäre Uhr), () falls inaktiv"
-
-#: editor_regions.cc:119
-msgid "Lock|L"
-msgstr "L"
-
-#: editor_regions.cc:119
-msgid "Region position locked?"
-msgstr "Position der Region gesperrt?"
-
-#: editor_regions.cc:120
-msgid "Gain|G"
-msgstr "G"
-
-#: editor_regions.cc:120
-msgid "Region position glued to Bars|Beats time?"
-msgstr "Regionenposition an Takt und Schäge gebunden?"
-
-#: editor_regions.cc:121
-msgid "Region muted?"
-msgstr "Region stummgeschaltet?"
-
-#: editor_regions.cc:122
-msgid "Opaque|O"
-msgstr "O"
-
-#: editor_regions.cc:122
-msgid "Region opaque (blocks regions below it from being heard)?"
-msgstr "Region deckend (hindert darunterliegende Regionen, gehört zu werden)?"
-
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
-msgid "Hidden"
-msgstr "Versteckt"
-
-#: editor_regions.cc:391
-msgid "(MISSING) "
-msgstr "(FEHLT)"
-
-#: editor_regions.cc:459
-msgid ""
-"Do you really want to remove unused regions?\n"
-"(This is destructive and cannot be undone)"
-msgstr ""
-"Wollen Sie ungenutzte Regionen wirklich entfernen?\n"
-"(Dies ist destruktiv und kann nicht rückgängig gemacht werden)"
-
-#: editor_regions.cc:463
-msgid "Yes, remove."
-msgstr "Ja, entfernen."
-
-#: editor_regions.cc:465
-msgid "Remove unused regions"
-msgstr "Ungenutzte Regionen entfernen"
-
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
-msgid "Mult."
-msgstr "Viele"
-
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
-msgid "Start"
-msgstr "Start"
-
-#: editor_regions.cc:867 editor_regions.cc:883
-msgid "Multiple"
-msgstr "Viele"
-
-#: editor_regions.cc:952
-msgid "MISSING "
-msgstr "FEHLT"
-
-#: editor_routes.cc:182
-msgid "SS"
-msgstr "SS"
-
-#: editor_routes.cc:206
-msgid "Track/Bus Name"
-msgstr "Spur/Busname"
-
-#: editor_routes.cc:207
-msgid "Track/Bus visible ?"
-msgstr "Spuren/Busse sichtbar?"
-
-#: editor_routes.cc:208
-msgid "Track/Bus active ?"
-msgstr "Spur/Bus aktiv?"
-
-#: editor_routes.cc:209
-msgid "MidiInput|I"
-msgstr "I"
-
-#: editor_routes.cc:209
-msgid "MIDI input enabled"
-msgstr "MIDI Eingänge aktiv"
-
-#: editor_routes.cc:210
-msgid "Rec|R"
-msgstr "R"
-
-#: editor_routes.cc:210
-msgid "Record enabled"
-msgstr "Aufnahme bereit"
-
-#: editor_routes.cc:211
-msgid "Muted"
-msgstr "Stumm"
-
-#: editor_routes.cc:212
-msgid "Soloed"
-msgstr "Solo ein"
-
-#: editor_routes.cc:213
-msgid "SoloIso|SI"
-msgstr "SI"
-
-#: editor_routes.cc:213
-msgid "Solo Isolated"
-msgstr "Isoliertes Solo"
-
-#: editor_routes.cc:214
-msgid "SoloLock|SS"
-msgstr "SS"
-
-#: editor_routes.cc:214
-msgid "Solo Safe (Locked)"
-msgstr "Solo Safe (gesperrt)"
-
-#: editor_routes.cc:477 mixer_ui.cc:1197
-msgid "Hide All"
-msgstr "Alle verbergen"
-
-#: editor_routes.cc:478 mixer_ui.cc:1198
-msgid "Show All Audio Tracks"
-msgstr "Zeige alle Audiospuren"
-
-#: editor_routes.cc:479 mixer_ui.cc:1199
-msgid "Hide All Audio Tracks"
-msgstr "Verberge alle Audiospuren"
-
-#: editor_routes.cc:480 mixer_ui.cc:1200
-msgid "Show All Audio Busses"
-msgstr "Zeige alle Audiobusse"
-
-#: editor_routes.cc:481 mixer_ui.cc:1201
-msgid "Hide All Audio Busses"
-msgstr "Verberge alle Audiobusse"
-
-#: editor_routes.cc:482
-msgid "Show All Midi Tracks"
-msgstr "Zeige alle MIDI-Spuren"
-
-#: editor_routes.cc:483
-msgid "Hide All Midi Tracks"
-msgstr "Verberge alle MIDI-Spuren"
-
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
-msgstr "Zeige Spuren mit Regionen unter dem Positionszeiger"
-
-#: editor_rulers.cc:211
-msgid "New location marker"
-msgstr "Neuer Positionsmarker"
-
-#: editor_rulers.cc:212
-msgid "Clear all locations"
-msgstr "Alle Positionsmarker entfernen"
-
-#: editor_rulers.cc:213
-msgid "Unhide locations"
-msgstr "Positionen anzeigen"
-
-#: editor_rulers.cc:217
-msgid "New range"
-msgstr "Neuer Bereich"
-
-#: editor_rulers.cc:218
-msgid "Clear all ranges"
-msgstr "Alle Bereiche entfernen"
-
-#: editor_rulers.cc:219
-msgid "Unhide ranges"
-msgstr "Bereiche anzeigen"
-
-#: editor_rulers.cc:224
-msgid "Make Loop range"
-msgstr "Erzeuge Schleifenbereich"
-
-#: editor_rulers.cc:225
-msgid "Make Punch range"
-msgstr "Erzeuge Punchbereich"
-
-#: editor_rulers.cc:230
-msgid "New CD track marker"
-msgstr "Neuer CD-Track Marker"
-
-#: editor_rulers.cc:235 tempo_dialog.cc:38
-msgid "New Tempo"
-msgstr "Tempowechsel einfügen..."
-
-#: editor_rulers.cc:239 tempo_dialog.cc:296
-msgid "New Meter"
-msgstr "Taktwechsel einfügen..."
-
-#: editor_snapshots.cc:137
-msgid "Rename Snapshot"
-msgstr "Schnappschuss umbenennen"
-
-#: editor_snapshots.cc:139
-msgid "New name of snapshot"
-msgstr "Name für neuen Schnappschuss"
-
-#: editor_snapshots.cc:157
-msgid ""
-"Do you really want to remove snapshot \"%1\" ?\n"
-"(which cannot be undone)"
-msgstr ""
-"Wollen Sie den Schnappschuss \"%1\" wirklich löschen?\n"
-"(Dies kann nicht rückgängig gemacht werden)"
-
-#: editor_snapshots.cc:162
-msgid "Remove snapshot"
-msgstr "Schnappschuss entfernen"
-
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "Hinzufügen"
-
-#: editor_tempodisplay.cc:215
-msgid "add tempo mark"
-msgstr "Tempowechsel einfügen"
-
-#: editor_tempodisplay.cc:254
-msgid "add meter mark"
-msgstr "Taktwechsel einfügen"
-
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
-msgid "done"
-msgstr "Fertig"
-
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
-msgid "replace tempo mark"
-msgstr "Tempowechsel ersetzen"
-
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
-msgid "remove tempo mark"
-msgstr "Tempowechsel entfernen"
-
-#: editor_tempodisplay.cc:370
-msgid ""
-"programming error: meter marker canvas item has no marker object pointer!"
-msgstr ""
-"pProgrammierfehler: meter marker canvas item has no marker object pointer!"
-
-#: editor_timefx.cc:68
-msgid "stretch/shrink"
-msgstr "strecken/stauchen"
-
-#: editor_timefx.cc:129
-msgid "pitch shift"
-msgstr "pitch-shift"
-
-#: editor_timefx.cc:301
-msgid "timefx cannot be started - thread creation error"
-msgstr ""
-"Time-Stretch konnte nicht gestartet werden - Fehler beim erstellen des "
-"Threads"
-
-#: engine_dialog.cc:83
-msgid "Device Control Panel"
-msgstr "Gerätekontrollfeld"
-
-#: engine_dialog.cc:84
-msgid "Midi Device Setup"
-msgstr "MIDI Geräteeinstellungen"
-
-#: engine_dialog.cc:85 engine_dialog.cc:2101
-msgid "Measure"
-msgstr "Messen"
-
-#: engine_dialog.cc:86
-msgid "Use results"
-msgstr "Benutze Ergebnisse"
-
-#: engine_dialog.cc:87
-msgid "Back to settings ... (ignore results)"
-msgstr "Zurücksetzen ... (Resultate ignorieren)"
-
-#: engine_dialog.cc:88
-msgid "Calibrate Audio"
-msgstr "AUdio kalibrieren"
-
-#: engine_dialog.cc:92
-msgid "Back to settings"
-msgstr "Zurück zu Einstellungen"
-
-#: engine_dialog.cc:111
-msgid ""
-"No audio/MIDI backends detected. %1 cannot run\n"
-"\n"
-"(This is a build/packaging/system error. It should never happen.)"
-msgstr ""
-"Kein Audio/MIDI backend gefunden. %1 kann nicht laufen\n"
-"\n"
-"(Das ist ein Kompilier-/Paket-/Systemfehler und sollte nie passieren.)"
-
-#: engine_dialog.cc:137
-msgid "Latency Measurement Tool"
-msgstr "Latenzmeßwerkzeug"
-
-#: engine_dialog.cc:149
-msgid ""
-"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
-"low level.</span>"
-msgstr ""
-"<span weight=\"bold\">Drehen Sie die Lautstärke Ihrer Audioanlage sehr leise."
-"</span>"
-
-#: engine_dialog.cc:158
-msgid "Select two channels below and connect them using a cable."
-msgstr "Wählen Sie unten zwei Kanäle aus und verbinden sie mit einem Kabel."
-
-#: engine_dialog.cc:163
-msgid "Output channel"
-msgstr "Ausgangskanal"
-
-#: engine_dialog.cc:171
-msgid "Input channel"
-msgstr "Eingangskanal"
-
-#: engine_dialog.cc:206
-msgid "Once the channels are connected, click the \"Measure\" button."
-msgstr "Wenn die Kanäle verbunden sind, klicken Sie den \"Messen\"-Knopf."
-
-#: engine_dialog.cc:213
-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:228 engine_dialog.cc:2221 engine_dialog.cc:2231
-msgid "No measurement results yet"
-msgstr "Noch keine Messergebnisse"
-
-#: engine_dialog.cc:238 route_params_ui.cc:106
-msgid "Latency"
-msgstr "Latenz"
-
-#: engine_dialog.cc:376
-msgid "Audio System:"
-msgstr "Audiosystem:"
-
-#: engine_dialog.cc:413
-msgid "Driver:"
-msgstr "Treiber:"
-
-#: engine_dialog.cc:419
-msgid "Device:"
-msgstr "Gerät:"
-
-#: engine_dialog.cc:424 engine_dialog.cc:523 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
-msgid "Sample rate:"
-msgstr "Samplerate:"
-
-#: engine_dialog.cc:430 engine_dialog.cc:530
-msgid "Buffer size:"
-msgstr "Puffergröße"
-
-#: engine_dialog.cc:448
-msgid "Input Channels:"
-msgstr "Eingangskanäle:"
-
-#: engine_dialog.cc:461
-msgid "Output Channels:"
-msgstr "Ausgangskanäle:"
-
-#: engine_dialog.cc:473
-msgid "Hardware input latency:"
-msgstr "Hardware Eingangslatenz (Samples)"
-
-#: engine_dialog.cc:476 engine_dialog.cc:489
-msgid "samples"
-msgstr "Samples"
-
-#: engine_dialog.cc:486
-msgid "Hardware output latency:"
-msgstr "Hardware Ausgangslatenz (Samples)"
-
-#: engine_dialog.cc:497
-msgid "MIDI System:"
-msgstr "MIDI System:"
-
-#: engine_dialog.cc:515
-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:568
-msgid ""
-"Failed to start or connect to audio-engine.\n"
-"\n"
-"Latency calibration requires a working audio interface."
-msgstr ""
-"Das Starten oder Verbinden mit der Audio-Engine ist fehlgeschlagen.\n"
-"\n"
-"Latenzkalibrierung erfordert ein funktionierendes Audio-Interface."
-
-#: engine_dialog.cc:574
-msgid ""
-"Your selected audio configuration is playback- or capture-only.\n"
-"\n"
-"Latency calibration requires playback and capture"
-msgstr ""
-"Ihre aktuelle Audiokonfiguration erlaubt nur Playback oder Aufnahme "
-"alleine.\n"
-"\n"
-"Latenzkalibrierung verlangt Duplexbetrieb (gleichzeitig Aufnahme und "
-"Wiedergabe)"
-
-#: engine_dialog.cc:655
-msgid "MIDI Devices"
-msgstr "MIDI Geräte"
-
-#: engine_dialog.cc:661
-msgid "Device"
-msgstr "Gerät"
-
-#: engine_dialog.cc:663
-msgid "Hardware Latencies"
-msgstr "Hardware-Latenzen"
-
-#: engine_dialog.cc:704
-msgid "Calibrate"
-msgstr "Kalibrieren"
-
-#: engine_dialog.cc:804
-msgid "all available channels"
-msgstr "alle verfügbaren Kanäle"
-
-#: engine_dialog.cc:1043 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "Sample"
-msgstr[1] "Samples"
-
-#: engine_dialog.cc:1094
-#, c-format
-msgid "(%.1f ms)"
-msgstr "(%.1f ms)"
-
-#: engine_dialog.cc:1597
-msgid "Could not start backend engine %1"
-msgstr "Konnte Backend Engine %1 nicht starten"
-
-#: engine_dialog.cc:1648
-msgid "Cannot set driver to %1"
-msgstr "Kann Treiber nicht auf %1 setzen"
-
-#: engine_dialog.cc:1652
-msgid "Cannot set device name to %1"
-msgstr "Kann Gerät nicht auf %1 setzen"
-
-#: engine_dialog.cc:1656
-msgid "Cannot set sample rate to %1"
-msgstr "Kann Samplerate nicht auf %1 setzen"
-
-#: engine_dialog.cc:1660
-msgid "Cannot set buffer size to %1"
-msgstr "Kann Buffergröße nicht auf %1 setzen"
-
-#: engine_dialog.cc:1666
-msgid "Cannot set input channels to %1"
-msgstr "Kann Eingangskanäle nicht auf %1 setzen"
-
-#: engine_dialog.cc:1670
-msgid "Cannot set output channels to %1"
-msgstr "Kann Ausgangskanäle nicht auf %1 setzen"
-
-#: engine_dialog.cc:1676
-msgid "Cannot set input latency to %1"
-msgstr "Kann Eingangslatenz nicht auf %1 setzen"
-
-#: engine_dialog.cc:1680
-msgid "Cannot set output latency to %1"
-msgstr "Kann Ausgangslatenz nicht auf %1 setzen"
-
-#: engine_dialog.cc:1959 engine_dialog.cc:2018
-msgid "No signal detected "
-msgstr "Kein Signal erkannt"
-
-#: engine_dialog.cc:1972 engine_dialog.cc:2026 port_insert_ui.cc:70
-#: port_insert_ui.cc:98
-msgid "Disconnected from audio engine"
-msgstr "Von Audio-Engine getrennt"
-
-#: engine_dialog.cc:1981 engine_dialog.cc:2034
-msgid "Detected roundtrip latency: "
-msgstr "Entdeckte Roundtrip-Latenz:"
-
-#: engine_dialog.cc:1983 engine_dialog.cc:2036
-msgid "Systemic latency: "
-msgstr "Systemische Latenz:"
-
-#: engine_dialog.cc:1990
-msgid "(signal detection error)"
-msgstr "(Fehler bei der Signalerkennung)"
-
-#: engine_dialog.cc:1996
-msgid "(inverted - bad wiring)"
-msgstr "(invertiert - schlechte Verkabelung)"
-
-#: engine_dialog.cc:2043
-msgid "(averaging)"
-msgstr "(durchschnittlich)"
-
-#: engine_dialog.cc:2049
-msgid "(too large jitter)"
-msgstr "(zu viel Jitter)"
-
-#: engine_dialog.cc:2053
-msgid "(large jitter)"
-msgstr "(viel Jitter)"
-
-#: engine_dialog.cc:2065
-msgid "Timeout - large MIDI jitter."
-msgstr "Timeout - viel MIDI Jitter."
-
-#: engine_dialog.cc:2081 port_insert_ui.cc:134
-msgid "Detecting ..."
-msgstr "Messe..."
-
-#: engine_dialog.cc:2175
-msgid "Disconnect from %1"
-msgstr "Trenne von %1"
-
-#: engine_dialog.cc:2179 mixer_strip.cc:1525 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Aktiv"
-
-#: engine_dialog.cc:2189
-msgid "Connect to %1"
-msgstr "Verbinde zu %1"
-
-#: engine_dialog.cc:2194
-msgid "Inactive"
-msgstr "Inaktiv"
-
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
-msgid "Channels:"
-msgstr "Kanäle:"
-
-#: export_channel_selector.cc:46
-msgid "Split to mono files"
-msgstr "In Monodateien aufteilen"
-
-#: export_channel_selector.cc:189
-msgid "Bus or Track"
-msgstr "Bus oder Spur"
-
-#: export_channel_selector.cc:465
-msgid "Region contents without fades nor region gain (channels: %1)"
-msgstr "Regioneninhalt ohne Fades und Regionenlautstärke (Kanäle: %1)"
-
-#: export_channel_selector.cc:469
-msgid "Region contents with fades and region gain (channels: %1)"
-msgstr "Regioneninhalt mit Fades und Regionenlautstärke (Kanäle: %1)"
-
-#: export_channel_selector.cc:473
-msgid "Track output (channels: %1)"
-msgstr "Spurausgang (%1 Kanäle)"
-
-#: export_channel_selector.cc:542
-msgid "Export region contents"
-msgstr "Regioneninhalte exportieren"
-
-#: export_channel_selector.cc:543
-msgid "Export track output"
-msgstr "Exportiere Spurausgänge"
-
-#: export_channel_selector.cc:575
-msgid "Track name"
-msgstr "Spurname"
-
-#: export_dialog.cc:46
-msgid ""
-"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
-"span>"
-msgstr ""
-"<span color=\"#ffa755\">Einige existierende Dateien werden überschrieben "
-"werden.</span>"
-
-#: export_dialog.cc:47
-msgid "List files"
-msgstr "Dateien auflisten"
-
-#: export_dialog.cc:158 export_format_dialog.cc:59
-msgid "File format"
-msgstr "Dateiformat"
-
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
-msgid "Time Span"
-msgstr "Zeitspanne"
-
-#: export_dialog.cc:160
-msgid "Channels"
-msgstr "Kanäle"
-
-#: export_dialog.cc:182
-msgid ""
-"Export has been aborted due to an error!\n"
-"See the Log for details."
-msgstr ""
-"Das Exportieren wurde aufgrund eines Fehlers abgebrochen!\n"
-"Details dazu stehen in der Log."
-
-#: export_dialog.cc:251
-msgid "Files that will be overwritten"
-msgstr "Dateien, die überschrieben werden"
-
-#: export_dialog.cc:296
-msgid "Export initialization failed: %1"
-msgstr "Exportinitialisierung gescheitert: %1"
-
-#: export_dialog.cc:306
-msgid "Stop Export"
-msgstr "Export Abbrechen"
-
-#: export_dialog.cc:327
-msgid "export"
-msgstr "Exportieren"
-
-#: export_dialog.cc:346
-msgid "Normalizing '%3' (timespan %1 of %2)"
-msgstr "Normalisiere '%3' (Zeitspanne %1 von %2)"
-
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "Exportiere '%3' (Zeitspanne %1 von %2)"
-
-#: export_dialog.cc:373 export_dialog.cc:375
-msgid "<span color=\"#ffa755\">Error: "
-msgstr "<span color=\"#ffa755\">Fehler: "
-
-#: export_dialog.cc:385
-msgid "<span color=\"#ffa755\">Warning: "
-msgstr "<span color=\"#ffa755\">Warnung: "
-
-#: export_dialog.cc:387
-msgid ""
-"\n"
-"<span color=\"#ffa755\">Warning: "
-msgstr ""
-"\n"
-"<span color=\"#ffa755\">Warnung: "
-
-#: export_dialog.cc:411
-msgid "Export Selection"
-msgstr "Auswahl exportieren"
-
-#: export_dialog.cc:425
-msgid "Export Region"
-msgstr "Region exportieren"
-
-#: export_dialog.cc:434
-msgid "Source"
-msgstr "Quelle"
-
-#: export_dialog.cc:450
-msgid "Stem Export"
-msgstr "Stem Export"
-
-#: export_file_notebook.cc:39
-msgid "Add another format"
-msgstr "Ein weiteres Format hinzuzufügen"
-
-#: export_file_notebook.cc:193
-msgid "Format"
-msgstr "Format"
-
-#: export_file_notebook.cc:194
-msgid "Location"
-msgstr "Ort"
-
-#: export_file_notebook.cc:195
-msgid "Upload to Soundcloud"
-msgstr "Zu Soundcloud hochladen"
-
-#: export_file_notebook.cc:273
-msgid "No format!"
-msgstr "Kein Format!"
-
-#: export_file_notebook.cc:291
-msgid "Format %1: %2"
-msgstr "Format: %1: %2"
-
-#: export_filename_selector.cc:32
-msgid "Label:"
-msgstr "Name:"
-
-#: export_filename_selector.cc:33
-msgid "Session Name"
-msgstr "Projektname"
-
-#: export_filename_selector.cc:34
-msgid "Revision:"
-msgstr "Revision:"
-
-#: export_filename_selector.cc:36
-msgid "Folder:"
-msgstr "Ordner:"
-
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
-#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
-msgid "Browse"
-msgstr "Durchsuchen"
-
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>Dateiname(n) aus diesen Bestandteilen erzeugen:</i>"
-
-#: export_filename_selector.cc:212
-msgid ""
-"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
-msgstr ""
-"<small><i>Leider kann zur Zeit kein Dateinamen-Beispiel gezeigt werden</i></"
-"small>"
-
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>Momentaner (ungefährer) Dateiname: \"%1\"</i></small>"
-
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
-msgid ""
-"%1: this is only the directory/folder name, not the filename.\n"
-"The filename will be chosen from the information just above the folder "
-"selector."
-msgstr ""
-"%1: dies ist nur der Verzeichnisname, nicht der Dateiname.\n"
-"Der Dateiname wird aus den Informationen über der "
-"Verzeichnisauswahlgeneriert."
-
-#: export_filename_selector.cc:322
-msgid "Choose export folder"
-msgstr "Wähle den Exportordner"
-
-#: export_format_dialog.cc:31
-msgid "New Export Format Profile"
-msgstr "Neues Exportformat-Profil"
-
-#: export_format_dialog.cc:31
-msgid "Edit Export Format Profile"
-msgstr "Exportformat-Profil bearbeiten"
-
-#: export_format_dialog.cc:38
-msgid "Label: "
-msgstr "Name:"
-
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normalisieren auf:"
-
-#: export_format_dialog.cc:46
-msgid "Trim silence at start"
-msgstr "Stille am Anfang abschneiden"
-
-#: export_format_dialog.cc:47
-msgid "Add silence at start:"
-msgstr "Füge Stille am Anfang hinzu:"
-
-#: export_format_dialog.cc:50
-msgid "Trim silence at end"
-msgstr "Stille am Ende abschneiden"
-
-#: export_format_dialog.cc:51
-msgid "Add silence at end:"
-msgstr "Füge Stille am Ende hinzu:"
-
-#: export_format_dialog.cc:54
-msgid ""
-"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
-msgstr ""
-"Kommando, das nach dem Export ausgeführt werden soll\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
-
-#: export_format_dialog.cc:57
-msgid "Compatibility"
-msgstr "Kompatibilität"
-
-#: export_format_dialog.cc:58
-msgid "Quality"
-msgstr "Qualität"
-
-#: export_format_dialog.cc:61
-msgid "Sample rate conversion quality:"
-msgstr "Qualität bei Konvertierung der Samplerate:"
-
-#: export_format_dialog.cc:68
-msgid "Dithering"
-msgstr "Dithering"
-
-#: export_format_dialog.cc:70
-msgid "Create CUE file for disk-at-once CD/DVD creation"
-msgstr "Schreibe CUE-Datei für Disk-at-once CD/DVD Erzeugung"
-
-#: export_format_dialog.cc:71
-msgid "Create TOC file for disk-at-once CD/DVD creation"
-msgstr "Schreibe TOC-Datei für Disk-at-once CD/DVD Erzeugung"
-
-#: export_format_dialog.cc:73
-msgid "Tag file with session's metadata"
-msgstr "Datei mit den Metadaten des Projekt taggen"
-
-#: export_format_dialog.cc:470
-msgid "Best (sinc)"
-msgstr "Beste (sinc)"
-
-#: export_format_dialog.cc:475
-msgid "Medium (sinc)"
-msgstr "Mittel (sinc)"
-
-#: export_format_dialog.cc:480
-msgid "Fast (sinc)"
-msgstr "Schnellste (sinc)"
-
-#: export_format_dialog.cc:490
-msgid "Zero order hold"
-msgstr "Halteglied nullter Ordnung (ZOH)"
-
-#: export_format_dialog.cc:895
-msgid "Linear encoding options"
-msgstr "Optionen für lineare Codierung"
-
-#: export_format_dialog.cc:911
-msgid "Ogg Vorbis options"
-msgstr "Ogg Vorbis Optionen"
-
-#: export_format_dialog.cc:922
-msgid "FLAC options"
-msgstr "FLAC Optionen"
-
-#: export_format_dialog.cc:939
-msgid "Broadcast Wave options"
-msgstr "Broadcast Wave Optionen"
-
-#: export_format_selector.cc:136
-msgid "Do you really want to remove the format?"
-msgstr "Wollen Sie das Format wirklich entfernen?"
-
-#: export_preset_selector.cc:28
-msgid "Preset"
-msgstr "Preset"
-
-#: export_preset_selector.cc:104
-msgid ""
-"The selected preset did not load successfully!\n"
-"Perhaps it references a format that has been removed?"
-msgstr ""
-"Das ausgewählte Preset konnte nicht geladen werden!\n"
-"Möglicherweise verwendet es ein Format, das entfernt wurde."
-
-#: export_preset_selector.cc:156
-msgid "Do you really want to remove this preset?"
-msgstr "Wollen Sie dieses Preset wirklich entfernen?"
-
-#: export_timespan_selector.cc:46
-msgid "Show Times as:"
-msgstr "Zeitanzeige:"
-
-#: export_timespan_selector.cc:53 processor_box.cc:2466
-msgid "Select All"
-msgstr "Alles auswählen"
-
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
-msgid " to "
-msgstr " bis"
-
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
-msgid "Range"
-msgstr "Bereiche"
-
-#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
-msgid "curl error %1 (%2)"
-msgstr "curl Fehler %1 (%2)"
-
-#: sfdb_freesound_mootcher.cc:266
-msgid "getSoundResourceFile: There is no valid root in the xml file"
-msgstr "getSoundResourceFile: Keine gültige Wurzel in der XML-Datei"
-
-#: sfdb_freesound_mootcher.cc:271
-msgid "getSoundResourceFile: root = %1, != response"
-msgstr "getSoundResourceFile: Wurzel = %1, != Antwort"
-
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
-msgid "%1"
-msgstr "%1"
-
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
-msgid "-inf"
-msgstr "-inf"
-
-#: gain_meter.cc:147 gain_meter.cc:958
-msgid "Fader automation mode"
-msgstr "Fader Automationsmodus"
-
-#: gain_meter.cc:148 gain_meter.cc:959
-msgid "Fader automation type"
-msgstr "Fader-Automationstyp"
-
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
-msgid "Abs"
-msgstr "Abs"
-
-#: gain_meter.cc:793
-msgid "M"
-msgstr "M"
-
-#: gain_meter.cc:796
-msgid "P"
-msgstr "P"
-
-#: gain_meter.cc:799
-msgid "T"
-msgstr "T"
-
-#: gain_meter.cc:802
-msgid "W"
-msgstr "W"
-
-#: generic_pluginui.cc:83
-msgid "<span size=\"large\">Presets</span>"
-msgstr "<span size=\"large\">Voreinstellungen</span>"
-
-#: generic_pluginui.cc:97
-msgid "Manual"
-msgstr "Manuell"
-
-#: generic_pluginui.cc:106
-msgid "All Automation"
-msgstr "Alle Automation"
-
-#: generic_pluginui.cc:250
-msgid "Switches"
-msgstr "Schalter"
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Steuerelemente"
-
-#: generic_pluginui.cc:293
-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:318
-msgid "Plugin Editor: no control for property %1"
-msgstr "Plugin Editor: kein Regler für Eigenschaft %1"
-
-#: generic_pluginui.cc:324
-msgid "Plugin Editor: could not build control element for property %1"
-msgstr "Plugin Editor: konnte kein Kontrollelement für Eigenschaft %1 erzeugen"
-
-#: generic_pluginui.cc:468
-msgid "Meters"
-msgstr "Pegelanzeigen"
-
-#: generic_pluginui.cc:490
-msgid "Automation control"
-msgstr "Automation"
-
-#: generic_pluginui.cc:497
-msgid "Mgnual"
-msgstr "Mgnuell"
-
-#: global_port_matrix.cc:158
-msgid "Audio Connection Manager"
-msgstr "Audio Verbindungsmanager"
-
-#: global_port_matrix.cc:161
-msgid "MIDI Connection Manager"
-msgstr "Midi Verbindungsmanager"
-
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:796
-#: mixer_strip.cc:897
-msgid "Disconnect"
-msgstr "Trenne"
-
-#: global_port_matrix.cc:207 io_selector.cc:217
-msgid "port"
-msgstr "Port"
-
-#: group_tabs.cc:312
-msgid "Selection..."
-msgstr "Ausgewählten Spuren"
-
-#: group_tabs.cc:313
-msgid "Record Enabled..."
-msgstr "Spuren, deren Aufnahme aktiviert ist"
-
-#: group_tabs.cc:314
-msgid "Soloed..."
-msgstr "Solo-Spuren/Busse"
-
-#: group_tabs.cc:320
-msgid "Create New Group ..."
-msgstr "Neue Gruppe erzeugen ..."
-
-#: group_tabs.cc:321
-msgid "Create New Group From"
-msgstr "Neue Gruppe erzeugen aus"
-
-#: group_tabs.cc:324
-msgid "Edit Group..."
-msgstr "Gruppe bearbeiten..."
-
-#: group_tabs.cc:325
-msgid "Collect Group"
-msgstr "Gruppe sammeln"
-
-#: group_tabs.cc:326
-msgid "Remove Group"
-msgstr "Gruppe entfernen"
-
-#: group_tabs.cc:329
-msgid "Remove Subgroup Bus"
-msgstr "Subgruppen-Bus entfernen"
-
-#: group_tabs.cc:331
-msgid "Add New Subgroup Bus"
-msgstr "Subgruppen-Bus hinzufügen"
-
-#: group_tabs.cc:333
-msgid "Add New Aux Bus (pre-fader)"
-msgstr "Aux-Send zur Subgruppe hinzufügen (Pre-Fader)"
-
-#: group_tabs.cc:334
-msgid "Add New Aux Bus (post-fader)"
-msgstr "Aux-Send zur Subgruppe hinzufügen (Post-Fader)"
-
-#: group_tabs.cc:340
-msgid "Enable All Groups"
-msgstr "Alle Gruppen aktivieren"
-
-#: group_tabs.cc:341
-msgid "Disable All Groups"
-msgstr "Alle Gruppen deaktivieren"
-
-#: insert_time_dialog.cc:46
-msgid "Time to insert:"
-msgstr "Einzufügende Zeit:"
-
-#: insert_time_dialog.cc:54
-msgid "Intersected regions should:"
-msgstr "Regionen am Positionsmarker:"
-
-#: insert_time_dialog.cc:57
-msgid "stay in position"
-msgstr "Unverändert lassen"
-
-#: insert_time_dialog.cc:58
-msgid "move"
-msgstr "Verschieben"
-
-#: insert_time_dialog.cc:59
-msgid "be split"
-msgstr "Aufteilen"
-
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
-msgstr "Zeit in alle Playlisten der Spur einfügen"
-
-#: insert_time_dialog.cc:68
-msgid "Move glued regions"
-msgstr "Taktgebundene Regionen mitbewegen"
-
-#: insert_time_dialog.cc:70
-msgid "Move markers"
-msgstr "Marker mitbewegen"
-
-#: insert_time_dialog.cc:73
-msgid "Move glued markers"
-msgstr "Taktgebundene Marker mitbewegen"
-
-#: insert_time_dialog.cc:78
-msgid "Move locked markers"
-msgstr "Gesperrte Marker mitbewegen"
-
-#: insert_time_dialog.cc:83
-msgid ""
-"Move tempo and meter changes\n"
-"<i>(may cause oddities in the tempo map)</i>"
-msgstr ""
-"Bewege Tempo- und Taktartänderungen\n"
-"<i>(kann in der Tempo-Tabelle seltsames Verhalten verursachen)</i>"
-
-#: insert_time_dialog.cc:91
-msgid "Insert time"
-msgstr "Stille einfügen"
-
-#: instrument_selector.cc:62
-msgid "-none-"
-msgstr "-keine-"
-
-#: interthread_progress_window.cc:103
-msgid "Importing file: %1 of %2"
-msgstr "Importiere Datei: %1 von %2"
-
-#: io_selector.cc:221
-msgid "I/O selector"
-msgstr "E/A Auswahl"
-
-#: io_selector.cc:266
-msgid "%1 input"
-msgstr "%1 Eingang"
-
-#: io_selector.cc:268
-msgid "%1 output"
-msgstr "%1 Ausgang"
-
-#: keyboard.cc:70
-msgid "your own"
-msgstr "Eigenes"
-
-#: keyboard.cc:133 keyboard.cc:157
-msgid "Default keybindings not found - %1 will be hard to use!"
-msgstr ""
-"Keine Tastatur-Standardbelegung gefunden - %1 wird sich schwer bedienen "
-"lassen!"
-
-#: keyboard.cc:136
-msgid "Key bindings file \"%1\" not found. Default bindings used instead"
-msgstr ""
-"Die Datei \"%1\" für Tastaturkürzel wurde nicht gefunden. Stattdessen wird "
-"die Standard-Belegung verwendet."
-
-#: keyeditor.cc:54
-msgid "Remove shortcut"
-msgstr "Tastenkürzel entfernen"
-
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Aktion"
-
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Tastenkürzel"
-
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
-msgstr ""
-"Wählen Sie eine Aktion und drücken Sie dann die Taste(n) \n"
-"um das Tastaturkürzel zu setzen"
-
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
-msgstr "Setze Kürzel auf Vorgabewerte zurück"
-
-#: keyeditor.cc:263
-msgid "Main_menu"
-msgstr "Hauptmenü"
-
-#: keyeditor.cc:265
-msgid "redirectmenu"
-msgstr "Umleitungsmenü"
-
-#: keyeditor.cc:267
-msgid "Editor_menus"
-msgstr "Editor-Menü"
-
-#: keyeditor.cc:269
-msgid "RegionList"
-msgstr "Regionenliste"
-
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
-msgstr "Prozessor-Menü"
-
-#: latency_gui.cc:40
-msgid "msec"
-msgstr "ms"
-
-#: latency_gui.cc:41
-msgid "period"
-msgstr "Periode"
-
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 Sample"
-msgstr[1] "%1 Samples"
-
-#: latency_gui.cc:72 panner_ui.cc:409
-msgid "Reset"
-msgstr "Reset"
-
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
-msgid "programming error: %1 (%2)"
-msgstr "Programmierfehler: %1 (%2)"
-
-#: location_ui.cc:52 location_ui.cc:54
-msgid "Use PH"
-msgstr "zu PZ"
-
-#: location_ui.cc:59
-msgid "Glue"
-msgstr "Bindung"
-
-#: location_ui.cc:87
-msgid "Performer:"
-msgstr "Performer:"
-
-#: location_ui.cc:88
-msgid "Composer:"
-msgstr "Komponist:"
-
-#: location_ui.cc:90
-msgid "Pre-Emphasis"
-msgstr "Präemphase"
-
-#: location_ui.cc:317
-msgid "Remove this range"
-msgstr "Diesen Bereich entfernen"
-
-#: location_ui.cc:318
-msgid "Start time - middle click to locate here"
-msgstr "Startzeit - Mittelklick, um hierher zu positionieren"
-
-#: location_ui.cc:319
-msgid "End time - middle click to locate here"
-msgstr "Endzeit - Mittelklick, um hierher zu positionieren"
-
-#: location_ui.cc:322
-msgid "Set range start from playhead location"
-msgstr "Bereichsbeginn auf Positionszeiger setzen"
-
-#: location_ui.cc:323
-msgid "Set range end from playhead location"
-msgstr "Bereichsende auf Positionszeiger setzen"
-
-#: location_ui.cc:327
-msgid "Remove this marker"
-msgstr "Diesen Marker entfernen"
-
-#: location_ui.cc:328
-msgid "Position - middle click to locate here"
-msgstr "Position - Mittelklick, um hierher zu positionieren"
-
-#: location_ui.cc:330
-msgid "Set marker time from playhead location"
-msgstr "Markerposition auf Positionszeiger setzen"
-
-#: location_ui.cc:499
-msgid "You cannot put a CD marker at the start of the session"
-msgstr "Sie können keinen CD-Marker am Anfang des Projekts erstellen"
-
-#: location_ui.cc:725
-msgid "New Marker"
-msgstr "Neuer Marker"
-
-#: location_ui.cc:726
-msgid "New Range"
-msgstr "Neuer Bereich"
-
-#: location_ui.cc:739
-msgid "<b>Loop/Punch Ranges</b>"
-msgstr "<b>Schleifen/Punchbereiche</b>"
-
-#: location_ui.cc:764
-msgid "<b>Markers (Including CD Index)</b>"
-msgstr "<b>Marker (auch CD-Index)</b>"
-
-#: location_ui.cc:799
-msgid "<b>Ranges (Including CD Track Ranges)</b>"
-msgstr "<b>Bereiche (auch CD-Track-Bereichen)</b>"
-
-#: location_ui.cc:1042
-msgid "add range marker"
-msgstr "Bereich hinzufügen"
-
-#: main.cc:82
-msgid "%1 could not connect to the audio backend."
-msgstr "%1 konnte nicht zum Audiobackend verbinden."
-
-#: main.cc:107 main.cc:123
-msgid "The audio backend (%1) has failed, or terminated"
-msgstr "Das Audiobackend (%1) funktioniert nicht oder wurde beendet"
-
-#: main.cc:110
-msgid ""
-"%2 exited unexpectedly, and without notifying %1.\n"
-"\n"
-"This could be due to misconfiguration or to an error inside %2.\n"
-"\n"
-"Click OK to exit %1."
-msgstr ""
-"%2 wurde unerwartet und ohne %1 zu benachrichtigen beendet .\n"
-"\n"
-"Dies liegt entweder an einer fehlerhaften Konfiguration oder an einem Fehler "
-"in %2.\n"
-"\n"
-"Klicke OK, um %1 zu verlassen."
-
-#: main.cc:124
-msgid "%2 exited unexpectedly, and without notifying %1."
-msgstr "%2 wurde unerwartet und ohne %1 zu benachrichtigen beendet "
-
-#: main.cc:219
-msgid ""
-"\n"
-" %1 could not understand your command line "
-msgstr ""
-"\n"
-" %1 konnte Ihre Kommandozeile nicht verstehen "
-
-#: main.cc:221
-msgid "An error was encountered while launching %1"
-msgstr "Während des Programmstarts von %1 ist ein Fehler aufgetreten"
-
-#: main.cc:310
-msgid " (built using "
-msgstr " (kompiliert mit Version "
-
-#: main.cc:313
-msgid " and GCC version "
-msgstr " und GCC Version"
-
-#: main.cc:323
-msgid "Copyright (C) 1999-2015 Paul Davis"
-msgstr "Copyright (C) 1999-2015 Paul Davis"
-
-#: main.cc:324
-msgid ""
-"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
-"Baker, Robin Gareus"
-msgstr ""
-"Einige Teile Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
-"Baker, Robin Gareus"
-
-#: main.cc:326
-msgid "%1 comes with ABSOLUTELY NO WARRANTY"
-msgstr "%1 wird Ihnen ohne jegliche Gewährleistung"
-
-#: main.cc:327
-msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-msgstr ""
-"für allgemeine oder spezielle Gebrauchstauglichkeit zur Verfügung gestellt."
-
-#: main.cc:328
-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:329
-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:334
-msgid "could not initialize %1."
-msgstr "Konnte %1 nicht initialisieren."
-
-#: main.cc:344
-msgid "Cannot xinstall SIGPIPE error handler"
-msgstr "Kann die SIGPIPE Fehlerbehandlung nicht installieren"
-
-#: main.cc:351
-msgid "could not create %1 GUI"
-msgstr "konnte das %1 GUI nicht erstellen"
-
-#: main_clock.cc:52
-msgid "Display delta to edit cursor"
-msgstr "Zeige Abstand zu Arbeitspunkt"
-
-#: marker.cc:273
-msgid "MarkerText"
-msgstr "MarkerText"
-
-#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
-msgid "None"
-msgstr "Kein"
-
-#: midi_channel_selector.cc:165 midi_channel_selector.cc:405
-#: midi_channel_selector.cc:441
-msgid "Invert"
-msgstr "Invert"
-
-#: midi_channel_selector.cc:169
-msgid "Force"
-msgstr "Force"
-
-#: midi_channel_selector.cc:328 midi_channel_selector.cc:370
-msgid "MIDI Channel Control"
-msgstr "MIDI-Kanalkontrolle"
-
-#: midi_channel_selector.cc:330
-msgid "Playback all channels"
-msgstr "Alle Kanäle wiedergeben"
-
-#: midi_channel_selector.cc:331
-msgid "Play only selected channels"
-msgstr "Nur ausgewählte Kanäle abspielen"
-
-#: midi_channel_selector.cc:332
-msgid "Use a single fixed channel for all playback"
-msgstr "Benutze einen einzelnen festen Kanal für gesamte Wiedergabe"
-
-#: midi_channel_selector.cc:333
-msgid "Record all channels"
-msgstr "Alle Kanäle aufnehmen"
-
-#: midi_channel_selector.cc:334
-msgid "Record only selected channels"
-msgstr "Nur ausgewählte Kanäle aufnehmen"
-
-#: midi_channel_selector.cc:335
-msgid "Force all channels to 1 channel"
-msgstr "Alle Kanäle auf einem Kanal wiedergeben"
-
-#: midi_channel_selector.cc:376
-msgid "Inbound"
-msgstr "Eingehend"
-
-#: midi_channel_selector.cc:396
-msgid "Click to enable recording all channels"
-msgstr "Klicke, um Aufnahme aller Kanäle zuzulassen"
-
-#: midi_channel_selector.cc:401
-msgid "Click to disable recording all channels"
-msgstr "Klicke, um Aufnahme für alle Kanäle abzuschalten"
-
-#: midi_channel_selector.cc:406
-msgid "Click to invert currently selected recording channels"
-msgstr ""
-"Klicke, um die gegenwärtige Auswahl der aufnehmenden Kanäle zu invertieren"
-
-#: midi_channel_selector.cc:413
-msgid "Playback"
-msgstr "Wiedergabe"
-
-#: midi_channel_selector.cc:432
-msgid "Click to enable playback of all channels"
-msgstr "Klicke, um Wiedergabe aller Kanäle zuzulassen"
-
-#: midi_channel_selector.cc:437
-msgid "Click to disable playback of all channels"
-msgstr "Klicke, um Wiedergabe aller Kanäle abzuschalten"
-
-#: midi_channel_selector.cc:442
-msgid "Click to invert current selected playback channels"
-msgstr ""
-"Klicke, um die gegenwärtige Auswahl der wiedergebenden Kanäle zu invertieren"
-
-#: midi_channel_selector.cc:620
-msgid "Click to toggle playback of channel %1"
-msgstr "Klicke, um die Wiedergabe von Kanal %1 umzuschalten"
-
-#: midi_channel_selector.cc:628
-msgid "Click to force all MIDI channel messages to channel %1"
-msgstr "Klicke, um alle MIDI Channel Messages auf Kanal %1 auszugeben"
-
-#: midi_channel_selector.cc:718
-msgid "Click to toggle recording of channel %1"
-msgstr "Klicke, um die Aufnahme von Kanal %1 umzuschalten"
-
-#: midi_channel_selector.cc:726
-msgid "Click to force all recorded channels to %1"
-msgstr "Klicke, um alle aufgenommenen Kanäle an %1 zu zwingen"
-
-#: midi_export_dialog.cc:35
-msgid "Export MIDI: %1"
-msgstr "Exportiere MIDI: %1"
-
-#: midi_list_editor.cc:56
-msgid "Whole"
-msgstr "Ganze"
-
-#: midi_list_editor.cc:57
-msgid "Half"
-msgstr "Halbe"
-
-#: midi_list_editor.cc:58
-msgid "Triplet"
-msgstr "Triole"
-
-#: midi_list_editor.cc:59
-msgid "Quarter"
-msgstr "Viertel"
-
-#: midi_list_editor.cc:60
-msgid "Eighth"
-msgstr "Achtel"
-
-#: midi_list_editor.cc:61
-msgid "Sixteenth"
-msgstr "Sechzehntel"
-
-#: midi_list_editor.cc:62
-msgid "Thirty-second"
-msgstr "Zweiunddreissigstel"
-
-#: midi_list_editor.cc:63
-msgid "Sixty-fourth"
-msgstr "Vierundsechzigstel"
-
-#: midi_list_editor.cc:106
-msgid "Num"
-msgstr "Nr."
-
-#: midi_list_editor.cc:108
-msgid "Vel"
-msgstr "Vel"
-
-#: midi_list_editor.cc:216
-msgid "edit note start"
-msgstr "Notenbeginn bearbeiten"
-
-#: midi_list_editor.cc:225
-msgid "edit note channel"
-msgstr "Kanal bearbeiten"
-
-#: midi_list_editor.cc:235
-msgid "edit note number"
-msgstr "Notennummer bearbeiten"
-
-#: midi_list_editor.cc:245
-msgid "edit note velocity"
-msgstr "Velocity bearbeiten"
-
-#: midi_list_editor.cc:259
-msgid "edit note length"
-msgstr "Notenlänge ändern"
-
-#: midi_list_editor.cc:463
-msgid "insert new note"
-msgstr "Neue Note einfügen"
-
-#: midi_list_editor.cc:527
-msgid "delete notes (from list)"
-msgstr "Noten (aus Liste) löschen"
-
-#: midi_list_editor.cc:602
-msgid "change note channel"
-msgstr "Kanal ändern"
-
-#: midi_list_editor.cc:610
-msgid "change note number"
-msgstr "Notennummerändern"
-
-#: midi_list_editor.cc:620
-msgid "change note velocity"
-msgstr "Velocity ändern"
-
-#: midi_list_editor.cc:690
-msgid "change note length"
-msgstr "Notenlänge ändern"
-
-#: midi_port_dialog.cc:39
-msgid "Add MIDI Port"
-msgstr "Neuen MIDI-Port hinzufügen"
-
-#: midi_port_dialog.cc:40
-msgid "Port name:"
-msgstr "Portname:"
-
-#: midi_port_dialog.cc:45
-msgid "MidiPortDialog"
-msgstr "MidiPortDialog"
-
-#: midi_region_view.cc:859
-msgid "channel edit"
-msgstr "Kanal editieren"
-
-#: midi_region_view.cc:895
-msgid "velocity edit"
-msgstr "Velocity bearbeiten"
-
-#: midi_region_view.cc:954
-msgid "add note"
-msgstr "Note hinzufügen"
-
-#: midi_region_view.cc:1885
-msgid "step add"
-msgstr "Schritt hinzufügen"
-
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
-msgid "alter patch change"
-msgstr "Patch Change ändern"
-
-#: midi_region_view.cc:2038
-msgid "add patch change"
-msgstr "Patch Change hinzufügen"
-
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
-msgid "move patch change"
-msgstr "Patch Change verschieben"
-
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
-msgid "delete patch change"
-msgstr "Patch Change löschen"
-
-#: midi_region_view.cc:2112
-msgid "delete selection"
-msgstr "Auswahl löschen"
-
-#: midi_region_view.cc:2128
-msgid "delete note"
-msgstr "Note löschen"
-
-#: midi_region_view.cc:2587
-msgid "move notes"
-msgstr "Noten verschieben"
-
-#: midi_region_view.cc:3070
-msgid "change velocities"
-msgstr "Velocity ändern"
-
-#: midi_region_view.cc:3136
-msgid "transpose"
-msgstr "Transponieren"
-
-#: midi_region_view.cc:3164
-msgid "change note lengths"
-msgstr "Notenlänge ändern"
-
-#: midi_region_view.cc:3240
-msgid "nudge"
-msgstr "Verschieben"
-
-#: midi_region_view.cc:3255
-msgid "change channel"
-msgstr "Kanal ändern"
-
-#: midi_region_view.cc:3295
-msgid "Bank "
-msgstr "Bank"
-
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr "Programm"
-
-#: midi_region_view.cc:3297
-msgid "Channel "
-msgstr "Kanal"
-
-#: midi_region_view.cc:3484
-msgid "paste"
-msgstr "Einfügen"
-
-#: midi_streamview.cc:185
-msgid "attempt to display MIDI region with no source"
-msgstr "versuche, eine MIDI Region ohne Datenquelle darzustellen"
-
-#: midi_streamview.cc:195
-msgid "attempt to display MIDI region with no model"
-msgstr "versuche, eine MIDI Region ohne Datenmodell darzustellen"
-
-#: midi_streamview.cc:506
-msgid "failed to create MIDI region"
-msgstr "konnte MIDI-Region nicht erzeugen"
-
-#: midi_time_axis.cc:309
-msgid "External MIDI Device"
-msgstr "Externes MIDI-Gerät"
-
-#: midi_time_axis.cc:310
-msgid "External Device Mode"
-msgstr "Modus Externes Gerät"
-
-#: midi_time_axis.cc:318
-msgid "Chns"
-msgstr "Chns"
-
-#: midi_time_axis.cc:320
-msgid "Click to edit channel settings"
-msgstr "Klicke, um Kanaleinstellungen zu bearbeiten"
-
-#: midi_time_axis.cc:519
-msgid "Show Full Range"
-msgstr "Ganzen Bereich anzeigen"
-
-#: midi_time_axis.cc:524
-msgid "Fit Contents"
-msgstr "Auf Inhalt anpassen"
-
-#: midi_time_axis.cc:528
-msgid "Note Range"
-msgstr "Notenbereich"
-
-#: midi_time_axis.cc:529
-msgid "Note Mode"
-msgstr "Noten-Modus"
-
-#: midi_time_axis.cc:530
-msgid "Channel Selector"
-msgstr "Kanalauswahl"
-
-#: midi_time_axis.cc:535
-msgid "Color Mode"
-msgstr "Farbmodus"
-
-#: midi_time_axis.cc:594
-msgid "Bender"
-msgstr "Bender"
-
-#: midi_time_axis.cc:598
-msgid "Pressure"
-msgstr "Druckdaten"
-
-#: midi_time_axis.cc:610
-msgid "Controllers"
-msgstr "Controller"
-
-#: midi_time_axis.cc:615
-msgid "No MIDI Channels selected"
-msgstr "Keine MIDI-Kanäle ausgewählt"
-
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
-msgid "Hide all channels"
-msgstr "Alle Kanäle verbergen"
-
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
-msgid "Show all channels"
-msgstr "Alle Kanäle anzeigen"
-
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
-msgid "Channel %1"
-msgstr "Kanal %1"
-
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
-msgid "Controllers %1-%2"
-msgstr "Controller %1-%2"
-
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
-msgid "Controller %1"
-msgstr "Controller %1"
-
-#: midi_time_axis.cc:991
-msgid "Sustained"
-msgstr "Sustain"
-
-#: midi_time_axis.cc:998
-msgid "Percussive"
-msgstr "Perkussiv"
-
-#: midi_time_axis.cc:1018
-msgid "Meter Colors"
-msgstr "Nach Lautstärke"
-
-#: midi_time_axis.cc:1025
-msgid "Channel Colors"
-msgstr "Kanalfarben"
-
-#: midi_time_axis.cc:1032
-msgid "Track Color"
-msgstr "Spurfarbe"
-
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
-msgid "all"
-msgstr "alle"
-
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
-msgid "some"
-msgstr "einige"
-
-#: midi_tracer.cc:48
-msgid "Line history: "
-msgstr "Aktionsliste:"
-
-#: midi_tracer.cc:55
-msgid "Auto-Scroll"
-msgstr "Auto-Scroll"
-
-#: midi_tracer.cc:56
-msgid "Decimal"
-msgstr "Dezimal"
-
-#: midi_tracer.cc:57 rc_option_editor.cc:740
-msgid "Enabled"
-msgstr "Aktiviert"
-
-#: midi_tracer.cc:58
-msgid "Delta times"
-msgstr "Deltazeiten"
-
-#: midi_tracer.cc:71
-msgid "Port:"
-msgstr "Port:"
-
-#: midi_velocity_dialog.cc:31
-msgid "New velocity"
-msgstr "Neue Velocity"
-
-#: missing_file_dialog.cc:35
-msgid "Missing File"
-msgstr "Fehlende Datei"
-
-#: missing_file_dialog.cc:37
-msgid "Select a folder to search"
-msgstr "Ordner zum Suchen auswählen"
-
-#: missing_file_dialog.cc:38
-msgid "Add chosen folder to search path, and try again"
-msgstr "Ausgewählten Ordner zur Suche hinzufügen und es nochmal versuchen"
-
-#: missing_file_dialog.cc:40
-msgid "Stop loading this session"
-msgstr "Laden des Projekts abbrechen"
-
-#: missing_file_dialog.cc:41
-msgid "Skip all missing files"
-msgstr "Alle fehlenden Dateien überspringen"
-
-#: missing_file_dialog.cc:42
-msgid "Skip this file"
-msgstr "Diese Datei überspringen"
-
-#: missing_file_dialog.cc:53
-msgid "audio"
-msgstr "Audio"
-
-#: missing_file_dialog.cc:70
-msgid ""
-"%1 cannot find the %2 file\n"
-"\n"
-"<i>%3</i>\n"
-"\n"
-"in any of these folders:\n"
-"\n"
-"<tt>%4</tt>\n"
-"\n"
-msgstr ""
-"%1 kann die %2datei\n"
-"\n"
-"<i>%3</i>\n"
-"\n"
-"in keinem dieser Ordner finden:\n"
-"\n"
-"<tt>%4</tt>\n"
-"\n"
-
-#: missing_file_dialog.cc:104
-msgid "Click to choose an additional folder"
-msgstr "Einen weiteren Ordner für die Suche auswählen"
-
-#: missing_plugin_dialog.cc:29
-msgid "Missing Plugins"
-msgstr "Fehlende Plugins"
-
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
-msgid "OK"
-msgstr "OK"
-
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "Im Mixer ausgewählte Spuren/Busse auf Solo schalten"
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "Stummschaltung der im Mixer ausgewählten Spuren/Busse ändern"
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr "Aufnahme auf im Mixer ausgewählten Spuren aktivieren"
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse reduzieren"
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse erhöhen"
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse auf 0dB setzen"
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "Ausgewählte Prozessoren kopieren"
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "Ausgewählte Prozessoren ausschneiden"
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "Ausgewählte Prozessoren einfügen"
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "Ausgewählte Prozessoren löschen"
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "Alle (sichtbaren) Prozessoren auswählen"
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "Ausgewählte Prozessoren umschalten"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "Ausgewählte Plugins umschalten "
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr "Alle Kanalzüge und Prozessoren deselektieren"
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr "Mixerfenster nach links scrollen"
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "MIDI Eingang für im Mixer ausgewählte Spuren/Busse de/aktivieren"
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr "Mixer-Tastenkürzel aus %1 geladen"
-
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
-msgstr "Konnte mixer.bindings im Suchpfad %1 nicht finden"
-
-#: mixer_strip.cc:96 mixer_strip.cc:125
-msgid "pre"
-msgstr "Pre"
-
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:374 mixer_strip.cc:1413
-#: rc_option_editor.cc:2331
-msgid "Comments"
-msgstr "Kommentare"
-
-#: mixer_strip.cc:149
-msgid "Click to toggle the width of this mixer strip."
-msgstr "Klicken Sie, um die Breite dieses Kanalzuges umzuschalten"
-
-#: mixer_strip.cc:151
-msgid ""
-"\n"
-"%1-%2-click to toggle the width of all strips."
-msgstr ""
-"\n"
-"%1-%2-Klicken Sie, um die Breite aller Kanalzüge umzuschalten."
-
-#: mixer_strip.cc:160
-msgid "Hide this mixer strip"
-msgstr "Diesen Kanalzug verbergen"
-
-#: mixer_strip.cc:171
-msgid "Click to select metering point"
-msgstr "Abgreifpunkt der Pegelanzeige auswählen"
-
-#: mixer_strip.cc:187
-msgid "Isolate Solo"
-msgstr "Solo isolieren"
-
-#: mixer_strip.cc:195
-msgid "Lock Solo Status"
-msgstr "Solostatus sperren"
-
-#: mixer_strip.cc:197 mixer_strip.cc:2035
-msgid "SoloLock|Lock"
-msgstr "Lock"
-
-#: mixer_strip.cc:198 mixer_strip.cc:2034
-msgid "Iso"
-msgstr "Iso"
-
-#: mixer_strip.cc:252
-msgid "Mix group"
-msgstr "Bearbeitungsgruppe"
-
-#: mixer_strip.cc:370 rc_option_editor.cc:2327
-msgid "Phase Invert"
-msgstr "Phaseninvertierung"
-
-#: mixer_strip.cc:371 rc_option_editor.cc:2328
-msgid "Record & Monitor"
-msgstr "Aufnahme & Monitor..."
-
-#: mixer_strip.cc:372 rc_option_editor.cc:2329
-msgid "Solo Iso / Lock"
-msgstr "Solo Iso / Sperre"
-
-#: mixer_strip.cc:527
-msgid "Enable/Disable MIDI input"
-msgstr "Aktiviert/Deaktiviert MIDI Input"
-
-#: mixer_strip.cc:691
-msgid "Aux"
-msgstr "Aux"
-
-#: mixer_strip.cc:713
-msgid "Snd"
-msgstr "Snd"
-
-#: mixer_strip.cc:779 mixer_strip.cc:882 processor_box.cc:2382
-msgid "Not connected to audio engine - no I/O changes are possible"
-msgstr ""
-"Nicht mit Audioengine verbunden - es sind keine Änderungen an Ein-/Ausgängen "
-"möglich"
-
-#: mixer_strip.cc:836 mixer_strip.cc:938
-msgid "Add %1 port"
-msgstr "%1-Port hinzufügen"
-
-#: mixer_strip.cc:843 mixer_strip.cc:945
-msgid "Routing Grid"
-msgstr "Verbindungsraster"
-
-#: mixer_strip.cc:1174
-msgid "<b>INPUT</b> to %1"
-msgstr "<b>EINGANG</b> zu %1"
-
-#: mixer_strip.cc:1177
-msgid "<b>OUTPUT</b> from %1"
-msgstr "<b>AUSGANG</b> von %1"
-
-#: mixer_strip.cc:1290
-msgid "Disconnected"
-msgstr "Getrennt"
-
-#: mixer_strip.cc:1416
-msgid "*Comments*"
-msgstr "*Kommentare*"
-
-#: mixer_strip.cc:1423
-msgid "Cmt"
-msgstr "Kmt"
-
-#: mixer_strip.cc:1426
-msgid "*Cmt*"
-msgstr "*Kmt*"
-
-#: mixer_strip.cc:1432
-msgid "Click to Add/Edit Comments"
-msgstr "Kommentare hinzufügen/ändern"
-
-#: mixer_strip.cc:1476
-msgid "Grp"
-msgstr "Grp"
-
-#: mixer_strip.cc:1479
-msgid "~G"
-msgstr "~G"
-
-#: mixer_strip.cc:1508 route_time_axis.cc:561
-msgid "Color..."
-msgstr "Farbe..."
-
-#: mixer_strip.cc:1510 route_time_axis.cc:563
-msgid "Comments..."
-msgstr "Kommentare"
-
-#: mixer_strip.cc:1512 route_time_axis.cc:565
-msgid "Inputs..."
-msgstr "Eingänge..."
-
-#: mixer_strip.cc:1514 route_time_axis.cc:567
-msgid "Outputs..."
-msgstr "Ausgänge..."
-
-#: mixer_strip.cc:1519
-msgid "Save As Template..."
-msgstr "Als Vorlage Speichern..."
-
-#: mixer_strip.cc:1533
-msgid "Adjust Latency..."
-msgstr "Latenz einstellen..."
-
-#: mixer_strip.cc:1536
-msgid "Protect Against Denormals"
-msgstr "Schütze vor Denormals"
-
-#: mixer_strip.cc:1542 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr "ID für Fernsteuerung..."
-
-#: mixer_strip.cc:1830
-msgid "Pre"
-msgstr "Pre"
-
-#: mixer_strip.cc:1834
-msgid "Post"
-msgstr "Post"
-
-#: mixer_strip.cc:1850
-msgid "Meter|In"
-msgstr "In"
-
-#: mixer_strip.cc:1854
-msgid "Meter|Pr"
-msgstr "Pr"
-
-#: mixer_strip.cc:1858
-msgid "Meter|Po"
-msgstr "Po"
-
-#: mixer_strip.cc:1862
-msgid "Meter|O"
-msgstr "O"
-
-#: mixer_strip.cc:1867
-msgid "Meter|C"
-msgstr "C"
-
-#: mixer_strip.cc:2015 route_ui.cc:171
-msgid "Disk"
-msgstr "Disk"
-
-#: mixer_strip.cc:2027 monitor_section.cc:70
-msgid "AFL"
-msgstr "AFL"
-
-#: mixer_strip.cc:2030 monitor_section.cc:71
-msgid "PFL"
-msgstr "PFL"
-
-#: mixer_strip.cc:2040 meter_strip.cc:383
-msgid "MonitorInput|I"
-msgstr "I"
-
-#: mixer_strip.cc:2041 meter_strip.cc:384
-msgid "MonitorDisk|D"
-msgstr "D"
-
-#: mixer_strip.cc:2053 meter_strip.cc:375 route_time_axis.cc:2697
-msgid "AfterFader|A"
-msgstr "A"
-
-#: mixer_strip.cc:2056
-msgid "Prefader|P"
-msgstr "P"
-
-#: mixer_strip.cc:2061
-msgid "SoloIso|I"
-msgstr "I"
-
-#: mixer_strip.cc:2062
-msgid "SoloLock|L"
-msgstr "L"
-
-#: mixer_strip.cc:2248
-msgid "Pre Fader"
-msgstr "Pre Fader"
-
-#: mixer_strip.cc:2249
-msgid "Post Fader"
-msgstr "Post Fader"
-
-#: mixer_strip.cc:2293 meter_strip.cc:851
-msgid "Change all in Group to %1"
-msgstr "Alle in Gruppe zu %1 ändern"
-
-#: mixer_strip.cc:2295 meter_strip.cc:853
-msgid "Change all to %1"
-msgstr "Alle zu %1 ändern"
-
-#: mixer_strip.cc:2297 meter_strip.cc:855
-msgid "Change same track-type to %1"
-msgstr "Gleichen Spurtyp zu %1 ändern"
-
-#: mixer_ui.cc:130 route_time_axis.cc:818
-msgid "Group"
-msgstr "Gruppe"
-
-#: mixer_ui.cc:1224
-msgid "track display list item for renamed strip not found!"
-msgstr ""
-"Konnte Bezeichnung für umbenannten Kanalzug nicht in der Spurliste finden!"
-
-#: mixer_ui.cc:1316
-msgid "-all-"
-msgstr "-alle-"
-
-#: mixer_ui.cc:1853
-msgid "Strips"
-msgstr "Kanalzüge"
-
-#: meter_strip.cc:157
-msgid "Reset Peak"
-msgstr "Peaks zurücksetzen"
-
-#: meter_strip.cc:378 route_time_axis.cc:2701
-msgid "PreFader|P"
-msgstr "P"
-
-#: meter_strip.cc:887
-msgid "Variable height"
-msgstr "Variable Höhe"
-
-#: meter_strip.cc:888
-msgid "Short"
-msgstr "Short"
-
-#: meter_strip.cc:889
-msgid "Tall"
-msgstr "Tall"
-
-#: meter_strip.cc:890
-msgid "Grande"
-msgstr "Grande"
-
-#: meter_strip.cc:891
-msgid "Venti"
-msgstr "Venti"
-
-#: meter_patterns.cc:82
-msgid "Peak"
-msgstr "Spitzenwert"
-
-#: meter_patterns.cc:85
-msgid "RMS + Peak"
-msgstr "RMS + Spitzenwert"
-
-#: meter_patterns.cc:88
-msgid "IEC1/DIN"
-msgstr "IEC1/DIN"
-
-#: meter_patterns.cc:91
-msgid "IEC1/Nordic"
-msgstr "IEC1/Nordisch"
-
-#: meter_patterns.cc:94
-msgid "IEC2/BBC"
-msgstr "IEC2/BBC"
-
-#: meter_patterns.cc:97
-msgid "IEC2/EBU"
-msgstr "IEC2/EBU"
-
-#: meter_patterns.cc:100
-msgid "K20"
-msgstr "K20"
-
-#: meter_patterns.cc:103
-msgid "K14"
-msgstr "K14"
-
-#: meter_patterns.cc:106
-msgid "K12"
-msgstr "K12"
-
-#: meter_patterns.cc:109
-msgid "VU"
-msgstr "VU"
-
-#: monitor_section.cc:69
-msgid "SiP"
-msgstr "SiP"
-
-#: monitor_section.cc:96 route_group_dialog.cc:49
-msgid "Soloing"
-msgstr "Soloing"
-
-#: monitor_section.cc:100
-msgid "Isolated"
-msgstr "Isoliert"
-
-#: monitor_section.cc:104
-msgid "Auditioning"
-msgstr "Vorhören"
-
-#: monitor_section.cc:114
-msgid ""
-"When active, something is solo-isolated.\n"
-"Click to de-isolate everything"
-msgstr ""
-"Wenn aktiv, ist etwas auf isoliertes Solo geschalten.\n"
-"Klick, schaltet isoliertes Solo überall aus."
-
-#: monitor_section.cc:117
-msgid ""
-"When active, auditioning is active.\n"
-"Click to stop the audition"
-msgstr ""
-"Wird beim Vorhören aktiv.\n"
-"Klicken stoppt das Vorhören."
-
-#: monitor_section.cc:134
-msgid "Solo controls affect solo-in-place"
-msgstr "Solo-Kontrollelemente beeinflussen solo-in-place"
-
-#: monitor_section.cc:140
-msgid "Solo controls toggle after-fader-listen"
-msgstr "Solo-Kontrollelemente schalten AFL um"
-
-#: monitor_section.cc:146
-msgid "Solo controls toggle pre-fader-listen"
-msgstr "Solo-Kontrollelemente schalten PFL um"
-
-#: monitor_section.cc:156
-msgid "Gain increase for soloed signals (0dB is normal)"
-msgstr "Erhöhung der Lautstärke für Solosignale (0dB ist üblich)"
-
-#: monitor_section.cc:161 monitor_section.cc:190 monitor_section.cc:216
-#: monitor_section.cc:316
-msgid "0 dB"
-msgstr "0 dB"
-
-#: monitor_section.cc:162
-msgid "3 dB"
-msgstr "3 dB"
-
-#: monitor_section.cc:163
-msgid "6 dB"
-msgstr "6 dB"
-
-#: monitor_section.cc:164
-msgid "10 dB"
-msgstr "10 dB"
-
-#: monitor_section.cc:170
-msgid "Solo Boost"
-msgstr "Solo Boost"
-
-#: monitor_section.cc:185
-msgid ""
-"Gain reduction non-soloed signals\n"
-"A value above -inf dB causes \"solo-in-front\""
-msgstr ""
-"Reduzierung der Lautstärke für Signale, die nicht Solo geschalten sind.\n"
-"Ein Wert über -inf dB bedeutet \"solo-in-front\""
-
-#: monitor_section.cc:191 monitor_section.cc:218 monitor_section.cc:318
-msgid "-6 dB"
-msgstr "-6 dB"
-
-#: monitor_section.cc:192 monitor_section.cc:219 monitor_section.cc:319
-msgid "-12 dB"
-msgstr "-12 dB"
-
-#: monitor_section.cc:193 monitor_section.cc:220 monitor_section.cc:320
-msgid "-20 dB"
-msgstr "-20 dB"
-
-#: monitor_section.cc:194
-msgid "OFF"
-msgstr "OFF"
-
-#: monitor_section.cc:196
-msgid "SiP Cut"
-msgstr "SiP Cut"
-
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
-msgstr "Lautstärkereduzierung beim Abschwächen der Monitorausgänge"
-
-#: monitor_section.cc:217 monitor_section.cc:317
-msgid "-3 dB"
-msgstr "-3 dB"
-
-#: monitor_section.cc:225 monitor_section.cc:283 monitor_section.cc:353
-msgid "Dim"
-msgstr "Dim"
-
-#: monitor_section.cc:235
-msgid "Excl. Solo"
-msgstr "Exkl. Solo"
-
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
-msgstr ""
-"Exklusives Solo bedeutet, daß nur ein Solo zu einem Zeitpunkt aktiv ist"
-
-#: monitor_section.cc:244
-msgid "Solo » Mute"
-msgstr "Solo » Mute"
-
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
-msgstr ""
-"Wenn aktiviert, hat Solo Priorität über Mute\n"
-"(eine Spur mit aktiviertem Mute & Solo ist hörbar)"
-
-#: monitor_section.cc:321
-msgid "-30 dB"
-msgstr "-30 dB"
-
-#: monitor_section.cc:323
-msgid "Monitor"
-msgstr "Monitor"
-
-#: monitor_section.cc:361
-msgid "Inv"
-msgstr "Inv"
-
-#: monitor_section.cc:744
-msgid "Switch monitor to mono"
-msgstr "Monitor auf Mono schalten"
-
-#: monitor_section.cc:747
-msgid "Cut monitor"
-msgstr "Monitor stummschalten"
-
-#: monitor_section.cc:750
-msgid "Dim monitor"
-msgstr "Monitor abschwächen"
-
-#: monitor_section.cc:753
-msgid "Toggle exclusive solo mode"
-msgstr "Exklusives Solo umschalten"
-
-#: monitor_section.cc:759
-msgid "Toggle mute overrides solo mode"
-msgstr "Mute-Status hat höhere Priorität als Solo-Modus"
-
-#: monitor_section.cc:771
-msgid "Cut monitor channel %1"
-msgstr "Monitorkanal %1 stummschalten"
-
-#: monitor_section.cc:776
-msgid "Dim monitor channel %1"
-msgstr "Monitorkanal %1 abschwächen"
-
-#: monitor_section.cc:781
-msgid "Solo monitor channel %1"
-msgstr "Monitorkanal %1 Solo"
-
-#: monitor_section.cc:786
-msgid "Invert monitor channel %1"
-msgstr "Invertiere Monitorkanal %1"
-
-#: monitor_section.cc:796
-msgid "In-place solo"
-msgstr "In-Place Solo"
-
-#: monitor_section.cc:798
-msgid "After Fade Listen (AFL) solo"
-msgstr "Solo nach Fader (AFL) abhören"
-
-#: monitor_section.cc:800
-msgid "Pre Fade Listen (PFL) solo"
-msgstr "Solo vor Fader (PFL) abhören"
-
-#: mono_panner.cc:109 stereo_panner.cc:119
-msgid "bypassed"
-msgstr "überbrückt"
-
-#: mono_panner.cc:123
-#, c-format
-msgid "L:%3d R:%3d"
-msgstr "L:%3d R:%3d"
-
-#: mono_panner.cc:203 panner2d.cc:240 stereo_panner.cc:251
-#: stereo_panner.cc:274
-msgid "Panner|L"
-msgstr "L"
-
-#: mono_panner.cc:220 panner2d.cc:241 stereo_panner.cc:249
-#: stereo_panner.cc:276
-msgid "Panner|R"
-msgstr "R"
-
-#: mono_panner_editor.cc:33
-msgid "Mono Panner"
-msgstr "Mono Panner"
-
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
-msgid "%"
-msgstr "%"
-
-#: nag.cc:41
-msgid "Support %1 Development"
-msgstr "Unterstütze die Entwicklung von %1"
-
-#: nag.cc:42
-msgid "I'd like to make a one-time donation"
-msgstr "Ich möchte etwas spenden"
-
-#: nag.cc:43
-msgid "Tell me more about becoming a subscriber"
-msgstr "Ich möchte mehr über eine dauerhafte Unterstützung (Abonnement) wissen"
-
-#: nag.cc:44
-msgid "I'm already a subscriber!"
-msgstr "Ich bin schon Abonnent!"
-
-#: nag.cc:45
-msgid "Ask about this the next time I export"
-msgstr "Frage mich nach dem nächsten Export"
-
-#: nag.cc:46
-msgid "Never ever ask me about this again"
-msgstr "Frage nicht mehr danach"
-
-#: nag.cc:49
-msgid ""
-"Congratulations on your session export.\n"
-"\n"
-"It looks as if you may already be a subscriber. If so, thanks, and sorry\n"
-"to bother you again about this - I'm working on improving our subscriber "
-"system\n"
-"so that I don't have to keep annoying you with this message.\n"
-"\n"
-"If you're not a subscriber, perhaps you might consider supporting my work\n"
-"on Ardour with either a one-time donation or subscription. Nothing will \n"
-"happen if you choose not to do so. However Ardour's continuing development\n"
-"relies on a stable, sustainable income stream. Thanks for using Ardour!"
-msgstr ""
-"Herzlichen Glückwunsch zu Ihrem Projektexport.\n"
-"\n"
-"Es sieht so aus, als wären Sie schon ein Abonnent/eine Abonnentin. Wenn ja,\n"
-"dann vielen Dank und Entschuldigung für die Störung - ich arbeite daran, "
-"das\n"
-"Abo-System zu verbessern, damit ich Sie nicht dauernd störe.\n"
-"\n"
-"Wenn Sie Ardour noch nicht regelmäßig finanziell unterstützen, wäre es "
-"schön\n"
-"wenn Sie sich überlegen würden, meine Arbeit mit einer einmaligen Spende "
-"oder\n"
-"einem Abonnement zu unterstützen. Falls Sie das nicht tun, wird nichts "
-"passieren.\n"
-"Die weitere Entwicklung hängt allerdings von einem stabilen und "
-"verlässlichen Einkommen ab.\n"
-"Danke, dass Sie Ardour verwenden!"
-
-#: nag.cc:58
-msgid ""
-"Congratulations on your session export.\n"
-"\n"
-"I hope you find Ardour a useful tool. I'd like to ask you to consider "
-"supporting\n"
-"its development with either a one-time donation or subscription. Nothing\n"
-"will happen if you choose not to do so. However Ardour's continuing "
-"development\n"
-"relies on a stable, sustainable income stream. Thanks for using Ardour!"
-msgstr ""
-"Herzlichen Glückwunsch zu Ihrem Projektexport.\n"
-"\n"
-"Ich hoffe, dass Ardour ein nützliches Werkzeug für Sie ist. Ich möchte Sie\n"
-"darum bitten, Ardours Entwicklung entweder durch eine einmalige Spende\n"
-"oder ein Abonnement zu unterstützen. Falls Sie das nicht tun, wird nichts\n"
-"passieren. Die weitere Entwicklung hängt allerdings von einem stabilen\n"
-"und verlässlichen Einkommen ab. Danke, dass Sie Ardour verwenden!"
-
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "Neues Preset"
-
-#: new_plugin_preset_dialog.cc:30
-msgid "Replace existing preset with this name"
-msgstr "Ersetze vorhandenes Preset mit diesem Namen"
-
-#: new_plugin_preset_dialog.cc:34
-msgid "Name of new preset"
-msgstr "Name für neues Preset"
-
-#: normalize_dialog.cc:34
-msgid "Normalize regions"
-msgstr "Regionen normalisieren"
-
-#: normalize_dialog.cc:34
-msgid "Normalize region"
-msgstr "Region normalisieren"
-
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
-msgid "dbFS"
-msgstr "dbFS"
-
-#: normalize_dialog.cc:56
-msgid "Normalize each region using its own peak value"
-msgstr "Normalisiere jede Region mit ihrem eigenen Spitzenwert"
-
-#: normalize_dialog.cc:58
-msgid "Normalize each region using the peak value of all regions"
-msgstr "Normalisiere jede Region mit dem Spitzenwert aller Regionen"
-
-#: normalize_dialog.cc:73
-msgid "Normalize"
-msgstr "Normalisieren"
-
-#: note_select_dialog.cc:33
-msgid "Select Note"
-msgstr "Note auswählen"
-
-#: opts.cc:57
-msgid "Usage: "
-msgstr "Aufruf:"
-
-#: opts.cc:58
-msgid " [SESSION_NAME] Name of session to load\n"
-msgstr " [PROJEKTNAME] Name des zu ladenden Projekts\n"
-
-#: opts.cc:59
-msgid " -v, --version Show version information\n"
-msgstr " -v, --version Versionsinformation ausgeben\n"
-
-#: opts.cc:60
-msgid " -h, --help Print this message\n"
-msgstr " -h, --help Diese Hinweise ausgeben\n"
-
-#: opts.cc:61
-msgid ""
-" -a, --no-announcements Do not contact website for announcements\n"
-msgstr ""
-" -a, --no-announcements Webseite nicht für Neuigkeiten kontaktieren\n"
-
-#: opts.cc:62
-msgid ""
-" -b, --bindings Print all possible keyboard binding names\n"
-msgstr ""
-" -b, --bindings Alle möglichen Tastaturkürzelnamen "
-"ausgeben\n"
-
-#: opts.cc:63
-msgid ""
-" -c, --name <name> Use a specific backend client name, default is "
-"ardour\n"
-msgstr ""
-" -c, --name name Benutze speziellen Backend-Clientnamen, "
-"Voreinstellung: ardour\n"
-
-#: opts.cc:64
-msgid ""
-" -d, --disable-plugins Disable all plugins in an existing session\n"
-msgstr ""
-"-d, --disable-plugins Alle Plugins eines bestehenden Projekts "
-"deaktivieren\n"
-
-#: opts.cc:65
-msgid ""
-" -D, --debug <options> Set debug flags. Use \"-D list\" to see "
-"available options\n"
-msgstr ""
-" -D, --debug <options> Setze Debug-flags. Verwende \"-D list\" um die "
-"verfügbaren Optionen zu sehen\n"
-
-#: opts.cc:66
-msgid " -n, --no-splash Do not show splash screen\n"
-msgstr " -n, --no-splash Splashscreen nicht anzeigen\n"
-
-#: opts.cc:67
-msgid " -m, --menus file Use \"file\" to define menus\n"
-msgstr " -m, --menus file Benutze \"file\" für die Menüs\n"
-
-#: opts.cc:68
-msgid ""
-" -N, --new session-name Create a new session from the command line\n"
-msgstr ""
-" -N, --new session-name Erstelle neues Projekt aus der "
-"Kommandozeile\n"
-
-#: opts.cc:69
-msgid " -O, --no-hw-optimizations Disable h/w specific optimizations\n"
-msgstr ""
-" -O, --no-hw-optimizations Hardwarespezifische Optimierungen "
-"deaktivieren\n"
-
-#: opts.cc:70
-msgid " -P, --no-connect-ports Do not connect any ports at startup\n"
-msgstr ""
-" -P, --no-connect-ports beim Programmstart keine Ports verbinden\n"
-
-#: opts.cc:71
-msgid " -S, --sync Draw the gui synchronously \n"
-msgstr " -S, --sync\t Zeichne die GUI synchron \n"
-
-#: opts.cc:73
-msgid " -V, --novst Do not use VST support\n"
-msgstr " -V, --novst VST-Unterstützung ausschalten\n"
-
-#: opts.cc:75
-msgid ""
-" -E, --save <file> Load the specified session, save it to <file> "
-"and then quit\n"
-msgstr ""
-" -E, --save <file> Lädt das angegebene Projekt, speichert es "
-"unter <file> und beendet sich\n"
-
-#: opts.cc:76
-msgid " -C, --curvetest filename Curve algorithm debugger\n"
-msgstr " -C, --curvetest filename Curve algorithm debugger\n"
-
-#: opts.cc:77
-msgid ""
-" -k, --keybindings filename Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
-msgstr ""
-" -k, --keybindings dateiname Dateiname für die Tastaturbelegungen "
-"(Standard: ~/.config/.ardour3/ardour.bindings)\n"
-
-#: panner2d.cc:854
-msgid "Panner (2D)"
-msgstr "Panner (2D)"
-
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
-msgid "Bypass"
-msgstr "Bypass"
-
-#: panner2d.cc:862
-msgid "Panner"
-msgstr "Panner"
-
-#: panner_ui.cc:72
-msgid "Pan automation mode"
-msgstr "Pan-Automationsmodus"
-
-#: panner_ui.cc:73
-msgid "Pan automation type"
-msgstr "Pan-Automationstyp"
-
-#: panner_ui.cc:603
-msgid "Manual|M"
-msgstr "M"
-
-#: panner_ui.cc:606
-msgid "Play|P"
-msgstr "P"
-
-#: panner_ui.cc:609
-msgid "Touch|T"
-msgstr "T"
-
-#: panner_ui.cc:612
-msgid "Write|W"
-msgstr "W"
-
-#: playlist_selector.cc:43
-msgid "Playlists"
-msgstr "Wiedergabelisten"
-
-#: playlist_selector.cc:54
-msgid "Playlists grouped by track"
-msgstr "Wiedergabelisten, nach Spur gruppiert"
-
-#: playlist_selector.cc:101
-msgid "Playlist for %1"
-msgstr "Wiedergabeliste für %1"
-
-#: playlist_selector.cc:114
-msgid "Other tracks"
-msgstr "Andere Spuren"
-
-#: playlist_selector.cc:139
-msgid "unassigned"
-msgstr "nicht zugewiesen"
-
-#: playlist_selector.cc:194
-msgid "Imported"
-msgstr "Importierte"
-
-#: plugin_eq_gui.cc:85 plugin_eq_gui.cc:109
-msgid "dB scale"
-msgstr "dB Skala"
-
-#: plugin_eq_gui.cc:116
-msgid "Show phase"
-msgstr "Zeige Phase"
-
-#: plugin_selector.cc:53 plugin_selector.cc:229
-msgid "Name contains"
-msgstr "Name enthält"
-
-#: plugin_selector.cc:54 plugin_selector.cc:233
-msgid "Type contains"
-msgstr "Typ enthält"
-
-#: plugin_selector.cc:55 plugin_selector.cc:231
-msgid "Category contains"
-msgstr "Kategorie enthält"
-
-#: plugin_selector.cc:56 plugin_selector.cc:253
-msgid "Author contains"
-msgstr "Autor enthält"
-
-#: plugin_selector.cc:57 plugin_selector.cc:255
-msgid "Library contains"
-msgstr "Katalog enthält"
-
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
-msgid "Favorites only"
-msgstr "nur Favoriten"
-
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
-msgid "Hidden only"
-msgstr "Nur versteckte"
-
-#: plugin_selector.cc:64
-msgid "Plugin Manager"
-msgstr "Alle Plugins ..."
-
-#: plugin_selector.cc:85
-msgid "Fav"
-msgstr "Fav"
-
-#: plugin_selector.cc:87
-msgid "Available Plugins"
-msgstr "Verfügbare Plugins"
-
-#: plugin_selector.cc:88
-msgid "Type"
-msgstr "Typ"
-
-#: plugin_selector.cc:89
-msgid "Category"
-msgstr "Kategorie"
-
-#: plugin_selector.cc:90
-msgid "Creator"
-msgstr "Ersteller"
-
-#: plugin_selector.cc:91
-msgid "# Audio In"
-msgstr "# Audio In"
-
-#: plugin_selector.cc:92
-msgid "# Audio Out"
-msgstr "# Audio Out"
-
-#: plugin_selector.cc:93
-msgid "# MIDI In"
-msgstr "# MIDI In"
-
-#: plugin_selector.cc:94
-msgid "# MIDI Out"
-msgstr "# MIDI Out"
-
-#: plugin_selector.cc:116
-msgid "Plugins to be connected"
-msgstr "Plugins, die verbunden werden"
-
-#: plugin_selector.cc:129
-msgid "Add a plugin to the effect list"
-msgstr "Plugin zur Effektliste hinzufügen"
-
-#: plugin_selector.cc:133
-msgid "Remove a plugin from the effect list"
-msgstr "Plugin aus der Effektliste entfernen"
-
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Verfügbare Plugins auffrischen"
-
-#: plugin_selector.cc:172
-msgid "Insert Plugin(s)"
-msgstr "Plugin(s) einfügen"
-
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
-msgid "variable"
-msgstr "variabel"
-
-#: plugin_selector.cc:496
-msgid ""
-"The plugin \"%1\" could not be loaded\n"
-"\n"
-"See the Log window for more details (maybe)"
-msgstr ""
-"Das Plugin \"%1\" konnte nicht geladen werden\n"
-"\n"
-"Im Logfenster befinden sich möglicherweise mehr Informationen"
-
-#: plugin_selector.cc:644
-msgid "Favorites"
-msgstr "Favoriten"
-
-#: plugin_selector.cc:646
-msgid "Plugin Manager..."
-msgstr "Plugin Manager..."
-
-#: plugin_selector.cc:650
-msgid "By Creator"
-msgstr "Nach Urheber"
-
-#: plugin_selector.cc:653
-msgid "By Category"
-msgstr "Nach Kategorie"
-
-#: plugin_ui.cc:113
-msgid "Eh? LADSPA plugins don't have editors!"
-msgstr "Merkwürdig... LADSPA-Plugins sollten kein GUI haben!"
-
-#: plugin_ui.cc:122 plugin_ui.cc:227
-msgid ""
-"unknown type of editor-supplying plugin (note: no VST support in this "
-"version of %1)"
-msgstr ""
-"Unbekannter Plugintyp mit eigenem Editor (Hinweis: diese %1-Version "
-"unterstützt keine VST-Plugins)"
-
-#: plugin_ui.cc:125
-msgid "unknown type of editor-supplying plugin"
-msgstr "Unbekannter Plugintyp"
-
-#: plugin_ui.cc:257
-msgid ""
-"unknown type of editor-supplying plugin (note: no linuxVST support in this "
-"version of %1)"
-msgstr ""
-"Unbekannter Plugintyp mit eigenem Editor (Hinweis: diese %1-Version "
-"unterstützt keine linuxVST-Plugins)"
-
-#: plugin_ui.cc:329
-msgid "create_lv2_editor called on non-LV2 plugin"
-msgstr "create_lv2_editor auf nicht-LV2-Plugin angewandt"
-
-#: plugin_ui.cc:418
-msgid "Add"
-msgstr "Hinzufügen"
-
-#: plugin_ui.cc:422
-msgid "Description"
-msgstr "Beschreibung"
-
-#: plugin_ui.cc:423
-msgid "Plugin analysis"
-msgstr "Pluginanalyse"
-
-#: plugin_ui.cc:430
-msgid ""
-"Presets (if any) for this plugin\n"
-"(Both factory and user-created)"
-msgstr ""
-"Presets (falls existent) für dieses Plugin\n"
-"(Hersteller- und Benutzerpresets)"
-
-#: plugin_ui.cc:431
-msgid "Save a new preset"
-msgstr "Neues Preset speichern"
-
-#: plugin_ui.cc:432
-msgid "Save the current preset"
-msgstr "Momentanes Preset speichern"
-
-#: plugin_ui.cc:433
-msgid "Delete the current preset"
-msgstr "Lösche das aktuelle Preset"
-
-#: plugin_ui.cc:434
-msgid "Disable signal processing by the plugin"
-msgstr "Deaktiviere die Signalverarbeitung des Plugins"
-
-#: plugin_ui.cc:467 plugin_ui.cc:663
-msgid ""
-"Click to allow the plugin to receive keyboard events that %1 would normally "
-"use as a shortcut"
-msgstr ""
-"Klicke, damit das Plugin Tastaturbefehle erhält, die %1 sonst als "
-"Tastenkürzel verwenden würde"
-
-#: plugin_ui.cc:468
-msgid "Click to enable/disable this plugin"
-msgstr "Klicke, um dieses Plugin zu ein/auszuschalten"
-
-#: plugin_ui.cc:507
-msgid "latency (%1 sample)"
-msgid_plural "latency (%1 samples)"
-msgstr[0] "Latenz (%1 Sample)"
-msgstr[1] "Latenz (%1 Samples)"
-
-#: plugin_ui.cc:509
-msgid "latency (%1 ms)"
-msgstr "Latenz (%1 ms)"
-
-#: plugin_ui.cc:520
-msgid "Edit Latency"
-msgstr "Latenz bearbeiten"
-
-#: plugin_ui.cc:566
-msgid ""
-"Plugin presets are not supported in this build of %1. Consider paying for a "
-"full version"
-msgstr ""
-"Pluginpresets werden in diesem Version von %1 nicht unterstützt. Erwägen "
-"Sie, für eine Vollversion zu zahlen"
-
-#: plugin_ui.cc:574
-msgid ""
-"Plugin presets are not supported in this build, see the Log window for more "
-"information."
-msgstr ""
-"Pluginpresets werden von dieser Ausgabe des Programms nicht unterstützt, "
-"weitere Informationen sind im Logfenster zu finden."
-
-#: plugin_ui.cc:670
-msgid "Click to allow normal use of %1 keyboard shortcuts"
-msgstr "Klicke, um die normale Verwendung von %1 Tastaturkürzeln zu aktivieren"
-
-#: plugin_ui.cc:767
-msgid "(none)"
-msgstr "(kein)"
-
-#: port_group.cc:337
-msgid "%1 Busses"
-msgstr "%1 Busse"
-
-#: port_group.cc:338
-msgid "%1 Tracks"
-msgstr "%1 Spuren"
-
-#: port_group.cc:339
-msgid "Hardware"
-msgstr "Hardware"
-
-#: port_group.cc:340
-msgid "%1 Misc"
-msgstr "%1 Sonstige"
-
-#: port_group.cc:341
-msgid "Other"
-msgstr "Andere"
-
-#: port_group.cc:432 port_group.cc:433
-msgid "LTC Out"
-msgstr "LTC Out"
-
-#: port_group.cc:436 port_group.cc:437
-msgid "LTC In"
-msgstr "LTC In"
-
-#: port_group.cc:463
-msgid "MTC in"
-msgstr "MTC in"
-
-#: port_group.cc:466
-msgid "MIDI control in"
-msgstr "MIDI control in"
-
-#: port_group.cc:469
-msgid "MIDI clock in"
-msgstr "MIDI clock in"
-
-#: port_group.cc:472
-msgid "MMC in"
-msgstr "MMC in"
-
-#: port_group.cc:476
-msgid "MTC out"
-msgstr "MTC out"
-
-#: port_group.cc:479
-msgid "MIDI control out"
-msgstr "MIDI control out"
-
-#: port_group.cc:482
-msgid "MIDI clock out"
-msgstr "MIDI clock out"
-
-#: port_group.cc:485
-msgid "MMC out"
-msgstr "MMC out"
-
-#: port_group.cc:532
-msgid ":monitor"
-msgstr ":monitor"
-
-#: port_group.cc:544
-msgid "system:"
-msgstr "system:"
-
-#: port_group.cc:545
-msgid "alsa_pcm"
-msgstr "alsa_pcm"
-
-#: port_insert_ui.cc:39
-msgid "Measure Latency"
-msgstr "Latenz messen"
-
-#: port_insert_ui.cc:50
-msgid "Send/Output"
-msgstr "Send/Ausgang"
-
-#: port_insert_ui.cc:51
-msgid "Return/Input"
-msgstr "Return/Input"
-
-#: port_insert_ui.cc:85
-msgid "No signal detected"
-msgstr "Kein Signal erkannt"
-
-#: port_insert_ui.cc:165
-msgid "Port Insert "
-msgstr "Port Insert "
-
-#: port_matrix.cc:340 port_matrix.cc:366
-msgid "<b>Sources</b>"
-msgstr "<b>Quellen</b>"
-
-#: port_matrix.cc:341 port_matrix.cc:367
-msgid "<b>Destinations</b>"
-msgstr "<b>Ziele</b>"
-
-#: port_matrix.cc:449 port_matrix.cc:457
-#, c-format
-msgid "Add %s %s"
-msgstr "Füge %s %s hinzu"
-
-#: port_matrix.cc:465
-#, c-format
-msgid "Rename '%s'..."
-msgstr "Benenne '%s' um..."
-
-#: port_matrix.cc:481
-msgid "Remove all"
-msgstr "Alle löschen"
-
-#: port_matrix.cc:501 port_matrix.cc:513
-#, c-format
-msgid "%s all"
-msgstr "%s alle"
-
-#: port_matrix.cc:536
-msgid "Rescan"
-msgstr "Aktualisieren"
-
-#: port_matrix.cc:538
-msgid "Show individual ports"
-msgstr "Individuelle Ports anzeigen"
-
-#: port_matrix.cc:544
-msgid "Flip"
-msgstr "Drehen"
-
-#: port_matrix.cc:731
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
-msgstr ""
-"Hier kann kein Port hinzugefügt werden, da der erste Prozessor der Spur/des "
-"Busses die neue Portanzahl nicht unterstützt."
-
-#: port_matrix.cc:734
-msgid "Cannot add port"
-msgstr "Kann Port nicht hinzufügen"
-
-#: port_matrix.cc:756
-msgid "Port removal not allowed"
-msgstr "Entfernen des Ports nicht erlaubt"
-
-#: port_matrix.cc:757
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
-msgstr ""
-"Dieser Port kann nicht entfernt werden.\n"
-"Entweder kann das erste Plugin auf der Spur oder dem Bus \n"
-"die neue Anzahl an Eingängen nicht verarbeiten, oder das \n"
-"letzte Plugin hat mehr Ausgänge."
-
-#: port_matrix.cc:974
-#, c-format
-msgid "Remove '%s'"
-msgstr "Lösche '%s'"
-
-#: port_matrix.cc:989
-#, c-format
-msgid "%s all from '%s'"
-msgstr "alle von '%s' %s"
-
-#: port_matrix.cc:1055 transform_dialog.cc:62
-msgid "channel"
-msgstr "Kanal"
-
-#: port_matrix_body.cc:82
-msgid "There are no ports to connect."
-msgstr "Es gibt keine Ports, zu denen verbunden werden kann."
-
-#: port_matrix_body.cc:84
-msgid "There are no %1 ports to connect."
-msgstr "Es gibt keine %1 Ports, zu denen verbunden werden kann."
-
-#: processor_box.cc:150
-msgid "Send"
-msgstr "Send"
-
-#: processor_box.cc:152
-msgid "Return"
-msgstr "Return"
-
-#: processor_box.cc:310
-msgid ""
-"\n"
-"This mono plugin has been replicated %1 times."
-msgstr ""
-"\n"
-"Dieses Mono-Plugin wurde %1 mal repliziert."
-
-#: processor_box.cc:314
-msgid ""
-"<b>%1</b>\n"
-"Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
-msgstr ""
-"<b>%1</b>\n"
-"Doppelklick, um GUI zu zeigen.\n"
-"Alt+Doppelklick, um einfaches GUI zu zeigen.%2"
-
-#: processor_box.cc:317
-msgid ""
-"<b>%1</b>\n"
-"Double-click to show generic GUI.%2"
-msgstr ""
-"<b>%1</b>\n"
-"Doppelklick, um einfaches GUI zu zeigen.%2"
-
-#: processor_box.cc:361
-#, c-format
-msgid "(%1x1) "
-msgstr "(%1x1) "
-
-#: processor_box.cc:437
-msgid "Show All Controls"
-msgstr "Alle Regler zeigen"
-
-#: processor_box.cc:441
-msgid "Hide All Controls"
-msgstr "Alle Regler verbergen"
-
-#: processor_box.cc:475
-msgid "Link panner controls"
-msgstr "Panner-Elemente verknüpfen"
-
-#: processor_box.cc:575
-msgid "on"
-msgstr "an"
-
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
-msgid "off"
-msgstr "Aus"
-
-#: processor_box.cc:957
-msgid ""
-"Right-click to add/remove/edit\n"
-"plugins,inserts,sends and more"
-msgstr ""
-"Rechtsklick, um Plugins, Inserts, Sends etc.\n"
-"hinzuzufügen/zu editieren/zu löschen"
-
-#: processor_box.cc:1429 processor_box.cc:1804
-msgid "Plugin Incompatibility"
-msgstr "Plugin-Inkompatibilität"
-
-#: processor_box.cc:1432
-msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
-msgstr "Sie haben versucht, das Plugin \"%1\" im Einschub %2 hinzuzufügen.\n"
-
-#: processor_box.cc:1438
-msgid ""
-"\n"
-"This plugin has:\n"
-msgstr ""
-"\n"
-"Dieses Plugin hat:\n"
-
-#: processor_box.cc:1441
-msgid "\t%1 MIDI input\n"
-msgid_plural "\t%1 MIDI inputs\n"
-msgstr[0] "\t%1 MIDI Eingang\n"
-msgstr[1] "\t%1 MIDI Eingänge\n"
-
-#: processor_box.cc:1445
-msgid "\t%1 audio input\n"
-msgid_plural "\t%1 audio inputs\n"
-msgstr[0] "\t%1 Audio-Eingang\n"
-msgstr[1] "\t%1 Audio-Eingänge\n"
-
-#: processor_box.cc:1448
-msgid ""
-"\n"
-"but at the insertion point, there are:\n"
-msgstr ""
-"\n"
-"aber am Einfügepunkt gibt es:\n"
-
-#: processor_box.cc:1451
-msgid "\t%1 MIDI channel\n"
-msgid_plural "\t%1 MIDI channels\n"
-msgstr[0] "\t%1 MIDI-Kanal\n"
-msgstr[1] "\t%1 MIDI-Kanäle\n"
-
-#: processor_box.cc:1455
-msgid "\t%1 audio channel\n"
-msgid_plural "\t%1 audio channels\n"
-msgstr[0] "\t%1 Audio-Kanal\n"
-msgstr[1] "\t%1 Audio-Kanäle\n"
-
-#: processor_box.cc:1458
-msgid ""
-"\n"
-"%1 is unable to insert this plugin here.\n"
-msgstr ""
-"\n"
-"%1 kann dieses Plugin hier nicht einfügen.\n"
-
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr "Kann keinen neuen Send erstellen: %1"
-
-#: processor_box.cc:1807
-msgid ""
-"You cannot reorder these plugins/sends/inserts\n"
-"in that way because the inputs and\n"
-"outputs will not work correctly."
-msgstr ""
-"Sie können diese Plugins/Sends/Inserts\n"
-"nicht auf diese Weise verändern, sonst würden\n"
-"die Ein-/Ausgänge nicht mehr richtig funktionieren."
-
-#: processor_box.cc:1991
-msgid "Rename Processor"
-msgstr "Prozessor umbenennen"
-
-#: processor_box.cc:2022
-msgid "At least 100 IO objects exist with a name like %1 - name not changed"
-msgstr ""
-"Es gibt mindestens 100 E/A-Objekte mit einem Namen wie %1 - Name nicht "
-"geändert"
-
-#: processor_box.cc:2159
-msgid "plugin insert constructor failed"
-msgstr "Einfügen des Plugins gescheitert"
-
-#: processor_box.cc:2170
-msgid ""
-"Copying the set of processors on the clipboard failed,\n"
-"probably because the I/O configuration of the plugins\n"
-"could not match the configuration of this track."
-msgstr ""
-"Konnte die Prozessoren aus der Zwischenablage nicht\n"
-"kopieren, vermutlich weil die E/A Konfiguration der Plugins\n"
-"nicht mit der dieser Spur übereinstimmt."
-
-#: processor_box.cc:2216
-msgid ""
-"Do you really want to remove all processors from %1?\n"
-"(this cannot be undone)"
-msgstr ""
-"Wollen Sie wirklich alle Prozessoren von %1 entfernen?\n"
-"(Dies kann nicht rückgängig gemacht werden)"
-
-#: processor_box.cc:2220 processor_box.cc:2245
-msgid "Yes, remove them all"
-msgstr "Ja, alle löschen"
-
-#: processor_box.cc:2222 processor_box.cc:2247
-msgid "Remove processors"
-msgstr "Prozessoren entfernen"
-
-#: processor_box.cc:2237
-msgid ""
-"Do you really want to remove all pre-fader processors from %1?\n"
-"(this cannot be undone)"
-msgstr ""
-"Wollen Sie wirklich alle Pre-Fader-Prozessoren von %1 entfernen?\n"
-"(Dies kann nicht rückgängig gemacht werden)"
-
-#: processor_box.cc:2240
-msgid ""
-"Do you really want to remove all post-fader processors from %1?\n"
-"(this cannot be undone)"
-msgstr ""
-"Wollen Sie wirklich alle Post-Fader-Prozessoren von %1 entfernen?\n"
-"(Dies kann nicht rückgängig gemacht werden)"
-
-#: processor_box.cc:2428
-msgid "New Plugin"
-msgstr "Plugin einfügen"
-
-#: processor_box.cc:2431
-msgid "New Insert"
-msgstr "Insert einfügen"
-
-#: processor_box.cc:2434
-msgid "New External Send ..."
-msgstr "Neuer externer Send..."
-
-#: processor_box.cc:2438
-msgid "New Aux Send ..."
-msgstr "Neuer Aux-Send..."
-
-#: processor_box.cc:2441
-msgid "Send Options"
-msgstr "Send Optionen"
-
-#: processor_box.cc:2443
-msgid "Clear (all)"
-msgstr "Leeren (alle)"
-
-#: processor_box.cc:2445
-msgid "Clear (pre-fader)"
-msgstr "Leeren (Pre-Fader)"
-
-#: processor_box.cc:2447
-msgid "Clear (post-fader)"
-msgstr "Leeren (Post-Fader)"
-
-#: processor_box.cc:2473
-msgid "Activate All"
-msgstr "Alle aktivieren"
-
-#: processor_box.cc:2475
-msgid "Deactivate All"
-msgstr "Alle deaktivieren"
-
-#: processor_box.cc:2477
-msgid "A/B Plugins"
-msgstr "A/B Plugins"
-
-#: processor_box.cc:2486
-msgid "Edit with generic controls..."
-msgstr "Mit einfachen Kontrollelementen editieren..."
-
-#: processor_box.cc:2789
-msgid "%1: %2 (by %3)"
-msgstr "%1: %2 (von %3)"
-
-#: processor_box.cc:2791
-msgid "%1 (by %2)"
-msgstr "%1 (von %2)"
-
-#: patch_change_dialog.cc:50
-msgid "Patch Change"
-msgstr "Patch Change"
-
-#: patch_change_dialog.cc:76
-msgid "Patch Bank"
-msgstr "Patch Bank"
-
-#: patch_change_dialog.cc:83
-msgid "Patch"
-msgstr "Patch"
-
-#: patch_change_dialog.cc:98 step_entry.cc:430
-msgid "Program"
-msgstr "Programm"
-
-#: patch_change_dialog.cc:106 step_entry.cc:422
-msgid "Bank"
-msgstr "Bank"
-
-#: quantize_dialog.cc:36
-msgid "main grid"
-msgstr "Hauptraster"
-
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
-msgid "Quantize"
-msgstr "Quantisieren"
-
-#: quantize_dialog.cc:56
-msgid "Strength"
-msgstr "Stärke"
-
-#: quantize_dialog.cc:59
-msgid "Swing"
-msgstr "Swing"
-
-#: quantize_dialog.cc:62
-msgid "Threshold (ticks)"
-msgstr "Threshold (ticks)"
-
-#: quantize_dialog.cc:63
-msgid "Snap note start"
-msgstr "Notenanfang einrasten an"
-
-#: quantize_dialog.cc:64
-msgid "Snap note end"
-msgstr "Notenende einrasten an"
-
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
-msgstr "Audiodatei für Klick"
-
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
-msgid "Browse..."
-msgstr "Durchsuchen..."
-
-#: rc_option_editor.cc:84
-msgid "Click emphasis audio file:"
-msgstr "Audiodatei für Klick-Betonung"
-
-#: rc_option_editor.cc:116
-msgid "Choose Click"
-msgstr "Click auswählen"
-
-#: rc_option_editor.cc:139
-msgid "Choose Click Emphasis"
-msgstr "Click-Betonung auswählen"
-
-#: rc_option_editor.cc:170
-msgid "Limit undo history to"
-msgstr "Limitiere Aktionsliste auf"
-
-#: rc_option_editor.cc:171
-msgid "Save undo history of"
-msgstr "Speichere Aktionsliste von"
-
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
-msgid "commands"
-msgstr "Aktionen"
-
-#: rc_option_editor.cc:325
-msgid "Edit using:"
-msgstr "Bearbeiten mit:"
-
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
-msgid "+ button"
-msgstr "+ Maustaste"
-
-#: rc_option_editor.cc:351
-msgid "Delete using:"
-msgstr "Entfernen mit:"
-
-#: rc_option_editor.cc:378
-msgid "Insert note using:"
-msgstr "Note einfügen:"
-
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
-msgstr "Einrasten ignorieren mittels:"
-
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "Tastaturlayout:"
-
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "Schriftskalierung"
-
-#: rc_option_editor.cc:547
-msgid "Default"
-msgstr "Voreinstellung"
-
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
-msgstr ""
-"Größere Änderungen an der Fontskalierung verlangen einen Neustart des "
-"Programms, um das Layout anzupassen."
-
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
-msgstr "Wellenform Clipping-Wert (dBFS):"
-
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
-msgstr "Wiedergabe (gepufferte Sekunden):"
-
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
-msgstr "Aufnahme (gepufferte Sekunden):"
-
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
-msgstr "Eingabegeräteprotokoll"
-
-#: rc_option_editor.cc:746
-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:903
-msgid "Show Video Export Info before export"
-msgstr "Zeige Video-Exportinformationen vor dem Exportieren"
-
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
-msgstr "Zeige den Videoserver-Startdialog"
-
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
-msgstr "Ausführliche Einrichtung (entfernter Videoserver)"
-
-#: rc_option_editor.cc:913
-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."
-msgstr ""
-"<b>Wenn aktiviert</b>, können Sie eine benutzerdefinierte URL und docroot "
-"für den Videoserver eingeben. - Aktivieren Sie diese Option nur, wenn Sie "
-"wissen, was Sie tun."
-
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
-msgstr "Videoserver URL:"
-
-#: rc_option_editor.cc:920
-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 "
-"the video-server is running locally"
-msgstr ""
-"Basis-URL des Videoservers mit http-Prefix. Dies ist normalerweise 'http://"
-"hostname.example.org:1554/' und ist auf 'http://localhost:1554/' "
-"voreingestellt, wenn der Videoserver lokal läuft"
-
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
-msgstr "Videoordner:"
-
-#: rc_option_editor.cc:927
-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 "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
-msgstr ""
-"Lokaler Pfad zum document-root des Videoservers. Nur Dateien unterhalb "
-"dieses Verzeichnisses sind dem Videoserver zugänglich.Falls der Server auf "
-"einem entfernten Rechner läuft, sollte der Pfad auf ein im Netzwerk "
-"gemountetes Verzeichnis der docroot des Servers verweisen, oder leergelassen "
-"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:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
-msgstr ""
-"<b>Wenn aktiviert</b> , wird vor dem Videoexport-Dialog ein "
-"Informationsfenster mit Details angezeigt."
-
-#: rc_option_editor.cc:939
-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:1022
-msgid "Always Display Plugin Scan Progress"
-msgstr "Plugin Scan-Fortschritt immer anzeigen"
-
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
-msgstr "Bei Programmstart nach [neuen] VST Plugins scannen"
-
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
-msgstr "Bei Programmstart nach AudioUnit Plugins scannen"
-
-#: rc_option_editor.cc:1035
-msgid "General"
-msgstr "Allgemein"
-
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
-msgstr "Scanne nach Plugins"
-
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
-msgstr ""
-"<b>Wenn aktiviert,</b> wird ein Popupfenster dargestellt, um Plugin Scan-"
-"Fortschritt, Indizierung(Laden des Cace) und Entdeckung (neue Plugins "
-"finden) anzuzeigen"
-
-#: rc_option_editor.cc:1055
-msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
-msgstr ""
-"Geben Sie die Voreinstellung für das Timeout bei der Plugin-Instanzierung in "
-"1/10 Sekunden an. Plugins, die mehr Zeit benötigen um zu laden, werden auf "
-"die schwarze Liste gesetzt. Ein Wert von 0 deaktiviert das Timeout."
-
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
-msgstr "Scan-Timeout [Zehntelsekunden]"
-
-#: rc_option_editor.cc:1065
-msgid "VST"
-msgstr "VST"
-
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
-msgstr "VST Cache leeren"
-
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
-msgstr "VST Blacklist leeren"
-
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
-msgstr ""
-"<b>Wenn aktiviert<b>, werden bei Programmstart neue VST Plugins gesucht, "
-"getestet und dem Cache-Index hinzugefügt. Wenn nicht aktiviert, werden neue "
-"Plugins nur nach einem manuellen Scan verfügbar sein"
-
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
-msgstr "Linux VST Pfad:"
-
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
-msgstr "Windows VST Pfad:"
-
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
-msgstr "Audio Unit"
-
-#: rc_option_editor.cc:1111
-msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
-msgstr ""
-"<b>Wenn aktiviert<b>, werden bei Programmstart AudioUnit Plugins entdeckt. "
-"Wenn nicht aktiviert, werden neue Plugins nur nach einem manuellen Scan "
-"verfügbar sein. Der erste erfolgreiche Scan wird weitere automatische AU-"
-"Scans aktivieren, ein Crash während der Pluginentdeckung wird sie "
-"deaktivieren."
-
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
-msgstr "AU Cache leeren"
-
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
-msgstr "AU Blacklist leeren"
-
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
-msgstr "Windows VST Suchpfad setzen"
-
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
-msgstr "Linux VST Suchpfad setzen"
-
-#: rc_option_editor.cc:1297
-msgid "%1 Preferences"
-msgstr "%1 Einstellungen"
-
-#: rc_option_editor.cc:1309
-msgid "DSP CPU Utilization"
-msgstr "DSP CPU Nutzung"
-
-#: rc_option_editor.cc:1313
-msgid "Signal processing uses"
-msgstr "Die Signalverarbeitung verwendet"
-
-#: rc_option_editor.cc:1318
-msgid "all but one processor"
-msgstr "Alle außer einem Prozessor"
-
-#: rc_option_editor.cc:1319
-msgid "all available processors"
-msgstr "Alle verfügbaren Prozessoren"
-
-#: rc_option_editor.cc:1322
-msgid "%1 processors"
-msgstr "%1 Prozessoren"
-
-#: rc_option_editor.cc:1325
-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:1330
-msgid "Options|Undo"
-msgstr "Undo"
-
-#: rc_option_editor.cc:1337
-msgid "Verify removal of last capture"
-msgstr "Verwerfen der letzten Aufnahme bestätigen"
-
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
-msgstr "Erstelle regelmäßig Backups der Projektdatei"
-
-#: rc_option_editor.cc:1350
-msgid "Session Management"
-msgstr "Projektmanagement:"
-
-#: rc_option_editor.cc:1355
-msgid "Always copy imported files"
-msgstr "Importierte Dateien immer kopieren"
-
-#: rc_option_editor.cc:1362
-msgid "Default folder for new sessions:"
-msgstr "Standardordner für neue Projekte"
-
-#: rc_option_editor.cc:1370
-msgid "Maximum number of recent sessions"
-msgstr "Maximale Anzahl kürzlich geöffneter Projekte"
-
-#: rc_option_editor.cc:1383
-msgid "Click gain level"
-msgstr "Lautstärke für Klick"
-
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
-msgid "Automation"
-msgstr "Automationen"
-
-#: rc_option_editor.cc:1393
-msgid "Thinning factor (larger value => less data)"
-msgstr "Ausdünnungsfaktor (größerer Wert => weniger Daten)"
-
-#: rc_option_editor.cc:1402
-msgid "Automation sampling interval (milliseconds)"
-msgstr "Meßintervall für Automation (Millisekunden)"
-
-#: rc_option_editor.cc:1414
-msgid "Keep record-enable engaged on stop"
-msgstr "Aufnahme bleibt nach Stopp aktiviert"
-
-#: rc_option_editor.cc:1423
-msgid "Play loop is a transport mode"
-msgstr "Schleifenwiedergabe ist ein Transportmodus"
-
-#: rc_option_editor.cc:1428
-msgid ""
-"<b>When enabled</b> the loop button does not start playback but forces "
-"playback to always play the loop\n"
-"\n"
-"<b>When disabled</b> the loop button starts playing the loop, but stop then "
-"cancels loop playback"
-msgstr ""
-"<b>Wenn aktiviert<b>, startet die Schleifen-Schaltfläche nicht die "
-"Wiedergabe, zwingt aber die Wiedergabe, immer die Schleife zu spielen\n"
-"\n"
-"<b>Wenn deaktiviert<b>, startet die Schleifen-Schaltfläche die Wiedergabe, "
-"ein späteres \"Stop\" beendet aber die Wiedergabe als Schleife"
-
-#: rc_option_editor.cc:1434
-msgid "Stop recording when an xrun occurs"
-msgstr "Aufnahme bei xrun stoppen"
-
-#: rc_option_editor.cc:1439
-msgid ""
-"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
-"detected by the audio engine"
-msgstr ""
-"<b>Falls an</b>, wird %1 Aufnahmen bei Auftreten von Over- oder Underruns "
-"abbrechen"
-
-#: rc_option_editor.cc:1445
-msgid "Create markers where xruns occur"
-msgstr "Bei xrun Marker erzeugen"
-
-#: rc_option_editor.cc:1454
-msgid "Stop at the end of the session"
-msgstr "Am Ende des Projektes anhalten"
-
-#: rc_option_editor.cc:1459
-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"
-"\n"
-"<b>When disabled</b> %1 will continue to roll past the session end marker at "
-"all times"
-msgstr ""
-"<b>Falls an</b>, und %1 </b>nimmt nicht auf</b>, wird es bei Erreichen ds "
-"Projektende-Markers die Wiedergabe stoppen\n"
-"\n"
-"<b>Falls aus</b> , wird %1 am Ende des Projektes immer weiterlaufen"
-
-#: rc_option_editor.cc:1467
-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:1472
-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 "
-"the loop\n"
-"\n"
-"<b>When disabled</b> looping is done by locating back to the start of the "
-"loop when %1 reaches the end which will often cause a small click or delay"
-msgstr ""
-"<b>Falls an</b>, wird dies vorauslesen und am Schleifenendpunkt "
-"zurückspringen, wodurch eine Neupositionierung am Schleifenende vermieden "
-"wird\n"
-"\n"
-"<b>Falls aus</b>, wird %1 bei Erreichen des Schleifenendes zum Anfang der "
-"Schleife springen, was oft einen hörbaren Klick oder kurze Verzögerung "
-"verursacht"
-
-#: rc_option_editor.cc:1480
-msgid "Disable per-track record disarm while rolling"
-msgstr "Während der Aufnahme Aufnahmestatus einzelner Spuren sperren"
-
-#: rc_option_editor.cc:1484
-msgid ""
-"<b>When enabled</b> this will prevent you from accidentally stopping "
-"specific tracks recording during a take"
-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:1489
-msgid "12dB gain reduction during fast-forward and fast-rewind"
-msgstr "Beim Spulen Pegel um 12dB absenken"
-
-#: rc_option_editor.cc:1493
-msgid ""
-"This will reduce the unpleasant increase in perceived volume that occurs "
-"when fast-forwarding or rewinding through some kinds of audio"
-msgstr ""
-"Dies wird die unangenehme Steigerung der wahrgenommenen Lautstärke "
-"verringern, die bei manchem Material bei Vor/Rücklauf auftritt"
-
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
-msgstr "Sync/Slave"
-
-#: rc_option_editor.cc:1501
-msgid "External timecode source"
-msgstr "Externe Timecode-Quelle"
-
-#: rc_option_editor.cc:1510
-msgid "Match session video frame rate to external timecode"
-msgstr "Videoframerate des Projekts an externen Timecode anpassen"
-
-#: rc_option_editor.cc:1516
-msgid ""
-"This option controls the value of the video frame rate <i>while chasing</i> "
-"an external timecode source.\n"
-"\n"
-"<b>When enabled</b> the session video frame rate will be changed to match "
-"that of the selected external timecode source.\n"
-"\n"
-"<b>When disabled</b> the session video frame rate will not be changed to "
-"match that of the selected external timecode source.Instead the frame rate "
-"indication in the main clock will flash red and %1 will convert between the "
-"external timecode standard and the session standard."
-msgstr ""
-"Diese Option bestimmt den Wert der Videoframerate <i>während der "
-"Synchronisation</i> mit einer externen Timecode-Quelle. \n"
-"\n"
-"<b>Falls an</b>, wird die Videoframerate des Projektes an die der externen "
-"Timecode-Quelle angepasst. \n"
-"\n"
-"<b>Falls aus</b>, wird die Videoframerate des Projektes nicht geändert. "
-"Stattdessen wird die Anzeige der Framerate in der Uhr rot blinken und %1 "
-"wird zwischen den Standards der externen Quelle und des Projektes "
-"konvertieren."
-
-#: rc_option_editor.cc:1526
-msgid "Sync-lock timecode to clock (disable drift compensation)"
-msgstr ""
-"Starre Synchronisation von Timecode und Uhr (unterbinde Driftkompensation)"
-
-#: rc_option_editor.cc:1532
-msgid ""
-"<b>When enabled</b> %1 will never varispeed when slaved to external "
-"timecode. Sync Lock indicates that the selected external timecode source "
-"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
-"interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
-"\n"
-"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
-"the timecode sources shares clock sync."
-msgstr ""
-"<b>Wenn aktiviert</b>, wird %1 niemals mit variabler Geschwindigkeit "
-"abspielen, während zu externem Timecode synchronisiert wird. Starre "
-"Synchronisation zeigt an, dass die ausgewählte externe Timecodequelle mit "
-"dem Audiointerface Clock-Sync teilt (Black & Burst, Wordclock, etc.) "
-"Diese Option deaktiviert Driftkompensation. Die Transportgeschwindigkeit ist "
-"auf 1,0 fixiert. Varispeed LTC wird ignoriert und wird Drift verursachen.\n"
-"\n"
-"<b>Wenn deaktiviert</b>, wird %1 potentiellen Drift kompensieren, "
-"ungeachtet, ob die Timecodequellen Clock Sync teilen."
-
-#: rc_option_editor.cc:1547
-msgid "Lock to 29.9700 fps instead of 30000/1001"
-msgstr "Fest auf 29.9700 fps statt 30000/1001"
-
-#: rc_option_editor.cc:1553
-msgid ""
-"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
-"instead of 30000/1001.\n"
-"SMPTE 12M-1999 specifies 29.97df as 30000/1001. The spec further mentions "
-"that drop-frame timecode has an accumulated error of -86ms over a 24-hour "
-"period.\n"
-"Drop-frame timecode would compensate exactly for a NTSC color frame rate of "
-"30 * 0.9990 (ie 29.970000). That is not the actual rate. However, some "
-"vendors use that rate - despite it being against the specs - because the "
-"variant of using exactly 29.97 fps has zero timecode drift.\n"
-msgstr ""
-"<b>Wenn aktiv</b>, wird erwartet, daß die externe Timecode-Quelle 29.97 fps "
-"statt 30000/1001 benutzt.\n"
-"SMPTE 12M-1999 spezifiziert 29.97df as 30000/1001. Die Spezifikation erwähnt "
-"darüber hinaus, daß Drop-frame Timecode einen Fehler von -86ms im Zeitraum "
-"von 24 Stunden akkumuliert.\n"
-"Drop-frame Timecode würde eine NTSC Farb-Framerate von 30 * 0.9990 "
-"(entspricht29.970000) exakt kompensieren. Das ist nicht die tatsächliche "
-"Rate, jedoch benutzen manche Hersteller diese - der Spezifikation "
-"widersprechend - da bei der Variante mit exakt 29.97 fps kein Timecode-Drift "
-"auftritt.\n"
-
-#: rc_option_editor.cc:1563
-msgid "LTC Reader"
-msgstr "LTC-Leser"
-
-#: rc_option_editor.cc:1567
-msgid "LTC incoming port"
-msgstr "LTC Eingangsport"
-
-#: rc_option_editor.cc:1582
-msgid "LTC Generator"
-msgstr "LTC-Generator"
-
-#: rc_option_editor.cc:1587
-msgid "Enable LTC generator"
-msgstr "LTC-Generator aktivieren"
-
-#: rc_option_editor.cc:1594
-msgid "Send LTC while stopped"
-msgstr "LTC senden, während Transport stillsteht"
-
-#: rc_option_editor.cc:1600
-msgid ""
-"<b>When enabled</b> %1 will continue to send LTC information even when the "
-"transport (playhead) is not moving"
-msgstr ""
-"<b>Falls an</b>, wird %1 weiterhin LTC-Information senden, sogar wenn der "
-"Transport (Positionszeiger) stillsteht"
-
-#: rc_option_editor.cc:1606
-msgid "LTC generator level"
-msgstr "LTC-Generator-Lautstärke"
-
-#: rc_option_editor.cc:1610
-msgid ""
-"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
-"is 0dBu ^= -18dbFS in an EBU calibrated system"
-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:1622
-msgid "Allow dragging of playhead"
-msgstr "Erlaube Ziehen des Positionszeigers"
-
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
-msgstr "Verschiebe relevante Automationen mit Region"
-
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
-msgstr "Aktiviere Pegelanzeigen im Editor"
-
-#: rc_option_editor.cc:1646
-msgid "Display master-meter in the toolbar"
-msgstr "Master-Pegelanzeige in der Werkzeugleiste anzeigen"
-
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
-msgstr "Voreingestellte Fade-Art"
-
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
-msgstr "Regionen der aktiven Bearbeitungsgruppen werden gemeinsam bearbeitet"
-
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
-msgstr "immer, wenn sie sich auf der Zeitachse überlappen"
-
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
-msgstr "nur bei identischer Länge, Position und Herkunft"
-
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
-msgstr "Gummiband-Auswahl an Raster ausrichten"
-
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
-msgstr "Zeige Wellenformen in Regionen"
-
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
-msgstr "Zeige Lautstärkekurven in Regionen an"
-
-#: rc_option_editor.cc:1701
-msgid "in all modes"
-msgstr "in allen Modi"
-
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
-msgstr "nur im Region-Gain Modus"
-
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
-msgstr "Wellenformskalierung"
-
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "Linear"
-
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
-msgstr "Logarithmisch"
-
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
-msgstr "Wellenform Anzeigeart"
-
-#: rc_option_editor.cc:1726
-msgid "traditional"
-msgstr "Traditionell"
-
-#: rc_option_editor.cc:1727
-msgid "rectified"
-msgstr "Rectified"
-
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
-msgstr "Zeige bei Aufnahmen die Wellenformen des aufgenommenen Audiomaterials"
-
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
-msgstr "Zeige Zoom Toolbar"
-
-#: rc_option_editor.cc:1752
-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:1760
-msgid "Synchronise editor and mixer selection"
-msgstr "Synchronisiere Auswahl der Spuren im Editor und Mixer"
-
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
-msgstr "Neue Marker benennen"
-
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
-msgstr ""
-"Falls an, wird bei Erzeugung eines neuen Markers ein Dialog eingeblendet, "
-"damit der Name sofort bearbeitet werden kann.\n"
-"\n"
-"Marker können jederzeit per Rechtsklick umbenannt werden"
-
-#: rc_option_editor.cc:1779
-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:1786
-msgid "After splitting selected regions, select"
-msgstr "Nach dem Teilen"
-
-#: rc_option_editor.cc:1791
-msgid "no regions"
-msgstr "keine Regionen"
-
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
-msgstr "neu erzeugte Regionen"
-
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
-msgstr "existierende Auswahl und neu erzeugte Regionen"
-
-#: rc_option_editor.cc:1805
-msgid "Buffering"
-msgstr "Pufferung"
-
-#: rc_option_editor.cc:1813
-msgid "Record monitoring handled by"
-msgstr "Aufnahmemonitoring wird verwaltet von"
-
-#: rc_option_editor.cc:1819
-msgid "via Audio Driver"
-msgstr "via Audiotreiber"
-
-#: rc_option_editor.cc:1825
-msgid "audio hardware"
-msgstr "Audiohardware"
-
-#: rc_option_editor.cc:1832
-msgid "Tape machine mode"
-msgstr "Bandmaschinen-Modus"
-
-#: rc_option_editor.cc:1837
-msgid "Connection of tracks and busses"
-msgstr "Verbindung von Spuren und Bussen"
-
-#: rc_option_editor.cc:1842
-msgid "Auto-connect master/monitor busses"
-msgstr "Master/Monitor-Busse automatisch verbinden"
-
-#: rc_option_editor.cc:1849
-msgid "Connect track inputs"
-msgstr "Verbinde Spureingänge"
-
-#: rc_option_editor.cc:1854
-msgid "automatically to physical inputs"
-msgstr "automatisch mit Audioeingängen"
-
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
-msgid "manually"
-msgstr "manuell"
-
-#: rc_option_editor.cc:1861
-msgid "Connect track and bus outputs"
-msgstr "Verbinde Spur- und Busausgänge"
-
-#: rc_option_editor.cc:1866
-msgid "automatically to physical outputs"
-msgstr "automatisch mit Audioausgängen"
-
-#: rc_option_editor.cc:1867
-msgid "automatically to master bus"
-msgstr "automatisch mit dem Master-Bus"
-
-#: rc_option_editor.cc:1872
-msgid "Denormals"
-msgstr "Denormals"
-
-#: rc_option_editor.cc:1877
-msgid "Use DC bias to protect against denormals"
-msgstr "Nutze DC bias als Schutz vor Denormals"
-
-#: rc_option_editor.cc:1884
-msgid "Processor handling"
-msgstr "Umgang des Prozessors mit Denormals"
-
-#: rc_option_editor.cc:1890
-msgid "no processor handling"
-msgstr "nicht behandeln"
-
-#: rc_option_editor.cc:1896
-msgid "use FlushToZero"
-msgstr "Benutze FlushToZero"
-
-#: rc_option_editor.cc:1903
-msgid "use DenormalsAreZero"
-msgstr "Benutze DenormalsAreZero"
-
-#: rc_option_editor.cc:1910
-msgid "use FlushToZero and DenormalsAreZero"
-msgstr "Benutze FlushToZero & DenormalsAreZero"
-
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
-msgstr "Deaktiviere Plugins, wenn der Transport gestoppt ist."
-
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
-msgstr "Neue Plugins sind aktiv"
-
-#: rc_option_editor.cc:1944
-msgid "Enable automatic analysis of audio"
-msgstr "Audiodaten automatisch analysieren"
-
-#: rc_option_editor.cc:1952
-msgid "Replicate missing region channels"
-msgstr "Fehlende Kanäle in Regionen durch Kopien ersetzen"
-
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
-msgstr "Solo / Mute"
-
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
-msgstr "Solo-in-Place Mute Dämpfung (dB)"
-
-#: rc_option_editor.cc:1971
-msgid "Solo controls are Listen controls"
-msgstr "Solo-Schalter arbeiten als AFL/PFL"
-
-#: rc_option_editor.cc:1980
-msgid "Listen Position"
-msgstr "Abhörpunkt"
-
-#: rc_option_editor.cc:1985
-msgid "after-fader (AFL)"
-msgstr "After-Fader (AFL)"
-
-#: rc_option_editor.cc:1986
-msgid "pre-fader (PFL)"
-msgstr "Pre-Fader (PFL)"
-
-#: rc_option_editor.cc:1992
-msgid "PFL signals come from"
-msgstr "Abgreifpunkt der PFL Signale"
-
-#: rc_option_editor.cc:1997
-msgid "before pre-fader processors"
-msgstr "Vor den Pre-Fader Prozessoren"
-
-#: rc_option_editor.cc:1998
-msgid "pre-fader but after pre-fader processors"
-msgstr "Pre-Fader, aber nach den Prozessoren"
-
-#: rc_option_editor.cc:2004
-msgid "AFL signals come from"
-msgstr "Abgreifpunkt der AFL Signale"
-
-#: rc_option_editor.cc:2009
-msgid "immediately post-fader"
-msgstr "Direkt nach dem Fader"
-
-#: rc_option_editor.cc:2010
-msgid "after post-fader processors (before pan)"
-msgstr "Nach den Post-Fader Prozessoren (vor Pan)"
-
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr "Exclusives Solo"
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr "Solo auf anderen Kanälen als Mute anzeigen"
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr "Solo ist trotz Mute hörbar"
-
-#: rc_option_editor.cc:2040
-msgid "Default track / bus muting options"
-msgstr "Standardeinstellungen für Mute von Spuren / Bussen"
-
-#: rc_option_editor.cc:2045
-msgid "Mute affects pre-fader sends"
-msgstr "Mute schaltet Pre-Fader Sends stumm"
-
-#: rc_option_editor.cc:2053
-msgid "Mute affects post-fader sends"
-msgstr "Mute schaltet Post-Fader Sends stumm"
-
-#: rc_option_editor.cc:2061
-msgid "Mute affects control outputs"
-msgstr "Mute schaltet Abhörausgänge stumm"
-
-#: rc_option_editor.cc:2069
-msgid "Mute affects main outputs"
-msgstr "Mute schaltet Hauptausgänge stumm"
-
-#: rc_option_editor.cc:2074
-msgid "Send Routing"
-msgstr "Send Routing"
-
-#: rc_option_editor.cc:2079
-msgid "Link panners of Aux and External Sends with main panner by default"
-msgstr "Verknüpfe Aux- und External-Send-Panner mit Hauptpanner"
-
-#: rc_option_editor.cc:2087
-msgid "MIDI read-ahead time (seconds)"
-msgstr "MIDI read-ahead Zeit (Sekunden)"
-
-#: rc_option_editor.cc:2105
-msgid "Send MIDI Time Code"
-msgstr "Sende MIDI Time Code"
-
-#: rc_option_editor.cc:2113
-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:2122
-msgid "Obey MIDI Machine Control commands"
-msgstr "MIDI Machine Control Commands empfangen"
-
-#: rc_option_editor.cc:2130
-msgid "Send MIDI Machine Control commands"
-msgstr "MIDI Machine Control Commands senden"
-
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
-msgstr "MIDI Control Feedback senden"
-
-#: rc_option_editor.cc:2146
-msgid "Inbound MMC device ID"
-msgstr "ID des eingehenden MMC-Geräts"
-
-#: rc_option_editor.cc:2155
-msgid "Outbound MMC device ID"
-msgstr "ID des ausgehenden MMC-Geräts"
-
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
-msgstr "Erstmaliger Programmwechsel"
-
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
-msgstr "Erste(s) MIDI Bank/Programm als 0 anzeigen"
-
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
-msgstr "Periodische MIDI Nachrichten nie anzeigen (MTC, MIDI Clock)"
-
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
-msgstr "MIDI Noten ertönen bei Auswahl"
-
-#: rc_option_editor.cc:2194
-msgid "Midi Audition"
-msgstr "Midi vorhören"
-
-#: rc_option_editor.cc:2198
-msgid "Midi Audition Synth (LV2)"
-msgstr "Midi Vorhör-Synth (LV2)"
-
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
-msgid "User interaction"
-msgstr "Benutzerinteraktion"
-
-#: rc_option_editor.cc:2232
-msgid ""
-"Use translations of %1 messages\n"
-" <i>(requires a restart of %1 to take effect)</i>\n"
-" <i>(if available for your language preferences)</i>"
-msgstr ""
-"Benutze Übersetzung der %1-Oberfläche\n"
-" <i>(erfordert Neustart von %1)</i>\n"
-" <i>(falls für Ihre gewünschte Sprache verfügbar)</i>"
-
-#: rc_option_editor.cc:2239
-msgid "Keyboard"
-msgstr "Tastatur"
-
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
-msgstr "Remote ID des Eingabegeräts"
-
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
-msgstr "vom Benutzer festgelegt"
-
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
-msgstr "folgt Reihenfolge im Mixer"
-
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
-msgid "Preferences|GUI"
-msgstr "GUI"
-
-#: rc_option_editor.cc:2272
-msgid "Graphically indicate mouse pointer hovering over various widgets"
-msgstr "Mouseover-Effekt über verschiedenen Anzeigen"
-
-#: rc_option_editor.cc:2281
-msgid "Show tooltips if mouse hovers over a control"
-msgstr "Zeige Tooltips, wenn die Maus über einem Element schwebt"
-
-#: rc_option_editor.cc:2290
-msgid "Use name highlight bars in region displays (requires a restart)"
-msgstr ""
-"Verwende Farbbalken zur Namenshervorhebung in der Regionendarstellung "
-"(erfordert Neustart)"
-
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
-msgstr "Auffrischen der Transport-Uhranzeige in FPS statt alle 100 ms"
-
-#: rc_option_editor.cc:2312
-msgid "Lock timeout (seconds)"
-msgstr "Sperr-Timeout (Sekunden)"
-
-#: rc_option_editor.cc:2320
-msgid "Lock GUI after this many idle seconds (zero to never lock)"
-msgstr "Sperre GUI nach so vielen untätigen Sekunden (null, um nie zu sperren)"
-
-#: rc_option_editor.cc:2336
-msgid "Mixer Strip"
-msgstr "Anzeige im Kanalzug"
-
-#: rc_option_editor.cc:2346
-msgid "Use narrow strips in the mixer by default"
-msgstr "Standardmäßig schmale Kanalzüge verwenden"
-
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
-msgid "Preferences|Metering"
-msgstr "Pegelanzeige"
-
-#: rc_option_editor.cc:2355
-msgid "Peak hold time"
-msgstr "Haltezeit für Spitzenwert"
-
-#: rc_option_editor.cc:2361
-msgid "short"
-msgstr "Kurz"
-
-#: rc_option_editor.cc:2362
-msgid "medium"
-msgstr "Mittel"
-
-#: rc_option_editor.cc:2363
-msgid "long"
-msgstr "Lange"
-
-#: rc_option_editor.cc:2369
-msgid "DPM fall-off"
-msgstr "Abfall der digitalen Pegelanzeige"
-
-#: rc_option_editor.cc:2375
-msgid "slowest [6.6dB/sec]"
-msgstr "am langsamsten [6.6dB/sec]"
-
-#: rc_option_editor.cc:2376
-msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
-msgstr "langsam [8.6dB/sec] (BBC PPM, EBU PPM)"
-
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr "etwas langsam [12.0dB/sec] (DIN)"
-
-#: rc_option_editor.cc:2378
-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:2379
-msgid "medium [20dB/sec]"
-msgstr "mittel [20dB/sec]"
-
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
-msgstr "schnell [32dB/sec]"
-
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
-msgstr "schneller [46dB/sec]"
-
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
-msgstr "am schnellsten [70dB/sec]"
-
-#: rc_option_editor.cc:2388
-msgid "Meter line-up level; 0dBu"
-msgstr "Ausrichtung der Pegelanzeige; 0dBu"
-
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
-msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
-msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
-
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
-msgid "-20dBFS (SMPTE RP.0155)"
-msgstr "-20dBFS (SMPTE RP.0155)"
-
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
-msgid "-18dBFS (EBU, BBC)"
-msgstr "-18dBFS (EBU, BBC)"
-
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
-msgid "-15dBFS (DIN)"
-msgstr "-15dBFS (DIN)"
-
-#: rc_option_editor.cc:2398
-msgid ""
-"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
-"level for IEC1/Nordic, IEC2 PPM and VU meter."
-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:2404
-msgid "IEC1/DIN Meter line-up level; 0dBu"
-msgstr "Ausrichtung der IEC1/DIN Pegelanzeige; 0dBu"
-
-#: rc_option_editor.cc:2414
-msgid "Reference level for IEC1/DIN meter."
-msgstr "Referenzpegel für IEC1/DIN Pegelanzeige."
-
-#: rc_option_editor.cc:2420
-msgid "VU Meter standard"
-msgstr "Standard für VU-Pegelanzeige"
-
-#: rc_option_editor.cc:2425
-msgid "0VU = -2dBu (France)"
-msgstr "0VU = -2dBu (Frankreich)"
-
-#: rc_option_editor.cc:2426
-msgid "0VU = 0dBu (North America, Australia)"
-msgstr "0VU = 0dBu (Nordamerika, Australien)"
-
-#: rc_option_editor.cc:2427
-msgid "0VU = +4dBu (standard)"
-msgstr "0VU = +4dBu (Standard)"
-
-#: rc_option_editor.cc:2428
-msgid "0VU = +8dBu"
-msgstr "0VU = +8dBu"
-
-#: rc_option_editor.cc:2434
-msgid "Peak threshold [dBFS]"
-msgstr "Schwelle für Spitzenwert [dBFS]"
-
-#: rc_option_editor.cc:2442
-msgid ""
-"Specify the audio signal level in dbFS at and above which the meter-peak "
-"indicator will flash red."
-msgstr ""
-"Geben Sie den Signalpegel in dbFS an, bei dessen Erreichen oder "
-"Überschreitung die Spitzenwertanzeige in der Pegelanzeige rot blinkt"
-
-#: rc_option_editor.cc:2449
-msgid "LED meter style"
-msgstr "Pegelanzeigen im LED-Stil"
-
-#: rc_option_editor.cc:2457
-msgid "Theme"
-msgstr "Thema"
-
-#: region_editor.cc:79
-msgid "audition this region"
-msgstr "Diese Region vorhören"
-
-#: region_editor.cc:88 region_layering_order_editor.cc:75
-msgid "Position:"
-msgstr "Position:"
-
-#: region_editor.cc:90 add_video_dialog.cc:155
-msgid "End:"
-msgstr "Ende:"
-
-#: region_editor.cc:92 sfdb_ui.cc:145
-msgid "Length:"
-msgstr "Länge:"
-
-#: region_editor.cc:94
-msgid "Sync point (relative to region):"
-msgstr "Synchronisationspunkt (relativ zur Region)"
-
-#: region_editor.cc:96
-msgid "Sync point (absolute):"
-msgstr "Synchronisationspunkt (absolut)"
-
-#: region_editor.cc:98
-msgid "File start:"
-msgstr "Dateibeginn:"
-
-#: region_editor.cc:102
-msgid "Sources:"
-msgstr "Quellen:"
-
-#: region_editor.cc:104
-msgid "Source:"
-msgstr "Quelle:"
-
-#: region_editor.cc:166
-msgid "Region '%1'"
-msgstr "Region '%1'"
-
-#: region_editor.cc:273
-msgid "change region start position"
-msgstr "Startposition der Region ändern"
-
-#: region_editor.cc:289
-msgid "change region end position"
-msgstr "Endposition der Region ändern"
-
-#: region_editor.cc:309
-msgid "change region length"
-msgstr "Länge der Region verändern"
-
-#: region_editor.cc:403 region_editor.cc:415
-msgid "change region sync point"
-msgstr "Synchronisationspunkt der Region ändern"
-
-#: region_layering_order_editor.cc:42
-msgid "RegionLayeringOrderEditor"
-msgstr "RegionenEbenenOrdnungEditor"
-
-#: region_layering_order_editor.cc:55
-msgid "Region Name"
-msgstr "Name der Region"
-
-#: region_layering_order_editor.cc:72
-msgid "Track:"
-msgstr "Spur:"
-
-#: region_layering_order_editor.cc:104
-msgid "Choose Top Region"
-msgstr "Oberste Region auswählen"
-
-#: region_view.cc:277
-msgid "SilenceText"
-msgstr "StilleText"
-
-#: region_view.cc:292 region_view.cc:311
-msgid "minutes"
-msgstr "Minuten"
-
-#: region_view.cc:295 region_view.cc:314
-msgid "msecs"
-msgstr "ms"
-
-#: region_view.cc:298 region_view.cc:317
-msgid "secs"
-msgstr "s"
-
-#: region_view.cc:301
-msgid "%1 silent segment"
-msgid_plural "%1 silent segments"
-msgstr[0] "%1 stilles Segment"
-msgstr[1] "%1 stille Segmente"
-
-#: region_view.cc:303
-msgid "shortest = %1 %2"
-msgstr "kürzestes = %1 %2"
-
-#: region_view.cc:320
-msgid ""
-"\n"
-" (shortest audible segment = %1 %2)"
-msgstr ""
-"\n"
-" (kürzestes hörbares Segment = %1 %2)"
-
-#: return_ui.cc:102
-msgid "Return "
-msgstr "Return "
-
-#: rhythm_ferret.cc:48
-msgid "Percussive Onset"
-msgstr "Percussive Onset"
-
-#: rhythm_ferret.cc:49
-msgid "Note Onset"
-msgstr "Note Onset"
-
-#: rhythm_ferret.cc:54
-msgid "Energy Based"
-msgstr "Energy Based"
-
-#: rhythm_ferret.cc:55
-msgid "Spectral Difference"
-msgstr "Spectral Difference"
-
-#: rhythm_ferret.cc:56
-msgid "High-Frequency Content"
-msgstr "High-Frequency Content"
-
-#: rhythm_ferret.cc:57
-msgid "Complex Domain"
-msgstr "Complex Domain"
-
-#: rhythm_ferret.cc:58
-msgid "Phase Deviation"
-msgstr "Phasenabweichung"
-
-#: rhythm_ferret.cc:59
-msgid "Kullback-Liebler"
-msgstr "Kullback-Liebler"
-
-#: rhythm_ferret.cc:60
-msgid "Modified Kullback-Liebler"
-msgstr "Modified Kullback-Liebler"
-
-#: rhythm_ferret.cc:65
-msgid "Split region"
-msgstr "Region teilen"
-
-#: rhythm_ferret.cc:66
-msgid "Snap regions"
-msgstr "Regionen einrasten"
-
-#: rhythm_ferret.cc:67
-msgid "Conform regions"
-msgstr "Region angleichen"
-
-#: rhythm_ferret.cc:72
-msgid "Rhythm Ferret"
-msgstr "Rhythm Ferret"
-
-#: rhythm_ferret.cc:78
-msgid "Analyze"
-msgstr "Daten analysieren"
-
-#: rhythm_ferret.cc:113
-msgid "Detection function"
-msgstr "Erkennungsfunktion"
-
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "Mindestauslöseabstand"
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "Threshold"
-
-#: rhythm_ferret.cc:127
-msgid "Peak threshold"
-msgstr "Schwelle für Spitzenwert"
-
-#: rhythm_ferret.cc:132
-msgid "Silence threshold"
-msgstr "Silence threshold"
-
-#: rhythm_ferret.cc:137
-msgid "Sensitivity"
-msgstr "Empfindlichkeit"
-
-#: rhythm_ferret.cc:141
-msgid "Operation"
-msgstr "Aktionen"
-
-#: rhythm_ferret.cc:355
-msgid "split regions (rhythm ferret)"
-msgstr "Regionen teilen (rhythm ferret)"
-
-#: route_group_dialog.cc:42
-msgid "Track/bus Group"
-msgstr "Spur/Bus-Gruppe"
-
-#: route_group_dialog.cc:47
-msgid "Relative"
-msgstr "Relativ"
-
-#: route_group_dialog.cc:48
-msgid "Muting"
-msgstr "Muting"
-
-#: route_group_dialog.cc:50
-msgid "Record enable"
-msgstr "Aufnahmestatus"
-
-#: route_group_dialog.cc:52
-msgid "Active state"
-msgstr "Aktiv-Status"
-
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Farbe"
-
-#: route_group_dialog.cc:59
-msgid "RouteGroupDialog"
-msgstr "Bearbeitungsgruppendialog"
-
-#: route_group_dialog.cc:100
-msgid "<b>Sharing</b>"
-msgstr "<b>Geteilte Funktionen</b>"
-
-#: route_group_dialog.cc:200
-msgid "The group name is not unique. Please use a different name."
-msgstr ""
-"Der Gruppenname ist nicht einzigartig. Bitte benutzen Sie einen anderen "
-"Namen."
-
-#: route_params_ui.cc:84
-msgid "Tracks/Busses"
-msgstr "Spuren/Busse"
-
-#: route_params_ui.cc:103
-msgid "Inputs"
-msgstr "Eingänge"
-
-#: route_params_ui.cc:104
-msgid "Outputs"
-msgstr "Ausgänge"
-
-#: route_params_ui.cc:105
-msgid "Plugins, Inserts & Sends"
-msgstr "Plugins, Inserts & Sends"
-
-#: route_params_ui.cc:209
-msgid "route display list item for renamed route not found!"
-msgstr ""
-"Konnte Bezeichnung für umbenannten Verbindung nicht in der Liste der "
-"Verbindungen finden!"
-
-#: route_params_ui.cc:279 route_params_ui.cc:307
-#, c-format
-msgid "Playback delay: %<PRId64> samples"
-msgstr "Wiedergabeverzögerung: %<PRId64> Samples"
-
-#: route_params_ui.cc:499
-msgid "NO TRACK"
-msgstr "KEINE SPUR"
-
-#: route_params_ui.cc:637 route_params_ui.cc:638
-msgid "No Track or Bus Selected"
-msgstr "Keine Spuren oder Busse ausgewählt"
-
-#: route_time_axis.cc:103
-msgid "RTAV|G"
-msgstr "G"
-
-#: route_time_axis.cc:104
-msgid "RTAV|P"
-msgstr "P"
-
-#: route_time_axis.cc:105
-msgid "RTAV|A"
-msgstr "A"
-
-#: route_time_axis.cc:181
-msgid "Record (Right-click for Step Edit)"
-msgstr "Aufnahme (Rechtsklick für Step Entry)"
-
-#: route_time_axis.cc:184
-msgid "Record"
-msgstr "Aufnahme"
-
-#: route_time_axis.cc:254
-msgid "Route Group"
-msgstr "Bearbeitungsgruppe"
-
-#: route_time_axis.cc:264
-msgid "MIDI Controllers and Automation"
-msgstr "MIDI-Controller und Automation"
-
-#: route_time_axis.cc:495
-msgid "Show All Automation"
-msgstr "Alle Automationen anzeigen"
-
-#: route_time_axis.cc:498
-msgid "Show Existing Automation"
-msgstr "Genutzte Automationen zeigen"
-
-#: route_time_axis.cc:501
-msgid "Hide All Automation"
-msgstr "Alle Automationen verbergen"
-
-#: route_time_axis.cc:510
-msgid "Processor automation"
-msgstr "Prozessorautomation"
-
-#: route_time_axis.cc:517
-msgid "Fader"
-msgstr "Fader"
-
-#: route_time_axis.cc:535
-msgid "Pan"
-msgstr "Pan"
-
-#: route_time_axis.cc:626
-msgid "Overlaid"
-msgstr "Overlaid"
-
-#: route_time_axis.cc:632
-msgid "Stacked"
-msgstr "Stacked"
-
-#: route_time_axis.cc:640
-msgid "Layers"
-msgstr "Layers"
-
-#: route_time_axis.cc:709
-msgid "Automatic (based on I/O connections)"
-msgstr "Automatisch (auf den I/O Verbindungen basierend)"
-
-#: route_time_axis.cc:718
-msgid "(Currently: Existing Material)"
-msgstr "(Momentan: An vorhandenem Material ausrichten)"
-
-#: route_time_axis.cc:721
-msgid "(Currently: Capture Time)"
-msgstr "(Momentan: An Aufnahmezeit ausrichten)"
-
-#: route_time_axis.cc:729
-msgid "Align With Existing Material"
-msgstr "An vorhandenem Material ausrichten"
-
-#: route_time_axis.cc:734
-msgid "Align With Capture Time"
-msgstr "An Aufnahmezeit ausrichten"
-
-#: route_time_axis.cc:739
-msgid "Alignment"
-msgstr "Ausrichtung"
-
-#: route_time_axis.cc:774
-msgid "Normal Mode"
-msgstr "Normaler Modus"
-
-#: route_time_axis.cc:780
-msgid "Tape Mode"
-msgstr "Band-Modus"
-
-#: route_time_axis.cc:786
-msgid "Non-Layered Mode"
-msgstr "Non-Layered Mode"
-
-#: route_time_axis.cc:792
-msgid "Record Mode"
-msgstr "Aufnahmemodus"
-
-#: route_time_axis.cc:799 route_time_axis.cc:1785
-msgid "Playlist"
-msgstr "Wiedergabeliste"
-
-#: route_time_axis.cc:1093
-msgid "Rename Playlist"
-msgstr "Wiedergabeliste umbenennen"
-
-#: route_time_axis.cc:1094
-msgid "New name for playlist:"
-msgstr "Neuer Name für Wiedergabeliste:"
-
-#: route_time_axis.cc:1179
-msgid "New Copy Playlist"
-msgstr "Neue Kopie der Wiedergabeliste"
-
-#: route_time_axis.cc:1180 route_time_axis.cc:1233
-msgid "Name for new playlist:"
-msgstr "Name für die neue Wiedergabeliste:"
-
-#: route_time_axis.cc:1232
-msgid "New Playlist"
-msgstr "Neue Wiedergabeliste"
-
-#: route_time_axis.cc:1432
-msgid "You cannot create a track with that name as it is reserved for %1"
-msgstr ""
-"Sie können keine Spur mit einem Namen erstellen, der für %1 reserviert ist."
-
-#: route_time_axis.cc:1674
-msgid "New Copy..."
-msgstr "Neue Kopie..."
-
-#: route_time_axis.cc:1678
-msgid "New Take"
-msgstr "Neuer Take"
-
-#: route_time_axis.cc:1679
-msgid "Copy Take"
-msgstr "Take kopieren"
-
-#: route_time_axis.cc:1684
-msgid "Clear Current"
-msgstr "Aktuelle leeren"
-
-#: route_time_axis.cc:1687
-msgid "Select From All..."
-msgstr "Aus allen auswählen..."
-
-#: route_time_axis.cc:1775
-msgid "Take: %1.%2"
-msgstr "Take: %1.%2"
-
-#: route_time_axis.cc:2165 selection.cc:1007 selection.cc:1061
-msgid "programming error: "
-msgstr "Programmierfehler:"
-
-#: route_time_axis.cc:2581
-msgid "Underlays"
-msgstr "Darunterliegende"
-
-#: route_time_axis.cc:2584
-msgid "Remove \"%1\""
-msgstr "Lösche \"%1\""
-
-#: route_time_axis.cc:2634 route_time_axis.cc:2671
-msgid "programming error: underlay reference pointer pairs are inconsistent!"
-msgstr "programming error: underlay reference pointer pairs are inconsistent!"
-
-#: route_time_axis.cc:2698
-msgid "After-fade listen (AFL)"
-msgstr "After-Fader (AFL)"
-
-#: route_time_axis.cc:2702
-msgid "Pre-fade listen (PFL)"
-msgstr "Pre-Fader (PFL)"
-
-#: route_ui.cc:142
-msgid "Mute this track"
-msgstr "Diese Spur stummschalten"
-
-#: route_ui.cc:146
-msgid "Mute other (non-soloed) tracks"
-msgstr "Andere (nicht Solo-)Spuren stummschalten"
-
-#: route_ui.cc:153
-msgid "Enable recording on this track"
-msgstr "Aktiviere die Aufnahme auf dieser Spur"
-
-#: route_ui.cc:161
-msgid "make mixer strips show sends to this bus"
-msgstr "Kanalzüge zeigen Sends zu diesem Bus"
-
-#: route_ui.cc:166
-msgid "Monitor input"
-msgstr "Eingang abhören"
-
-#: route_ui.cc:172
-msgid "Monitor playback"
-msgstr "Vorhandenes Material abhören"
-
-#: route_ui.cc:679
-msgid "Not connected to AudioEngine - cannot engage record"
-msgstr "Nicht mit Audio-Engine verbunden - Aufnahme nicht möglich"
-
-#: route_ui.cc:878
-msgid "Step Entry"
-msgstr "Eingabemodus (Step Entry)"
-
-#: route_ui.cc:951
-msgid "Assign all tracks (prefader)"
-msgstr "Alle Audiospuren zuweisen (Pre-Fader)"
-
-#: route_ui.cc:955
-msgid "Assign all tracks and buses (prefader)"
-msgstr "Alle Audiospuren und Busse zuweisen (Pre-Fader)"
-
-#: route_ui.cc:959
-msgid "Assign all tracks (postfader)"
-msgstr "Alle Audiospuren zuweisen (Post-Fader)"
-
-#: route_ui.cc:963
-msgid "Assign all tracks and buses (postfader)"
-msgstr "Alle Audiospuren und Busse zuweisen (Post-Fader)"
-
-#: route_ui.cc:967
-msgid "Assign selected tracks (prefader)"
-msgstr "Ausgewählte Audiospuren zuweisen (Pre-Fader)"
-
-#: route_ui.cc:971
-msgid "Assign selected tracks and buses (prefader)"
-msgstr "Ausgewählte Audiospuren und Busse zuweisen (Pre-Fader)"
-
-#: route_ui.cc:974
-msgid "Assign selected tracks (postfader)"
-msgstr "Ausgewählte Audiospuren zuweisen (Post-Fader)"
-
-#: route_ui.cc:978
-msgid "Assign selected tracks and buses (postfader)"
-msgstr "Ausgewählte Audiospuren und Busse zuweisen (Post-Fader)"
-
-#: route_ui.cc:981
-msgid "Copy track/bus gains to sends"
-msgstr "Lautstärken der Spuren/Busse auf ihre Sends kopieren"
-
-#: route_ui.cc:982
-msgid "Set sends gain to -inf"
-msgstr "Setze Sends-Lautstärken to -inf"
-
-#: route_ui.cc:983
-msgid "Set sends gain to 0dB"
-msgstr "Setze Sends-Lautstärken to 0dB"
-
-#: route_ui.cc:1303
-msgid "Solo Isolate"
-msgstr "Isoliertes Solo"
-
-#: route_ui.cc:1310
-msgid "Solo Safe"
-msgstr "Solo sperren"
-
-#: route_ui.cc:1332
-msgid "Pre Fader Sends"
-msgstr "Pre-Fader Sends"
-
-#: route_ui.cc:1338
-msgid "Post Fader Sends"
-msgstr "Post-Fader Sends"
-
-#: route_ui.cc:1344
-msgid "Control Outs"
-msgstr "Vorhörausgang"
-
-#: route_ui.cc:1350
-msgid "Main Outs"
-msgstr "Hauptausgänge"
-
-#: route_ui.cc:1482
-msgid "Color Selection"
-msgstr "Farbauswahl"
-
-#: route_ui.cc:1547
-msgid ""
-"The use of colons (':') is discouraged in track and bus names.\n"
-"Do you want to use this new name?"
-msgstr ""
-"Die Verwendung von Doppelpunkten (':') in Spur- und Busnamen\n"
-"wird nicht empfohlen.\n"
-"Wollen Sie diesen neuen Namen verwenden?"
-
-#: route_ui.cc:1551
-msgid "Use the new name"
-msgstr "Neuen Namen verwenden"
-
-#: route_ui.cc:1552
-msgid "Re-edit the name"
-msgstr "Namen bearbeiten"
-
-#: route_ui.cc:1565
-msgid "Rename Track"
-msgstr "Spur umbenennen"
-
-#: route_ui.cc:1567
-msgid "Rename Bus"
-msgstr "Bus umbenennen"
-
-#: route_ui.cc:1635
-msgid ": comment editor"
-msgstr ": Kommentare bearbeiten"
-
-#: route_ui.cc:1801
-msgid " latency"
-msgstr " Latenz"
-
-#: route_ui.cc:1814
-msgid "Cannot create route template directory %1"
-msgstr "Kann das Vorlagenverzeichnis für Spuren/Busse %1 nicht erzeugen"
-
-#: route_ui.cc:1820
-msgid "Save As Template"
-msgstr "Als Vorlage speichern"
-
-#: route_ui.cc:1821
-msgid "Template name:"
-msgstr "Name der Vorlage:"
-
-#: route_ui.cc:1902
-msgid "Remote Control ID"
-msgstr "ID für Fernsteuerung"
-
-#: route_ui.cc:1912
-msgid "Remote control ID:"
-msgstr "ID für Fernsteuerung:"
-
-#: route_ui.cc:1926
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
-msgstr ""
-"Die Fernbedienungs-ID von %1 ist: %2\n"
-"\n"
-"\n"
-"Die Fernbedienungs-ID von %3 kann nicht geändert werden."
-
-#: route_ui.cc:1930
-msgid "the master bus"
-msgstr "der Master-Bus"
-
-#: route_ui.cc:1930
-msgid "the monitor bus"
-msgstr "der Monitor-Bus"
-
-#: route_ui.cc:1932
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
-msgstr ""
-"Die Fernbedienungs-ID von %5 ist: %2\n"
-"\n"
-"\n"
-"Fernbedienungs-IDs werden zur Zeit durch die Reihenfolge der Spuren/Busse in "
-"%6 bestimmt.\n"
-"\n"
-"%3Benutzen Sie den Reiter GUI im Fenster \"Einstellungen\", um dies zu ändern"
-"%4"
-
-#: route_ui.cc:1989
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
-"to show menu."
-msgstr ""
-"Linksklick, um die Phase von Kanal %1 zu invertieren. Rechtsklick zeigt das "
-"Menü."
-
-#: route_ui.cc:1991
-msgid "Click to show a menu of channels for inversion (phase reverse)"
-msgstr ""
-"Klicken, um ein Menü zum Invertieren der Kanäle (Phasendrehung) anzuzeigen"
-
-#: search_path_option.cc:35
-msgid "Select folder to search for media"
-msgstr "Verzeichnis zur Mediensuche auswählen"
-
-#: search_path_option.cc:44
-msgid "Click to add a new location"
-msgstr "Hier klicken, um einen Pfad hinzuzufügen"
-
-#: search_path_option.cc:51
-msgid "the session folder"
-msgstr "Projektordner"
-
-#: send_ui.cc:134
-msgid "Send "
-msgstr "Send "
-
-#: session_dialog.cc:61
-msgid "Session Setup"
-msgstr "Projekteinrichtung"
-
-#: session_dialog.cc:66
-msgid "Advanced options ..."
-msgstr "Erweiterte Einstellungen..."
-
-#: session_dialog.cc:263
-msgid "New Session"
-msgstr "Neues Projekt"
-
-#: session_dialog.cc:301
-msgid "Check the website for more..."
-msgstr "Informieren Sie sich auf der Webseite weiter..."
-
-#: session_dialog.cc:304
-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:324
-msgid "Sample Rate"
-msgstr "Samplerate"
-
-#: session_dialog.cc:325
-msgid "Disk Format"
-msgstr "Dateiformat"
-
-#: session_dialog.cc:343
-msgid "Select session file"
-msgstr "Projektdatei auswählen"
-
-#: session_dialog.cc:358
-msgid "Other Sessions"
-msgstr "Andere Projekte"
-
-#: session_dialog.cc:384
-msgid "Open"
-msgstr "Öffnen"
-
-#: session_dialog.cc:451
-msgid "Session name:"
-msgstr "Projektname:"
-
-#: session_dialog.cc:473
-msgid "Create session folder in:"
-msgstr "Ort des Projektverzeichnisses:"
-
-#: session_dialog.cc:496
-msgid "Select folder for session"
-msgstr "Ordner für Projekt wählen"
-
-#: session_dialog.cc:525
-msgid "Use this template"
-msgstr "Diese Vorlage verwenden"
-
-#: session_dialog.cc:528
-msgid "no template"
-msgstr "keine Vorlage"
-
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
-msgstr "32 Bit float"
-
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
-msgstr "24 Bit"
-
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
-msgstr "16 Bit"
-
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
-msgid "channels"
-msgstr "Kanäle"
-
-#: session_dialog.cc:763
-msgid "<b>Busses</b>"
-msgstr "<b>Busse</b>"
-
-#: session_dialog.cc:764
-msgid "<b>Inputs</b>"
-msgstr "<b>Eingänge</b>"
-
-#: session_dialog.cc:765
-msgid "<b>Outputs</b>"
-msgstr "<b>Ausgänge</b>"
-
-#: session_dialog.cc:773
-msgid "Create master bus"
-msgstr "Master-Bus erstellen"
-
-#: session_dialog.cc:783
-msgid "Automatically connect to physical inputs"
-msgstr "Automatisch mit Audioeingängen verbinden"
-
-#: session_dialog.cc:790 session_dialog.cc:849
-msgid "Use only"
-msgstr "Benutze nur"
-
-#: session_dialog.cc:843
-msgid "Automatically connect outputs"
-msgstr "Ausgänge automatisch verbinden"
-
-#: session_dialog.cc:865
-msgid "... to master bus"
-msgstr "... mit dem Master-Bus"
-
-#: session_dialog.cc:875
-msgid "... to physical outputs"
-msgstr "... mit den Audioausgängen"
-
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr "Aus Projekt importieren"
-
-#: session_import_dialog.cc:74
-msgid "Elements"
-msgstr "Elemente"
-
-#: session_import_dialog.cc:111
-msgid "Cannot load XML for session from %1"
-msgstr "Konnte XML für das Projekt von %1 nicht laden"
-
-#: session_import_dialog.cc:128 session_import_dialog.cc:212
-msgid "Some elements had errors in them. Please see the log for details"
-msgstr ""
-"Einige Elemente beinhalteten Fehler. Für Einzelheiten lesen Sie bitte das Log"
-
-#: session_import_dialog.cc:164
-msgid "Import from session"
-msgstr "Aus Projekt importieren"
-
-#: session_import_dialog.cc:228
-msgid "This will select all elements of this type!"
-msgstr "Dies wird alle Elemente dieses Typs auswählen!"
-
-#: session_metadata_dialog.cc:285
-msgid "EAN Check digit OK"
-msgstr "EAN Prüfziffer OK"
-
-#: session_metadata_dialog.cc:289
-msgid "EAN Check digit error"
-msgstr "EAN Prüfziffernfehler"
-
-#: session_metadata_dialog.cc:289
-msgid "expected"
-msgstr "erwartet"
-
-#: session_metadata_dialog.cc:294
-msgid "EAN Length error"
-msgstr "EAN Längenfehler"
-
-#: session_metadata_dialog.cc:423
-msgid "Field"
-msgstr "Feld"
-
-#: session_metadata_dialog.cc:427
-msgid "Values (current value on top)"
-msgstr "Werte (aktueller oben)"
-
-#: session_metadata_dialog.cc:641
-msgid "User"
-msgstr "Benutzer"
-
-#: session_metadata_dialog.cc:649
-msgid "Email"
-msgstr "E-Mail"
-
-#: session_metadata_dialog.cc:652
-msgid "Web"
-msgstr "Web"
-
-#: session_metadata_dialog.cc:655
-msgid "Organization"
-msgstr "Organisation"
-
-#: session_metadata_dialog.cc:658
-msgid "Country"
-msgstr "Land"
-
-#: session_metadata_dialog.cc:672
-msgid "Title"
-msgstr "Titel"
-
-#: session_metadata_dialog.cc:675
-msgid "Track Number"
-msgstr "Liednummer"
-
-#: session_metadata_dialog.cc:678
-msgid "Subtitle"
-msgstr "Untertitel"
-
-#: session_metadata_dialog.cc:681
-msgid "Grouping"
-msgstr "Gruppierung"
-
-#: session_metadata_dialog.cc:684
-msgid "Artist"
-msgstr "Künstler"
-
-#: session_metadata_dialog.cc:687
-msgid "Genre"
-msgstr "Genre"
-
-#: session_metadata_dialog.cc:690
-msgid "Comment"
-msgstr "Kommentar"
-
-#: session_metadata_dialog.cc:693
-msgid "Copyright"
-msgstr "Copyright"
-
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
-msgid "Album"
-msgstr "Album"
-
-#: session_metadata_dialog.cc:709
-msgid "Year"
-msgstr "Jahr"
-
-#: session_metadata_dialog.cc:712
-msgid "Album Artist"
-msgstr "Albumkünstler"
-
-#: session_metadata_dialog.cc:715
-msgid "Total Tracks"
-msgstr "Spuranzahl"
-
-#: session_metadata_dialog.cc:718
-msgid "Disc Subtitle"
-msgstr "CD-Untertitel"
-
-#: session_metadata_dialog.cc:721
-msgid "Disc Number"
-msgstr "CD-Nummer"
-
-#: session_metadata_dialog.cc:724
-msgid "Total Discs"
-msgstr "CDs insgesamt"
-
-#: session_metadata_dialog.cc:727
-msgid "Compilation"
-msgstr "Compilation"
-
-#: session_metadata_dialog.cc:730
-msgid "ISRC"
-msgstr "ISRC"
-
-#: session_metadata_dialog.cc:733
-msgid "EAN barcode"
-msgstr "EAN Strichcode"
-
-#: session_metadata_dialog.cc:746
-msgid "People"
-msgstr "Mitwirkenden"
-
-#: session_metadata_dialog.cc:751
-msgid "Lyricist"
-msgstr "Texter"
-
-#: session_metadata_dialog.cc:754
-msgid "Composer"
-msgstr "Komponist"
-
-#: session_metadata_dialog.cc:757
-msgid "Conductor"
-msgstr "Leiter"
-
-#: session_metadata_dialog.cc:760
-msgid "Remixer"
-msgstr "Remixer"
-
-#: session_metadata_dialog.cc:763
-msgid "Arranger"
-msgstr "Arranger"
-
-#: session_metadata_dialog.cc:766
-msgid "Engineer"
-msgstr "Bearbeiter"
-
-#: session_metadata_dialog.cc:769
-msgid "Producer"
-msgstr "Produzent"
-
-#: session_metadata_dialog.cc:772
-msgid "DJ Mixer"
-msgstr "DJ Mixer"
-
-#: session_metadata_dialog.cc:775
-msgid "Metadata|Mixer"
-msgstr "Mixer"
-
-#: session_metadata_dialog.cc:783
-msgid "School"
-msgstr "Schule"
-
-#: session_metadata_dialog.cc:788
-msgid "Instructor"
-msgstr "Lehrender"
-
-#: session_metadata_dialog.cc:791
-msgid "Course"
-msgstr "Kurs"
-
-#: session_metadata_dialog.cc:799
-msgid "Edit Session Metadata"
-msgstr "Projekt-Metadaten bearbeiten"
-
-#: session_metadata_dialog.cc:830
-msgid "Import session metadata"
-msgstr "Projekt-Metadaten importieren"
-
-#: session_metadata_dialog.cc:851
-msgid "Choose session to import metadata from"
-msgstr "Wählen Sie das Projekt, aus dem Metadaten importiert werden sollen"
-
-#: session_metadata_dialog.cc:889
-msgid "This session file could not be read!"
-msgstr "Diese Projektdatei konnte nicht gelesen werden!"
-
-#: session_metadata_dialog.cc:899
-msgid ""
-"The session file didn't contain metadata!\n"
-"Maybe this is an old session format?"
-msgstr ""
-"Das Projekt enthält keine Metadaten!\n"
-"Eventuell ein altes Projektformat?"
-
-#: session_metadata_dialog.cc:918
-msgid "Import all from:"
-msgstr "Alles importieren von:"
-
-#: session_option_editor.cc:32
-msgid "Session Properties"
-msgstr "Projekteinstellungen"
-
-#: session_option_editor.cc:41
-msgid "Timecode Settings"
-msgstr "Timecode Einstellungen"
-
-#: session_option_editor.cc:45
-msgid "Timecode frames-per-second"
-msgstr "Timecode frames-per-second"
-
-#: session_option_editor.cc:50
-msgid "23.976"
-msgstr "23,976"
-
-#: session_option_editor.cc:51
-msgid "24"
-msgstr "24"
-
-#: session_option_editor.cc:52
-msgid "24.975"
-msgstr "24,976"
-
-#: session_option_editor.cc:53
-msgid "25"
-msgstr "25"
-
-#: session_option_editor.cc:54
-msgid "29.97"
-msgstr "29,97"
-
-#: session_option_editor.cc:55
-msgid "29.97 drop"
-msgstr "29,97 (drop)"
-
-#: session_option_editor.cc:56
-msgid "30"
-msgstr "30"
-
-#: session_option_editor.cc:57
-msgid "30 drop"
-msgstr "30 (drop)"
-
-#: session_option_editor.cc:58
-msgid "59.94"
-msgstr "59,94"
-
-#: session_option_editor.cc:59
-msgid "60"
-msgstr "60"
-
-#: session_option_editor.cc:65
-msgid "Pull-up / pull-down"
-msgstr "Pull-Up / Pull-Down"
-
-#: session_option_editor.cc:70
-msgid "4.1667 + 0.1%"
-msgstr "+4,1667 + 0,1%"
-
-#: session_option_editor.cc:71
-msgid "4.1667"
-msgstr "+4,1667"
-
-#: session_option_editor.cc:72
-msgid "4.1667 - 0.1%"
-msgstr "+4,1667 - 0,1%"
-
-#: session_option_editor.cc:73
-msgid "0.1"
-msgstr "0,1"
-
-#: session_option_editor.cc:74
-msgid "none"
-msgstr "keine"
-
-#: session_option_editor.cc:75
-msgid "-0.1"
-msgstr "-0,1"
-
-#: session_option_editor.cc:76
-msgid "-4.1667 + 0.1%"
-msgstr "-4,1667% + 0,1%"
-
-#: session_option_editor.cc:77
-msgid "-4.1667"
-msgstr "-4,1667"
-
-#: session_option_editor.cc:78
-msgid "-4.1667 - 0.1%"
-msgstr "-4,1667 - 0,1%"
-
-#: session_option_editor.cc:84
-msgid ""
-"Use Video File's FPS Instead of Timecode Value for Timeline and Video "
-"Monitor."
-msgstr ""
-"Benutze FPS aus Videodatei statt des Timecode-Wertes für Zeitleiste und "
-"Videomonitor."
-
-#: session_option_editor.cc:91
-msgid ""
-"Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless using JACK-"
-"sync)."
-msgstr ""
-"Pull-Up/Down auf Video-Zeitleiste und Videomonitor anwenden (außer wenn JACK "
-"Sync verwendet wird)."
-
-#: session_option_editor.cc:96
-msgid "Ext Timecode Offsets"
-msgstr "Ext. Timecode Offsets"
-
-#: session_option_editor.cc:100
-msgid "Slave Timecode offset"
-msgstr "Slave Timecode Offset"
-
-#: session_option_editor.cc:107
-msgid "The specified offset is added to the received timecode (MTC or LTC)."
-msgstr ""
-"Der angegebene Offset wird dem empfangenen Timecode hinzuaddiert (MTC oder "
-"LTC)."
-
-#: session_option_editor.cc:113
-msgid "Timecode Generator offset"
-msgstr "Timecode-Generator Offset"
-
-#: session_option_editor.cc:120
-msgid ""
-"Specify an offset which is added to the generated timecode (so far only LTC)."
-msgstr ""
-"Geben Sie einen Offset an, der dem generierten Timecode hinzuaddiert wird "
-"(derzeit nur LTC)."
-
-#: session_option_editor.cc:124
-msgid "JACK Transport/Time Settings"
-msgstr "JACK Transport/Time Einstellungen"
-
-#: session_option_editor.cc:128
-msgid ""
-"%1 is JACK Time Master (provides Bar|Beat|Tick and other information to JACK)"
-msgstr ""
-"%1 ist JACK Time Master (übergibt Takt|Schlag|Tick und andere Information an "
-"JACK)"
-
-#: session_option_editor.cc:136
-msgid "destructive-xfade-seconds"
-msgstr "destruktive Xfade-Sekunden"
-
-#: session_option_editor.cc:137
-msgid "Destructive crossfade length"
-msgstr "Länge für destruktive Crossfades"
-
-#: session_option_editor.cc:146
-msgid "Region fades active"
-msgstr "Regionen Fade-Ins/Fade-Outs sind aktiv"
-
-#: session_option_editor.cc:153
-msgid "Region fades visible"
-msgstr "Regionen Fade-Ins/Fade-Outs sind sichtbar"
-
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
-msgid "Media"
-msgstr "Medien"
-
-#: session_option_editor.cc:160
-msgid "Audio file format"
-msgstr "Audio-Dateiformat"
-
-#: session_option_editor.cc:164
-msgid "Sample format"
-msgstr "Sampleformat"
-
-#: session_option_editor.cc:169
-msgid "32-bit floating point"
-msgstr "32-bit floating point"
-
-#: session_option_editor.cc:170
-msgid "24-bit integer"
-msgstr "24-bit integer"
-
-#: session_option_editor.cc:171
-msgid "16-bit integer"
-msgstr "16-bit integer"
-
-#: session_option_editor.cc:177
-msgid "File type"
-msgstr "Dateiformat"
-
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
-msgstr "Broadcast WAVE"
-
-#: session_option_editor.cc:183
-msgid "WAVE"
-msgstr "WAVE"
-
-#: session_option_editor.cc:184
-msgid "WAVE-64"
-msgstr "WAVE-64"
-
-#: session_option_editor.cc:189
-msgid "File locations"
-msgstr "Dateipfade"
-
-#: session_option_editor.cc:191
-msgid "Search for audio files in:"
-msgstr "Suche hier nach Audiodateien:"
-
-#: session_option_editor.cc:197
-msgid "Search for MIDI files in:"
-msgstr "Suche hier nach MIDI-Dateien:"
-
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
-msgid "Filenames"
-msgstr "Dateinamen"
-
-#: session_option_editor.cc:206
-msgid "File Naming"
-msgstr "Dateibenennung"
-
-#: session_option_editor.cc:212
-msgid "Prefix Track number"
-msgstr "Füge Spurnummer vorne ein"
-
-#: session_option_editor.cc:217
-msgid ""
-"Adds the current track number to the beginning of the recorded file name."
-msgstr ""
-"Fügt die momentane Spurnummer am Beginn des Dateinamens der Aufnahme hinzu."
-
-#: session_option_editor.cc:222
-msgid "Prefix Take Name"
-msgstr "Füge Takenamen vorne ein"
-
-#: session_option_editor.cc:227
-msgid "Adds the Take Name to the beginning of the recorded file name."
-msgstr "Fügt den Take-Namen am Beginn des Dateinamens der Aufnahme hinzu."
-
-#: session_option_editor.cc:232
-msgid "Take Name"
-msgstr "Name übernehmen"
-
-#: session_option_editor.cc:245
-msgid ""
-"Track Input Monitoring automatically follows transport state (\"auto-input\")"
-msgstr ""
-"Spur-Eingangs-Monitoring folgt automatisch dem Transportstatus (\"auto-input"
-"\")"
-
-#: session_option_editor.cc:252
-msgid "Use monitor section in this session"
-msgstr "In diesem Projekt eine Monitorsektion verwenden"
-
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
-msgid "Meterbridge"
-msgstr "Meterbridge"
-
-#: session_option_editor.cc:257
-msgid "Route Display"
-msgstr "Routenanzeige"
-
-#: session_option_editor.cc:261
-msgid "Show Midi Tracks"
-msgstr "Zeige MIDI-Spuren"
-
-#: session_option_editor.cc:268
-msgid "Show Busses"
-msgstr "Zeige Busse"
-
-#: session_option_editor.cc:275
-msgid "Include Master Bus"
-msgstr "Zeige Master-Bus"
-
-#: session_option_editor.cc:280
-msgid "Button Area"
-msgstr "Schaltflächenbereich"
-
-#: session_option_editor.cc:284
-msgid "Rec-enable Button"
-msgstr "Schaltfläche für Aufnahmebereitschaft"
-
-#: session_option_editor.cc:291
-msgid "Mute Button"
-msgstr "Schaltfläche für Stummschaltung"
-
-#: session_option_editor.cc:298
-msgid "Solo Button"
-msgstr "Schaltfläche für Solostatus"
-
-#: session_option_editor.cc:305
-msgid "Monitor Buttons"
-msgstr "Monitor-Knöpfe"
-
-#: session_option_editor.cc:310
-msgid "Name Labels"
-msgstr "Namensfelder"
-
-#: session_option_editor.cc:314
-msgid "Track Name"
-msgstr "Spurname"
-
-#: session_option_editor.cc:325
-msgid "MIDI region copies are independent"
-msgstr "Kopien von MIDI Regionen sind unabhängig"
-
-#: session_option_editor.cc:332
-msgid ""
-"Policy for handling overlapping notes\n"
-" on the same MIDI channel"
-msgstr ""
-"Vorgehen bei überlappenden Noten\n"
-"am selben MIDI-Kanal"
-
-#: session_option_editor.cc:337
-msgid "never allow them"
-msgstr "Niemals erlauben"
-
-#: session_option_editor.cc:338
-msgid "don't do anything in particular"
-msgstr "Nichts bestimmtes tun"
-
-#: session_option_editor.cc:339
-msgid "replace any overlapped existing note"
-msgstr "Überlagerte Note ersetzen"
-
-#: session_option_editor.cc:340
-msgid "shorten the overlapped existing note"
-msgstr "Überlagerte Note kürzen"
-
-#: session_option_editor.cc:341
-msgid "shorten the overlapping new note"
-msgstr "Die überlagernde neue Note kürzen"
-
-#: session_option_editor.cc:342
-msgid "replace both overlapping notes with a single note"
-msgstr "Überlagernde Note mit einer einzelnen ersetzen"
-
-#: session_option_editor.cc:346
-msgid "Glue to bars and beats"
-msgstr "An Takte und Schläge binden"
-
-#: session_option_editor.cc:350
-msgid "Glue new markers to bars and beats"
-msgstr "Neue Marker an Takte und Schläge binden"
-
-#: session_option_editor.cc:357
-msgid "Glue new regions to bars and beats"
-msgstr "Neue Regionen an Takte und Schläge binden"
-
-#: session_option_editor.cc:362
-msgid "Defaults"
-msgstr "Voreinstellungen"
-
-#: session_option_editor.cc:364
-msgid "Use these settings as defaults"
-msgstr "Diese Einstellungen als Voreinstellungen nehmen"
-
-#: sfdb_ui.cc:90 sfdb_ui.cc:110 sfdb_ui.cc:119
-msgid "as new tracks"
-msgstr "als neue Spuren"
-
-#: sfdb_ui.cc:92 sfdb_ui.cc:112
-msgid "to selected tracks"
-msgstr "zu ausgewählten Spuren"
-
-#: sfdb_ui.cc:94 sfdb_ui.cc:114
-msgid "to region list"
-msgstr "zur Liste der Regionen"
-
-#: sfdb_ui.cc:96 sfdb_ui.cc:116
-msgid "as new tape tracks"
-msgstr "als neue Band-Spuren"
-
-#: sfdb_ui.cc:100
-msgid "programming error: unknown import mode string %1"
-msgstr "Programmierfehler: unbekannter Importmodus %1"
-
-#: sfdb_ui.cc:127
-msgid "Auto-play"
-msgstr "Auto-Play"
-
-#: sfdb_ui.cc:135 sfdb_ui.cc:324
-msgid "<b>Sound File Information</b>"
-msgstr "<b>Eigenschaften der Audiodatei</b>"
-
-#: sfdb_ui.cc:147
-msgid "Timestamp:"
-msgstr "Zeitstempel:"
-
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Format:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
-msgid "Tags:"
-msgstr "Stichworte:"
-
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Konnte Datei nicht lesen: %1 (%2)."
-
-#: sfdb_ui.cc:297
-msgid "<b>Midi File Information</b>"
-msgstr "<b>Midi Datei Information</b>"
-
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Konnte auf Audiodatei nicht zugreifen: "
-
-#: sfdb_ui.cc:530
-msgid "SoundFileBox: Could not tokenize string: "
-msgstr "SoundFileBox: Konnte Zeichenkette nicht zerlegen: "
-
-#: sfdb_ui.cc:550 sfdb_ui.cc:552
-msgid "Search"
-msgstr "Suchen"
-
-#: sfdb_ui.cc:576
-msgid "Audio and MIDI files"
-msgstr "Audio- und MIDIdateien"
-
-#: sfdb_ui.cc:579
-msgid "Audio files"
-msgstr "Audiodateien"
-
-#: sfdb_ui.cc:582
-msgid "MIDI files"
-msgstr "MIDI-Dateien"
-
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
-msgid "All files"
-msgstr "Alle Dateien"
-
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
-msgid "Browse Files"
-msgstr "Durchsuchen"
-
-#: sfdb_ui.cc:633
-msgid "Paths"
-msgstr "Pfade"
-
-#: sfdb_ui.cc:642
-msgid "Search Tags"
-msgstr "Stichwortsuche"
-
-#: sfdb_ui.cc:658
-msgid "Sort:"
-msgstr "Sortierung:"
-
-#: sfdb_ui.cc:666
-msgid "Longest"
-msgstr "Längste"
-
-#: sfdb_ui.cc:667
-msgid "Shortest"
-msgstr "Kürzeste"
-
-#: sfdb_ui.cc:668
-msgid "Newest"
-msgstr "Neueste"
-
-#: sfdb_ui.cc:669
-msgid "Oldest"
-msgstr "Ältestes"
-
-#: sfdb_ui.cc:670
-msgid "Most downloaded"
-msgstr "Am häufigsten heruntergeladen"
-
-#: sfdb_ui.cc:671
-msgid "Least downloaded"
-msgstr "Am seltensten heruntergeladen"
-
-#: sfdb_ui.cc:672
-msgid "Highest rated"
-msgstr "Bestbewertetes"
-
-#: sfdb_ui.cc:673
-msgid "Lowest rated"
-msgstr "Am schlechtesten bewertetes"
-
-#: sfdb_ui.cc:678
-msgid "More"
-msgstr "Mehr"
-
-#: sfdb_ui.cc:682
-msgid "Similar"
-msgstr "Ähnlich"
-
-#: sfdb_ui.cc:694
-msgid "ID"
-msgstr "ID"
-
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
-msgid "Filename"
-msgstr "Dateiname"
-
-#: sfdb_ui.cc:697
-msgid "Duration"
-msgstr "Dauer"
-
-#: sfdb_ui.cc:698
-msgid "Size"
-msgstr "Größe"
-
-#: sfdb_ui.cc:699
-msgid "Samplerate"
-msgstr "Samplerate"
-
-#: sfdb_ui.cc:700
-msgid "License"
-msgstr "Lizenz"
-
-#: sfdb_ui.cc:718
-msgid "Search Freesound"
-msgstr "Freesound durchsuchen"
-
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
-msgstr ""
-"Drücken Sie hier, um die angewählten Dateien zu importieren und dieses "
-"Fenster zu schließen"
-
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr ""
-"Drücken Sie hier, um die angewählten Dateien zu importieren und dieses "
-"Fenster offen zu lassen"
-
-#: sfdb_ui.cc:740
-msgid "Press to close this window without importing any files"
-msgstr ""
-"Drücken Sie hier, um dieses Fenster zu schließen, ohne Dateien zu importieren"
-
-#: sfdb_ui.cc:936
-msgid "SoundFileBrowser: Could not tokenize string: "
-msgstr "SoundFileBrowser: Konnte Zeichenkete nicht zerlegen:"
-
-#: sfdb_ui.cc:1136
-msgid "%1 more page of 100 results available"
-msgid_plural "%1 more pages of 100 results available"
-msgstr[0] "%1 weitere Seite von 100 Ergebnissen verfügbar"
-msgstr[1] "%1 weitere Seiten von 100 Ergebnissen verfügbar"
-
-#: sfdb_ui.cc:1141
-msgid "No more results available"
-msgstr "Keine weiteren Ergebnisse verfügbar"
-
-#: sfdb_ui.cc:1205
-msgid "B"
-msgstr "B"
-
-#: sfdb_ui.cc:1207
-msgid "kB"
-msgstr "kB"
-
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
-msgid "MB"
-msgstr "MB"
-
-#: sfdb_ui.cc:1213
-msgid "GB"
-msgstr "GB"
-
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
-msgid "one track per file"
-msgstr "eine Spur pro Datei"
-
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
-msgid "one track per channel"
-msgstr "eine Spur pro Kanal"
-
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
-msgid "sequence files"
-msgstr "Dateien aneinanderreihen"
-
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
-msgid "all files in one track"
-msgstr "Alle Dateien in eine Spur"
-
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
-msgid "merge files"
-msgstr "Dateien zusammenfügen"
-
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
-msgid "one region per file"
-msgstr "eine Region pro Datei"
-
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
-msgid "one region per channel"
-msgstr "eine Region pro Kanal"
-
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
-msgid "all files in one region"
-msgstr "alle Dateien in einer Region"
-
-#: sfdb_ui.cc:1521
-msgid ""
-"One or more of the selected files\n"
-"cannot be used by %1"
-msgstr ""
-"Eine oder mehrere der ausgewählten Dateien\n"
-"können von %1 nicht verwendet werden"
-
-#: sfdb_ui.cc:1665
-msgid "Copy files to session"
-msgstr "Kopiere Dateien in Projekt"
-
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
-msgid "file timestamp"
-msgstr "Zeitstempel"
-
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
-msgid "edit point"
-msgstr "Arbeitspunkt"
-
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
-msgid "playhead"
-msgstr "Positionszeiger"
-
-#: sfdb_ui.cc:1685
-msgid "session start"
-msgstr "Projektanfang"
-
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
-msgstr "<b>Füge Dateien hinzu als...</b>"
-
-#: sfdb_ui.cc:1713
-msgid "<b>Insert at</b>"
-msgstr "<b>Einfügen bei</b>"
-
-#: sfdb_ui.cc:1726
-msgid "<b>Mapping</b>"
-msgstr "<b>Zuordnung</b>"
-
-#: sfdb_ui.cc:1744
-msgid "<b>Conversion quality</b>"
-msgstr "<b>Konvertierungsqualität:</b>"
-
-#: sfdb_ui.cc:1756
-msgid "<b>Instrument</b>"
-msgstr "<b>Instrument</b>"
-
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
-msgid "Best"
-msgstr "bestmöglich"
-
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
-msgid "Good"
-msgstr "gut"
-
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
-msgid "Quick"
-msgstr "schnell"
-
-#: sfdb_ui.cc:1772
-msgid "Fastest"
-msgstr "Schnellstmöglich"
-
-#: shuttle_control.cc:56
-msgid "Shuttle speed control (Context-click for options)"
-msgstr "Abspielgeschwindigkeit (Rechtsklick für Optionen)"
-
-#: shuttle_control.cc:174
-msgid "Percent"
-msgstr "Prozent"
-
-#: shuttle_control.cc:182
-msgid "Units"
-msgstr "Einheiten"
-
-#: shuttle_control.cc:188 shuttle_control.cc:609
-msgid "Sprung"
-msgstr "Feder"
-
-#: shuttle_control.cc:192 shuttle_control.cc:612
-msgid "Wheel"
-msgstr "Drehrad"
-
-#: shuttle_control.cc:226
-msgid "Maximum speed"
-msgstr "Max. Geschwindigkeit"
-
-#: shuttle_control.cc:568
-msgid "Playing"
-msgstr "Wiedergabe"
-
-#: shuttle_control.cc:583
-#, c-format
-msgid "<<< %+d semitones"
-msgstr "<<< %+d Halbtöne"
-
-#: shuttle_control.cc:585
-#, c-format
-msgid ">>> %+d semitones"
-msgstr ">>> %+d Halbtöne"
-
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr "Gestoppt"
-
-#: soundcloud_export_selector.cc:44
-msgid "User Email"
-msgstr "Benutzer Email"
-
-#: soundcloud_export_selector.cc:45
-msgid "Password"
-msgstr "Passwort"
-
-#: soundcloud_export_selector.cc:46
-msgid "Make files public"
-msgstr "Dateien öffentlich machen"
-
-#: soundcloud_export_selector.cc:47
-msgid "Open uploaded files in browser"
-msgstr "Hochgeladene Dateien in Browser öffnen"
-
-#: soundcloud_export_selector.cc:48
-msgid "Make files downloadable"
-msgstr "Dateien herunterladbar machen"
-
-#: soundcloud_export_selector.cc:107
-msgid "%1: %2 of %3 bytes uploaded"
-msgstr "%1: %2 von %3 bytes hochgeladen"
-
-#: splash.cc:73
-msgid "%1 loading ..."
-msgstr "%1 startet ..."
-
-#: speaker_dialog.cc:40
-msgid "Add Speaker"
-msgstr "Lautsprecher hinzufügen"
-
-#: speaker_dialog.cc:41
-msgid "Remove Speaker"
-msgstr "Lautsprecher entfernen"
-
-#: speaker_dialog.cc:63
-msgid "Azimuth:"
-msgstr "Azimut:"
-
-#: startup.cc:67
-msgid ""
-"Use an external mixer or the hardware mixer of your audio interface.\n"
-"%1 will play NO role in monitoring"
-msgstr ""
-"Verwende einen externen Mixer oder den Hardwaremixer der Audiohardware.\n"
-"%1 wird das Monitoring NICHT übernehmen."
-
-#: startup.cc:69
-msgid "Ask %1 to play back material as it is being recorded"
-msgstr "%1 soll laufende Aufnahmen wiedergeben"
-
-#: startup.cc:142
-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 "
-"video soundtracks, or experiment with new ideas about music and sound. \n"
-"\n"
-"There are a few things that need to be configured before you start using the "
-"program.</span> "
-msgstr ""
-"<span size=\"larger\">%1 ist eine Digital Audio Workstation (DAW). Sie "
-"können damit Mehrspuraufnahmen aufnehmen, editieren und mischen. Sie können "
-"Ihre eigenen CDs produzieren, Video Soundtracks mischen oder einfach mit "
-"neuen Musik- und Klangideen experimentieren.\n"
-"\n"
-"Es gibt ein paar Dinge, die vor dem ersten Programmstart konfiguriert werden "
-"müssen.</span>"
-
-#: startup.cc:168
-msgid "Welcome to %1"
-msgstr "Willkommen bei %1"
-
-#: startup.cc:191
-msgid "Default folder for %1 sessions"
-msgstr "Standardordner für %1 Projekte"
-
-#: startup.cc:197
-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"
-"\n"
-"Where would you like new %1 sessions to be stored by default?\n"
-"\n"
-"<i>(You can put new sessions anywhere, this is just a default)</i>"
-msgstr ""
-"Jedes Projekt in %1 hat seinen eigenen Ordner.\n"
-"Diese Ordner können sehr groß werden, wenn Sie aufnehmen.\n"
-"\n"
-"Wo soll %1 neue Projekte standardmäßig abspeichern?\n"
-"\n"
-"<i>(Neue Projekte können überall abgespeichert werden, dies ist nur die "
-"Vorgabe)</i>"
-
-#: startup.cc:220
-msgid "Default folder for new sessions"
-msgstr "Standardordner für neue Projekte"
-
-#: startup.cc:241
-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"
-"different ways to do this depending on the equipment you have and the\n"
-"configuration of that equipment. The two most common are presented here.\n"
-"Please choose whichever one is right for your setup.\n"
-"\n"
-"<i>(You can change this preference at any time, via the Preferences dialog)</"
-"i>\n"
-"\n"
-"<i>If you do not understand what this is about, just accept the default.</i>"
-msgstr ""
-"Während der Aufnahme von Instrumenten oder Gesang soll das Signal\n"
-"wahrscheinlich gleichzeitig abgehört und aufgenommen werden.\n"
-"Dies wird \"Monitoring\" genannt. Ausgehend von Ihrer\n"
-"Hardware gibt es verschiedenen Möglichkeiten hierfür.\n"
-"Die zwei meistgenutzten stehen hier zur Auswahl.\n"
-"Bitte wählen Sie, welche Konfiguration Ihren Wünschen entspricht.\n"
-"\n"
-"<i>(Diese Einstellung kann jederzeit über die globalen Einstellungen "
-"geändert werden)</i> \n"
-"\n"
-"<i>Im Zweifelsfall akzeptieren Sie einfach die Voreinstellung.</i>"
-
-#: startup.cc:262
-msgid "Monitoring Choices"
-msgstr "Auswahl des Monitoring"
-
-#: startup.cc:285
-msgid "Use a Master bus directly"
-msgstr "Nutze den Master-Bus direkt"
-
-#: startup.cc:287
-msgid ""
-"Connect the Master bus directly to your hardware outputs. This is preferable "
-"for simple usage."
-msgstr ""
-"Verbinde den Master-Bus direkt mit den Audioausgängen. Wird für einfache "
-"Anwendungen empfohlen."
-
-#: startup.cc:296
-msgid "Use an additional Monitor bus"
-msgstr "Nutze einen zusätzlichen Monitor-Bus"
-
-#: startup.cc:299
-msgid ""
-"Use a Monitor bus between Master bus and hardware outputs for \n"
-"greater control in monitoring without affecting the mix."
-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:321
-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"
-"\n"
-"<i>If you do not understand what this is about, just accept the default.</i>"
-msgstr ""
-"<i>Diese Einstellung können Sie jederzeit über den Dialog "
-"Projekteinstellungen \n"
-"ändern. Sie können auch die Monitorsektion in Ihren Projekten hinzufügen \n"
-"oder entfernen.</i>\n"
-"\n"
-"</i>Im Zweifelsfall akzeptieren Sie einfach die Voreinstellung.</i>"
-
-#: startup.cc:332
-msgid "Monitor Section"
-msgstr "Monitorsektion"
-
-#: step_entry.cc:60
-msgid "Step Entry: %1"
-msgstr "Eingabemodus (Step Entry): %1"
-
-#: step_entry.cc:65
-msgid ">beat"
-msgstr ">Schlag"
-
-#: step_entry.cc:66
-msgid ">bar"
-msgstr ">Takt"
-
-#: step_entry.cc:67
-msgid ">EP"
-msgstr ">AP"
-
-#: step_entry.cc:68
-msgid "sustain"
-msgstr "Sustain"
-
-#: step_entry.cc:69
-msgid "rest"
-msgstr "Pause"
-
-#: step_entry.cc:70
-msgid "g-rest"
-msgstr "R-Pause"
-
-#: step_entry.cc:71
-msgid "back"
-msgstr "zurück"
-
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr "+"
-
-#: step_entry.cc:191
-msgid "Set note length to a whole note"
-msgstr "Notenwert auf ganze Note setzen"
-
-#: step_entry.cc:192
-msgid "Set note length to a half note"
-msgstr "Notenwert auf halbe Note setzen"
-
-#: step_entry.cc:193
-msgid "Set note length to a quarter note"
-msgstr "Notenwert auf Viertelnote setzen"
-
-#: step_entry.cc:194
-msgid "Set note length to a eighth note"
-msgstr "Notenwert auf Achtelnote setzen"
-
-#: step_entry.cc:195
-msgid "Set note length to a sixteenth note"
-msgstr "Notenwert auf Sechzehntelnote setzen"
-
-#: step_entry.cc:196
-msgid "Set note length to a thirty-second note"
-msgstr "Notenwert auf Zweiunddreißigstelnote setzen"
-
-#: step_entry.cc:197
-msgid "Set note length to a sixty-fourth note"
-msgstr "Notenwert auf Vierundsechzigstelnote setzen"
-
-#: step_entry.cc:276
-msgid "Set volume (velocity) to pianississimo"
-msgstr "Lautstärke (velocity) auf pianississimo setzen"
-
-#: step_entry.cc:277
-msgid "Set volume (velocity) to pianissimo"
-msgstr "Lautstärke (velocity) auf pianissimo setzen"
-
-#: step_entry.cc:278
-msgid "Set volume (velocity) to piano"
-msgstr "Lautstärke (velocity) auf piano setzen"
-
-#: step_entry.cc:279
-msgid "Set volume (velocity) to mezzo-piano"
-msgstr "Lautstärke (velocity) auf mezzo-piano setzen"
-
-#: step_entry.cc:280
-msgid "Set volume (velocity) to mezzo-forte"
-msgstr "Lautstärke (velocity) auf mezzo-forte setzen"
-
-#: step_entry.cc:281
-msgid "Set volume (velocity) to forte"
-msgstr "Lautstärke (velocity) auf forte setzen"
-
-#: step_entry.cc:282
-msgid "Set volume (velocity) to fortissimo"
-msgstr "Lautstärke (Velocity) auf fortissimo setzen"
-
-#: step_entry.cc:283
-msgid "Set volume (velocity) to fortississimo"
-msgstr "Lautstärke (Velocity) auf fortississimo setzen"
-
-#: step_entry.cc:331
-msgid "Stack inserted notes to form a chord"
-msgstr "Einen Akkord eingeben (Noten stapeln)"
-
-#: step_entry.cc:332
-msgid "Extend selected notes by note length"
-msgstr "Ausgewählte Noten um Notenwert verlängern"
-
-#: step_entry.cc:333
-msgid "Use undotted note lengths"
-msgstr "Keine punktierten Notenwerte verwenden"
-
-#: step_entry.cc:334
-msgid "Use dotted (* 1.5) note lengths"
-msgstr "Punktierte Notenwerte (* 1,5)"
-
-#: step_entry.cc:335
-msgid "Use double-dotted (* 1.75) note lengths"
-msgstr "Doppelt punktierte Notenwerte (* 1,75)"
-
-#: step_entry.cc:336
-msgid "Use triple-dotted (* 1.875) note lengths"
-msgstr "Dreifach punktierte Notenwerte (* 1,875)"
-
-#: step_entry.cc:337
-msgid "Insert a note-length's rest"
-msgstr "Eine Pause einfügen"
-
-#: step_entry.cc:338
-msgid "Insert a grid-unit's rest"
-msgstr "Eine Pause in der Länge einer Rastereinheit einfügen"
-
-#: step_entry.cc:339
-msgid "Insert a rest until the next beat"
-msgstr "Eine Pause bis zum nächsten Schlag einfügen"
-
-#: step_entry.cc:340
-msgid "Insert a rest until the next bar"
-msgstr "Eine Pause bis zum nächsten Takt einfügen"
-
-#: step_entry.cc:341
-msgid "Insert a bank change message"
-msgstr "MIDI Bank Change einfügen"
-
-#: step_entry.cc:342
-msgid "Insert a program change message"
-msgstr "MIDI Program Change einfügen"
-
-#: step_entry.cc:343 step_entry.cc:700
-msgid "Move Insert Position Back by Note Length"
-msgstr "Um einen Notenwert zurück gehen"
-
-#: step_entry.cc:344 step_entry.cc:698
-msgid "Move Insert Position to Edit Point"
-msgstr "Eingabepunkt zum Arbeitspunkt verschieben"
-
-#: step_entry.cc:401
-msgid "1/Note"
-msgstr "1/Note"
-
-#: step_entry.cc:415
-msgid "Octave"
-msgstr "Oktave"
-
-#: step_entry.cc:598
-msgid "Insert Note A"
-msgstr "Note A Einfügen"
-
-#: step_entry.cc:599
-msgid "Insert Note A-sharp"
-msgstr "Ais einfügen"
-
-#: step_entry.cc:600
-msgid "Insert Note B"
-msgstr "Note H Einfügen"
-
-#: step_entry.cc:601
-msgid "Insert Note C"
-msgstr "Note C Einfügen"
-
-#: step_entry.cc:602
-msgid "Insert Note C-sharp"
-msgstr "Cis einfügen"
-
-#: step_entry.cc:603
-msgid "Insert Note D"
-msgstr "Note D Einfügen"
-
-#: step_entry.cc:604
-msgid "Insert Note D-sharp"
-msgstr "Dis einfügen"
-
-#: step_entry.cc:605
-msgid "Insert Note E"
-msgstr "Note E Einfügen"
-
-#: step_entry.cc:606
-msgid "Insert Note F"
-msgstr "Note F Einfügen"
-
-#: step_entry.cc:607
-msgid "Insert Note F-sharp"
-msgstr "Fis einfügen"
-
-#: step_entry.cc:608
-msgid "Insert Note G"
-msgstr "Note G Einfügen"
-
-#: step_entry.cc:609
-msgid "Insert Note G-sharp"
-msgstr "Gis einfügen"
-
-#: step_entry.cc:611
-msgid "Insert a Note-length Rest"
-msgstr "Eine Pause einfügen"
-
-#: step_entry.cc:612
-msgid "Insert a Snap-length Rest"
-msgstr "Eine Pause in der Länge einer Rastereinheit einfügen"
-
-#: step_entry.cc:614 step_entry.cc:615
-msgid "Move to next octave"
-msgstr "Zu nächster Oktave gehen"
-
-#: step_entry.cc:617
-msgid "Move to Next Note Length"
-msgstr "Zu nächster Notenlänge gehen"
-
-#: step_entry.cc:618
-msgid "Move to Previous Note Length"
-msgstr "Zu voriger Notenlänge gehen"
-
-#: step_entry.cc:620
-msgid "Increase Note Length"
-msgstr "Notenwert verlängern"
-
-#: step_entry.cc:621
-msgid "Decrease Note Length"
-msgstr "Notenwert kürzen"
-
-#: step_entry.cc:623
-msgid "Move to Next Note Velocity"
-msgstr "Zu nächster Velocity gehen"
-
-#: step_entry.cc:624
-msgid "Move to Previous Note Velocity"
-msgstr "Zu voriger Velocity gehen"
-
-#: step_entry.cc:626
-msgid "Increase Note Velocity"
-msgstr "Velocity erhöhen"
-
-#: step_entry.cc:627
-msgid "Decrease Note Velocity"
-msgstr "Velocity verringern"
-
-#: step_entry.cc:629
-msgid "Switch to the 1st octave"
-msgstr "Zur 1. Oktave wechseln"
-
-#: step_entry.cc:630
-msgid "Switch to the 2nd octave"
-msgstr "Zur 2. Oktave wechseln"
-
-#: step_entry.cc:631
-msgid "Switch to the 3rd octave"
-msgstr "Zur 3. Oktave wechseln"
-
-#: step_entry.cc:632
-msgid "Switch to the 4th octave"
-msgstr "Zur 4. Oktave wechseln"
-
-#: step_entry.cc:633
-msgid "Switch to the 5th octave"
-msgstr "Zur 5. Oktave wechseln"
-
-#: step_entry.cc:634
-msgid "Switch to the 6th octave"
-msgstr "Zur 6. Oktave wechseln"
-
-#: step_entry.cc:635
-msgid "Switch to the 7th octave"
-msgstr "Zur 7. Oktave wechseln"
-
-#: step_entry.cc:636
-msgid "Switch to the 8th octave"
-msgstr "Zur 8. Oktave wechseln"
-
-#: step_entry.cc:637
-msgid "Switch to the 9th octave"
-msgstr "Zur 9. Oktave wechseln"
-
-#: step_entry.cc:638
-msgid "Switch to the 10th octave"
-msgstr "Zur 10. Oktave wechseln"
-
-#: step_entry.cc:639
-msgid "Switch to the 11th octave"
-msgstr "Zur 11. Oktave wechseln"
-
-#: step_entry.cc:644
-msgid "Set Note Length to Whole"
-msgstr "Notenwert auf ganze Note setzen"
-
-#: step_entry.cc:646
-msgid "Set Note Length to 1/2"
-msgstr "Notenwert auf halbe Note setzen"
-
-#: step_entry.cc:648
-msgid "Set Note Length to 1/3"
-msgstr "Notenwert auf drittel Note setzen"
-
-#: step_entry.cc:650
-msgid "Set Note Length to 1/4"
-msgstr "Notenwert auf Viertelnote setzen"
-
-#: step_entry.cc:652
-msgid "Set Note Length to 1/8"
-msgstr "Notenwert auf Achtelnote setzen"
-
-#: step_entry.cc:654
-msgid "Set Note Length to 1/16"
-msgstr "Notenwert auf Sechzehntelnote setzen"
-
-#: step_entry.cc:656
-msgid "Set Note Length to 1/32"
-msgstr "Notenwert auf Zweiunddreißigstelnote setzen"
-
-#: step_entry.cc:658
-msgid "Set Note Length to 1/64"
-msgstr "Notenwert auf Vierundsechzigstelnote setzen"
-
-#: step_entry.cc:663
-msgid "Set Note Velocity to Pianississimo"
-msgstr "Lautstärke (velocity) auf pianississimo setzen"
-
-#: step_entry.cc:665
-msgid "Set Note Velocity to Pianissimo"
-msgstr "Lautstärke (velocity) auf pianissimo setzen"
-
-#: step_entry.cc:667
-msgid "Set Note Velocity to Piano"
-msgstr "Lautstärke (velocity) auf piano setzen"
-
-#: step_entry.cc:669
-msgid "Set Note Velocity to Mezzo-Piano"
-msgstr "Lautstärke (velocity) auf mezzo-piano setzen"
-
-#: step_entry.cc:671
-msgid "Set Note Velocity to Mezzo-Forte"
-msgstr "Lautstärke (velocity) auf mezzo-forte setzen"
-
-#: step_entry.cc:673
-msgid "Set Note Velocity to Forte"
-msgstr "Lautstärke (velocity) auf forte setzen"
-
-#: step_entry.cc:675 step_entry.cc:677
-msgid "Set Note Velocity to Fortississimo"
-msgstr "Lautstärke (velocity) auf fortississimo setzen"
-
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "Triolen an/aus"
-
-#: step_entry.cc:684
-msgid "No Dotted Notes"
-msgstr "Keine punktierten Noten"
-
-#: step_entry.cc:686
-msgid "Toggled Dotted Notes"
-msgstr "Punktierte Noten an/aus"
-
-#: step_entry.cc:688
-msgid "Toggled Double-Dotted Notes"
-msgstr "Doppelt punktierte Noten an/aus"
-
-#: step_entry.cc:690
-msgid "Toggled Triple-Dotted Notes"
-msgstr "Punktierte Triolen an/aus"
-
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr "Akkordeingabe aktivieren"
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr "Ausgewählte Noten ertönen über Notenlänge"
-
-#: stereo_panner.cc:133
-#, c-format
-msgid "L:%3d R:%3d Width:%d%%"
-msgstr "L:%3d R:%3d Breite:%d%%"
-
-#: stereo_panner.cc:271
-msgid "Panner|M"
-msgstr "M"
-
-#: stereo_panner_editor.cc:35
-msgid "Stereo Panner"
-msgstr "Stereo Panner"
-
-#: stereo_panner_editor.cc:49
-msgid "Width"
-msgstr "Breite"
-
-#: strip_silence_dialog.cc:44
-msgid "Strip Silence"
-msgstr "Stille entfernen"
-
-#: strip_silence_dialog.cc:75
-msgid "Minimum length"
-msgstr "Mindestlänge"
-
-#: strip_silence_dialog.cc:83
-msgid "Fade length"
-msgstr "Fade-Länge"
-
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
-msgid "bar:"
-msgstr "Takt:"
-
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
-msgid "beat:"
-msgstr "Schlag:"
-
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
-msgid "Pulse note"
-msgstr "Pulsnote"
-
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
-msgid "Tap tempo"
-msgstr "Tempo tappen"
-
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr "Tempo bearbeiten"
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
-msgid "whole"
-msgstr "Ganze"
-
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
-msgid "second"
-msgstr "Halbe"
-
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
-msgid "third"
-msgstr "Drittel"
-
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
-msgid "quarter"
-msgstr "Viertel"
-
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
-msgid "eighth"
-msgstr "Achtel"
-
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
-msgid "sixteenth"
-msgstr "Sechzehntel"
-
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
-msgid "thirty-second"
-msgstr "Zweiunddreissigstel"
-
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
-msgid "sixty-fourth"
-msgstr "Vierundsechzigstelnote"
-
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
-msgid "one-hundred-twenty-eighth"
-msgstr "Hundertachtundzwanzigstelnote"
-
-#: tempo_dialog.cc:121
-msgid "Beats per minute:"
-msgstr "Schläge pro Minute:"
-
-#: tempo_dialog.cc:155
-msgid "Tempo begins at"
-msgstr "Tempo beginnt bei"
-
-#: tempo_dialog.cc:251
-msgid "incomprehensible pulse note type (%1)"
-msgstr "Unverständlicher Puls-Notentyp (%1)"
-
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
-msgstr "Taktart bearbeiten"
-
-#: tempo_dialog.cc:356
-msgid "Note value:"
-msgstr "Notenwert:"
-
-#: tempo_dialog.cc:357
-msgid "Beats per bar:"
-msgstr "Schläge pro Takt:"
-
-#: tempo_dialog.cc:371
-msgid "Meter begins at bar:"
-msgstr "Taktart beginnt bei Takt:"
-
-#: tempo_dialog.cc:484
-msgid "incomprehensible meter note type (%1)"
-msgstr "Unverständlicher Signatur-Notentyp (%1)"
-
-#: theme_manager.cc:65
-msgid "Dark Theme"
-msgstr "Dunkles Thema"
-
-#: theme_manager.cc:66
-msgid "Light Theme"
-msgstr "Helles Thema"
-
-#: theme_manager.cc:67
-msgid "Restore Defaults"
-msgstr "Standards wiederherstellen"
-
-#: theme_manager.cc:68
-msgid "Draw \"flat\" buttons"
-msgstr "Zeichne \"flache\" Schaltflächen"
-
-#: theme_manager.cc:69
-msgid "Blink Rec-Arm buttons"
-msgstr "Aufnahmebereitschaftsknopf blinkt"
-
-#: theme_manager.cc:70
-msgid "Color regions using their track's color"
-msgstr "Färbe Regionen in der Spurfarbe ein"
-
-#: theme_manager.cc:71
-msgid "Show waveform clipping"
-msgstr "Clipping der Wellenform anzeigen"
-
-#: theme_manager.cc:73
-msgid "Waveforms color gradient depth"
-msgstr "Farbverlaufs-Intensität der Wellenform"
-
-#: theme_manager.cc:75
-msgid "Timeline item gradient depth"
-msgstr "Farbverlaufs-Intensität von Zeitleisten-Objekten "
-
-#: theme_manager.cc:76
-msgid "All floating windows are dialogs"
-msgstr "Alle schwebenden Fenster sind Dialoge"
-
-#: theme_manager.cc:77
-msgid "Transient windows follow front window."
-msgstr "Transientenfenster folgt Hauptfenster"
-
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr "Icon-Satz"
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "Objekt"
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr "Objekte"
-
-#: theme_manager.cc:164
-msgid "Palette"
-msgstr "Palette"
-
-#: theme_manager.cc:165
-msgid "Transparency"
-msgstr "Transparenz"
-
-#: theme_manager.cc:195
-msgid ""
-"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
-"\" for some.\n"
-"This may help with some window managers. This requires a restart of %1 to "
-"take effect"
-msgstr ""
-"Markiere alle schwebenden Fenster als Typ \"Dialog\", statt für einige "
-"\"Utility\" zu verwenden.\n"
-"Dies kann bei einigen Fenstermanagern helfen. Sie müssen %1 starten, um "
-"diese Option zu aktivieren"
-
-#: theme_manager.cc:199
-msgid ""
-"Make transient windows follow the front window when toggling between the "
-"editor and mixer.\n"
-"This requires a restart of %1 to take effect"
-msgstr ""
-"Kurzlebige Fenster folgen bei Wechsel zwischen Editor und Mixer dem "
-"Vordergrund-Fenster.\n"
-"Dies erfordert einen Neustart von %1."
-
-#: theme_manager.cc:620
-msgid "Color Palette"
-msgstr "Farbpalette"
-
-#: time_axis_view.cc:148
-msgid "Track/Bus name (double click to edit)"
-msgstr "Spur-/Busname (Doppelklick zum Bearbeiten)"
-
-#: time_axis_view_item.cc:345
-msgid "new duration %1 frame is out of bounds for %2"
-msgid_plural "new duration of %1 frames is out of bounds for %2"
-msgstr[0] "neue Dauer %1 Frame ist außerhalb des erlaubten Bereichs für %2"
-msgstr[1] "neue Dauer %1 Frames ist außerhalb des erlaubten Bereichs für %2"
-
-#: time_fx_dialog.cc:62
-msgid "Quick but Ugly"
-msgstr "Schnell, aber hässlich"
-
-#: time_fx_dialog.cc:63
-msgid "Skip Anti-aliasing"
-msgstr "Überspringe Anti-Aliasing"
-
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Inhalt:"
-
-#: time_fx_dialog.cc:65
-msgid "Minimize time distortion"
-msgstr "zeitliche Verzerrung minimieren"
-
-#: time_fx_dialog.cc:66
-msgid "Preserve Formants"
-msgstr "Formanten beibehalten"
-
-#: time_fx_dialog.cc:71
-msgid "TimeFXDialog"
-msgstr "TimeFXDialog"
-
-#: time_fx_dialog.cc:74
-msgid "Pitch Shift Audio"
-msgstr "Tonhöhe ändern"
-
-#: time_fx_dialog.cc:76
-msgid "Time Stretch Audio"
-msgstr "Time Stretch Audio"
-
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
-msgid "Octaves:"
-msgstr "Oktaven:"
-
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
-msgid "Semitones:"
-msgstr "Halbtöne:"
-
-#: time_fx_dialog.cc:114
-msgid "Cents:"
-msgstr "Cents:"
-
-#: time_fx_dialog.cc:122
-msgid "Time|Shift"
-msgstr "Tonhöhe ändern"
-
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
-msgid "TimeFXButton"
-msgstr "TimeFXButton"
-
-#: time_fx_dialog.cc:154
-msgid "Stretch/Shrink"
-msgstr "Strecken/Stauchen"
-
-#: time_fx_dialog.cc:164
-msgid "<b>Progress</b>"
-msgstr "<b>Fortschritt</b>"
-
-#: time_info_box.cc:124
-msgid "Start recording at auto-punch start"
-msgstr "Aufnahme am Anfang des Punchbereichs starten"
-
-#: time_info_box.cc:125
-msgid "Stop recording at auto-punch end"
-msgstr "Aufnahme am Ende des Punchbereichs beenden"
-
-#: time_selection.cc:40
-msgid "programming error: request for non-existent audio range (%1)!"
-msgstr ""
-"Programmierfehler: nichtexistenter Audiobereich wurde angefordert (%1)!"
-
-#: transform_dialog.cc:39
-msgid "this note's"
-msgstr "dieser Note"
-
-#: transform_dialog.cc:40
-msgid "the previous note's"
-msgstr "der vorigen Note"
-
-#: transform_dialog.cc:41
-msgid "this note's index"
-msgstr "Index der Note"
-
-#: transform_dialog.cc:42
-msgid "the number of notes"
-msgstr "Anzahl der Noten"
-
-#: transform_dialog.cc:43
-msgid "exactly"
-msgstr "genau"
-
-#: transform_dialog.cc:44
-msgid "a random number from"
-msgstr "eine zufällige Nummer von"
-
-#: transform_dialog.cc:55
-msgid "equal steps from"
-msgstr "gleiche Schritte von"
-
-#: transform_dialog.cc:58
-msgid "note number"
-msgstr "Notennummer"
-
-#: transform_dialog.cc:59
-msgid "velocity"
-msgstr "Velocity"
-
-#: transform_dialog.cc:60
-msgid "start time"
-msgstr "Beginnzeit"
-
-#: transform_dialog.cc:61
-msgid "length"
-msgstr "Länge"
-
-#: transform_dialog.cc:82 transform_dialog.cc:113
-msgid "Transform"
-msgstr "Transformiere"
-
-#: transform_dialog.cc:91
-msgid "Set "
-msgstr "Setze"
-
-#: transpose_dialog.cc:30
-msgid "Transpose MIDI"
-msgstr "MIDI Transponieren"
-
-#: transpose_dialog.cc:55
-msgid "Transpose"
-msgstr "Transponieren"
-
-#: ui_config.cc:163 ui_config.cc:300
-msgid "Loading default ui configuration file %1"
-msgstr "lade voreingestellte UI-Konfigurationsdatei %1"
-
-#: ui_config.cc:166 ui_config.cc:303
-msgid "cannot read default ui configuration file \"%1\""
-msgstr "Kann die voreingestellte UI-Konfigurationsdatei \"%1\" nicht lesen"
-
-#: ui_config.cc:169 ui_config.cc:308
-msgid "default ui configuration file \"%1\" not loaded successfully."
-msgstr ""
-"Die voreingestellte UI-Konfigurationsdatei \"%1\" konnte nicht geladen "
-"werden."
-
-#: ui_config.cc:177
-msgid "Could not find default UI configuration file %1"
-msgstr "Konnte UI-Konfigurationsdatei für Voreinstellungen %1 nicht finden"
-
-#: ui_config.cc:219
-msgid "Loading color file %1"
-msgstr "Lade Farbdatei %1"
-
-#: ui_config.cc:222
-msgid "cannot read color file \"%1\""
-msgstr "kann Farbdatei \"%1\" nicht lesen"
-
-#: ui_config.cc:227
-msgid "color file \"%1\" not loaded successfully."
-msgstr "Farbdatei \"%1\" konnte nicht geladen werden."
-
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr "Farbdatei %1 nicht gefunden"
-
-#: ui_config.cc:282 ui_config.cc:361
-msgid "Color file %1 not saved"
-msgstr "Farbdatei %1 nicght gespeichert"
-
-#: ui_config.cc:317
-msgid "Loading user ui configuration file %1"
-msgstr "Lade benutzerdefinierte UI-Konfigurationsdatei %1"
-
-#: ui_config.cc:320
-msgid "cannot read ui configuration file \"%1\""
-msgstr "kann die UI-Konfigurationsdatei \"%1\" nicht lesen"
-
-#: ui_config.cc:325
-msgid "user ui configuration file \"%1\" not loaded successfully."
-msgstr ""
-"Die benutzerdefinierte UI-Konfigurationsdatei \"%1\" konnte nicht geladen "
-"werden."
-
-#: ui_config.cc:333
-msgid "could not find any ui configuration file, canvas will look broken."
-msgstr ""
-"Konnte keine UI-Konfigurationsdatei finden, die Arbeitsfläche wird nicht "
-"korrekt dargestellt werden."
-
-#: ui_config.cc:351
-msgid "Config file %1 not saved"
-msgstr "Konfigurationsdatei %1 nicht gespeichert"
-
-#: ui_config.cc:592
-msgid "Color %1 not found"
-msgstr "Farbe %1 nicht gefunden"
-
-#: ui_config.cc:662
-msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
-msgstr ""
-"Kann den UI-Stil Datei %1 im Suchpfad %2 nicht finden. %3 wird merkwürdig "
-"aussehen"
-
-#: utils.cc:117 utils.cc:160
-msgid "bad XPM header %1"
-msgstr "Fehlerhafter XPM Header %1"
-
-#: utils.cc:577
-msgid "cannot find XPM file for %1"
-msgstr "Konnte XPM-Datei für %1 nicht finden"
-
-#: utils.cc:597 utils.cc:627 utils.cc:641
-msgid "default"
-msgstr "voreingestellt"
-
-#: utils.cc:642
-msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
-msgstr ""
-"Icon \"%1\" wurde im Icon-Satz \"%2\" nicht gefunden, greife auf "
-"Voreinstellung zurück"
-
-#: utils.cc:649
-msgid "cannot find icon image for %1 using %2"
-msgstr "Konnte Icon-Bild für %1 unter %2 nicht finden"
-
-#: utils.cc:666 utils.cc:682
-msgid "Caught exception while loading icon named %1"
-msgstr ""
-"Während des Ladens des Icons mit dem Namen %1 trat ein Ausnahmefehler auf"
-
-#: add_video_dialog.cc:54
-msgid "Set Video Track"
-msgstr "Videospur-Einstellungen"
-
-#: add_video_dialog.cc:62
-msgid "Open Video Monitor Window"
-msgstr "Videomonitorfenster öffnen"
-
-#: add_video_dialog.cc:63
-msgid "Adjust Session Framerate to Match Video Framerate"
-msgstr "Projekt-Framerate an Video-Framerate anpassen"
-
-#: add_video_dialog.cc:65
-msgid "Reload docroot"
-msgstr "docroot neu laden"
-
-#: add_video_dialog.cc:120
-msgid "Video files"
-msgstr "Videodateien"
-
-#: add_video_dialog.cc:149
-msgid "<b>Video Information</b>"
-msgstr "<b>Videoinformationen</b>"
-
-#: add_video_dialog.cc:152
-msgid "Start:"
-msgstr "Start:"
-
-#: add_video_dialog.cc:158
-msgid "Frame rate:"
-msgstr "Framerate:"
-
-#: add_video_dialog.cc:161
-msgid "Aspect Ratio:"
-msgstr "Seitenverhältnis:"
-
-#: add_video_dialog.cc:244
-msgid "VideoServerIndex"
-msgstr "VideoServerIndex"
-
-#: add_video_dialog.cc:675
-msgid " %1 fps"
-msgstr " %1 fps"
-
-#: video_timeline.cc:468
-msgid ""
-"Parsing video file info failed. Is the Video Server running? Is the file "
-"readable by the Video Server? Does the docroot match? Is it a video file?"
-msgstr ""
-"Fehler beim Parsen der Videodatei. Läuft der Videoserver? Ist die Datei für "
-"den Videoserver lesbar? Ist die docroot passend eingestellt? Ist die Datei "
-"tatsächlich eine Videodatei?"
-
-#: video_timeline.cc:506
-msgid ""
-"Failed to set session-framerate: '%1' does not have a corresponding option "
-"setting in %2."
-msgstr ""
-"Setzen der Projektframerate fehlgeschlagen: '%1' hat keine entsprechende "
-"Einstellungsoption in %2."
-
-#: video_timeline.cc:514
-msgid ""
-"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
-"vs '%3'"
-msgstr ""
-"Framerate der Videodatei entspricht nicht der Framerate des Timecodes im %1-"
-"Projekt: '%2' vs. '%3'"
-
-#: video_timeline.cc:587
-msgid ""
-"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
-"means that the video server was not started by %1 and uses a different "
-"document-root."
-msgstr ""
-"Docroot des Videoserver stimmt nicht überein. %1: '%2', Videoserver: '%3'. "
-"Das bedeutet üblicherweise, dass der Videoserver nicht von %1 gestartet "
-"wurde und einen anderen Dokumenten-Wurzelpfad verwendet."
-
-#: video_timeline.cc:724
-msgid ""
-"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
-"(a custom path to xjadeo can be specified by setting the XJREMOTE "
-"environment variable. It should point to an application compatible with "
-"xjadeo's remote-control interface 'xjremote').\n"
-"\n"
-"see also http://manual.ardour.org/video-timeline/setup/"
-msgstr ""
-"Der Videomonitor 'xjadeo' wurde nicht gefunden. Bitte installieren Sie "
-"http://xjadeo.sf.net/ (ein benutzerspezifischer Pfad für xjadeo kann durch "
-"Setzen der Umgebungsvariablen XJREMOTE angegeben werden. Er sollte auf ein "
-"Programm zeigen, das zu dem Fernsteuerungsprotokoll 'xjremote' von xjadeo "
-"kompatibel ist).\n"
-"\n"
-"Siehe auch http://manual.ardour.org/video-timeline/setup/"
-
-#: video_timeline.cc:739
-msgid "Video-monitor 'xjadeo' cannot be launched."
-msgstr "Videomonitor 'xjadeo' kann nicht gestartet werden."
-
-#: video_timeline.cc:766
-msgid ""
-"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
-"later. http://xjadeo.sf.net/"
-msgstr ""
-"Videomonitor 'xjadeo' ist zu alt. Bitte installieren Sie xjadeo in Version "
-"0.7.7 oder höher. http://xjadeo.sf.net/"
-
-#: video_monitor.cc:285
-msgid "Video Monitor: File Not Found."
-msgstr "Videomonitor: Datei nicht gefunden."
-
-#: transcode_ffmpeg.cc:56
-msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
-"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
-"\n"
-"The tools are included with the %1 releases from ardour.org and also "
-"available with the video-server at http://x42.github.com/harvid/\n"
-"\n"
-"Important: the files need to be installed in $PATH and named ffmpeg_harvid "
-"and ffprobe_harvid.\n"
-"If you already have a suitable ffmpeg installation on your system, we "
-"recommend creating symbolic links from ffmpeg to ffmpeg_harvid and from "
-"ffprobe to ffprobe_harvid.\n"
-"\n"
-"see also http://manual.ardour.org/video-timeline/setup/"
-msgstr ""
-"Die Programme ffprobe oder ffmpeg konnten auf diesem System nicht gefunden "
-"werden.\n"
-"Bis diese Werkzeuge installiert sind, ist Videoexport nicht möglich.\n"
-"%1 benötigt ffmpeg und ffprobe von ffmpeg.org in der Version 1.1 oder "
-"neuer.\n"
-"\n"
-"Diese Werkzeuge sind in den %1-Paketen von ardour.org inkludiert und auch "
-"mit dem Videoserver auf http://x42.github.com/harvid/ erhältlich.\n"
-"\n"
-"Wichtig: die Dateien müssen in $PATH installiert sein und die Namen "
-"ffmpeg_harvid und ffprobe_harvid.\n"
-"Falls Sie bereits eine ffmpeg Installation auf Ihrem System haben, empfehlen "
-"wir, symbolische Links von ffmpeg zu ffmpeg_harvid und von ffprobe zu "
-"ffprobe_harvid anzulegen.\n"
-"\n"
-"Siehe auch http://manual.ardour.org/video-timeline/setup/"
-
-#: transcode_video_dialog.cc:56
-msgid "Transcode/Import Video File "
-msgstr "Videodatei transkodieren/importieren"
-
-#: transcode_video_dialog.cc:58
-msgid "Output File:"
-msgstr "Ausgabedatei:"
-
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
-msgid "Abort"
-msgstr "Abbruch"
-
-#: transcode_video_dialog.cc:63
-msgid "Height = "
-msgstr "Höhe ="
-
-#: transcode_video_dialog.cc:66
-msgid "Manual Override"
-msgstr "Manuelle Eingabe"
-
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
-msgid "Debug Mode: Print ffmpeg command and output to stdout."
-msgstr "Debug-Modus: gibt die ffmpeg-Befehlszeile und -Ausgabe an stdout aus."
-
-#: transcode_video_dialog.cc:107
-msgid "<b>File Information</b>"
-msgstr "<b>Dateiinformationen</b>"
-
-#: transcode_video_dialog.cc:113
-msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
-msgstr ""
-"Die Programme ffprobe oder ffmpeg konnten auf diesem System nicht gefunden "
-"werden. Bis diese Werkzeuge installiert sind, ist Videoimport nicht möglich. "
-"Sehen Sie im Log-Fenster nach weiteren Informationen."
-
-#: transcode_video_dialog.cc:120
-msgid ""
-"File-info can not be read. Most likely '%1' is not a valid video-file or an "
-"unsupported video codec or format."
-msgstr ""
-"Dateiinformationen können nicht gelesen werden. Vermutlich ist '%1' keine "
-"gültige Videodatei, oder enthält einen nicht unterstützten Videocodec bzw. "
-"ein nicht unterstütztes Videoformat."
-
-#: transcode_video_dialog.cc:134
-msgid "FPS:"
-msgstr "FPS:"
-
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr "Dauer:"
-
-#: transcode_video_dialog.cc:138
-msgid "Codec:"
-msgstr "Codec:"
-
-#: transcode_video_dialog.cc:140
-msgid "Geometry:"
-msgstr "Geometrie:"
-
-#: transcode_video_dialog.cc:155
-msgid "??"
-msgstr "??"
-
-#: transcode_video_dialog.cc:176
-msgid "<b>Import Settings</b>"
-msgstr "<b>Importeinstellungen</b>"
-
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
-msgstr ""
-"Referenz von momentaner Position (vorher nur von transkodierten Dateien)"
-
-#: transcode_video_dialog.cc:183
-msgid "Import/Transcode Video to Session"
-msgstr "Video ins Projekt transkodieren/importieren"
-
-#: transcode_video_dialog.cc:191
-msgid "Do Not Import Video (Audio Import Only)"
-msgstr "Video nicht importieren (nur Audio)"
-
-#: transcode_video_dialog.cc:200
-msgid "Scale Video: Width = "
-msgstr "Video skalieren: Breite = "
-
-#: transcode_video_dialog.cc:207
-msgid "Original Width"
-msgstr "Originalbreite"
-
-#: transcode_video_dialog.cc:222
-msgid "Bitrate (KBit/s):"
-msgstr "Bitrate (KBit/s):"
-
-#: transcode_video_dialog.cc:227
-msgid "Extract Audio:"
-msgstr "Audio extrahieren:"
-
-#: transcode_video_dialog.cc:232
-msgid "No Audio Track Present"
-msgstr "Keine Audiospur"
-
-#: transcode_video_dialog.cc:235
-msgid "Do Not Extract Audio"
-msgstr "Audio nicht extrahieren"
-
-#: transcode_video_dialog.cc:350
-msgid "Extracting Audio.."
-msgstr "Extrahiere Audio..."
-
-#: transcode_video_dialog.cc:353
-msgid "Audio Extraction Failed."
-msgstr "Extrahieren des Audio gescheitert."
-
-#: transcode_video_dialog.cc:379
-msgid "Transcoding Video.."
-msgstr "Transkodiere Video.."
-
-#: transcode_video_dialog.cc:413
-msgid "Transcoding Failed."
-msgstr "Transkodieren gescheitert"
-
-#: transcode_video_dialog.cc:503
-msgid "Save Transcoded Video File"
-msgstr "Sichere transkodierte Videodatei"
-
-#: video_server_dialog.cc:52
-msgid "Launch Video Server"
-msgstr "Video-Server starten"
-
-#: video_server_dialog.cc:53
-msgid "Server Executable:"
-msgstr "Server-Datei:"
-
-#: video_server_dialog.cc:55
-msgid "Server Docroot:"
-msgstr "Server Docroot:"
-
-#: video_server_dialog.cc:61
-msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
-msgstr ""
-"Diesen Dialog nicht mehr anzeigen (kann in Einstellungen geändert werden)."
-
-#: video_server_dialog.cc:97
-msgid ""
-"The external video server 'harvid' can not be found.\n"
-"The tool is included with the %1 releases from ardour.org, alternatively you "
-"can download it from http://x42.github.com/harvid/ or acquire it from your "
-"distribution.\n"
-"\n"
-"see also http://manual.ardour.org/video-timeline/setup/"
-msgstr "key"
-
-#: video_server_dialog.cc:129
-msgid "Listen Address:"
-msgstr "Eingehende Adresse:"
-
-#: video_server_dialog.cc:134
-msgid "Listen Port:"
-msgstr "Eingehender Port:"
-
-#: video_server_dialog.cc:139
-msgid "Cache Size:"
-msgstr "Cachegröße"
-
-#: video_server_dialog.cc:145
-msgid ""
-"%1 relies on an external video server for the videotimeline.\n"
-"The server configured in Edit -> Preferences -> Video is not reachable.\n"
-"Do you want %1 to launch 'harvid' on this machine?"
-msgstr ""
-"%1 benötigt einen externen Videoserver für die Video-Zeitleiste.\n"
-"Der in Bearbeiten -> Globale Einstellungen -> Video konfigurierte Server ist "
-"nicht erreichbar.\n"
-"Möchten Sie, daß %1 \"harvid\" auf diesem Computer startet?"
-
-#: video_server_dialog.cc:189
-msgid "Set Video Server Executable"
-msgstr "Setze Video-Serverpfad"
-
-#: video_server_dialog.cc:209
-msgid "Server docroot"
-msgstr "Server-docroot"
-
-#: utils_videotl.cc:60
-msgid "Destination is outside Video Server's docroot. "
-msgstr "Ziel ist ausserhalb der docroot des Videoservers."
-
-#: utils_videotl.cc:61
-msgid ""
-"The destination file path is outside of the Video Server's docroot. The file "
-"will not be readable by the Video Server. Do you still want to continue?"
-msgstr ""
-"Der Dateipfad des Zieles befindet sich ausserhalb der docroot des "
-"Videoservers. Die Datei wird für den Videoserver nicht lesbar sein. Wollen "
-"Sie wirklich fortfahren?"
-
-#: utils_videotl.cc:64
-msgid "Continue"
-msgstr "Fortfahren"
-
-#: utils_videotl.cc:70
-msgid "Confirm Overwrite"
-msgstr "Bestätige das Überschreiben"
-
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists. Do you want to overwrite it?"
-msgstr ""
-"Eine Datei mit diesem Namen existiert bereits. Wollen Sie sie überschreiben?"
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
-msgid "Cannot create video folder \"%1\" (%2)"
-msgstr "Kann Videoordner \"%1\" nicht erstellen (%2)"
-
-#: export_video_dialog.cc:71
-msgid "Export Video File "
-msgstr "Exportiere Videodatei"
-
-#: export_video_dialog.cc:82
-msgid "Video:"
-msgstr "Video:"
-
-#: export_video_dialog.cc:87
-msgid "Scale Video (W x H):"
-msgstr "Skaliere Video (W x H):"
-
-#: export_video_dialog.cc:88
-msgid "Retain Aspect"
-msgstr "Seitenverhältnis beibehalten"
-
-#: export_video_dialog.cc:93
-msgid "Set Aspect Ratio:"
-msgstr "Seitenverhältnis:"
-
-#: export_video_dialog.cc:94
-msgid "Normalize Audio"
-msgstr "Audio normalisieren"
-
-#: export_video_dialog.cc:95
-msgid "2 Pass Encoding"
-msgstr "Enkodiere in 2 Durchgängen"
-
-#: export_video_dialog.cc:96
-msgid "Codec Optimizations:"
-msgstr "Codec-Optimierungen:"
-
-#: export_video_dialog.cc:98
-msgid "Deinterlace"
-msgstr "Deinterlacing anwenden"
-
-#: export_video_dialog.cc:99
-msgid "Use [2] B-frames (MPEG 2 or 4 only)"
-msgstr "Verwende [2] B-frames (nur MPEG 2 oder 4)"
-
-#: export_video_dialog.cc:100
-msgid "Override FPS (Default is to retain FPS from the input video file):"
-msgstr "FPS erzwingen (Voreinstellung: FPS der Videodatei wird beibehalten):"
-
-#: export_video_dialog.cc:101
-msgid "Include Session Metadata"
-msgstr "Projekt-Metadaten verwenden"
-
-#: export_video_dialog.cc:119
-msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
-msgstr ""
-"Die Programme ffprobe oder ffmpeg konnten auf diesem System nicht gefunden "
-"werden. Bis diese Werkzeuge installiert sind, ist Videoexport nicht möglich. "
-"Sehen Sie im Log-Fenster nach weiteren Informationen."
-
-#: export_video_dialog.cc:130
-msgid "<b>Output:</b> (file extension defines format)"
-msgstr "<b>Ausgabe:</b> (Dateierweiterung definiert das Format)"
-
-#: export_video_dialog.cc:140
-msgid "<b>Input Video:</b>"
-msgstr "<b>Eingabevideo:</b>"
-
-#: export_video_dialog.cc:151
-msgid "Audio:"
-msgstr "Audio:"
-
-#: export_video_dialog.cc:153
-msgid "Master Bus"
-msgstr "Masterbus"
-
-#: export_video_dialog.cc:158
-msgid "from the %1 session's start to the session's end"
-msgstr "von %1 Projektbeginn bis -ende"
-
-#: export_video_dialog.cc:161
-msgid "<b>Settings:</b>"
-msgstr "<b>Einstellungen:</b>"
-
-#: export_video_dialog.cc:169
-msgid "Range:"
-msgstr "Bereich:"
-
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr "Preset:"
-
-#: export_video_dialog.cc:175
-msgid "Video Codec:"
-msgstr "Videocodec:"
-
-#: export_video_dialog.cc:178
-msgid "Video KBit/s:"
-msgstr "Video KBit/s:"
-
-#: export_video_dialog.cc:181
-msgid "Audio Codec:"
-msgstr "Audiocodec:"
-
-#: export_video_dialog.cc:184
-msgid "Audio KBit/s:"
-msgstr "Audio KBit/s:"
-
-#: export_video_dialog.cc:187
-msgid "Audio Samplerate:"
-msgstr "Audiosamplerate:"
-
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:814 export_video_dialog.cc:817
-msgid "(default for format)"
-msgstr "(Voreinstellung für Format)"
-
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:821 export_video_dialog.cc:830
-msgid "(default)"
-msgstr "(Voreinstellung)"
-
-#: export_video_dialog.cc:256 export_video_dialog.cc:824
-msgid "(retain)"
-msgstr "(beibehalten)"
-
-#: export_video_dialog.cc:348
-msgid "from 00:00:00:00 to the video's end"
-msgstr "von 00:00:00:00 bis Videoende"
-
-#: export_video_dialog.cc:350
-msgid "from the video's start to the video's end"
-msgstr "von Videostart bis Videoende"
-
-#: export_video_dialog.cc:353
-msgid "Selected range"
-msgstr "Ausgewählter Bereich"
-
-#: export_video_dialog.cc:573
-msgid "Normalizing audio"
-msgstr "Audio normalisieren"
-
-#: export_video_dialog.cc:577
-msgid "Exporting audio"
-msgstr "Exportiere Audio"
-
-#: export_video_dialog.cc:632
-msgid "Exporting Audio..."
-msgstr "Exportiere Audio..."
-
-#: export_video_dialog.cc:689
-msgid ""
-"Export Video: Cannot query duration of video-file, using duration from "
-"timeline instead."
-msgstr ""
-"Exportiere Video: Kann die Dauer der Videodatei nicht eruieren, verwende "
-"statt dessen die Dauer aus der Zeitleiste."
-
-#: export_video_dialog.cc:719
-msgid "Export Video: export-range does not include video."
-msgstr "Video Export: Exportbereich enthält kein Video."
-
-#: export_video_dialog.cc:732
-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:774
-msgid "Encoding Video..."
-msgstr "Enkodiere Video..."
-
-#: export_video_dialog.cc:794
-msgid "Export Video: Video input file cannot be read."
-msgstr "Exportiere Video: Die Videoquelldatei kann nicht gelesen werden."
-
-#: export_video_dialog.cc:900
-msgid "Encoding Video.. Pass 1/2"
-msgstr "Kodiere Video.. Durchgang 1/2"
-
-#: export_video_dialog.cc:912
-msgid "Encoding Video.. Pass 2/2"
-msgstr "Kodiere Video.. Durchgang 2/2"
-
-#: export_video_dialog.cc:1015
-msgid "Transcoding failed."
-msgstr "Transkodieren fehlgeschlagen."
-
-#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
-msgid "Save Exported Video File"
-msgstr "Sichere exportierte Videodatei"
-
-#: export_video_infobox.cc:33
-msgid "Video Export Info"
-msgstr "Video-Exportinformationen"
-
-#: export_video_infobox.cc:34
-msgid "Do Not Show This Dialog Again (Reset in Edit > Preferences > Video)."
-msgstr ""
-"Diesen Dialog nicht wieder anzeigen (kann in Bearbeiten > Globale "
-"Einstellungen > Video zurückgesetzt werden)."
-
-#: export_video_infobox.cc:46
-msgid "<b>Video Export Info</b>"
-msgstr "<b>Videoexport Informationen</b>"
-
-#: export_video_infobox.cc:51
-msgid ""
-"Video encoding is a non-trivial task with many details.\n"
-"\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
-"\n"
-"Open Manual in Browser? "
-msgstr ""
-"Das Kodieren von Video ist eine komplexe Aufgabe mit vielen Details.\n"
-"\n"
-"Lesen Sie bitte darüber im Handbuch unter %1/video-timeline/operations/"
-"#export nach.\n"
-"\n"
-"Handbuch im Browser öffnen? "
-
-#~ msgid "Copyright (C) 1999-2012 Paul Davis"
-#~ msgstr "Copyright (C) 1999-2012 Paul Davis"
-
-#~ msgid "tracks"
-#~ msgstr "Spuren"
-
-#~ msgid "busses"
-#~ msgstr "Audio-Busse"
-
-#~ msgid ""
-#~ "Do you really want to remove track \"%1\" ?\n"
-#~ "\n"
-#~ "You may also lose the playlist used by this track.\n"
-#~ "\n"
-#~ "(This action cannot be undone, and the session file will be overwritten)"
-#~ msgstr ""
-#~ "Wollen Sie wirklich die Spur \"%1\" löschen?\n"
-#~ "\n"
-#~ "Sie werden auch die Wiedergabelisten, die diese Spur benutzt, verlieren.\n"
-#~ "\n"
-#~ "(Dies kann nicht rückgängig gemacht werden!)"
-
-#~ msgid ""
-#~ "Do you really want to remove bus \"%1\" ?\n"
-#~ "\n"
-#~ "(This action cannot be undone, and the session file will be overwritten)"
-#~ msgstr ""
-#~ "Wollen Sie den Bus \"%1\" wirklich löschen?\n"
-#~ "(Dies kann nicht rückgängig gemacht werden!)"
-
-#~ msgid "Remove track"
-#~ msgstr "Spur löschen"
-
-#~ msgid "Remove bus"
-#~ msgstr "Bus löschen"
+# German translations for gtk-ardour
+# Copyright (C) 2003 Paul Davis
+# This file is distributed under the same license as the gtk-ardour package.
+#
+#
+# Karsten Petersen <kapet at kapet.de>, 2003.
+# Edgar Aichinger <edgar.aichinger at aon.at>, 2008, 2012, 2013, 2014, 2015.
+# Benjamin Scherrer <benjamin at wagnerbrutal.de>, 2015.
+msgid ""
+msgstr ""
+"Project-Id-Version: gtk-ardour 0.347.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-08-13 10:38+0200\n"
+"PO-Revision-Date: 2015-08-13 11:53+0200\n"
+"Last-Translator: Edgar Aichinger <edogawa at aon.at>\n"
+"Language-Team: German <ardour-dev at lists.ardour.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 1.5\n"
+"X-Poedit-Basepath: ../../\n"
+"X-Poedit-SearchPath-0: gtk2_ardour\n"
+
+#: about.cc:125
+msgid "Brian Ahr"
+msgstr "Brian Ahr"
+
+#: about.cc:126
+msgid "John Anderson"
+msgstr "John Anderson"
+
+#: about.cc:127
+msgid "Marcus Andersson"
+msgstr "Marcus Andersson"
+
+#: about.cc:128
+msgid "Nedko Arnaudov"
+msgstr "Nedko Arnaudov"
+
+#: about.cc:129
+msgid "Hans Baier"
+msgstr "Hans Baier"
+
+#: about.cc:130
+msgid "Ben Bell"
+msgstr "Ben Bell"
+
+#: about.cc:131
+msgid "Sakari Bergen"
+msgstr "Sakari Bergen"
+
+#: about.cc:132
+msgid "Christian Borss"
+msgstr "Christian Borss"
+
+#: about.cc:133
+msgid "Chris Cannam"
+msgstr "Chris Cannam"
+
+#: about.cc:134
+msgid "Jeremy Carter"
+msgstr "Jeremy Carter"
+
+#: about.cc:135
+msgid "Jesse Chappell"
+msgstr "Jesse Chappell"
+
+#: about.cc:136
+msgid "Thomas Charbonnel"
+msgstr "Thomas Charbonnel"
+
+#: about.cc:137
+msgid "Sam Chessman"
+msgstr "Sam Chessman"
+
+#: about.cc:138
+msgid "André Colomb"
+msgstr "André Colomb"
+
+#: about.cc:139
+msgid "Paul Davis"
+msgstr "Paul Davis"
+
+#: about.cc:140
+msgid "Gerard van Dongen"
+msgstr "Gerard van Dongen"
+
+#: about.cc:141
+msgid "John Emmas"
+msgstr "John Emmas"
+
+#: about.cc:142
+msgid "Colin Fletcher"
+msgstr "Colin Fletcher"
+
+#: about.cc:143
+msgid "Dave Flick"
+msgstr "Dave Flick"
+
+#: about.cc:144
+msgid "Hans Fugal"
+msgstr "Hans Fugal"
+
+#: about.cc:145
+msgid "Robin Gareus"
+msgstr "Robin Gareus"
+
+#: about.cc:146
+msgid "Christopher George"
+msgstr "Christopher George"
+
+#: about.cc:147
+msgid "Chris Goddard"
+msgstr "Chris Goddard"
+
+#: about.cc:148
+msgid "J. Abelardo Gutierrez"
+msgstr "J. Abelardo Gutierrez"
+
+#: about.cc:149
+msgid "Jeremy Hall"
+msgstr "Jeremy Hall"
+
+#: about.cc:150
+msgid "Audun Halland"
+msgstr "Audun Halland"
+
+#: about.cc:151
+msgid "David Halter"
+msgstr "David Halter"
+
+#: about.cc:152
+msgid "Steve Harris"
+msgstr "Steve Harris"
+
+#: about.cc:153
+msgid "Melvin Ray Herr"
+msgstr "Melvin Ray Herr"
+
+#: about.cc:154
+msgid "Carl Hetherington"
+msgstr "Carl Hetherington"
+
+#: about.cc:155
+msgid "Rob Holland"
+msgstr "Rob Holland"
+
+#: about.cc:156
+msgid "Robert Jordens"
+msgstr "Robert Jordens"
+
+#: about.cc:157
+msgid "Stefan Kersten"
+msgstr "Stefan Kersten"
+
+#: about.cc:158
+msgid "Armand Klenk"
+msgstr "Armand Klenk"
+
+#: about.cc:159
+msgid "Julien de Kozak"
+msgstr "Julien de Kozak"
+
+#: about.cc:160
+msgid "Matt Krai"
+msgstr "Matt Krai"
+
+#: about.cc:161
+msgid "Georg Krause"
+msgstr "Georg Krause"
+
+#: about.cc:162
+msgid "Nick Lanham"
+msgstr "Nick Lanham"
+
+#: about.cc:163
+msgid "Colin Law"
+msgstr "Colin Law"
+
+#: about.cc:164
+msgid "Joshua Leach"
+msgstr "Joshua Leach"
+
+#: about.cc:165
+msgid "Ben Loftis"
+msgstr "Ben Loftis"
+
+#: about.cc:166
+msgid "Nick Mainsbridge"
+msgstr "Nick Mainsbridge"
+
+#: about.cc:167
+msgid "Tim Mayberry"
+msgstr "Tim Mayberry"
+
+#: about.cc:168
+msgid "Doug Mclain"
+msgstr "Doug Mclain"
+
+#: about.cc:169
+msgid "Todd Naugle"
+msgstr "Todd Naugle"
+
+#: about.cc:170
+msgid "Jack O'Quin"
+msgstr "Jack O'Quin"
+
+#: about.cc:171
+msgid "Nimal Ratnayake"
+msgstr "Nimal Ratnayake"
+
+#: about.cc:172
+msgid "David Robillard"
+msgstr "David Robillard"
+
+#: about.cc:173
+msgid "Taybin Rutkin"
+msgstr "Taybin Rutkin"
+
+#: about.cc:174
+msgid "Andreas Ruge"
+msgstr "Andreas Ruge"
+
+#: about.cc:175
+msgid "Sampo Savolainen"
+msgstr "Sampo Savolainen"
+
+#: about.cc:176
+msgid "Rodrigo Severo"
+msgstr "Rodrigo Severo"
+
+#: about.cc:177
+msgid "Per Sigmond"
+msgstr "Per Sigmond"
+
+#: about.cc:178
+msgid "Lincoln Spiteri"
+msgstr "Lincoln Spiteri"
+
+#: about.cc:179
+msgid "Mike Start"
+msgstr "Mike Start"
+
+#: about.cc:180
+msgid "Mark Stewart"
+msgstr "Mark Stewart"
+
+#: about.cc:181
+msgid "Roland Stigge"
+msgstr "Roland Stigge"
+
+#: about.cc:182
+msgid "Petter Sundlöf"
+msgstr "Petter Sundlöf"
+
+#: about.cc:183
+msgid "Mike Täht"
+msgstr "Mike Täht"
+
+#: about.cc:184
+msgid "Roy Vegard"
+msgstr "Roy Vegard"
+
+#: about.cc:185
+msgid "Thorsten Wilms"
+msgstr "Thorsten Wilms"
+
+#: about.cc:186
+msgid "Damien Zammit"
+msgstr "Damien Zammit"
+
+#: about.cc:187
+msgid "Grygorii Zharun"
+msgstr "Grygorii Zharun"
+
+#: about.cc:192
+msgid ""
+"French:\n"
+"\tAlain Fréhel <alain.frehel at free.fr>\n"
+"\tChristophe Combelles <ccomb at free.fr>\n"
+"\tMartin Blanchard\n"
+"\tRomain Arnaud <roming22 at gmail.com>\n"
+msgstr ""
+"Französisch:\n"
+"\tAlain Fréhel <alain.frehel at free.fr>\n"
+"\tChristophe Combelles <ccomb at free.fr>\n"
+"\tMartin Blanchard\n"
+"\tRomain Arnaud <roming22 at gmail.com>\n"
+
+#: about.cc:193
+msgid ""
+"German:\n"
+"\tKarsten Petersen <kapet at kapet.de>\n"
+"\tSebastian Arnold <mail at sebastian-arnold.net>\n"
+"\tRobert Schwede <schwede at ironshark.com>\n"
+"\tBenjamin Scherrer <realhangman at web.de>\n"
+"\tEdgar Aichinger <edogawa at aon.at>\n"
+"\tRichard Oax <richard at pagliacciempire.de>\n"
+"\tRobin Gloster <robin at loc-com.de>\n"
+msgstr ""
+"Deutsch:\n"
+"\tKarsten Petersen <kapet at kapet.de>\n"
+"\tSebastian Arnold <mail at sebastian-arnold.net>\n"
+"\tRobert Schwede <schwede at ironshark.com>\n"
+"\tBenjamin Scherrer <realhangman at web.de>\n"
+"\tEdgar Aichinger <edogawa at aon.at>\n"
+"\tRichard Oax <richard at pagliacciempire.de>\n"
+"\tRobin Gloster <robin at loc-com.de>\n"
+
+#: about.cc:200
+msgid ""
+"Italian:\n"
+"\tFilippo Pappalardo <filippo at email.it>\n"
+"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
+msgstr ""
+"Italienisch:\n"
+"\tFilippo Pappalardo <filippo at email.it>\n"
+"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
+
+#: about.cc:201
+msgid ""
+"Portuguese:\n"
+"\tRui Nuno Capela <rncbc at rncbc.org>\n"
+msgstr ""
+"Portugiesisch:\n"
+"\tRui Nuno Capela <rncbc at rncbc.org>\n"
+
+#: about.cc:202
+msgid ""
+"Brazilian Portuguese:\n"
+"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
+"\tChris Ross <chris at tebibyte.org>\n"
+msgstr ""
+"Brasilianisches Portugiesisch:\n"
+"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
+"\tChris Ross <chris at tebibyte.org>\n"
+
+#: about.cc:204
+msgid ""
+"Spanish:\n"
+"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
+"\tPablo Fernández <pablo.fbus at gmail.com>\n"
+msgstr ""
+"Spanisch:\n"
+"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
+"\tPablo Fernández <pablo.fbus at gmail.com>\n"
+
+#: about.cc:205
+msgid ""
+"Russian:\n"
+"\t Igor Blinov <pitstop at nm.ru>\n"
+"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
+msgstr ""
+"Russisch:\n"
+"\t Igor Blinov <pitstop at nm.ru>\n"
+"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
+
+#: about.cc:207
+msgid ""
+"Greek:\n"
+"\t Klearchos Gourgourinis <muadib at in.gr>\n"
+msgstr ""
+"Griechisch:\n"
+"\t Klearchos Gourgourinis <muadib at in.gr>\n"
+
+#: about.cc:208
+msgid ""
+"Swedish:\n"
+"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
+msgstr ""
+"Schwedisch:\n"
+"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
+
+#: about.cc:209
+msgid ""
+"Polish:\n"
+"\t Piotr Zaryk <pzaryk at gmail.com>\n"
+msgstr ""
+"Polnisch:\n"
+"\t Piotr Zaryk <pzaryk at gmail.com>\n"
+
+#: about.cc:210
+msgid ""
+"Czech:\n"
+"\t Pavel Fric <pavelfric at seznam.cz>\n"
+msgstr ""
+"Tschechisch:\n"
+"\t Pavel Fric <pavelfric at seznam.cz>\n"
+
+#: about.cc:211
+msgid ""
+"Norwegian:\n"
+"\t Eivind Ødegård\n"
+msgstr ""
+"Norwegisch:\n"
+"\t Eivind Ødegård\n"
+
+#: about.cc:212
+msgid ""
+"Chinese:\n"
+"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
+msgstr ""
+"Chinesisch:\n"
+"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
+
+#: about.cc:592
+msgid "Copyright (C) 1999-2015 Paul Davis\n"
+msgstr "Copyright (C) 1999-2015 Paul Davis\n"
+
+#: about.cc:596
+msgid "http://ardour.org/"
+msgstr "http://ardour.org/"
+
+#: about.cc:597
+msgid ""
+"%1%2\n"
+"(built from revision %3)"
+msgstr ""
+"%1%2\n"
+"(kompiliert aus Revision %3)"
+
+#: about.cc:601
+msgid "Config"
+msgstr "Konfiguration"
+
+#: actions.cc:85
+msgid "Loading menus from %1"
+msgstr "Lade Menüs von %1"
+
+#: actions.cc:88 actions.cc:89
+msgid "badly formatted menu definition file: %1"
+msgstr "schlecht formatierte Menüdefinitions-Datei: %1"
+
+#: actions.cc:91
+msgid "%1 menu definition file not found"
+msgstr "Konnte die %1 Menü-Definitionsdatei nicht finden"
+
+#: actions.cc:95 actions.cc:96
+msgid "%1 will not work without a valid menu definition file"
+msgstr "%1 wird ohne gültige Menüdefinitions-Datei nicht funktionieren"
+
+#: add_route_dialog.cc:54 route_params_ui.cc:524
+msgid "Add Track or Bus"
+msgstr "Spur/Bus hinzufügen"
+
+#: add_route_dialog.cc:57
+msgid "Configuration:"
+msgstr "Kanaleinstellungen:"
+
+#: add_route_dialog.cc:58
+msgid "Record Mode:"
+msgstr "Aufnahmemodus:"
+
+#: add_route_dialog.cc:59
+msgid "Instrument:"
+msgstr "Instrument:"
+
+#: add_route_dialog.cc:77
+msgid "Audio Tracks"
+msgstr "Audiospuren"
+
+#: add_route_dialog.cc:78 add_route_dialog.cc:209
+msgid "MIDI Tracks"
+msgstr "Midispuren"
+
+#: add_route_dialog.cc:79 add_route_dialog.cc:211
+msgid "Audio+MIDI Tracks"
+msgstr "Audio+MIDI-Spuren"
+
+#: add_route_dialog.cc:80 add_route_dialog.cc:207
+msgid "Busses"
+msgstr "Audiobusse"
+
+#: add_route_dialog.cc:83 add_route_dialog.cc:559
+msgid "First"
+msgstr "Zuerst"
+
+#: add_route_dialog.cc:84 add_route_dialog.cc:563
+msgid "Before Selection"
+msgstr "Vor Auswahl"
+
+#: add_route_dialog.cc:85 add_route_dialog.cc:561
+msgid "After Selection"
+msgstr "Nach Auswahl"
+
+#: add_route_dialog.cc:86
+msgid "Last"
+msgstr "Zuletzt"
+
+#: add_route_dialog.cc:103
+msgid "Add:"
+msgstr "Erstelle:"
+
+#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
+#: video_server_dialog.cc:121
+msgid "<b>Options</b>"
+msgstr "<b>Optionen</b>"
+
+#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
+#: route_group_dialog.cc:71
+msgid "Name:"
+msgstr "Name:"
+
+#: add_route_dialog.cc:156
+msgid "Group:"
+msgstr "Gruppe:"
+
+#: add_route_dialog.cc:162
+msgid "Insert:"
+msgstr "Insert:"
+
+#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
+#: ardour_ui_ed.cc:548 engine_dialog.cc:240 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2283 rc_option_editor.cc:2301
+#: rc_option_editor.cc:2303 rc_option_editor.cc:2311 rc_option_editor.cc:2313
+#: rc_option_editor.cc:2331 rc_option_editor.cc:2344 rc_option_editor.cc:2346
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2393 rc_option_editor.cc:2395
+#: rc_option_editor.cc:2397 rc_option_editor.cc:2405 rc_option_editor.cc:2413
+#: rc_option_editor.cc:2415 rc_option_editor.cc:2423
+msgid "Audio"
+msgstr "Audio"
+
+#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
+#: editor_actions.cc:109 engine_dialog.cc:242 missing_file_dialog.cc:56
+#: rc_option_editor.cc:2558 rc_option_editor.cc:2568 rc_option_editor.cc:2576
+#: rc_option_editor.cc:2584 rc_option_editor.cc:2593 rc_option_editor.cc:2601
+#: rc_option_editor.cc:2609 rc_option_editor.cc:2617 rc_option_editor.cc:2626
+#: rc_option_editor.cc:2635 rc_option_editor.cc:2644 rc_option_editor.cc:2652
+#: rc_option_editor.cc:2660 rc_option_editor.cc:2668 rc_option_editor.cc:2691
+msgid "MIDI"
+msgstr "MIDI"
+
+#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+msgid "Audio+MIDI"
+msgstr "Audio+MIDI"
+
+#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+msgid "Bus"
+msgstr "Bus"
+
+#: add_route_dialog.cc:268
+msgid ""
+"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
+"both audio and MIDI input data\n"
+"\n"
+"If you do not plan to use such a plugin, then use a normal audio or MIDI "
+"track instead."
+msgstr ""
+"Audio+MIDI Spuren sind <b>NUR</b> für den Gebrauch mit Plugins gedacht, die "
+"sowohl Audio als auch MIDI Eingangsdaten benutzen\n"
+"\n"
+"Falls Sie nicht vorhaben, so ein Plugin zu benutzen, verwenden Sie "
+"stattdessen eine normale Audio- oder MIDI-Spur"
+
+#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:431
+#: editor_rulers.cc:251 time_axis_view.cc:1385
+msgid "Normal"
+msgstr "Normal"
+
+#: add_route_dialog.cc:330 add_route_dialog.cc:348
+msgid "Non Layered"
+msgstr "Non Layered"
+
+#: add_route_dialog.cc:331 add_route_dialog.cc:350
+msgid "Tape"
+msgstr "Band"
+
+#: add_route_dialog.cc:431 monitor_section.cc:296
+msgid "Mono"
+msgstr "Mono"
+
+#: add_route_dialog.cc:435
+msgid "Stereo"
+msgstr "Stereo"
+
+#: add_route_dialog.cc:459
+msgid "3 Channel"
+msgstr "3 Kanäle"
+
+#: add_route_dialog.cc:463
+msgid "4 Channel"
+msgstr "4 Kanäle"
+
+#: add_route_dialog.cc:467
+msgid "5 Channel"
+msgstr "5 Kanäle"
+
+#: add_route_dialog.cc:471
+msgid "6 Channel"
+msgstr "6 Kanäle"
+
+#: add_route_dialog.cc:475
+msgid "8 Channel"
+msgstr "8 Kanäle"
+
+#: add_route_dialog.cc:479
+msgid "12 Channel"
+msgstr "12 Kanäle"
+
+#: add_route_dialog.cc:483 mixer_strip.cc:1898 mixer_strip.cc:2306
+msgid "Custom"
+msgstr "Benutzerdefiniert"
+
+#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+msgid "New Group..."
+msgstr "Neue Gruppe..."
+
+#: add_route_dialog.cc:520 route_group_menu.cc:85
+msgid "No Group"
+msgstr "Keine Gruppe"
+
+#: ambiguous_file_dialog.cc:30
+msgid "Ambiguous File"
+msgstr "Mehrmals gefundene Datei"
+
+#: ambiguous_file_dialog.cc:35
+msgid ""
+"%1 has found the file <i>%2</i> in the following places:\n"
+"\n"
+msgstr ""
+"%1 hat die Datei <i>%2</i> an den folgenden Orten gefunden:\n"
+"\n"
+
+#: ambiguous_file_dialog.cc:44
+msgid ""
+"\n"
+"\n"
+"Please select the path that you want to get the file from."
+msgstr ""
+"\n"
+"\n"
+"Bitte wähle den Pfad der gewünschten Datei aus."
+
+#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+msgid "Done"
+msgstr "Fertig"
+
+#: analysis_window.cc:46
+msgid "Signal source"
+msgstr "Signalquelle"
+
+#: analysis_window.cc:47
+msgid "Selected ranges"
+msgstr "Ausgewählte Bereiche"
+
+#: analysis_window.cc:48
+msgid "Selected regions"
+msgstr "Ausgewählte Regionen"
+
+#: analysis_window.cc:50
+msgid "Display model"
+msgstr "Anzeigetyp"
+
+#: analysis_window.cc:51
+msgid "Composite graphs for each track"
+msgstr "Graphen für jede Spur einzeln"
+
+#: analysis_window.cc:52
+msgid "Composite graph of all tracks"
+msgstr "Graphen aller Spuren zusammenfassen"
+
+#: analysis_window.cc:54
+msgid "Show frequency power range"
+msgstr "Leistungsspektrum anzeigen"
+
+#: analysis_window.cc:55
+msgid "Normalize values"
+msgstr "Normalisieren"
+
+#: analysis_window.cc:59
+msgid "FFT analysis window"
+msgstr "FFT-Analysefenster"
+
+#: analysis_window.cc:60 editor.cc:1835
+msgid "Spectral Analysis"
+msgstr "FFT-Analyse"
+
+#: analysis_window.cc:67 editor_actions.cc:142 session_metadata_dialog.cc:667
+msgid "Track"
+msgstr "Spur"
+
+#: analysis_window.cc:68 editor_actions.cc:657 mixer_ui.cc:131
+#: mixer_ui.cc:1874
+msgid "Show"
+msgstr "Anzeigen"
+
+#: analysis_window.cc:135
+msgid "Re-analyze data"
+msgstr "Daten erneut analysieren"
+
+#: ardour_button.cc:820
+msgid "button cannot watch state of non-existing Controllable\n"
+msgstr ""
+"Schaltfläche kann den Status des nichtexistenten Kontrollzieles nicht "
+"verfolgen\n"
+
+#: ardour_button.cc:1088
+msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+
+#: ardour_ui.cc:172
+msgid ""
+"%1 %2.x has discovered configuration files from %1 %3.x.\n"
+"\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
+"\n"
+"(This will require you to restart %1.)"
+msgstr ""
+"%1 %2.x hat Konfigurationsdateien von %1 %3.x gefunden.\n"
+"\n"
+"Möchten Sie diese Dateien zur Benutzung von %1 %2.x kopieren?\n"
+"\n"
+"(Dies erfordert einen Neustart von %1.)"
+
+#: ardour_ui.cc:252 editor_actions.cc:651 region_editor.cc:51
+msgid "Audition"
+msgstr "Vorhören"
+
+#: ardour_ui.cc:253 editor_actions.cc:136 mixer_strip.cc:2078
+#: monitor_section.cc:376 rc_option_editor.cc:2433 route_time_axis.cc:254
+#: route_time_axis.cc:2739
+msgid "Solo"
+msgstr "Solo"
+
+#: ardour_ui.cc:254 rc_option_editor.cc:1192
+msgid "Feedback"
+msgstr "Feedback"
+
+#: ardour_ui.cc:265 speaker_dialog.cc:36
+msgid "Speaker Configuration"
+msgstr "Lautsprechereinstellung"
+
+#: ardour_ui.cc:266 keyeditor.cc:53
+msgid "Key Bindings"
+msgstr "Tastaturkürzel"
+
+#: ardour_ui.cc:267
+msgid "Preferences"
+msgstr "Globale Einstellungen"
+
+#: ardour_ui.cc:268 ardour_ui.cc:275
+msgid "Add Tracks/Busses"
+msgstr "Spuren/Busse hinzufügen"
+
+#: ardour_ui.cc:269
+msgid "About"
+msgstr "Über..."
+
+#: ardour_ui.cc:270 location_ui.cc:1141 session_option_editor.cc:189
+#: session_option_editor.cc:195 session_option_editor.cc:202
+msgid "Locations"
+msgstr "Dateiorte"
+
+#: ardour_ui.cc:271 route_params_ui.cc:59 route_params_ui.cc:630
+msgid "Tracks and Busses"
+msgstr "Spuren/Busse"
+
+#: ardour_ui.cc:272 engine_dialog.cc:74
+msgid "Audio/MIDI Setup"
+msgstr "Audio/MIDI Einstellungen"
+
+#: ardour_ui.cc:273
+msgid "Video Export Dialog"
+msgstr "Videoexport-Dialog"
+
+#: ardour_ui.cc:274
+msgid "Properties"
+msgstr "Projekteinstellungen"
+
+#: ardour_ui.cc:276 bundle_manager.cc:264
+msgid "Bundle Manager"
+msgstr "Bundle Manager"
+
+#: ardour_ui.cc:277 big_clock_window.cc:37
+msgid "Big Clock"
+msgstr "Große Zeitanzeige"
+
+#: ardour_ui.cc:278
+msgid "Audio Connections"
+msgstr "Audio-Verbindungen"
+
+#: ardour_ui.cc:279
+msgid "MIDI Connections"
+msgstr "MIDI-Verbindungen"
+
+#: ardour_ui.cc:293
+msgid "Your configuration files were copied. You can now restart %1."
+msgstr ""
+"Ihre Konfigurationsdateien wurden kopiert. Sie können jetzt %1 neu starten."
+
+#: ardour_ui.cc:519
+msgid ""
+"The audio backend was shutdown because:\n"
+"\n"
+"%1"
+msgstr ""
+"Das Audiobackend wurde aus folgendem Grund beendet:\n"
+"\n"
+"%1"
+
+#: ardour_ui.cc:521
+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 hat\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:545
+msgid ""
+"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
+"Please see the log window for further details."
+msgstr ""
+"Audio Unit Plugin Scan fehlgeschlagen. Automatische AU Scans wurden "
+"deaktiviert. Weitere Einzelheiten finden Sie im Logfenster."
+
+#: ardour_ui.cc:546
+msgid "Audio Unit Plugin Scan Failed:"
+msgstr "Audio Unit Plugin Scan fehlgeschlagen:"
+
+#: ardour_ui.cc:877
+msgid "NSM server did not announce itself"
+msgstr "Der NSM Server hat sich nicht angemeldet"
+
+#: ardour_ui.cc:890
+msgid "NSM: no client ID provided"
+msgstr "NSM: keine Client-ID verfügbar"
+
+#: ardour_ui.cc:897
+msgid "NSM: no session created"
+msgstr "NSM: kein Projekt erzeugt"
+
+#: ardour_ui.cc:920
+msgid "NSM: initialization failed"
+msgstr "NSM: Initialisierung gescheitert"
+
+#: ardour_ui.cc:952
+msgid "Free/Demo Version Warning"
+msgstr "Demoversionswarnung"
+
+#: ardour_ui.cc:954
+msgid "Subscribe and support development of %1"
+msgstr "%1 abonnieren und die Entwicklung unterstützen"
+
+#: ardour_ui.cc:955
+msgid "Don't warn me about this again"
+msgstr "Nicht noch einmal warnen"
+
+#: ardour_ui.cc:957
+msgid ""
+"<span weight=\"bold\" size=\"large\">%1</span>\n"
+"\n"
+"<b>%2</b>\n"
+"\n"
+"<i>%3</i>\n"
+"\n"
+"%4"
+msgstr ""
+"<span weight=\"bold\" size=\"large\">%1</span>\n"
+"\n"
+"<b>%2</b>\n"
+"\n"
+"<i>%3</i>\n"
+"\n"
+"%4"
+
+#: ardour_ui.cc:958
+msgid "This is a free/demo version of %1"
+msgstr "Dies ist eine freie Demoversion von %1"
+
+#: ardour_ui.cc:959
+msgid "It will not restore OR save any plugin settings"
+msgstr "Sie kann keine Plugin-Einstellungen speichern oder laden"
+
+#: ardour_ui.cc:960
+msgid ""
+"If you load an existing session with plugin settings\n"
+"they will not be used and will be lost."
+msgstr ""
+"Wenn Sie ein existierendes Projekt mit Plugin-Einstellungen laden, werden "
+"diese nicht benutzt und beim Speichern verloren gehen."
+
+#: ardour_ui.cc:962 plugin_ui.cc:579
+msgid ""
+"To get full access to updates without this limitation\n"
+"consider becoming a subscriber for a low cost every month."
+msgstr ""
+"Um vollen Zugriff auf Updates ohne diese Einschränkung zu erhalten, erwägen "
+"Sie, uns durch ein Abonnement mit einem geringen monatlichen Betrag zu "
+"unterstützen."
+
+#: ardour_ui.cc:972
+msgid "Quit now"
+msgstr "Jetzt beenden"
+
+#: ardour_ui.cc:973
+msgid "Continue using %1"
+msgstr "%1 weiterhin benutzen"
+
+#: ardour_ui.cc:1006 startup.cc:346
+msgid "%1 is ready for use"
+msgstr "%1 ist nun bereit"
+
+#: ardour_ui.cc:1048
+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"
+"\n"
+"You can view the memory limit with 'ulimit -l', and it is normally "
+"controlled by %2"
+msgstr ""
+"WARNUNG: Ihr System hat eine Begrenzung für die Reservierung von "
+"Arbeitsspeicher eingestellt. Dies könnte dazu führen, dass %1 der Speicher "
+"ausgeht bevor die Systembegrenzung erreicht ist.\n"
+"\n"
+"Sie können die Speicherbegrenzung mit 'ulimit -l' einsehen und normalerweise "
+"in %2 verändern."
+
+#: ardour_ui.cc:1065
+msgid "Do not show this window again"
+msgstr "Diese Meldung nicht erneut anzeigen"
+
+#: ardour_ui.cc:1109
+msgid "Don't quit"
+msgstr "Abbrechen"
+
+#: ardour_ui.cc:1110
+msgid "Just quit"
+msgstr "Beenden ohne zu speichern"
+
+#: ardour_ui.cc:1111 ardour_ui.cc:4903
+msgid "Save and quit"
+msgstr "Speichern und beenden"
+
+#: ardour_ui.cc:1121
+msgid ""
+"%1 was unable to save your session.\n"
+"\n"
+"If you still wish to quit, please use the\n"
+"\n"
+"\"Just quit\" option."
+msgstr ""
+"%1 konnte das Projekt nicht speichern.\n"
+"
\n"
+"Wenn Sie trotzdem beenden wollen, wählen Sie bitte\n"
+"\n"
+"\"Trotzdem beenden\"."
+
+#: ardour_ui.cc:1171
+msgid "Unsaved Session"
+msgstr "Nicht gespeichertes Projekt"
+
+#: ardour_ui.cc:1192
+msgid ""
+"The session \"%1\"\n"
+"has not been saved.\n"
+"\n"
+"Any changes made this time\n"
+"will be lost unless you save it.\n"
+"\n"
+"What do you want to do?"
+msgstr ""
+"Das Projekt \"%1\"\n"
+"wurde nicht gespeichert.\n"
+"\n"
+"Alle Änderungen werden verloren\n"
+"gehen, wenn Sie es nicht speichern.\n"
+"\n"
+"Wie wollen Sie vorgehen?"
+
+#: ardour_ui.cc:1195
+msgid ""
+"The snapshot \"%1\"\n"
+"has not been saved.\n"
+"\n"
+"Any changes made this time\n"
+"will be lost unless you save it.\n"
+"\n"
+"What do you want to do?"
+msgstr ""
+"Der Schnappschuss \"%1\"\n"
+"wurde nicht gespeichert.\n"
+"\n"
+"Alle Änderungen werden verloren\n"
+"gehen, wenn Sie ihn nicht speichern.\n"
+"\n"
+"Wie wollen Sie vorgehen?"
+
+#: ardour_ui.cc:1209
+msgid "Prompter"
+msgstr "Frage"
+
+#: ardour_ui.cc:1322 ardour_ui.cc:1330
+msgid "Audio: <span foreground=\"red\">none</span>"
+msgstr "Audio: <span foreground=\"red\">Kein</span>"
+
+#: ardour_ui.cc:1334
+#, c-format
+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:1338
+#, c-format
+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:1356 export_video_dialog.cc:76
+msgid "File:"
+msgstr "Datei:"
+
+#: ardour_ui.cc:1360
+msgid "BWF"
+msgstr "BWF"
+
+#: ardour_ui.cc:1363
+msgid "WAV"
+msgstr "WAV"
+
+#: ardour_ui.cc:1366
+msgid "WAV64"
+msgstr "WAV64"
+
+#: ardour_ui.cc:1369 session_option_editor.cc:185
+msgid "CAF"
+msgstr "CAF"
+
+#: ardour_ui.cc:1372
+msgid "AIFF"
+msgstr "AIFF"
+
+#: ardour_ui.cc:1375
+msgid "iXML"
+msgstr "iXML"
+
+#: ardour_ui.cc:1378
+msgid "RF64"
+msgstr "RF64"
+
+#: ardour_ui.cc:1386
+msgid "32-float"
+msgstr "32-float"
+
+#: ardour_ui.cc:1389
+msgid "24-int"
+msgstr "24-int"
+
+#: ardour_ui.cc:1392
+msgid "16-int"
+msgstr "16-int"
+
+#: ardour_ui.cc:1413
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr "X: <span foreground=\"%s\">>10K</span>"
+
+#: ardour_ui.cc:1415
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr "X: <span foreground=\"%s\">%u</span>"
+
+#: ardour_ui.cc:1418
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr "X: <span foreground=\"%s\">?</span>"
+
+#: ardour_ui.cc:1421
+msgid "Audio dropouts. Shift+click to reset"
+msgstr "Audio Dropouts. Zum Zurücksetzen Shift+Klick"
+
+#: ardour_ui.cc:1434
+#, c-format
+msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
+msgstr "DSP: <span foreground=\"%s\">%5.1f%%</span>"
+
+#: ardour_ui.cc:1453
+#, c-format
+msgid ""
+"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
+"%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
+"\">%<PRIu32>%%</span>"
+msgstr ""
+"Puffer: <span foreground=\"green\">p:</span><span foreground=\"%s\">%<PRIu32>"
+"%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s\">"
+"%<PRIu32>%%</span>"
+
+#: ardour_ui.cc:1494
+msgid "Disk: <span foreground=\"green\">Unknown</span>"
+msgstr "Disk: <span foreground=\"green\">Unbekannt</span>"
+
+#: ardour_ui.cc:1496
+msgid "Disk: <span foreground=\"green\">24hrs+</span>"
+msgstr "Disk: <span foreground=\"green\">24h+</span>"
+
+#: ardour_ui.cc:1514
+msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
+msgstr "Disk: <span foreground=\"green\">>24 h</span>"
+
+#: ardour_ui.cc:1525
+#, c-format
+msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
+msgstr "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
+
+#: ardour_ui.cc:1551
+#, c-format
+msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
+msgstr "TC: <span foreground=\"%s\">%s</span>"
+
+#: ardour_ui.cc:1672 ardour_ui.cc:1681 session_dialog.cc:318
+#: session_dialog.cc:323
+msgid "Recent Sessions"
+msgstr "Zuletzt verwendete Projekte"
+
+#: ardour_ui.cc:1760
+msgid ""
+"%1 is not connected to any audio backend.\n"
+"You cannot open or close sessions in this condition"
+msgstr ""
+"%1 ist derzeit mit keinem Audiobackend verbunden.\n"
+"Daher können keine Projekte geöffnet oder geschlossen werden."
+
+#: ardour_ui.cc:1784
+msgid "Open Session"
+msgstr "Projekt öffnen"
+
+#: ardour_ui.cc:1809 session_dialog.cc:349 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:858
+msgid "%1 sessions"
+msgstr "%1 Projekte"
+
+#: ardour_ui.cc:1846
+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:1854
+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:1860 ardour_ui.cc:1921
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+"Es sind nicht genügend Ports verfügbar,\n"
+"um neue Spuren oder Busse zu erzeugen.\n"
+"Sie sollten %1 sichern, beenden und\n"
+" mit mehr Ports neustarten."
+
+#: ardour_ui.cc:1895
+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:1904
+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:1913
+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:2066
+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."
+msgstr ""
+"Bitte fügen Sie, bevor Sie aufnehmen, mindestens \n"
+"eine oder mehrere Spur hinzu. Die geht über \"Spur/Bus hinzufügen\"\n"
+"im Menüpunkt Projekt."
+
+#: ardour_ui.cc:2444
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
+msgstr "%<PRId64> von %<PRId64> kopiert"
+
+#: ardour_ui.cc:2498 save_as_dialog.cc:33
+msgid "Save As"
+msgstr "Speichern unter"
+
+#: ardour_ui.cc:2526
+msgid "Save As failed: %1"
+msgstr "Sichern unter fehlgeschlagen: %1"
+
+#: ardour_ui.cc:2548
+msgid "Save as..."
+msgstr "Speichern unter..."
+
+#: ardour_ui.cc:2549 ardour_ui.cc:2628
+msgid "New session name"
+msgstr "Neuer Projektname"
+
+#: ardour_ui.cc:2551
+msgid "Take Snapshot"
+msgstr "Schnappschuss machen"
+
+#: ardour_ui.cc:2552
+msgid "Name of new snapshot"
+msgstr "Name für neuen Schnappschuss"
+
+#: ardour_ui.cc:2577
+msgid ""
+"To ensure compatibility with various systems\n"
+"snapshot names may not contain a '%1' character"
+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:2589
+msgid "Confirm Snapshot Overwrite"
+msgstr "Überschreiben des Schnappschusses bestätigen"
+
+#: ardour_ui.cc:2590
+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:2593 utils_videotl.cc:74
+msgid "Overwrite"
+msgstr "Überschreiben"
+
+#: ardour_ui.cc:2627
+msgid "Rename Session"
+msgstr "Projekt umbenennen"
+
+#: ardour_ui.cc:2642 ardour_ui.cc:3056 ardour_ui.cc:3094
+msgid ""
+"To ensure compatibility with various systems\n"
+"session names may not contain a '%1' character"
+msgstr ""
+"Um die Kompatibilität mit verschiedenen Systemen sicher zu stellen,\n"
+"dürfen Projektnamen kein '%1'-Zeichen enthalten"
+
+#: ardour_ui.cc:2650
+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:2659
+msgid ""
+"Renaming this session failed.\n"
+"Things could be seriously messed up at this point"
+msgstr ""
+"Das Umbenennen des Projekts ist fehlgeschlagen.\n"
+"Dies könnte auf schwerwiegende Probleme hinweisen."
+
+#: ardour_ui.cc:2774
+msgid "Save Template"
+msgstr "Als Vorlage Speichern"
+
+#: ardour_ui.cc:2775
+msgid "Name for template:"
+msgstr "Name für Vorlage"
+
+#: ardour_ui.cc:2776
+msgid "-template"
+msgstr "-Vorlage"
+
+#: ardour_ui.cc:2813
+msgid ""
+"This session\n"
+"%1\n"
+"already exists. Do you want to open it?"
+msgstr ""
+"Dieses Projekt\n"
+"%1\n"
+"existiert bereits. Wollen Sie es öffnen?"
+
+#: ardour_ui.cc:2823
+msgid "Open Existing Session"
+msgstr "Vorhandenes Projekt öffnen"
+
+#: ardour_ui.cc:3084
+msgid "There is no existing session at \"%1\""
+msgstr "Es gibt kein Projekt in: \"%1\""
+
+#: ardour_ui.cc:3176
+msgid "Please wait while %1 loads your session"
+msgstr "Bitte warten Sie, während %1 das Projekt lädt"
+
+#: ardour_ui.cc:3191
+msgid "Port Registration Error"
+msgstr "Fehler bei der Registrierung von Ports"
+
+#: ardour_ui.cc:3192
+msgid "Click the Close button to try again."
+msgstr "Klicken Sie auf Schließen, um es erneut zu versuchen."
+
+#: ardour_ui.cc:3213
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "Projekt \"%1 (Schnappschuss %2)\" konnte nicht geladen werden."
+
+#: ardour_ui.cc:3219
+msgid "Loading Error"
+msgstr "Fehler beim Laden"
+
+#: ardour_ui.cc:3241
+msgid ""
+"This session has been opened in read-only mode.\n"
+"\n"
+"You will not be able to record or save."
+msgstr ""
+"Dieses Projekt wurde im Nur-Lesen Modus geöffnet.\n"
+"\n"
+"Aufnehmen oder Speichern wird nicht möglich sein."
+
+#: ardour_ui.cc:3246
+msgid "Read-only Session"
+msgstr "Schreibgeschütztes Projekt"
+
+#: ardour_ui.cc:3312
+msgid "Could not create session in \"%1\""
+msgstr "Konnte kein Projekt in \"%1\" anlegen"
+
+#: ardour_ui.cc:3461
+msgid "No files were ready for clean-up"
+msgstr "Keine Audiodateien zum Aufräumen vorhanden"
+
+#: ardour_ui.cc:3465 ardour_ui.cc:3475 ardour_ui.cc:3608 ardour_ui.cc:3615
+#: ardour_ui_ed.cc:103
+msgid "Clean-up"
+msgstr "Aufräumen"
+
+#: ardour_ui.cc:3466
+msgid ""
+"If this seems suprising, \n"
+"check for any existing snapshots.\n"
+"These may still include regions that\n"
+"require some unused files to continue to exist."
+msgstr ""
+"Falls trotzdem nicht benötigte Dateien\n"
+"existieren, welche hier nicht erkannt werden,\n"
+"sind sie wahrscheinlich noch in einem\n"
+"älteren Schnappschuss als Region eingebunden."
+
+#: ardour_ui.cc:3525
+msgid "kilo"
+msgstr "kilo"
+
+#: ardour_ui.cc:3528
+msgid "mega"
+msgstr "mega"
+
+#: ardour_ui.cc:3531
+msgid "giga"
+msgstr "giga"
+
+#: ardour_ui.cc:3536
+msgid ""
+"The following file was deleted from %2,\n"
+"releasing %3 %4bytes of disk space"
+msgid_plural ""
+"The following %1 files were deleted from %2,\n"
+"releasing %3 %4bytes of disk space"
+msgstr[0] ""
+"Die folgende Datei wurde von %2\n"
+"gelöscht und gab %3 %4bytes Speicherplatz frei"
+msgstr[1] ""
+"Die folgenden %1 Dateien wurden von %2\n"
+"gelöscht und gaben %3 %4bytes Speicherplatz frei"
+
+#: ardour_ui.cc:3543
+msgid ""
+"The following file was not in use and \n"
+"has been moved to: %2\n"
+"\n"
+"After a restart of %5\n"
+"\n"
+"<span face=\"mono\">Session -> Clean-up -> Flush Wastebasket</span>\n"
+"\n"
+"will release an additional %3 %4bytes of disk space.\n"
+msgid_plural ""
+"The following %1 files were not in use and \n"
+"have been moved to: %2\n"
+"\n"
+"After a restart of %5\n"
+"\n"
+"<span face=\"mono\">Session -> Clean-up -> Flush Wastebasket</span>\n"
+"\n"
+"will release an additional %3 %4bytes of disk space.\n"
+msgstr[0] ""
+"Die folgende Datei wurde nicht benutzt\n"
+"und wurde nach %2 verschoben.\n"
+"\n"
+"Nach einem Neustart von %5 kann über\n"
+"\n"
+"<span face=\"mono\">Projekt -> Aufräumen -> Mülleimer leeren</span>\n"
+"\n"
+"%3 %4bytes Speicherplatz freigegeben werden.\n"
+msgstr[1] ""
+"Die folgenden %1 Dateien waren unbenutzt\n"
+"und wurden nach %2 verschoben.\n"
+"\n"
+"Nach einem Neustart von %5 kann über\n"
+"\n"
+"<span face=\"mono\">Projekt -> Aufräumen -> Mülleimer leeren</span>\n"
+"\n"
+"%3 %4bytes Speicherplatz freigegeben werden.\n"
+
+#: ardour_ui.cc:3603
+msgid "Are you sure you want to clean-up?"
+msgstr "Wollen Sie wirklich aufräumen?"
+
+#: ardour_ui.cc:3610
+msgid ""
+"Clean-up is a destructive operation.\n"
+"ALL undo/redo information will be lost if you clean-up.\n"
+"Clean-up will move all unused files to a \"dead\" location."
+msgstr ""
+"Das Aufräumen ist eine destruktive Operation.\n"
+"SÄMTLICHE Wiederherstellungsinformationen gehen verloren, wenn Sie "
+"aufräumen.\n"
+"Nach dem Aufräumen werden alle nicht benötigten Audiodateien in den \"dead "
+"sounds\" Ordner verschoben."
+
+#: ardour_ui.cc:3618
+msgid "CleanupDialog"
+msgstr "Aufräumdialog"
+
+#: ardour_ui.cc:3648
+msgid "Cleaned Files"
+msgstr "Aufgeräumte Dateien"
+
+#: ardour_ui.cc:3665
+msgid "deleted file"
+msgstr "gelöschte Datei"
+
+#: ardour_ui.cc:3803
+msgid "Video-Server was not launched by %1. The request to stop it is ignored."
+msgstr ""
+"Der Video-Server wurde nicht von %1 gestartet. Die Aufforderung ihn zu "
+"beenden wird ignoriert."
+
+#: ardour_ui.cc:3807
+msgid "Stop Video-Server"
+msgstr "Video-Server anhalten"
+
+#: ardour_ui.cc:3808
+msgid "Do you really want to stop the Video Server?"
+msgstr "Wollen Sie den Video-Server wirklich anhalten?"
+
+#: ardour_ui.cc:3811
+msgid "Yes, Stop It"
+msgstr "Ja, anhalten."
+
+#: ardour_ui.cc:3837
+msgid "The Video Server is already started."
+msgstr "Der Video-Server läuft bereits"
+
+#: ardour_ui.cc:3839
+msgid ""
+"An external Video Server is configured and can be reached. Not starting a "
+"new instance."
+msgstr ""
+"Ein externer Video-Server wurde konfiguriert, ist aber nicht erreichbar. Es "
+"wird keine neue Instanz gestartet."
+
+#: ardour_ui.cc:3847 ardour_ui.cc:3952
+msgid ""
+"Could not connect to the Video Server. Start it or configure its access URL "
+"in Preferences."
+msgstr ""
+"Es konnte keine Verbindung zum Video-Server hergestellt werden.Sie müssen "
+"ihn vorher starten oder die URL für den Zugriff in den Einstellungen "
+"anpassen."
+
+#: ardour_ui.cc:3877
+msgid "Specified docroot is not an existing directory."
+msgstr "Das eingestellte Dokumentenverzeichnis existiert nicht."
+
+#: ardour_ui.cc:3883 ardour_ui.cc:3889
+msgid "Given Video Server is not an executable file."
+msgstr "Der eingestellte Video-Server ist keine ausführbare Datei."
+
+#: ardour_ui.cc:3923
+msgid "Cannot launch the video-server"
+msgstr "Kann den Videoserver nicht starten "
+
+#: ardour_ui.cc:3933
+msgid "Video-server was started but does not respond to requests..."
+msgstr "Viideoserver wurde gestartet, reagiert aber nicht auf Anfragen..."
+
+#: ardour_ui.cc:3978 editor_audio_import.cc:644
+msgid "could not open %1"
+msgstr "Konnte %1 nicht öffnen"
+
+#: ardour_ui.cc:3982
+msgid "no video-file selected"
+msgstr "Es wurde keine Videodatei ausgewählt."
+
+#: ardour_ui.cc:4174
+msgid "xrun"
+msgstr "xrun"
+
+#: ardour_ui.cc:4183
+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:4212
+msgid ""
+"The disk system on your computer\n"
+"was not able to keep up with %1.\n"
+"\n"
+"Specifically, it failed to write data to disk\n"
+"quickly enough to keep up with recording.\n"
+msgstr ""
+"Ihre Festplatte war nicht schnell genug,\n"
+"um %1 zu folgen.\n"
+"\n"
+"Die Daten konnten nicht schnell genug geschrieben\n"
+"werden, um die Aufnahme fortzuführen.\n"
+
+#: ardour_ui.cc:4285
+msgid "Scanning for plugins"
+msgstr "Suche nach Plugins"
+
+#: ardour_ui.cc:4287
+msgid "Cancel plugin scan"
+msgstr "Plugin-Suche abbrechen"
+
+#: ardour_ui.cc:4296
+msgid "Stop Timeout"
+msgstr "Stopp-Timeout"
+
+#: ardour_ui.cc:4303
+msgid "Scan Timeout"
+msgstr "Such-Timeout"
+
+#: ardour_ui.cc:4347
+msgid ""
+"The disk system on your computer\n"
+"was not able to keep up with %1.\n"
+"\n"
+"Specifically, it failed to read data from disk\n"
+"quickly enough to keep up with playback.\n"
+msgstr ""
+"Ihre Festplatte war nicht schnell genug,\n"
+"um %1 zu folgen.\n"
+"\n"
+"Die Daten konnten nicht schnell genug gelesen\n"
+"werden, um die Wiedergabe aufrechtzuerhalten.\n"
+
+#: ardour_ui.cc:4387
+msgid "Crash Recovery"
+msgstr "Absturz-Wiederherstellung"
+
+#: ardour_ui.cc:4388
+msgid ""
+"This session appears to have been in the\n"
+"middle of recording when %1 or\n"
+"the computer was shutdown.\n"
+"\n"
+"%1 can recover any captured audio for\n"
+"you, or it can ignore it. Please decide\n"
+"what you would like to do.\n"
+msgstr ""
+"Es scheint, dass dieses Projekt während\n"
+"einer Aufnahme abgebrochen oder\n"
+"geschlossen wurde.\n"
+"\n"
+"%1 kann die aufgenommenen Audiodaten\n"
+"für Sie wiederherstellen oder sie verwerfen.\n"
+"Bitte entscheiden Sie, wie Sie vorgehen möchten.\n"
+
+#: ardour_ui.cc:4400
+msgid "Ignore crash data"
+msgstr "Daten verwerfen"
+
+#: ardour_ui.cc:4401
+msgid "Recover from crash"
+msgstr "Daten wiederherstellen"
+
+#: ardour_ui.cc:4421
+msgid "Sample Rate Mismatch"
+msgstr "Samplerate passt nicht"
+
+#: ardour_ui.cc:4422
+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"
+"audio may be played at the wrong sample rate.\n"
+msgstr ""
+"Dieses Projekt wurde mit einer Samplerate von %1 Hz erstellt.\n"
+"\n"
+"%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:4431
+msgid "Do not load session"
+msgstr "Projekt nicht laden"
+
+#: ardour_ui.cc:4432
+msgid "Load session anyway"
+msgstr "Projekt trotzdem laden"
+
+#: ardour_ui.cc:4459
+msgid "Could not disconnect from Audio/MIDI engine"
+msgstr "Konnte Verbindung mit der Audio/MIDI Engine nicht trennen"
+
+#: ardour_ui.cc:4476 ardour_ui.cc:4479
+msgid "Could not reconnect to the Audio/MIDI engine"
+msgstr "Konnte nicht zur Audio/MIDI Engine wiederverbinden"
+
+#: ardour_ui.cc:4763
+msgid ""
+"%4This is a session from an older version of %3%5\n"
+"\n"
+"%3 has copied the old session file\n"
+"\n"
+"%6%1%7\n"
+"\n"
+"to\n"
+"\n"
+"%6%2%7\n"
+"\n"
+"From now on, use the -2000 version with older versions of %3"
+msgstr ""
+"%4Dies ist ein Projekt, das mit einer älteren Version von %3 erstellt wurde"
+"%5\n"
+"\n"
+"%3 hat die alte Projektdatei\n"
+"\n"
+"%6%1%7\n"
+"\n"
+"nach\n"
+"\n"
+"%6%2%7 kopiert.\n"
+"\n"
+"Benutzen Sie von nun an die -2000 Version mit älteren Versionen von %3"
+
+#: ardour_ui.cc:4872
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
+"Dies ist eine freie Demoversion von %1. Sie hat sich gerade stummgeschaltet."
+
+#: ardour_ui.cc:4878
+msgid "%1 is now silent"
+msgstr "%1 ist nun stumm"
+
+#: ardour_ui.cc:4880
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+"Bitte ziehen Sie in Erwägung, für eine Kopie von %1 einen Geldbetrag - in "
+"beliebiger Höhe - zu zahlen."
+
+#: ardour_ui.cc:4881
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+"Besser noch, werden Sie ein Abonnent - Abonnements beginnen bei US$1 pro "
+"Monat."
+
+#: ardour_ui.cc:4882
+msgid "Pay for a copy (via the web)"
+msgstr "Für eine Kopie zahlen (über das WWW)"
+
+#: ardour_ui.cc:4883
+msgid "Become a subscriber (via the web)"
+msgstr "Abonnent werden (über das Web)"
+
+#: ardour_ui.cc:4902
+msgid "Remain silent"
+msgstr "Stumm bleiben"
+
+#: ardour_ui.cc:4904
+msgid "Give me more time"
+msgstr "Ich möchte mehr Zeit haben"
+
+#: ardour_ui2.cc:73
+msgid "UI: cannot setup editor"
+msgstr "Der Editor konnte nicht initialisiert werden."
+
+#: ardour_ui2.cc:78
+msgid "UI: cannot setup mixer"
+msgstr "Der Mixer konnte nicht initialisiert werden."
+
+#: ardour_ui2.cc:83
+msgid "UI: cannot setup meterbridge"
+msgstr "UI: konnte Meterbridge nicht einrichten."
+
+#: ardour_ui2.cc:128
+msgid "Play from playhead"
+msgstr "Wiedergabe ab Positionszeiger"
+
+#: ardour_ui2.cc:129
+msgid "Stop playback"
+msgstr "Wiedergabe anhalten"
+
+#: ardour_ui2.cc:130
+msgid "Toggle record"
+msgstr "Aufnahmestatus aktivieren"
+
+#: ardour_ui2.cc:131
+msgid "Play range/selection"
+msgstr "Bereich/Auswahl wiedergeben"
+
+#: ardour_ui2.cc:132
+msgid "Go to start of session"
+msgstr "Zum Anfang des Projekts springen"
+
+#: ardour_ui2.cc:133
+msgid "Go to end of session"
+msgstr "Zum Ende des Projekts springen"
+
+#: ardour_ui2.cc:134
+msgid "Play loop range"
+msgstr "Schleife wiedergeben"
+
+#: ardour_ui2.cc:135
+msgid ""
+"MIDI Panic\n"
+"Send note off and reset controller messages on all MIDI channels"
+msgstr ""
+"MIDI Panic\n"
+"Schalte auf allen Midikanälen die Notensignale aus und setzte alle MIDI-"
+"Controller zurück"
+
+#: ardour_ui2.cc:136
+msgid "Return to last playback start when stopped"
+msgstr "Bei Stopp zum letzten Wiedergabepunkt springen"
+
+#: ardour_ui2.cc:137
+msgid "Playhead follows Range Selections and Edits"
+msgstr "Positionszeiger folgt Auswahl und Editierungen"
+
+#: ardour_ui2.cc:138
+msgid "Be sensible about input monitoring"
+msgstr "Automatisches Input Monitoring aktivieren"
+
+#: ardour_ui2.cc:139
+msgid "Enable/Disable audio click"
+msgstr "Aktiviert/Deaktiviert Klick"
+
+#: ardour_ui2.cc:140 monitor_section.cc:117
+msgid ""
+"When active, something is soloed.\n"
+"Click to de-solo everything"
+msgstr ""
+"Wenn aktiv, ist etwas auf Solo geschalten.\n"
+"Klick schaltet Solo überall aus."
+
+#: ardour_ui2.cc:141
+msgid ""
+"When active, auditioning is taking place\n"
+"Click to stop the audition"
+msgstr ""
+"Wird beim Vorhören aktiv.\n"
+"Klicken stoppt das Vorhören."
+
+#: ardour_ui2.cc:142
+msgid "When active, there is a feedback loop."
+msgstr "Wenn aktiv, gibt es eine Rückkopplungsschleife."
+
+#: ardour_ui2.cc:143
+msgid ""
+"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
+"+drag a digit or mouse-over+scroll wheel to modify.\n"
+"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: "
+"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
+msgstr ""
+"<b>Primäre Uhr</b> Rechtsklick um Anzeigemodus zu setzen. Klick zum "
+"Bearbeiten, Klick+Mausbewegung auf eine Ziffer oder Maus-Über+Scrollrad zum "
+"Ändern.\n"
+"Text editieren: überschreibt von rechts nach links <tt>Esc</tt>: Abbruch; "
+"<tt>Eingabe</tt>: Bestätige; hänge '+' or '-' an, um Deltazeiten "
+"einzugeben.\n"
+
+#: ardour_ui2.cc:144
+msgid ""
+"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
+"+drag a digit or mouse-over+scroll wheel to modify.\n"
+"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: "
+"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
+msgstr ""
+"<b>Sekundäre Uhr</b> Rechtsklick um Anzeigemodus zu setzen. Klick zum "
+"Bearbeiten, Klick+Mausbewegung auf eine Ziffer oder Maus-Über+Scrollrad zum "
+"Ändern.\n"
+"Text editieren: überschreibt von rechts nach links <tt>Esc</tt>: Abbruch; "
+"<tt>Eingabe</tt>: Bestätige; hänge '+' or '-' an, um Deltazeiten "
+"einzugeben.\n"
+
+#: ardour_ui2.cc:145
+msgid "Reset All Peak Indicators"
+msgstr "Alle Spitzenwertanzeigen zurücksetzen"
+
+#: ardour_ui2.cc:146
+msgid "Show Error Log and acknowledge warnings"
+msgstr "Zeige Fehlermeldungen und bestätige Warnungen"
+
+#: ardour_ui2.cc:179
+msgid "[ERROR]: "
+msgstr "[FEHLER]:"
+
+#: ardour_ui2.cc:182
+msgid "[WARNING]: "
+msgstr "[WARNUNG]:"
+
+#: ardour_ui2.cc:185
+msgid "[INFO]: "
+msgstr "[INFO]: "
+
+#: ardour_ui2.cc:255 ardour_ui_ed.cc:408
+msgid "Auto Return"
+msgstr "Auto Return"
+
+#: ardour_ui2.cc:257 ardour_ui_ed.cc:411
+msgid "Follow Edits"
+msgstr "Folge Bearbeitungen"
+
+#: ardour_ui2.cc:716 rc_option_editor.cc:2786
+msgid "GUI"
+msgstr "GUI"
+
+#: ardour_ui2.cc:733 rc_option_editor.cc:1778 rc_option_editor.cc:1796
+#: rc_option_editor.cc:1799 rc_option_editor.cc:1801 rc_option_editor.cc:1803
+#: rc_option_editor.cc:1811 rc_option_editor.cc:1819 rc_option_editor.cc:1821
+#: rc_option_editor.cc:1829 rc_option_editor.cc:1836 rc_option_editor.cc:1845
+#: rc_option_editor.cc:1847 rc_option_editor.cc:1849 rc_option_editor.cc:1857
+#: rc_option_editor.cc:1859 rc_option_editor.cc:1868
+#: session_option_editor.cc:321 session_option_editor.cc:323
+#: session_option_editor.cc:344 session_option_editor.cc:346
+#: session_option_editor.cc:348 session_option_editor.cc:355
+#: session_option_editor.cc:362 session_option_editor.cc:366
+msgid "Misc"
+msgstr "Allgemein"
+
+#: ardour_ui_dependents.cc:76
+msgid "Setup Editor"
+msgstr "Editor laden"
+
+#: ardour_ui_dependents.cc:78
+msgid "Setup Mixer"
+msgstr "Mixer laden"
+
+#: ardour_ui_dependents.cc:84
+msgid "Reload Session History"
+msgstr "Projekt-Aktionsverlauf laden"
+
+#: ardour_ui_dialogs.cc:250
+msgid "Don't close"
+msgstr "Abbrechen"
+
+#: ardour_ui_dialogs.cc:251
+msgid "Just close"
+msgstr "Ohne speichern schließen"
+
+#: ardour_ui_dialogs.cc:252
+msgid "Save and close"
+msgstr "Speichern und schließen"
+
+#: ardour_ui_dialogs.cc:362
+msgid "This screen is not tall enough to display the mixer window"
+msgstr ""
+"Dieser Bildschirm ist nicht hoch genug, um das Mixerfenster darzustellen"
+
+#: ardour_ui_ed.cc:102
+msgid "Session"
+msgstr "Projekt"
+
+#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
+#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+msgid "Sync"
+msgstr "Sync"
+
+#: ardour_ui_ed.cc:106
+msgid "Options"
+msgstr "Optionen"
+
+#: ardour_ui_ed.cc:107
+msgid "Window"
+msgstr "Fenster"
+
+#: ardour_ui_ed.cc:108
+msgid "Help"
+msgstr "Hilfe"
+
+#: ardour_ui_ed.cc:109
+msgid "Misc. Shortcuts"
+msgstr "Verschiedenes"
+
+#: ardour_ui_ed.cc:110
+msgid "Audio File Format"
+msgstr "Audio-Dateiformat"
+
+#: ardour_ui_ed.cc:111
+msgid "File Type"
+msgstr "Dateiformat"
+
+#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+msgid "Sample Format"
+msgstr "Sampleformat"
+
+#: ardour_ui_ed.cc:113 rc_option_editor.cc:2719 rc_option_editor.cc:2731
+msgid "Control Surfaces"
+msgstr "Eingabegeräte / Controller"
+
+#: ardour_ui_ed.cc:114 rc_option_editor.cc:2395 rc_option_editor.cc:2738
+msgid "Plugins"
+msgstr "Plugins"
+
+#: ardour_ui_ed.cc:115 rc_option_editor.cc:2853
+msgid "Metering"
+msgstr "Pegelanzeige"
+
+#: ardour_ui_ed.cc:116
+msgid "Fall Off Rate"
+msgstr "Abfall der Pegelanzeige"
+
+#: ardour_ui_ed.cc:117
+msgid "Hold Time"
+msgstr "Pegelanzeige halten"
+
+#: ardour_ui_ed.cc:118
+msgid "Denormal Handling"
+msgstr "Umgang mit Denormals"
+
+#: ardour_ui_ed.cc:122 route_time_axis.cc:1689
+msgid "New..."
+msgstr "Neu..."
+
+#: ardour_ui_ed.cc:124
+msgid "Open..."
+msgstr "Öffnen..."
+
+#: ardour_ui_ed.cc:125
+msgid "Recent..."
+msgstr "Zuletzt verwendet..."
+
+#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+msgid "Close"
+msgstr "Schließen"
+
+#: ardour_ui_ed.cc:129
+msgid "Add Track or Bus..."
+msgstr "Spur/Bus hinzufügen..."
+
+#: ardour_ui_ed.cc:134
+msgid "Open Video"
+msgstr "Video öffnen"
+
+#: ardour_ui_ed.cc:137
+msgid "Remove Video"
+msgstr "Video entfernen"
+
+#: ardour_ui_ed.cc:140
+msgid "Export To Video File"
+msgstr "Exportiere Videodatei"
+
+#: ardour_ui_ed.cc:144
+msgid "Snapshot (& keep working on current version) ..."
+msgstr "Schnappschuss (& an dieser Version weiterarbeiten)..."
+
+#: ardour_ui_ed.cc:148
+msgid "Snapshot (& switch to new version) ..."
+msgstr "Schnappschuss (& zur neuen Version wechseln) ..."
+
+#: ardour_ui_ed.cc:152
+msgid "Save As..."
+msgstr "Speichern unter..."
+
+#: ardour_ui_ed.cc:156 editor_actions.cc:1783 editor_markers.cc:896
+#: editor_snapshots.cc:124 mixer_strip.cc:1564 route_time_axis.cc:1685
+msgid "Rename..."
+msgstr "Umbenennen..."
+
+#: ardour_ui_ed.cc:160
+msgid "Save Template..."
+msgstr "Als Vorlage Speichern..."
+
+#: ardour_ui_ed.cc:163
+msgid "Metadata"
+msgstr "Metadaten"
+
+#: ardour_ui_ed.cc:166
+msgid "Edit Metadata..."
+msgstr "Metadaten bearbeiten..."
+
+#: ardour_ui_ed.cc:169
+msgid "Import Metadata..."
+msgstr "Metadaten importieren..."
+
+#: ardour_ui_ed.cc:172
+msgid "Export To Audio File(s)..."
+msgstr "Exportiere Audiodatei(en)..."
+
+#: ardour_ui_ed.cc:175
+msgid "Stem export..."
+msgstr "Stems exportieren..."
+
+#: ardour_ui_ed.cc:178 editor_export_audio.cc:65
+#: export_channel_selector.cc:190 export_channel_selector.cc:576
+#: export_dialog.cc:129 export_video_dialog.cc:80
+msgid "Export"
+msgstr "Exportieren"
+
+#: ardour_ui_ed.cc:181
+msgid "Clean-up Unused Sources..."
+msgstr "Nicht benutzte Dateien entfernen..."
+
+#: ardour_ui_ed.cc:185
+msgid "Flush Wastebasket"
+msgstr "Müll leeren"
+
+#: ardour_ui_ed.cc:192
+msgid "Quit"
+msgstr "Beenden"
+
+#: ardour_ui_ed.cc:193 automation_time_axis.cc:543 editor_actions.cc:654
+#: editor_markers.cc:895 location_ui.cc:57 plugin_selector.cc:86
+#: route_time_axis.cc:865
+msgid "Hide"
+msgstr "Verbergen"
+
+#: ardour_ui_ed.cc:197
+msgid "Maximise Editor Space"
+msgstr "Editor maximieren"
+
+#: ardour_ui_ed.cc:198
+msgid "Maximise Mixer Space"
+msgstr "Mixerfenster maximieren"
+
+#: ardour_ui_ed.cc:199
+msgid "Show Toolbars"
+msgstr "Zeige Werkzeugleisten"
+
+#: ardour_ui_ed.cc:203
+msgid "Show more UI preferences"
+msgstr "Mehr UI-Einstellungen anzeigen"
+
+#: ardour_ui_ed.cc:205 mixer_ui.cc:1945 mixer_ui.cc:1951
+msgid "Window|Mixer"
+msgstr "Mixer"
+
+#: ardour_ui_ed.cc:206
+msgid "Toggle Editor+Mixer"
+msgstr "Editor+Mixer umschalten"
+
+#: ardour_ui_ed.cc:207 meterbridge.cc:217 meterbridge.cc:223
+msgid "Window|Meterbridge"
+msgstr "Meterbridge"
+
+#: ardour_ui_ed.cc:209
+msgid "Reattach All Tearoffs"
+msgstr "Alle Abreißmenüs wieder anheften"
+
+#: ardour_ui_ed.cc:211 midi_tracer.cc:45
+msgid "MIDI Tracer"
+msgstr "Midisignale verfolgen"
+
+#: ardour_ui_ed.cc:213
+msgid "Chat"
+msgstr "Chat"
+
+#: ardour_ui_ed.cc:215
+msgid "Help|Manual"
+msgstr "Handbuch"
+
+#: ardour_ui_ed.cc:216
+msgid "Reference"
+msgstr "Referenz"
+
+#: ardour_ui_ed.cc:217
+msgid "Report A Bug"
+msgstr "Einen Fehler melden"
+
+#: ardour_ui_ed.cc:218
+msgid "Cheat Sheet"
+msgstr "Cheat Sheet"
+
+#: ardour_ui_ed.cc:219
+msgid "Ardour Website"
+msgstr "Ardour Website"
+
+#: ardour_ui_ed.cc:220
+msgid "Ardour Development"
+msgstr "Ardour Entwicklung"
+
+#: ardour_ui_ed.cc:221
+msgid "User Forums"
+msgstr "Userforen"
+
+#: ardour_ui_ed.cc:222
+msgid "How to report a bug"
+msgstr "Wie man einen Fehler meldet"
+
+#: ardour_ui_ed.cc:224 plugin_ui.cc:419
+msgid "Save"
+msgstr "Speichern"
+
+#: ardour_ui_ed.cc:232 rc_option_editor.cc:1879 rc_option_editor.cc:1890
+#: rc_option_editor.cc:1901 rc_option_editor.cc:1912 rc_option_editor.cc:1921
+#: rc_option_editor.cc:1934 rc_option_editor.cc:1947 rc_option_editor.cc:1956
+#: rc_option_editor.cc:1966 rc_option_editor.cc:1968 rc_option_editor.cc:1977
+#: rc_option_editor.cc:1993 rc_option_editor.cc:2014 rc_option_editor.cc:2032
+#: rc_option_editor.cc:2034 rc_option_editor.cc:2050 rc_option_editor.cc:2053
+#: rc_option_editor.cc:2055 rc_option_editor.cc:2072 rc_option_editor.cc:2083
+msgid "Transport"
+msgstr "Transport"
+
+#: ardour_ui_ed.cc:238
+msgid "Stop"
+msgstr "Stopp"
+
+#: ardour_ui_ed.cc:241
+msgid "Roll"
+msgstr "Wiedergabe"
+
+#: ardour_ui_ed.cc:245 ardour_ui_ed.cc:248
+msgid "Start/Stop"
+msgstr "Start/Stopp"
+
+#: ardour_ui_ed.cc:251
+msgid "Start/Continue/Stop"
+msgstr "Start/Stopp"
+
+#: ardour_ui_ed.cc:254
+msgid "Stop and Forget Capture"
+msgstr "Stopp + Aufnahme verwerfen"
+
+#: ardour_ui_ed.cc:264
+msgid "Transition To Roll"
+msgstr "Vorwärts (normal)"
+
+#: ardour_ui_ed.cc:268
+msgid "Transition To Reverse"
+msgstr "Rückwärts (normal)"
+
+#: ardour_ui_ed.cc:272
+msgid "Play Loop Range"
+msgstr "Schleife wiedergeben"
+
+#: ardour_ui_ed.cc:275
+msgid "Play Selection"
+msgstr "Auswahl abspielen"
+
+#: ardour_ui_ed.cc:278
+msgid "Play Selection w/Preroll"
+msgstr "Ausgewählten Bereich mit Vorlauf wiedergeben"
+
+#: ardour_ui_ed.cc:282
+msgid "Enable Record"
+msgstr "Aufnahme aktivieren"
+
+#: ardour_ui_ed.cc:285 ardour_ui_ed.cc:289
+msgid "Start Recording"
+msgstr "Aufnahme starten"
+
+#: ardour_ui_ed.cc:293
+msgid "Rewind"
+msgstr "Rückwärts (beschleunigen)"
+
+#: ardour_ui_ed.cc:296
+msgid "Rewind (Slow)"
+msgstr "Rückwärts (langsam)"
+
+#: ardour_ui_ed.cc:299
+msgid "Rewind (Fast)"
+msgstr "Rückwärts (schnell)"
+
+#: ardour_ui_ed.cc:302
+msgid "Forward"
+msgstr "Vorwärts (beschleunigen)"
+
+#: ardour_ui_ed.cc:305
+msgid "Forward (Slow)"
+msgstr "Vorwärts (langsam)"
+
+#: ardour_ui_ed.cc:308
+msgid "Forward (Fast)"
+msgstr "Vorwärts (schnell)"
+
+#: ardour_ui_ed.cc:311
+msgid "Go to Zero"
+msgstr "Zum Nullpunkt springen"
+
+#: ardour_ui_ed.cc:314 ardour_ui_ed.cc:317
+msgid "Go to Start"
+msgstr "Zum Anfang springen"
+
+#: ardour_ui_ed.cc:320
+msgid "Go to End"
+msgstr "Zum Ende springen"
+
+#: ardour_ui_ed.cc:323
+msgid "Go to Wall Clock"
+msgstr "Zur lokalen Uhrzeit springen"
+
+#: ardour_ui_ed.cc:328 ardour_ui_ed.cc:331
+msgid "Numpad Decimal"
+msgstr "Nummernblock Dezimalpunkt"
+
+#: ardour_ui_ed.cc:334
+msgid "Numpad 0"
+msgstr "Nummernblock 0"
+
+#: ardour_ui_ed.cc:337
+msgid "Numpad 1"
+msgstr "Nummernblock 1"
+
+#: ardour_ui_ed.cc:340
+msgid "Numpad 2"
+msgstr "Nummernblock 2"
+
+#: ardour_ui_ed.cc:343
+msgid "Numpad 3"
+msgstr "Nummernblock 3"
+
+#: ardour_ui_ed.cc:346
+msgid "Numpad 4"
+msgstr "Nummernblock 4"
+
+#: ardour_ui_ed.cc:349
+msgid "Numpad 5"
+msgstr "Nummernblock 5"
+
+#: ardour_ui_ed.cc:352
+msgid "Numpad 6"
+msgstr "Nummernblock 6"
+
+#: ardour_ui_ed.cc:355
+msgid "Numpad 7"
+msgstr "Nummernblock 7"
+
+#: ardour_ui_ed.cc:358
+msgid "Numpad 8"
+msgstr "Nummernblock 8"
+
+#: ardour_ui_ed.cc:361
+msgid "Numpad 9"
+msgstr "Nummernblock 9"
+
+#: ardour_ui_ed.cc:365
+msgid "Focus On Clock"
+msgstr "Fokus auf Zeitanzeige setzen"
+
+#: ardour_ui_ed.cc:369 ardour_ui_ed.cc:378 audio_clock.cc:2114 editor.cc:259
+#: editor_actions.cc:578 editor_actions.cc:587 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
+#: session_option_editor.cc:109 session_option_editor.cc:122
+#: session_option_editor.cc:124 session_option_editor.cc:126
+msgid "Timecode"
+msgstr "Timecode"
+
+#: ardour_ui_ed.cc:371 ardour_ui_ed.cc:380 editor_actions.cc:576
+msgid "Bars & Beats"
+msgstr "Takte & Schläge"
+
+#: ardour_ui_ed.cc:373 ardour_ui_ed.cc:382
+msgid "Minutes & Seconds"
+msgstr "Minuten & Sekunden"
+
+#: ardour_ui_ed.cc:375 ardour_ui_ed.cc:384 audio_clock.cc:2118 editor.cc:260
+#: editor_actions.cc:577
+msgid "Samples"
+msgstr "Samples"
+
+#: ardour_ui_ed.cc:387
+msgid "Punch In"
+msgstr "Punch In"
+
+#: ardour_ui_ed.cc:388 mixer_strip.cc:1881 mixer_strip.cc:2069 route_ui.cc:164
+#: time_info_box.cc:116
+msgid "In"
+msgstr "In"
+
+#: ardour_ui_ed.cc:391
+msgid "Punch Out"
+msgstr "Punch Out"
+
+#: ardour_ui_ed.cc:392 mixer_strip.cc:1893 time_info_box.cc:117
+msgid "Out"
+msgstr "Out"
+
+#: ardour_ui_ed.cc:395
+msgid "Punch In/Out"
+msgstr "Punch In/Out"
+
+#: ardour_ui_ed.cc:396
+msgid "In/Out"
+msgstr "In/Out"
+
+#: ardour_ui_ed.cc:399 rc_option_editor.cc:1845
+msgid "Click"
+msgstr "Klick"
+
+#: ardour_ui_ed.cc:402
+msgid "Auto Input"
+msgstr "Auto Input"
+
+#: ardour_ui_ed.cc:405
+msgid "Auto Play"
+msgstr "Auto Play"
+
+#: ardour_ui_ed.cc:416
+msgid "Sync Startup to Video"
+msgstr "Start mit Video synchronisieren"
+
+#: ardour_ui_ed.cc:418
+msgid "Time Master"
+msgstr "Time Master"
+
+#: ardour_ui_ed.cc:420
+msgid "Use External Positional Sync Source"
+msgstr "Benutze Externe Synchronisationsquelle"
+
+#: ardour_ui_ed.cc:425
+msgid "Toggle Record Enable Track %1"
+msgstr "Aufnahmebereitschaft auf Spur %1 umschalten"
+
+#: ardour_ui_ed.cc:432
+msgid "Percentage"
+msgstr "Prozent"
+
+#: ardour_ui_ed.cc:433 shuttle_control.cc:187
+msgid "Semitones"
+msgstr "Halbtöne"
+
+#: ardour_ui_ed.cc:437
+msgid "Send MTC"
+msgstr "MTC senden"
+
+#: ardour_ui_ed.cc:439
+msgid "Send MMC"
+msgstr "MMC senden"
+
+#: ardour_ui_ed.cc:441
+msgid "Use MMC"
+msgstr "Benutze MMC"
+
+#: ardour_ui_ed.cc:443 rc_option_editor.cc:2571
+msgid "Send MIDI Clock"
+msgstr "MIDI Clock senden"
+
+#: ardour_ui_ed.cc:445
+msgid "Send MIDI Feedback"
+msgstr "MIDI Feedback senden"
+
+#: ardour_ui_ed.cc:451
+msgid "Panic"
+msgstr "Panic"
+
+#: ardour_ui_ed.cc:542
+msgid "Wall Clock"
+msgstr "Uhrzeit"
+
+#: ardour_ui_ed.cc:544
+msgid "Disk Space"
+msgstr "Speicherplatz"
+
+#: ardour_ui_ed.cc:545
+msgid "DSP"
+msgstr "DSP"
+
+#: ardour_ui_ed.cc:546
+msgid "X-run"
+msgstr "X-run"
+
+#: ardour_ui_ed.cc:547
+msgid "Buffers"
+msgstr "Puffer"
+
+#: ardour_ui_ed.cc:549
+msgid "Timecode Format"
+msgstr "Timecode-Format"
+
+#: ardour_ui_ed.cc:550
+msgid "File Format"
+msgstr "Dateiformat"
+
+#: ardour_ui_options.cc:63
+msgid ""
+"It is not possible to use JACK as the the sync source\n"
+"when the pull up/down setting is non-zero."
+msgstr ""
+"Es ist nicht möglich, JACK als Synchronisationsquelle zu verwenden,\n"
+"wenn die Pull-up/down Einstellung nicht 0 ist."
+
+#: ardour_ui_options.cc:317
+msgid "Internal"
+msgstr "Intern"
+
+#: ardour_ui_options.cc:503
+msgid "Enable/Disable external positional sync"
+msgstr "Aktiviere/Deaktiviere externe Positionssynchronisierung"
+
+#: ardour_ui_options.cc:505
+msgid "Sync to JACK is not possible: video pull up/down is set"
+msgstr "Synchronisation ist nicht möglich: Video pull-up/down ist aktiviert"
+
+#: audio_clock.cc:1052 audio_clock.cc:1071
+msgid "--pending--"
+msgstr "--wartend--"
+
+#: audio_clock.cc:1123
+msgid "SR"
+msgstr "SR"
+
+#: audio_clock.cc:1129 audio_clock.cc:1133
+msgid "Pull"
+msgstr "Ziehen"
+
+#: audio_clock.cc:1131
+#, c-format
+msgid "%+.4f%%"
+msgstr "%+.4f%%"
+
+#: audio_clock.cc:1287 editor.cc:261 editor_actions.cc:139
+#: editor_actions.cc:570
+msgid "Tempo"
+msgstr "Tempo"
+
+#: audio_clock.cc:1291 editor.cc:262 editor_actions.cc:571
+msgid "Meter"
+msgstr "Taktart"
+
+#: audio_clock.cc:1869 audio_streamview.cc:116 editor_actions.cc:1101
+#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
+#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
+#: streamview.cc:470
+msgid "programming error: %1"
+msgstr "Programmierfehler: %1"
+
+#: audio_clock.cc:2002 audio_clock.cc:2030
+msgid "programming error: %1 %2"
+msgstr "Programmierfehler: %1 %2"
+
+#: audio_clock.cc:2116 editor.cc:258 export_timespan_selector.cc:98
+msgid "Bars:Beats"
+msgstr "Takte:Schläge"
+
+#: audio_clock.cc:2117 export_timespan_selector.cc:93
+msgid "Minutes:Seconds"
+msgstr "Minuten:Sekunden"
+
+#: audio_clock.cc:2122
+msgid "Set From Playhead"
+msgstr "Ab Positionszeiger"
+
+#: audio_clock.cc:2123
+msgid "Locate to This Time"
+msgstr "Positionszeiger hierhin setzen"
+
+#: audio_clock.cc:2126
+msgid "Copy to clipboard"
+msgstr "In die Zwischenablage kopieren"
+
+#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
+#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+msgid "dB"
+msgstr "dB"
+
+#: audio_region_editor.cc:67
+msgid "Region gain:"
+msgstr "Regionen-Lautstärke:"
+
+#: audio_region_editor.cc:77 export_format_dialog.cc:43
+msgid "dBFS"
+msgstr "dBFS"
+
+#: audio_region_editor.cc:80
+msgid "Peak amplitude:"
+msgstr "Spitzenamplitude"
+
+#: audio_region_editor.cc:91
+msgid "Calculating..."
+msgstr "Berechne..."
+
+#: audio_region_view.cc:1254
+msgid "add gain control point"
+msgstr "Lautstärkekurve bearbeiten"
+
+#: automation_controller.cc:287 automation_controller.cc:303
+msgid "Select Note..."
+msgstr "Note selektieren..."
+
+#: automation_controller.cc:294
+msgid "Halve"
+msgstr "Halbiere"
+
+#: automation_controller.cc:297
+msgid "Double"
+msgstr "Verdopple"
+
+#: automation_controller.cc:308
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] "Setze auf %1 Schlag"
+msgstr[1] "Setze auf %1 Schläge"
+
+#: automation_line.cc:287 editor_drag.cc:4129
+msgid "automation event move"
+msgstr "Automationspunkt bewegen"
+
+#: automation_line.cc:884 region_gain_line.cc:75
+msgid "remove control point"
+msgstr "Automationspunkt entfernen"
+
+#: automation_line.cc:1008
+msgid "Ignoring illegal points on AutomationLine \"%1\""
+msgstr "Unzulässige Automationspunkte werden ignoriert: \"%1\""
+
+#: automation_region_view.cc:190 automation_time_axis.cc:644
+msgid "add automation event"
+msgstr "Automationspunkt einfügen"
+
+#: automation_streamview.cc:95
+msgid "unable to display automation region for control without list"
+msgstr ""
+"die Automationsspur für diesen Parameter kann ohne Liste nicht dargestellt "
+"werden"
+
+#: automation_time_axis.cc:163
+msgid "automation state"
+msgstr "Automationsmodus"
+
+#: automation_time_axis.cc:164
+msgid "hide track"
+msgstr "Diese Spur verbergen"
+
+#: automation_time_axis.cc:308 automation_time_axis.cc:360
+#: automation_time_axis.cc:554 gain_meter.cc:222 generic_pluginui.cc:524
+#: generic_pluginui.cc:818 panner_ui.cc:149
+msgid "Automation|Manual"
+msgstr "Manuell"
+
+#: automation_time_axis.cc:310 automation_time_axis.cc:371
+#: automation_time_axis.cc:559 editor.cc:1916 editor.cc:1994
+#: editor_actions.cc:122 editor_actions.cc:1932 gain_meter.cc:225
+#: generic_pluginui.cc:100 generic_pluginui.cc:527 generic_pluginui.cc:820
+#: midi_time_axis.cc:1607 midi_time_axis.cc:1610 midi_time_axis.cc:1613
+#: panner_ui.cc:152
+msgid "Play"
+msgstr "Wiedergabe"
+
+#: automation_time_axis.cc:312 automation_time_axis.cc:382
+#: automation_time_axis.cc:564 gain_meter.cc:228 generic_pluginui.cc:102
+#: generic_pluginui.cc:530 generic_pluginui.cc:822 panner_ui.cc:155
+msgid "Write"
+msgstr "Schreiben"
+
+#: automation_time_axis.cc:314 automation_time_axis.cc:393
+#: automation_time_axis.cc:569 gain_meter.cc:231 generic_pluginui.cc:104
+#: generic_pluginui.cc:533 generic_pluginui.cc:824 panner_ui.cc:158
+msgid "Touch"
+msgstr "Ändern"
+
+#: automation_time_axis.cc:404 generic_pluginui.cc:536 meter_patterns.cc:116
+msgid "???"
+msgstr "???"
+
+#: automation_time_axis.cc:445
+msgid "clear automation"
+msgstr "Automation zurücksetzen"
+
+#: automation_time_axis.cc:545
+msgid "Clear"
+msgstr "Leeren"
+
+#: automation_time_axis.cc:576
+msgid "State"
+msgstr "Automationssmodus"
+
+#: automation_time_axis.cc:592
+msgid "Discrete"
+msgstr "Diskret"
+
+#: automation_time_axis.cc:598 export_format_dialog.cc:489
+msgid "Linear"
+msgstr "Linear"
+
+#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:206
+msgid "Mode"
+msgstr "Modus"
+
+#: bundle_manager.cc:182
+msgid "Disassociate"
+msgstr "Trenne"
+
+#: bundle_manager.cc:186
+msgid "Edit Bundle"
+msgstr "Bundle editieren"
+
+#: bundle_manager.cc:201
+msgid "Direction:"
+msgstr "Richtung:"
+
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:881
+#: mixer_strip.cc:165 mixer_strip.cc:379 mixer_strip.cc:2302
+#: rc_option_editor.cc:2828
+msgid "Input"
+msgstr "Eingang"
+
+#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
+#: engine_dialog.cc:883 mixer_strip.cc:169 mixer_strip.cc:383
+#: mixer_strip.cc:2305 monitor_section.cc:329 monitor_section.cc:333
+#: rc_option_editor.cc:2832
+msgid "Output"
+msgstr "Ausgang"
+
+#: bundle_manager.cc:265 editor.cc:1958 editor_actions.cc:94
+#: editor_actions.cc:104 rc_option_editor.cc:1539 rc_option_editor.cc:1546
+msgid "Edit"
+msgstr "Bearbeiten"
+
+#: bundle_manager.cc:266 editor.cc:5921 editor.cc:5949 editor_actions.cc:345
+#: editor_actions.cc:346 plugin_ui.cc:420 processor_box.cc:2525
+msgid "Delete"
+msgstr "Löschen"
+
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
+#: editor_routes.cc:207 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+msgid "Name"
+msgstr "Name"
+
+#: bundle_manager.cc:283
+msgid "New"
+msgstr "Neu"
+
+#: bundle_manager.cc:333
+msgid "Bundle"
+msgstr "Bundle"
+
+#: bundle_manager.cc:418
+msgid "Add Channel"
+msgstr "Kanal hinzufügen"
+
+#: bundle_manager.cc:425
+msgid "Rename Channel"
+msgstr "Kanal umbenennen"
+
+#: configinfo.cc:28
+msgid "Build Configuration"
+msgstr "Build Configuration"
+
+#: control_point_dialog.cc:33
+msgid "Control point"
+msgstr "Automationspunkt"
+
+#: control_point_dialog.cc:45
+msgid "Value"
+msgstr "Wert"
+
+#: edit_note_dialog.cc:42
+msgid "Note"
+msgstr "Note"
+
+#: edit_note_dialog.cc:45
+msgid "Set selected notes to this channel"
+msgstr "Ausgewählte Noten auf diesen Kanal setzen"
+
+#: edit_note_dialog.cc:46
+msgid "Set selected notes to this pitch"
+msgstr "Ausgewählte Noten auf diese Tonhöhe setzen"
+
+#: edit_note_dialog.cc:47
+msgid "Set selected notes to this velocity"
+msgstr "Ausgewählte Noten auf diese Velocity setzen"
+
+#: edit_note_dialog.cc:49
+msgid "Set selected notes to this time"
+msgstr "Ausgewählte Noten auf diesen Zeitpunkt setzen"
+
+#: edit_note_dialog.cc:51
+msgid "Set selected notes to this length"
+msgstr "Ausgewählte Noten auf diese Notenlänge setzen"
+
+#: edit_note_dialog.cc:58 midi_list_editor.cc:105 patch_change_dialog.cc:90
+#: step_entry.cc:394
+msgid "Channel"
+msgstr "Kanal"
+
+#: edit_note_dialog.cc:68
+msgid "Pitch"
+msgstr "Tonhöhe"
+
+#: edit_note_dialog.cc:78 step_entry.cc:408
+msgid "Velocity"
+msgstr "Velocity"
+
+#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+msgid "Time"
+msgstr "Zeitpunkt"
+
+#: edit_note_dialog.cc:98 editor_regions.cc:115
+#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
+#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+msgid "Length"
+msgstr "Länge"
+
+#: edit_note_dialog.cc:165
+msgid "edit note"
+msgstr "Note bearbeiten"
+
+#: editor.cc:148
+msgid "CD Frames"
+msgstr "CD-Frames"
+
+#: editor.cc:149
+msgid "TC Frames"
+msgstr "TC Frames"
+
+#: editor.cc:150
+msgid "TC Seconds"
+msgstr "TC Sekunden"
+
+#: editor.cc:151
+msgid "TC Minutes"
+msgstr "TC Minuten"
+
+#: editor.cc:152
+msgid "Seconds"
+msgstr "Sekunden"
+
+#: editor.cc:153
+msgid "Minutes"
+msgstr "Minuten"
+
+#: editor.cc:154 quantize_dialog.cc:37 quantize_dialog.cc:141
+msgid "Beats/128"
+msgstr "Schläge/128"
+
+#: editor.cc:155 quantize_dialog.cc:38 quantize_dialog.cc:143
+msgid "Beats/64"
+msgstr "Schläge/64"
+
+#: editor.cc:156 quantize_dialog.cc:39 quantize_dialog.cc:145
+msgid "Beats/32"
+msgstr "Schläge/32"
+
+#: editor.cc:157
+msgid "Beats/28"
+msgstr "Schläge/28"
+
+#: editor.cc:158
+msgid "Beats/24"
+msgstr "Schläge/24"
+
+#: editor.cc:159
+msgid "Beats/20"
+msgstr "Schläge/20"
+
+#: editor.cc:160 quantize_dialog.cc:40 quantize_dialog.cc:147
+msgid "Beats/16"
+msgstr "Schläge/16"
+
+#: editor.cc:161
+msgid "Beats/14"
+msgstr "Schläge/14"
+
+#: editor.cc:162
+msgid "Beats/12"
+msgstr "Schläge/12"
+
+#: editor.cc:163
+msgid "Beats/10"
+msgstr "Schläge/10"
+
+#: editor.cc:164 quantize_dialog.cc:41 quantize_dialog.cc:149
+msgid "Beats/8"
+msgstr "Schläge/8"
+
+#: editor.cc:165
+msgid "Beats/7"
+msgstr "Schläge/7"
+
+#: editor.cc:166
+msgid "Beats/6"
+msgstr "Schläge/6"
+
+#: editor.cc:167
+msgid "Beats/5"
+msgstr "Schläge/5"
+
+#: editor.cc:168 quantize_dialog.cc:42 quantize_dialog.cc:151
+msgid "Beats/4"
+msgstr "Schläge/4"
+
+#: editor.cc:169 quantize_dialog.cc:43 quantize_dialog.cc:153
+msgid "Beats/3"
+msgstr "Schläge/3"
+
+#: editor.cc:170 quantize_dialog.cc:44 quantize_dialog.cc:155
+msgid "Beats/2"
+msgstr "Schläge/2"
+
+#: editor.cc:171 quantize_dialog.cc:45 quantize_dialog.cc:157
+msgid "Beats"
+msgstr "Schläge"
+
+#: editor.cc:172
+msgid "Bars"
+msgstr "Takte"
+
+#: editor.cc:173
+msgid "Marks"
+msgstr "Marker"
+
+#: editor.cc:174
+msgid "Region starts"
+msgstr "Regionen-Anfang"
+
+#: editor.cc:175
+msgid "Region ends"
+msgstr "Regionen-Ende"
+
+#: editor.cc:176
+msgid "Region syncs"
+msgstr "Regionen-Sync"
+
+#: editor.cc:177
+msgid "Region bounds"
+msgstr "Regionengrenzen"
+
+#: editor.cc:182 editor_actions.cc:519
+msgid "No Grid"
+msgstr "Raster aus"
+
+#: editor.cc:183 editor_actions.cc:520
+msgid "Grid"
+msgstr "Einrasten"
+
+#: editor.cc:184 editor_actions.cc:521
+msgid "Magnetic"
+msgstr "Magnetisch"
+
+#: editor.cc:189 editor.cc:207 editor_actions.cc:121 editor_actions.cc:502
+msgid "Playhead"
+msgstr "Positionszeiger"
+
+#: editor.cc:190 editor_actions.cc:504
+msgid "Marker"
+msgstr "Marker"
+
+#: editor.cc:191 editor.cc:208 editor_actions.cc:503
+msgid "Mouse"
+msgstr "Maus"
+
+#: editor.cc:196 editor_actions.cc:511
+msgid "Slide"
+msgstr "Slide"
+
+#: editor.cc:197
+msgid "Splice"
+msgstr "Splice"
+
+#: editor.cc:198 editor_actions.cc:510
+msgid "Ripple"
+msgstr "Ripple"
+
+#: editor.cc:199 editor_actions.cc:1801 editor_markers.cc:898
+#: editor_rulers.cc:260 location_ui.cc:58
+msgid "Lock"
+msgstr "Lock"
+
+#: editor.cc:204 mono_panner_editor.cc:42
+msgid "Left"
+msgstr "Links"
+
+#: editor.cc:205 mono_panner_editor.cc:47
+msgid "Right"
+msgstr "Rechts"
+
+#: editor.cc:206
+msgid "Center"
+msgstr "Mitte"
+
+#: editor.cc:209 editor.cc:3248
+msgid "Edit point"
+msgstr "Arbeitspunkt"
+
+#: editor.cc:215
+msgid "Mushy"
+msgstr "Matschig"
+
+#: editor.cc:216
+msgid "Smooth"
+msgstr "Klar"
+
+#: editor.cc:217
+msgid "Balanced multitimbral mixture"
+msgstr "Ausgewogene multitimbrale Mischung"
+
+#: editor.cc:218
+msgid "Unpitched percussion with stable notes"
+msgstr "Ungestimmte Perkussion mit stabilen Tönen"
+
+#: editor.cc:219
+msgid "Crisp monophonic instrumental"
+msgstr "Klare monophone Instrumentalmusik"
+
+#: editor.cc:220
+msgid "Unpitched solo percussion"
+msgstr "Ungestimmte Perkussion (solo)"
+
+#: editor.cc:221
+msgid "Resample without preserving pitch"
+msgstr "Resampeln, ohne die Tonhöhe zu erhalten"
+
+#: editor.cc:257
+msgid "Mins:Secs"
+msgstr "Min:Sek"
+
+#: editor.cc:263
+msgid "Location Markers"
+msgstr "Positionsmarker"
+
+#: editor.cc:264
+msgid "Range Markers"
+msgstr "Bereiche"
+
+#: editor.cc:265
+msgid "Loop/Punch Ranges"
+msgstr "Schleifen/Punchbereiche"
+
+#: editor.cc:266 editor_actions.cc:574
+msgid "CD Markers"
+msgstr "CD-Marker"
+
+#: editor.cc:267
+msgid "Video Timeline"
+msgstr "Video Zeitleiste"
+
+#: editor.cc:284
+msgid "mode"
+msgstr "Modus"
+
+#: editor.cc:462 editor_actions.cc:114 editor_actions.cc:573
+msgid "Markers"
+msgstr "Marker"
+
+#: editor.cc:580 rc_option_editor.cc:2413
+msgid "Regions"
+msgstr "Regionen"
+
+#: editor.cc:581
+msgid "Tracks & Busses"
+msgstr "Spuren & Busse"
+
+#: editor.cc:582
+msgid "Snapshots"
+msgstr "Schnappschüsse"
+
+#: editor.cc:583
+msgid "Track & Bus Groups"
+msgstr "Spuren & Bus-Gruppen"
+
+#: editor.cc:584
+msgid "Ranges & Marks"
+msgstr "Bereiche & Marker"
+
+#: editor.cc:731 editor.cc:5773 rc_option_editor.cc:2090
+#: rc_option_editor.cc:2098 rc_option_editor.cc:2106 rc_option_editor.cc:2114
+#: rc_option_editor.cc:2138 rc_option_editor.cc:2150 rc_option_editor.cc:2161
+#: rc_option_editor.cc:2163 rc_option_editor.cc:2171 rc_option_editor.cc:2179
+#: rc_option_editor.cc:2199 rc_option_editor.cc:2211 rc_option_editor.cc:2213
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2223 rc_option_editor.cc:2231
+#: rc_option_editor.cc:2246 rc_option_editor.cc:2250 rc_option_editor.cc:2274
+msgid "Editor"
+msgstr "Editor"
+
+#: editor.cc:1335 editor.cc:4757 editor_actions.cc:134 editor_actions.cc:1877
+msgid "Loop"
+msgstr "Schleife"
+
+#: editor.cc:1341 editor.cc:4784 editor_actions.cc:135 time_info_box.cc:68
+msgid "Punch"
+msgstr "Punch"
+
+#: editor.cc:1453 rc_option_editor.cc:2132
+msgid "Linear (for highly correlated material)"
+msgstr "Linear (für stark korreliertes Material)"
+
+#: editor.cc:1463 rc_option_editor.cc:2133
+msgid "Constant power"
+msgstr "Konstante Energie"
+
+#: editor.cc:1472 rc_option_editor.cc:2134
+msgid "Symmetric"
+msgstr "Symmetrisch"
+
+#: editor.cc:1482 rc_option_editor.cc:2135
+msgid "Slow"
+msgstr "Langsam"
+
+#: editor.cc:1491 rc_option_editor.cc:2136 sfdb_ui.cc:1770 sfdb_ui.cc:1880
+msgid "Fast"
+msgstr "Schnell"
+
+#: editor.cc:1513 editor.cc:1538
+msgid "Deactivate"
+msgstr "Deaktivieren"
+
+#: editor.cc:1515 editor.cc:1540
+msgid "Activate"
+msgstr "Aktivieren"
+
+#: editor.cc:1641 editor.cc:1649 editor_ops.cc:3933
+msgid "Freeze"
+msgstr "Einfrieren"
+
+#: editor.cc:1645
+msgid "Unfreeze"
+msgstr "Auftauen"
+
+#: editor.cc:1784
+msgid "Selected Regions"
+msgstr "Ausgewählte Regionen"
+
+#: editor.cc:1828 editor_markers.cc:933
+msgid "Play Range"
+msgstr "Bereich wiedergeben"
+
+#: editor.cc:1829 editor_markers.cc:936
+msgid "Loop Range"
+msgstr "Bereich in Schleife wiedergeben"
+
+#: editor.cc:1832 editor_markers.cc:943
+msgid "Zoom to Range"
+msgstr "Auf Bereich zoomen"
+
+#: editor.cc:1841 editor_actions.cc:376
+msgid "Move Range Start to Previous Region Boundary"
+msgstr "Anfang des Bereiches zur vorherigen Regiongrenze verschieben"
+
+#: editor.cc:1848 editor_actions.cc:383
+msgid "Move Range Start to Next Region Boundary"
+msgstr "Anfang des Bereiches zur nächsten Regiongrenze verschieben"
+
+#: editor.cc:1855 editor_actions.cc:390
+msgid "Move Range End to Previous Region Boundary"
+msgstr "Ende des Bereiches zur vorherigen Regiongrenze verschieben"
+
+#: editor.cc:1862 editor_actions.cc:397
+msgid "Move Range End to Next Region Boundary"
+msgstr "Ende des Bereiches zur nächsten Regiongrenze verschieben"
+
+#: editor.cc:1868 editor_actions.cc:133 editor_actions.cc:332
+msgid "Separate"
+msgstr "Teilen"
+
+#: editor.cc:1869
+msgid "Convert to Region in Region List"
+msgstr "In Region umwanden (in Regionenliste hinzufügen)"
+
+#: editor.cc:1872 editor_markers.cc:963
+msgid "Select All in Range"
+msgstr "Alles im Bereich auswählen"
+
+#: editor.cc:1875 editor_actions.cc:304
+msgid "Set Loop from Selection"
+msgstr "Schleife aus Auswahl bilden"
+
+#: editor.cc:1876 editor_actions.cc:305
+msgid "Set Punch from Selection"
+msgstr "Punch aus Auswahl bilden"
+
+#: editor.cc:1877 editor_actions.cc:306
+msgid "Set Session Start/End from Selection"
+msgstr "Projektstart/ende auf Auswahl setzen"
+
+#: editor.cc:1880
+msgid "Add Range Markers"
+msgstr "Bereichsmarker einfügen"
+
+#: editor.cc:1883
+msgid "Crop Region to Range"
+msgstr "Region auf Bereich kürzen"
+
+#: editor.cc:1884
+msgid "Fill Range with Region"
+msgstr "Bereich mit Region füllen"
+
+#: editor.cc:1885 editor_actions.cc:318
+msgid "Duplicate Range"
+msgstr "Bereich duplizieren"
+
+#: editor.cc:1888
+msgid "Consolidate Range"
+msgstr "Bereich als neue Region pre-Mixer"
+
+#: editor.cc:1889
+msgid "Consolidate Range With Processing"
+msgstr "Bereich zu neuer Region (mit Signalverarbeitung)"
+
+#: editor.cc:1890
+msgid "Bounce Range to Region List"
+msgstr "Auswahl zur Regionenliste bouncen"
+
+#: editor.cc:1891
+msgid "Bounce Range to Region List With Processing"
+msgstr "Auswahl zur Regionenliste bouncen (mit Signalverarbeitung)"
+
+#: editor.cc:1892 editor_markers.cc:946
+msgid "Export Range..."
+msgstr "Bereich exportieren..."
+
+#: editor.cc:1894
+msgid "Export Video Range..."
+msgstr "Videobereich exportieren..."
+
+#: editor.cc:1910 editor.cc:1992 editor_actions.cc:310
+msgid "Play From Edit Point"
+msgstr "Wiedergabe ab Arbeitspunkt"
+
+#: editor.cc:1911 editor.cc:1993
+msgid "Play From Start"
+msgstr "Wiedergabe ab Anfang"
+
+#: editor.cc:1912
+msgid "Play Region"
+msgstr "Region wiedergeben"
+
+#: editor.cc:1914
+msgid "Loop Region"
+msgstr "Region in Schleife wiedergeben"
+
+#: editor.cc:1924 editor.cc:2002
+msgid "Select All in Track"
+msgstr "Alles in der Spur auswählen"
+
+#: editor.cc:1925 editor.cc:2003 editor_actions.cc:194
+msgid "Select All Objects"
+msgstr "Alle Objekte auswählen"
+
+#: editor.cc:1926 editor.cc:2004
+msgid "Invert Selection in Track"
+msgstr "Auswahl in der Spur umkehren"
+
+#: editor.cc:1927 editor.cc:2005 editor_actions.cc:197
+msgid "Invert Selection"
+msgstr "Auswahl umkehren"
+
+#: editor.cc:1929
+msgid "Set Range to Loop Range"
+msgstr "Bereich als Schleife auswählen"
+
+#: editor.cc:1930 editor_actions.cc:200
+msgid "Set Range to Punch Range"
+msgstr "Bereich als Punchbereich"
+
+#: editor.cc:1931 editor_actions.cc:201
+msgid "Set Range to Selected Regions"
+msgstr "Bereich auf ausgewählte Regionen setzen"
+
+#: editor.cc:1933 editor.cc:2007 editor_actions.cc:203 editor_actions.cc:204
+msgid "Select All After Edit Point"
+msgstr "Alle Regionen nach dem Arbeitspunkt auswählen"
+
+#: editor.cc:1934 editor.cc:2008 editor_actions.cc:205 editor_actions.cc:206
+msgid "Select All Before Edit Point"
+msgstr "Alle Regionen vor dem Arbeitspunkt auswählen"
+
+#: editor.cc:1935 editor.cc:2009
+msgid "Select All After Playhead"
+msgstr "Alle Regionen nach dem Positionszeiger auswählen"
+
+#: editor.cc:1936 editor.cc:2010
+msgid "Select All Before Playhead"
+msgstr "Alle Regionen vor dem Positionszeiger auswählen"
+
+#: editor.cc:1937
+msgid "Select All Between Playhead and Edit Point"
+msgstr "Alle zwischen Positionszeiger und Arbeitspunkt auswählen"
+
+#: editor.cc:1938
+msgid "Select All Within Playhead and Edit Point"
+msgstr "Alles zwischen Positionszeiger und Arbeitspunkt auswählen"
+
+#: editor.cc:1939
+msgid "Select Range Between Playhead and Edit Point"
+msgstr "Wähle Bereich zwischen Positionszeiger und Arbeitspunkt aus"
+
+#: editor.cc:1941 editor.cc:2012 editor_actions.cc:131 editor_actions.cc:132
+msgid "Select"
+msgstr "Auswahl"
+
+#: editor.cc:1949 editor.cc:2020 editor_actions.cc:344 processor_box.cc:2518
+msgid "Cut"
+msgstr "Ausschneiden"
+
+#: editor.cc:1950 editor.cc:2021 editor_actions.cc:348 processor_box.cc:2521
+msgid "Copy"
+msgstr "Kopieren"
+
+#: editor.cc:1951 editor.cc:2022 editor_actions.cc:349 processor_box.cc:2529
+msgid "Paste"
+msgstr "Einfügen"
+
+#: editor.cc:1955 editor_actions.cc:91
+msgid "Align"
+msgstr "Ausrichten"
+
+#: editor.cc:1956
+msgid "Align Relative"
+msgstr "Relativ ausrichten"
+
+#: editor.cc:1963
+msgid "Insert Selected Region"
+msgstr "Ausgewählte Region einfügen"
+
+#: editor.cc:1964
+msgid "Insert Existing Media"
+msgstr "Vorhandenes Material importieren"
+
+#: editor.cc:1973 editor.cc:2029
+msgid "Nudge Entire Track Later"
+msgstr "Gesamte Spur schrittweise nach hinten"
+
+#: editor.cc:1974 editor.cc:2030
+msgid "Nudge Track After Edit Point Later"
+msgstr "Spur nach Arbeitspunkt schrittweise nach hinten"
+
+#: editor.cc:1975 editor.cc:2031
+msgid "Nudge Entire Track Earlier"
+msgstr "Gesamte Spur schrittweise nach vorne"
+
+#: editor.cc:1976 editor.cc:2032
+msgid "Nudge Track After Edit Point Earlier"
+msgstr "Spur nach Arbeitspunkt schrittweise nach vorne"
+
+#: editor.cc:1978 editor.cc:2034
+msgid "Nudge"
+msgstr "Verschieben"
+
+#: editor.cc:2249
+msgid ""
+"Playhead position stored with a negative value - ignored (use zero instead)"
+msgstr ""
+"Positionzeiger mit negativer Position - ignoriert (benutze stattdessen Null)"
+
+#: editor.cc:3027 editor.cc:3724 editor.cc:3795 midi_channel_selector.cc:157
+#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
+msgid "All"
+msgstr "Alle"
+
+#: editor.cc:3227
+msgid "Smart Mode (add Range functions to Grab mode)"
+msgstr "Smart-Modus (zusätzliche Bereichsfunktionen im Greifmodus)"
+
+#: editor.cc:3228
+msgid "Grab Mode (select/move objects)"
+msgstr "Greifmodus (Objekte auswählen/bewegen)"
+
+#: editor.cc:3229
+msgid "Cut Mode (split regions)"
+msgstr "Schneidemodus (Regionen teilen)"
+
+#: editor.cc:3230
+msgid "Range Mode (select time ranges)"
+msgstr "Bereichsmodus (Zeitbereiche auswählen)"
+
+#: editor.cc:3231
+msgid "Draw Mode (draw and edit gain/notes/automation)"
+msgstr "Zeichenmodus (zeichne und editiere Lautstärken/Noten/Automationen)"
+
+#: editor.cc:3232
+msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
+msgstr ""
+"Streckmodus (Audio- und MIDI-Regionen zeitstrecken, ohne die Tonhöhe zu "
+"ändern)"
+
+#: editor.cc:3233
+msgid "Audition Mode (listen to regions)"
+msgstr "Vorhörmodus (Regionen anhören)"
+
+#: editor.cc:3234
+msgid "Internal Edit Mode (edit notes and automation points)"
+msgstr ""
+"Interner Bearbeitungsmodus (Noten und Automationspunkte innerhalb der "
+"Regionen "
+"editieren)"
+
+#: editor.cc:3235
+msgid ""
+"Groups: click to (de)activate\n"
+"Context-click for other operations"
+msgstr ""
+"Gruppen: Klicken zum (De)aktivieren\n"
+"Rechtsklick für Optionen"
+
+#: editor.cc:3236
+msgid "Nudge Region/Selection Later"
+msgstr "Region/Auswahl schrittweise nach hinten"
+
+#: editor.cc:3237
+msgid "Nudge Region/Selection Earlier"
+msgstr "Region/Auswahl schrittweise nach vorne"
+
+#: editor.cc:3238 editor_actions.cc:269
+msgid "Zoom In"
+msgstr "Vergrößern"
+
+#: editor.cc:3239 editor_actions.cc:268
+msgid "Zoom Out"
+msgstr "Verkleinern"
+
+#: editor.cc:3240
+msgid "Zoom to Time Scale"
+msgstr "Zu einer Zeitspanne zoomen"
+
+#: editor.cc:3241 editor.cc:3746 editor_actions.cc:270
+msgid "Zoom to Session"
+msgstr "Auf ganzes Projekt zoomen"
+
+#: editor.cc:3242
+msgid "Zoom focus"
+msgstr "Zoom-Mittelpunkt"
+
+#: editor.cc:3243
+msgid "Expand Tracks"
+msgstr "Spuren vergrößern"
+
+#: editor.cc:3244
+msgid "Shrink Tracks"
+msgstr "Spuren verkleinern"
+
+#: editor.cc:3245
+msgid "Number of visible tracks"
+msgstr "Anzahl der sichtbaren Spuren"
+
+#: editor.cc:3246
+msgid "Snap/Grid Units"
+msgstr "Rastereinheiten"
+
+#: editor.cc:3247
+msgid "Snap/Grid Mode"
+msgstr "Einrastmodus"
+
+#: editor.cc:3249
+msgid "Edit Mode"
+msgstr "Bearbeitungsmodus"
+
+#: editor.cc:3250
+msgid ""
+"Nudge Clock\n"
+"(controls distance used to nudge regions and selections)"
+msgstr ""
+"Uhr für Schrittweite\n"
+"(bestimmt den Abstand für das schrittweise Verschieben von Regionen und "
+"Bereichen)"
+
+#: editor.cc:3518 editor_actions.cc:320
+msgid "Command|Undo"
+msgstr "Rückgängig"
+
+#: editor.cc:3520
+msgid "Command|Undo (%1)"
+msgstr "Rückgängig (%1)"
+
+#: editor.cc:3527 editor_actions.cc:322 editor_actions.cc:323
+#: editor_actions.cc:324
+msgid "Redo"
+msgstr "Wiederherstellen"
+
+#: editor.cc:3529
+msgid "Redo (%1)"
+msgstr "Wiederherstellen (%1)"
+
+#: editor.cc:3548 editor.cc:3572 editor_actions.cc:110 editor_actions.cc:1858
+msgid "Duplicate"
+msgstr "Duplizieren"
+
+#: editor.cc:3549
+msgid "Number of duplications:"
+msgstr "Anzahl der Duplikate:"
+
+#: editor.cc:3723 route_group_dialog.cc:51 time_info_box.cc:67
+msgid "Selection"
+msgstr "Auswahl"
+
+#: editor.cc:3726
+msgid "Fit 1 track"
+msgstr "1 Spur einpassen"
+
+#: editor.cc:3727
+msgid "Fit 2 tracks"
+msgstr "2 Spuren einpassen"
+
+#: editor.cc:3728
+msgid "Fit 4 tracks"
+msgstr "4 Spuren einpassen"
+
+#: editor.cc:3729
+msgid "Fit 8 tracks"
+msgstr "8 Spuren einpassen"
+
+#: editor.cc:3730
+msgid "Fit 16 tracks"
+msgstr "16 Spuren einpassen"
+
+#: editor.cc:3731
+msgid "Fit 24 tracks"
+msgstr "24 Spuren einpassen"
+
+#: editor.cc:3732
+msgid "Fit 32 tracks"
+msgstr "32 Spuren einpassen"
+
+#: editor.cc:3733
+msgid "Fit 48 tracks"
+msgstr "48 Spuren einpassen"
+
+#: editor.cc:3734
+msgid "Fit All tracks"
+msgstr "Alle Spuren einpassen"
+
+#: editor.cc:3735
+msgid "Fit Selection"
+msgstr "Passe Auswahl ein"
+
+#: editor.cc:3737
+msgid "Zoom to 10 ms"
+msgstr "Zoome auf 10 ms"
+
+#: editor.cc:3738
+msgid "Zoom to 100 ms"
+msgstr "Zoome auf 100 ms"
+
+#: editor.cc:3739
+msgid "Zoom to 1 sec"
+msgstr "Zoome auf 1 Sek."
+
+#: editor.cc:3740
+msgid "Zoom to 10 sec"
+msgstr "Zoome auf 10 Sek."
+
+#: editor.cc:3741
+msgid "Zoom to 1 min"
+msgstr "Zoome auf 1 Min."
+
+#: editor.cc:3742
+msgid "Zoom to 10 min"
+msgstr "Zoome auf 10 Min."
+
+#: editor.cc:3743
+msgid "Zoom to 1 hour"
+msgstr "Zoome auf 1 Stunde"
+
+#: editor.cc:3744
+msgid "Zoom to 8 hours"
+msgstr "Zoome auf 8 Stunden"
+
+#: editor.cc:3745
+msgid "Zoom to 24 hours"
+msgstr "Zoome auf 24 Stunden"
+
+#: editor.cc:3747
+msgid "Zoom to Range/Region Selection"
+msgstr "Zoome auf Bereichs-/Regionenauswahl"
+
+#: editor.cc:3817
+msgid "*"
+msgstr "*"
+
+#: editor.cc:4137
+msgid "Playlist Deletion"
+msgstr "Löschen von Wiedergabelisten"
+
+#: editor.cc:4138
+msgid ""
+"Playlist %1 is currently unused.\n"
+"If it is kept, its audio files will not be cleaned.\n"
+"If it is deleted, audio files used by it alone will be cleaned."
+msgstr ""
+"Die Wiedergabeliste %1 wird momentan nicht verwendet.\n"
+"Wenn sie nicht gelöscht wird, können keine Audiodateien aufgeräumt werden, "
+"die von ihr verwendet werden.\n"
+"Falls sie gelöscht wird, werden die ausschließlich von ihr verwendeten "
+"Audiodateien gelöscht."
+
+#: editor.cc:4148
+msgid "Delete Playlist"
+msgstr "Wiedergabeliste löschen"
+
+#: editor.cc:4149
+msgid "Keep Playlist"
+msgstr "Wiedergabeliste behalten"
+
+#: editor.cc:4150 editor_audio_import.cc:597 editor_ops.cc:6407
+#: engine_dialog.cc:2679 sfdb_freesound_mootcher.cc:69 processor_box.cc:2286
+#: processor_box.cc:2311
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: editor.cc:4292
+msgid "new playlists"
+msgstr "Neue Wiedergabelisten"
+
+#: editor.cc:4308
+msgid "copy playlists"
+msgstr "Wiedergabelisten kopieren"
+
+#: editor.cc:4323
+msgid "clear playlists"
+msgstr "Wiedergabelisten zurücksetzen"
+
+#: editor.cc:5068
+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:5920 editor.cc:5951 editor_markers.cc:978 panner_ui.cc:410
+#: processor_box.cc:2549
+msgid "Edit..."
+msgstr "Bearbeiten..."
+
+#: editor.cc:5953 editor_actions.cc:1953
+msgid "Legatize"
+msgstr "überbinden (Legato)"
+
+#: editor.cc:5955 editor_actions.cc:1952
+msgid "Quantize..."
+msgstr "Quantisieren.."
+
+#: editor.cc:5957 editor_actions.cc:1955
+msgid "Remove Overlap"
+msgstr "Überlappung entfernen (Legato)"
+
+#: editor.cc:5959 editor_actions.cc:1954
+msgid "Transform..."
+msgstr "Transformiere..."
+
+#: editor_actions.cc:92
+msgid "Autoconnect"
+msgstr "Automatisch verbinden"
+
+#: editor_actions.cc:93
+msgid "Crossfades"
+msgstr "Crossfades"
+
+#: editor_actions.cc:95
+msgid "Move Selected Marker"
+msgstr "Ausgewählten Positionsmarker verschieben"
+
+#: editor_actions.cc:96
+msgid "Select Range Operations"
+msgstr "Bereichs"
+
+#: editor_actions.cc:97
+msgid "Select Regions"
+msgstr "Region auswählen"
+
+#: editor_actions.cc:98
+msgid "Edit Point"
+msgstr "Arbeitspunkt"
+
+#: editor_actions.cc:99
+msgid "Fade"
+msgstr "Fade"
+
+#: editor_actions.cc:100
+msgid "Latch"
+msgstr "Latch"
+
+#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+msgid "Region"
+msgstr "Region"
+
+#: editor_actions.cc:102
+msgid "Layering"
+msgstr "Layering"
+
+#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+msgid "Position"
+msgstr "Position"
+
+#: editor_actions.cc:105 gain_meter.cc:158 gain_meter.cc:827 panner_ui.cc:176
+#: panner_ui.cc:635 route_time_axis.cc:528
+msgid "Trim"
+msgstr "Anpassen"
+
+#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+msgid "Gain"
+msgstr "Lautstärke"
+
+#: editor_actions.cc:107 editor_actions.cc:572
+msgid "Ranges"
+msgstr "Bereiche"
+
+#: editor_actions.cc:108 editor_actions.cc:1854 session_option_editor.cc:135
+#: session_option_editor.cc:144 session_option_editor.cc:151
+msgid "Fades"
+msgstr "Fades"
+
+#: editor_actions.cc:111
+msgid "Link"
+msgstr "Verknüpfen"
+
+#: editor_actions.cc:112 editor_actions.cc:145
+msgid "Zoom Focus"
+msgstr "Zoom Fokus"
+
+#: editor_actions.cc:113
+msgid "Locate to Markers"
+msgstr "Positionszeiger zu Marker setzen"
+
+#: editor_actions.cc:115
+msgid "Meter falloff"
+msgstr "Abfall der Pegelanzeigen"
+
+#: editor_actions.cc:116
+msgid "Meter hold"
+msgstr "Pegelanzeige halten"
+
+#: editor_actions.cc:117 session_option_editor.cc:321
+msgid "MIDI Options"
+msgstr "MIDI Optionen"
+
+#: editor_actions.cc:118
+msgid "Misc Options"
+msgstr "Sonstiges"
+
+#: editor_actions.cc:119 rc_option_editor.cc:2283 route_group_dialog.cc:54
+#: session_option_editor.cc:243 session_option_editor.cc:250
+msgid "Monitoring"
+msgstr "Monitoring"
+
+#: editor_actions.cc:120
+msgid "Active Mark"
+msgstr "Aktiver Marker"
+
+#: editor_actions.cc:123
+msgid "Primary Clock"
+msgstr "Erste Zeitanzeige"
+
+#: editor_actions.cc:124
+msgid "Pullup / Pulldown"
+msgstr "Pull-Up / Pull-Down"
+
+#: editor_actions.cc:125
+msgid "Region operations"
+msgstr "Region(en)"
+
+#: editor_actions.cc:127 ruler_dialog.cc:28
+msgid "Rulers"
+msgstr "Markierungsleisten"
+
+#: editor_actions.cc:128
+msgid "Views"
+msgstr "Ansichten"
+
+#: editor_actions.cc:129
+msgid "Scroll"
+msgstr "Scrollen"
+
+#: editor_actions.cc:130
+msgid "Secondary Clock"
+msgstr "Zweite Zeitanzeige"
+
+#: editor_actions.cc:137
+msgid "Subframes"
+msgstr "Subframes"
+
+#: editor_actions.cc:140
+msgid "Timecode fps"
+msgstr "Timecode FPS"
+
+#: editor_actions.cc:141 route_time_axis.cc:586
+msgid "Height"
+msgstr "Höhe"
+
+#: editor_actions.cc:143
+msgid "Tools"
+msgstr "Werkzeuge"
+
+#: editor_actions.cc:144
+msgid "View"
+msgstr "Ansicht"
+
+#: editor_actions.cc:146
+msgid "Zoom"
+msgstr "Zoom"
+
+#: editor_actions.cc:152
+msgid "Break drag or deselect all"
+msgstr "Ziehen abbrechen oder alles deselektieren"
+
+#: editor_actions.cc:157
+msgid "Session|Lock"
+msgstr "Sperren"
+
+#: editor_actions.cc:159
+msgid "Show Editor Mixer"
+msgstr "Mixer-Panel zeigen"
+
+#: editor_actions.cc:160
+msgid "Show Editor List"
+msgstr "Seitenleiste anzeigen"
+
+#: editor_actions.cc:162
+msgid "Playhead to Next Region Boundary"
+msgstr "Positionszeiger zur nächsten Regiongrenze"
+
+#: editor_actions.cc:163
+msgid "Playhead to Next Region Boundary (No Track Selection)"
+msgstr "Positionszeiger zur nächsten Regiongrenze (ohne Spurauswahl)"
+
+#: editor_actions.cc:164
+msgid "Playhead to Previous Region Boundary"
+msgstr "Positionszeiger zur vorherigen Regiongrenze"
+
+#: editor_actions.cc:165
+msgid "Playhead to Previous Region Boundary (No Track Selection)"
+msgstr "Positionszeiger zur vorherigen Regiongrenze (ohne Spurauswahl)"
+
+#: editor_actions.cc:167
+msgid "Playhead to Next Region Start"
+msgstr "Positionszeiger zum Anfang der nächsten Region"
+
+#: editor_actions.cc:168
+msgid "Playhead to Next Region End"
+msgstr "Positionszeiger zum Ende der nächsten Region"
+
+#: editor_actions.cc:169
+msgid "Playhead to Next Region Sync"
+msgstr "Positionszeiger zum Einrastpunkt der nächsten Region"
+
+#: editor_actions.cc:171
+msgid "Playhead to Previous Region Start"
+msgstr "Positionszeiger zum Anfang der vorherigen Region"
+
+#: editor_actions.cc:172
+msgid "Playhead to Previous Region End"
+msgstr "Positionszeiger zum Ende der vorherigen Region"
+
+#: editor_actions.cc:173
+msgid "Playhead to Previous Region Sync"
+msgstr "Positionszeiger zum Einrastpunkt der vorherigen Region"
+
+#: editor_actions.cc:175
+msgid "To Next Region Boundary"
+msgstr "Zur nächsten Regiongrenze"
+
+#: editor_actions.cc:176
+msgid "To Next Region Boundary (No Track Selection)"
+msgstr "Zur nächsten Regiongrenze (ohne Spurauswahl)"
+
+#: editor_actions.cc:177
+msgid "To Previous Region Boundary"
+msgstr "Zur vorherigen Regiongrenze"
+
+#: editor_actions.cc:178
+msgid "To Previous Region Boundary (No Track Selection)"
+msgstr "Zur vorherigen Regiongrenze (ohne Spurauswahl)"
+
+#: editor_actions.cc:180
+msgid "To Next Region Start"
+msgstr "Zum nächsten Regionen-Anfang"
+
+#: editor_actions.cc:181
+msgid "To Next Region End"
+msgstr "Zum nächsten Regionen-Ende"
+
+#: editor_actions.cc:182
+msgid "To Next Region Sync"
+msgstr "Zum nächsten Regionen-Synchronisationspunkt"
+
+#: editor_actions.cc:184
+msgid "To Previous Region Start"
+msgstr "Zum vorherigen Anfang einer Region"
+
+#: editor_actions.cc:185
+msgid "To Previous Region End"
+msgstr "Zum vorherigen Ende einer Region"
+
+#: editor_actions.cc:186
+msgid "To Previous Region Sync"
+msgstr "Zum vorherigen Synchronisationspunkt einer Region"
+
+#: editor_actions.cc:188
+msgid "To Range Start"
+msgstr "Zum Anfang des Auswahlbereichs"
+
+#: editor_actions.cc:189
+msgid "To Range End"
+msgstr "Zum Ende des Auswahlbereichs"
+
+#: editor_actions.cc:191
+msgid "Playhead to Range Start"
+msgstr "Positionszeiger zum Anfang des Auswahlbereichs"
+
+#: editor_actions.cc:192
+msgid "Playhead to Range End"
+msgstr "Positionszeiger zum Ende des Auswahlbereichs"
+
+#: editor_actions.cc:195
+msgid "Select All Tracks"
+msgstr "Alle Spuren auswählen"
+
+#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2535
+msgid "Deselect All"
+msgstr "Nichts auswählen"
+
+#: editor_actions.cc:199
+msgid "Set Range in Loop Range"
+msgstr "Bereich auf Schleife setzen"
+
+#: editor_actions.cc:208
+msgid "Select All Overlapping Edit Range"
+msgstr "Alle Regionen des Bearbeitungsbereichs auswählen "
+
+#: editor_actions.cc:209
+msgid "Select All Inside Edit Range"
+msgstr "Alles inerhalb des Bearbeitungsbereichs auswählen"
+
+#: editor_actions.cc:211
+msgid "Select Edit Range"
+msgstr "Editierbereich auswählen"
+
+#: editor_actions.cc:213
+msgid "Select All in Punch Range"
+msgstr "Alle Regionen im Punchbereich auswählen"
+
+#: editor_actions.cc:214
+msgid "Select All in Loop Range"
+msgstr "Alle Regionen innerhalb der Schleife auswählen"
+
+#: editor_actions.cc:216
+msgid "Select Next Track or Bus"
+msgstr "Nächste Spur/Bus auswählen"
+
+#: editor_actions.cc:217
+msgid "Select Previous Track or Bus"
+msgstr "Vorherige Spur/Bus auswählen"
+
+#: editor_actions.cc:219
+msgid "Toggle Record Enable"
+msgstr "Aufnahmebereitschaft umschalten"
+
+#: editor_actions.cc:221
+msgid "Toggle Solo"
+msgstr "Solo umschalten"
+
+#: editor_actions.cc:223
+msgid "Toggle Mute"
+msgstr "Mute umschalten"
+
+#: editor_actions.cc:225
+msgid "Toggle Solo Isolate"
+msgstr "Isoliertes Solo umschalten"
+
+#: editor_actions.cc:230
+msgid "Save View %1"
+msgstr "Ansicht %1 speichern"
+
+#: editor_actions.cc:236
+msgid "Go to View %1"
+msgstr "Ansicht %1 aufrufen"
+
+#: editor_actions.cc:242
+msgid "Locate to Mark %1"
+msgstr "Positionszeiger zu Marker %1 setzen"
+
+#: editor_actions.cc:246 editor_actions.cc:247
+msgid "Jump to Next Mark"
+msgstr "Zu nächstem Marker springen"
+
+#: editor_actions.cc:248 editor_actions.cc:249
+msgid "Jump to Previous Mark"
+msgstr "Zur vorherigen Marker springen"
+
+#: editor_actions.cc:251
+msgid "Set Session Start from Playhead"
+msgstr "Projektbeginn auf Positionszeiger setzen"
+
+#: editor_actions.cc:252
+msgid "Set Session End from Playhead"
+msgstr "Projektende auf Positionszeiger setzen"
+
+#: editor_actions.cc:254 editor_actions.cc:255
+msgid "Add Mark from Playhead"
+msgstr "Marker am Positionszeiger setzen"
+
+#: editor_actions.cc:257 editor_actions.cc:258
+msgid "Remove Mark at Playhead"
+msgstr "Marker beim Positionszeiger entfernen"
+
+#: editor_actions.cc:260
+msgid "Nudge Next Later"
+msgstr "Nächste Region schrittweise nach hinten"
+
+#: editor_actions.cc:261
+msgid "Nudge Next Earlier"
+msgstr "Nächste Region schrittweise nach vorne"
+
+#: editor_actions.cc:263
+msgid "Nudge Playhead Forward"
+msgstr "Positionszeiger vorwärts"
+
+#: editor_actions.cc:264
+msgid "Nudge Playhead Backward"
+msgstr "Positionszeiger rückwärts"
+
+#: editor_actions.cc:265
+msgid "Playhead To Next Grid"
+msgstr "Positionszeiger zum nächsten Rasterpunkt"
+
+#: editor_actions.cc:266
+msgid "Playhead To Previous Grid"
+msgstr "Positionszeiger zum vorherigen Rasterpunkt"
+
+#: editor_actions.cc:271
+msgid "Zoom to Selection"
+msgstr "Zoome zu Auswahl"
+
+#: editor_actions.cc:272
+msgid "Toggle Zoom State"
+msgstr "Letzten Zoom wählen"
+
+#: editor_actions.cc:274
+msgid "Expand Track Height"
+msgstr "Spurhöhe vergrößern"
+
+#: editor_actions.cc:275
+msgid "Shrink Track Height"
+msgstr "Spurhöhe verkleinern"
+
+#: editor_actions.cc:277
+msgid "Move Selected Tracks Up"
+msgstr "Ausgewählte Spuren nach oben verschieben"
+
+#: editor_actions.cc:279
+msgid "Move Selected Tracks Down"
+msgstr "Ausgewählte Spuren nach unten verschieben"
+
+#: editor_actions.cc:282
+msgid "Scroll Tracks Up"
+msgstr "Spuren nach oben scrollen"
+
+#: editor_actions.cc:284
+msgid "Scroll Tracks Down"
+msgstr "Spuren nach unten scrollen"
+
+#: editor_actions.cc:286
+msgid "Step Tracks Up"
+msgstr "Spuren langsam nach oben scrollen"
+
+#: editor_actions.cc:288
+msgid "Step Tracks Down"
+msgstr "Spuren langsam nach unten scrollen"
+
+#: editor_actions.cc:291
+msgid "Scroll Backward"
+msgstr "Nach rechts scrollen"
+
+#: editor_actions.cc:292
+msgid "Scroll Forward"
+msgstr "Nach links scrollen"
+
+#: editor_actions.cc:293
+msgid "Center Playhead"
+msgstr "Positionszeiger zentrieren"
+
+#: editor_actions.cc:294
+msgid "Center Edit Point"
+msgstr "Arbeitspunkt zentrieren"
+
+#: editor_actions.cc:296
+msgid "Playhead Forward"
+msgstr "Positionszeiger vorwärts"
+
+#: editor_actions.cc:297
+msgid "Playhead Backward"
+msgstr "Positionszeiger rückwärts"
+
+#: editor_actions.cc:299
+msgid "Playhead to Active Mark"
+msgstr "Positionszeiger zur aktiven Markierung"
+
+#: editor_actions.cc:300
+msgid "Active Mark to Playhead"
+msgstr "Aktiven Marker zum Positionszeiger verschieben"
+
+#: editor_actions.cc:302
+msgid "Use Skip Ranges"
+msgstr "Benutze Sprungbereiche"
+
+#: editor_actions.cc:309
+msgid "Play Selected Regions"
+msgstr "Ausgewählte Regionen wiedergeben"
+
+#: editor_actions.cc:311
+msgid "Play from Edit Point and Return"
+msgstr "Wiedergabe ab Arbeitspunkt & Zurück"
+
+#: editor_actions.cc:313
+msgid "Play Edit Range"
+msgstr "Editierbereich wiedergeben"
+
+#: editor_actions.cc:315
+msgid "Playhead to Mouse"
+msgstr "Positionszeiger zur Mausposition"
+
+#: editor_actions.cc:316
+msgid "Active Marker to Mouse"
+msgstr "Aktiven Marker zur Mausposition"
+
+#: editor_actions.cc:326
+msgid "Undo Selection Change"
+msgstr "Auswahländerung rückgängig machen"
+
+#: editor_actions.cc:327
+msgid "Redo Selection Change"
+msgstr "Auswahländerung wiederherstellen"
+
+#: editor_actions.cc:329
+msgid "Export Audio"
+msgstr "Audio exportieren"
+
+#: editor_actions.cc:330 export_dialog.cc:396
+msgid "Export Range"
+msgstr "Bereich exportieren"
+
+#: editor_actions.cc:335
+msgid "Separate Using Punch Range"
+msgstr "an Punch-Bereichsgrenzen teilen"
+
+#: editor_actions.cc:338
+msgid "Separate Using Loop Range"
+msgstr "an Schleifengrenzen teilen"
+
+#: editor_actions.cc:341 editor_actions.cc:363
+msgid "Crop"
+msgstr "Auf Bereich zuschneiden"
+
+#: editor_actions.cc:351
+msgid "Fade Range Selection"
+msgstr "Bereichsauswahl faden"
+
+#: editor_actions.cc:353
+msgid "Set Tempo from Edit Range = Bar"
+msgstr "Editierbereich = Taktlänge setzen"
+
+#: editor_actions.cc:355
+msgid "Log"
+msgstr "Log"
+
+#: editor_actions.cc:358 editor_actions.cc:360
+msgid "Move to Next Transient"
+msgstr "Zum nächsten Transienten bewegen"
+
+#: editor_actions.cc:359 editor_actions.cc:361
+msgid "Move to Previous Transient"
+msgstr "Zum vorigen Transienten bewegen"
+
+#: editor_actions.cc:365 editor_actions.cc:368
+msgid "Start Range"
+msgstr "Bereich beginnen"
+
+#: editor_actions.cc:366 editor_actions.cc:369
+msgid "Finish Range"
+msgstr "Bereich beenden"
+
+#: editor_actions.cc:401
+msgid "Follow Playhead"
+msgstr "Positionszeiger folgen"
+
+#: editor_actions.cc:402
+msgid "Remove Last Capture"
+msgstr "Letzte Aufnahme entfernen"
+
+#: editor_actions.cc:404
+msgid "Stationary Playhead"
+msgstr "stehender Positionszeiger"
+
+#: editor_actions.cc:406 insert_remove_time_dialog.cc:32
+msgid "Insert Time"
+msgstr "Stille Einfügen"
+
+#: editor_actions.cc:408 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr "Zeit entfernen"
+
+#: editor_actions.cc:413
+msgid "Toggle Active"
+msgstr "Spur De/Aktivieren"
+
+#: editor_actions.cc:415 editor_actions.cc:1780 editor_markers.cc:914
+#: editor_markers.cc:979 editor_snapshots.cc:122 mixer_strip.cc:1603
+#: route_time_axis.cc:867
+msgid "Remove"
+msgstr "Löschen"
+
+#: editor_actions.cc:420
+msgid "Fit Selection (Vertical)"
+msgstr "Auswahl einpassen (vertikal)"
+
+#: editor_actions.cc:422 time_axis_view.cc:1382
+msgid "Largest"
+msgstr "Am größten"
+
+#: editor_actions.cc:425 time_axis_view.cc:1383
+msgid "Larger"
+msgstr "Größer"
+
+#: editor_actions.cc:428 editor_rulers.cc:249 time_axis_view.cc:1384
+msgid "Large"
+msgstr "Groß"
+
+#: editor_actions.cc:434 editor_rulers.cc:253 time_axis_view.cc:1386
+msgid "Small"
+msgstr "Klein"
+
+#: editor_actions.cc:438
+msgid "Sound Selected MIDI Notes"
+msgstr "ausgewählte Noten abspielen"
+
+#: editor_actions.cc:443
+msgid "Zoom Focus Left"
+msgstr "Am linken Rand ausrichten"
+
+#: editor_actions.cc:444
+msgid "Zoom Focus Right"
+msgstr "Am rechten Rand ausrichten"
+
+#: editor_actions.cc:445
+msgid "Zoom Focus Center"
+msgstr "Zentriert ausrichten"
+
+#: editor_actions.cc:446
+msgid "Zoom Focus Playhead"
+msgstr "Am Positionszeiger ausrichten"
+
+#: editor_actions.cc:447
+msgid "Zoom Focus Mouse"
+msgstr "Zoom Fokus zur Maus"
+
+#: editor_actions.cc:448
+msgid "Zoom Focus Edit Point"
+msgstr "Zoom Fokus zu Arbeitspunkt"
+
+#: editor_actions.cc:450
+msgid "Next Zoom Focus"
+msgstr "Zoom FokusNächster "
+
+#: editor_actions.cc:456
+msgid "Smart Object Mode"
+msgstr "Smarter Objektmodus"
+
+#: editor_actions.cc:459
+msgid "Smart"
+msgstr "Smart"
+
+#: editor_actions.cc:462
+msgid "Object Tool"
+msgstr "Objektwerkzeug"
+
+#: editor_actions.cc:467
+msgid "Range Tool"
+msgstr "Bereich-Werkzeug (Range)"
+
+#: editor_actions.cc:472
+msgid "Note Drawing Tool"
+msgstr "Noten-Malwerkzeug"
+
+#: editor_actions.cc:477
+msgid "Audition Tool"
+msgstr "Vorhör-Werkzeug"
+
+#: editor_actions.cc:482
+msgid "Time FX Tool"
+msgstr "TimeFX-Werkzeug"
+
+#: editor_actions.cc:487
+msgid "Content Tool"
+msgstr "Inhaltswerkzeug"
+
+#: editor_actions.cc:493
+msgid "Cut Tool"
+msgstr "Schneidewerkzeug"
+
+#: editor_actions.cc:499
+msgid "Step Mouse Mode"
+msgstr "Schritt-Mausmodus"
+
+#: editor_actions.cc:506
+msgid "Change Edit Point"
+msgstr "Arbeitspunkt ändern"
+
+#: editor_actions.cc:507
+msgid "Change Edit Point Including Marker"
+msgstr "Arbeitspunkt ändern (auch auf Marker wechseln)"
+
+#: editor_actions.cc:512
+msgid "EditMode|Lock"
+msgstr "Sperren"
+
+#: editor_actions.cc:513
+msgid "Cycle Edit Mode"
+msgstr "Bearbeitungsmodus weiterschalten"
+
+#: editor_actions.cc:515
+msgid "Snap to"
+msgstr "Einrasten"
+
+#: editor_actions.cc:516
+msgid "Snap Mode"
+msgstr "Einrastmodus"
+
+#: editor_actions.cc:523
+msgid "Next Snap Mode"
+msgstr "Nächster Einrastmodus"
+
+#: editor_actions.cc:524
+msgid "Next Snap Choice"
+msgstr "Nächste Einrastmöglichkeit"
+
+#: editor_actions.cc:525
+msgid "Next Musical Snap Choice"
+msgstr "Nächster Einrastmöglichkeit (musikalisch)"
+
+#: editor_actions.cc:526
+msgid "Previous Snap Choice"
+msgstr "Vorige Einrastmöglichkeit"
+
+#: editor_actions.cc:527
+msgid "Previous Musical Snap Choice"
+msgstr " Vorige Einrastmöglichkeit (musikalisch)"
+
+#: editor_actions.cc:532
+msgid "Snap to CD Frame"
+msgstr "An CD-Frames einrasten"
+
+#: editor_actions.cc:533
+msgid "Snap to Timecode Frame"
+msgstr "An Timecode-Frames einrasten"
+
+#: editor_actions.cc:534
+msgid "Snap to Timecode Seconds"
+msgstr "An Timecode-Sekunden einrasten"
+
+#: editor_actions.cc:535
+msgid "Snap to Timecode Minutes"
+msgstr "An Timecode-Minuten einrasten"
+
+#: editor_actions.cc:536
+msgid "Snap to Seconds"
+msgstr "An Sekunden einrasten"
+
+#: editor_actions.cc:537
+msgid "Snap to Minutes"
+msgstr "An Minuten einrasten"
+
+#: editor_actions.cc:539
+msgid "Snap to One Twenty Eighths"
+msgstr "An Schläge/28 einrasten"
+
+#: editor_actions.cc:540
+msgid "Snap to Sixty Fourths"
+msgstr "An Schläge/128 einrasten"
+
+#: editor_actions.cc:541
+msgid "Snap to Thirty Seconds"
+msgstr "An Schläge/32 einrasten"
+
+#: editor_actions.cc:542
+msgid "Snap to Twenty Eighths"
+msgstr "An Schläge/28 einrasten"
+
+#: editor_actions.cc:543
+msgid "Snap to Twenty Fourths"
+msgstr "An Schläge/24 einrasten"
+
+#: editor_actions.cc:544
+msgid "Snap to Twentieths"
+msgstr "An Schläge/20 einrasten"
+
+#: editor_actions.cc:545
+msgid "Snap to Sixteenths"
+msgstr "An Schläge/16 einrasten"
+
+#: editor_actions.cc:546
+msgid "Snap to Fourteenths"
+msgstr "An Schläge/14 einrasten"
+
+#: editor_actions.cc:547
+msgid "Snap to Twelfths"
+msgstr "An Schläge/12 einrasten"
+
+#: editor_actions.cc:548
+msgid "Snap to Tenths"
+msgstr "An Schläge/10 einrasten"
+
+#: editor_actions.cc:549
+msgid "Snap to Eighths"
+msgstr "An Schläge/8 einrasten"
+
+#: editor_actions.cc:550
+msgid "Snap to Sevenths"
+msgstr "An Schläge/7 einrasten"
+
+#: editor_actions.cc:551
+msgid "Snap to Sixths"
+msgstr "An Schläge/6 einrasten"
+
+#: editor_actions.cc:552
+msgid "Snap to Fifths"
+msgstr "An Schläge/5 einrasten"
+
+#: editor_actions.cc:553
+msgid "Snap to Quarters"
+msgstr "An Schläge/4 einrasten"
+
+#: editor_actions.cc:554
+msgid "Snap to Thirds"
+msgstr "An Triolen einrasten"
+
+#: editor_actions.cc:555
+msgid "Snap to Halves"
+msgstr "An Schläge/2 einrasten"
+
+#: editor_actions.cc:557
+msgid "Snap to Beat"
+msgstr "An Schlägen einrasten"
+
+#: editor_actions.cc:558
+msgid "Snap to Bar"
+msgstr "An Takten einrasten"
+
+#: editor_actions.cc:559
+msgid "Snap to Mark"
+msgstr "An Markern einrasten"
+
+#: editor_actions.cc:560
+msgid "Snap to Region Start"
+msgstr "An Regionenanfang einrasten"
+
+#: editor_actions.cc:561
+msgid "Snap to Region End"
+msgstr "An Regionenende einrasten"
+
+#: editor_actions.cc:562
+msgid "Snap to Region Sync"
+msgstr "An Regionen-Synchronisationspunkt einrasten"
+
+#: editor_actions.cc:563
+msgid "Snap to Region Boundary"
+msgstr "An Regionengrenzen einrasten"
+
+#: editor_actions.cc:565
+msgid "Show Marker Lines"
+msgstr "Markerlinien anzeigen"
+
+#: editor_actions.cc:575
+msgid "Loop/Punch"
+msgstr "Schleifen/Punchbereiche"
+
+#: editor_actions.cc:579
+msgid "Min:Sec"
+msgstr "Min:Sek"
+
+#: editor_actions.cc:581 editor_actions.cc:584 editor_rulers.cc:271
+msgid "Video Monitor"
+msgstr "Videomonitor"
+
+#: editor_actions.cc:583 rc_option_editor.cc:2734
+msgid "Video"
+msgstr "Video"
+
+#: editor_actions.cc:586
+msgid "Always on Top"
+msgstr "Immer oben"
+
+#: editor_actions.cc:588
+msgid "Frame number"
+msgstr "Framenummer"
+
+#: editor_actions.cc:589
+msgid "Timecode Background"
+msgstr "Timecode-Hintergrund"
+
+#: editor_actions.cc:590
+msgid "Fullscreen"
+msgstr "Vollbild"
+
+#: editor_actions.cc:591
+msgid "Letterbox"
+msgstr "Letterbox"
+
+#: editor_actions.cc:592
+msgid "Original Size"
+msgstr "Originalgröße"
+
+#: editor_actions.cc:649
+msgid "Sort"
+msgstr "Sortieren"
+
+#: editor_actions.cc:660 editor_routes.cc:484 mixer_ui.cc:1212
+msgid "Show All"
+msgstr "Alles anzeigen"
+
+#: editor_actions.cc:661
+msgid "Show Automatic Regions"
+msgstr "Automatische Regionen anzeigen"
+
+#: editor_actions.cc:663
+msgid "Ascending"
+msgstr "aufsteigend"
+
+#: editor_actions.cc:665
+msgid "Descending"
+msgstr "absteigend"
+
+#: editor_actions.cc:668
+msgid "By Region Name"
+msgstr "nach Name der Region"
+
+#: editor_actions.cc:670
+msgid "By Region Length"
+msgstr "nach Länge der Region"
+
+#: editor_actions.cc:672
+msgid "By Region Position"
+msgstr "nach Position der Region"
+
+#: editor_actions.cc:674
+msgid "By Region Timestamp"
+msgstr "nach Zeitstempel der Region"
+
+#: editor_actions.cc:676
+msgid "By Region Start in File"
+msgstr "nach Anfang der Region in der Datei"
+
+#: editor_actions.cc:678
+msgid "By Region End in File"
+msgstr "nach Ende der Region in der Datei"
+
+#: editor_actions.cc:680
+msgid "By Source File Name"
+msgstr "nach Namen der Quelldatei"
+
+#: editor_actions.cc:682
+msgid "By Source File Length"
+msgstr "nach Länge der Quelldatei"
+
+#: editor_actions.cc:684
+msgid "By Source File Creation Date"
+msgstr "nach Erstellungsdatum der Quelldatei"
+
+#: editor_actions.cc:686
+msgid "By Source Filesystem"
+msgstr "nach Dateisystem der Quelle"
+
+#: editor_actions.cc:689
+msgid "Remove Unused"
+msgstr "Ungenutzte entfernen"
+
+#: editor_actions.cc:691
+msgid "Import PT session"
+msgstr "PT Projekt importieren"
+
+#: editor_actions.cc:696 editor_audio_import.cc:282 editor_pt_import.cc:148
+#: session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+msgid "Import"
+msgstr "Importieren"
+
+#: editor_actions.cc:699
+msgid "Import to Region List..."
+msgstr "In Regionenliste importieren"
+
+#: editor_actions.cc:702 session_import_dialog.cc:44
+msgid "Import From Session"
+msgstr "Aus Projekt importieren"
+
+#: editor_actions.cc:706
+msgid "Bring all media into session folder"
+msgstr "Alle Medien in Projektordner kopieren"
+
+#: editor_actions.cc:709
+msgid "Show Summary"
+msgstr "Projektübersicht anzeigen"
+
+#: editor_actions.cc:711
+msgid "Show Group Tabs"
+msgstr "Gruppierungsleiste anzeigen"
+
+#: editor_actions.cc:713
+msgid "Show Measure Lines"
+msgstr "Zeige Taktlinien"
+
+#: editor_actions.cc:717
+msgid "Show Logo"
+msgstr "Zeige Logo"
+
+#: editor_actions.cc:721
+msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
+msgstr "MIDI Eingang für im Editor ausgewählte Spuren/Busse de/aktivieren"
+
+#: editor_actions.cc:744
+msgid "Loaded editor bindings from %1"
+msgstr "Editor-Tastenkürzel aus %1 geladen"
+
+#: editor_actions.cc:746
+msgid "Could not find editor.bindings in search path %1"
+msgstr "Konnte editor.bindings im Suchpfad %1 nicht finden"
+
+#: editor_actions.cc:1090 editor_actions.cc:1486 editor_actions.cc:1497
+#: editor_actions.cc:1550 editor_actions.cc:1561 editor_actions.cc:1608
+#: editor_actions.cc:1618 editor_regions.cc:1571
+msgid "programming error: %1: %2"
+msgstr "Programmierfehler: %1: %2"
+
+#: editor_actions.cc:1786
+msgid "Raise"
+msgstr "Nach oben"
+
+#: editor_actions.cc:1789
+msgid "Raise to Top"
+msgstr "Ganz nach oben"
+
+#: editor_actions.cc:1792
+msgid "Lower"
+msgstr "Nach unten"
+
+#: editor_actions.cc:1795
+msgid "Lower to Bottom"
+msgstr "Ganz nach unten"
+
+#: editor_actions.cc:1798
+msgid "Move to Original Position"
+msgstr "Zur Ursprungsposition verschieben"
+
+#: editor_actions.cc:1803
+msgid "Lock to Video"
+msgstr "an Video koppeln"
+
+#: editor_actions.cc:1808 editor_markers.cc:905
+msgid "Glue to Bars and Beats"
+msgstr "An Takte und Schläge binden"
+
+#: editor_actions.cc:1813
+msgid "Remove Sync"
+msgstr "Synchronisationspunkt entfernen"
+
+#: editor_actions.cc:1816 mixer_strip.cc:2068 monitor_section.cc:278
+#: monitor_section.cc:368 route_time_axis.cc:255 route_time_axis.cc:537
+msgid "Mute"
+msgstr "Mute"
+
+#: editor_actions.cc:1819
+msgid "Normalize..."
+msgstr "Normalisieren..."
+
+#: editor_actions.cc:1822
+msgid "Reverse"
+msgstr "Umkehren"
+
+#: editor_actions.cc:1825
+msgid "Make Mono Regions"
+msgstr "In Mono-Regionen umwandeln"
+
+#: editor_actions.cc:1828
+msgid "Boost Gain"
+msgstr "Lautstärke erhöhen"
+
+#: editor_actions.cc:1831
+msgid "Cut Gain"
+msgstr "Lautstärke reduzieren"
+
+#: editor_actions.cc:1834
+msgid "Pitch Shift..."
+msgstr "Tonhöhe ändern..."
+
+#: editor_actions.cc:1837
+msgid "Transpose..."
+msgstr "Transponieren..."
+
+#: editor_actions.cc:1840
+msgid "Opaque"
+msgstr "Deckend"
+
+#: editor_actions.cc:1844 editor_regions.cc:117
+msgid "Fade In"
+msgstr "Fade In"
+
+#: editor_actions.cc:1849 editor_regions.cc:118
+msgid "Fade Out"
+msgstr "Fade Out"
+
+#: editor_actions.cc:1864
+msgid "Multi-Duplicate..."
+msgstr "Mehrfach duplizieren..."
+
+#: editor_actions.cc:1869
+msgid "Fill Track"
+msgstr "Spur auffüllen"
+
+#: editor_actions.cc:1873 editor_markers.cc:993
+msgid "Set Loop Range"
+msgstr "Schleife erstellen"
+
+#: editor_actions.cc:1880
+msgid "Set Punch"
+msgstr "Punchbereich erstellen"
+
+#: editor_actions.cc:1884
+msgid "Add Single Range Marker"
+msgstr "Einzelnen Bereichsmarker einfügen"
+
+#: editor_actions.cc:1889
+msgid "Add Range Marker Per Region"
+msgstr "Einen Bereichsmarker pro Region einfügen"
+
+#: editor_actions.cc:1893
+msgid "Snap Position To Grid"
+msgstr "Positionszeiger einrasten"
+
+#: editor_actions.cc:1896
+msgid "Close Gaps"
+msgstr "Lücken schließen"
+
+#: editor_actions.cc:1899
+msgid "Rhythm Ferret..."
+msgstr "Rhythm Ferret..."
+
+#: editor_actions.cc:1902
+msgid "Export..."
+msgstr "Exportieren..."
+
+#: editor_actions.cc:1908
+msgid "Separate Under"
+msgstr "Bereich unter aktueller Region entfernen"
+
+#: editor_actions.cc:1912 editor_actions.cc:1913
+msgid "Set Fade In Length"
+msgstr "Fade-In bis Positionszeiger"
+
+#: editor_actions.cc:1914 editor_actions.cc:1915
+msgid "Set Fade Out Length"
+msgstr "Fade-Out ab Positionszeiger"
+
+#: editor_actions.cc:1917
+msgid "Set Tempo from Region = Bar"
+msgstr "Regionlänge = Taktlänge setzen"
+
+#: editor_actions.cc:1922
+msgid "Split at Percussion Onsets"
+msgstr "Regionen an perkussiven Schlägen teilen"
+
+#: editor_actions.cc:1927
+msgid "List Editor..."
+msgstr "Eventlisteneditor..."
+
+#: editor_actions.cc:1930
+msgid "Properties..."
+msgstr "Eigenschaften..."
+
+#: editor_actions.cc:1934
+msgid "Bounce (with processing)"
+msgstr "Bounce (mit Signalverarbeitung)"
+
+#: editor_actions.cc:1935
+msgid "Bounce (without processing)"
+msgstr "Bounce (ohne Signalverarbeitung)"
+
+#: editor_actions.cc:1936
+msgid "Combine"
+msgstr "Verbinden (combine)"
+
+#: editor_actions.cc:1937
+msgid "Uncombine"
+msgstr "Trennen (uncombine)"
+
+#: editor_actions.cc:1939
+msgid "Spectral Analysis..."
+msgstr "FFT-Analyse"
+
+#: editor_actions.cc:1941
+msgid "Reset Envelope"
+msgstr "Lautstärkekurve zurücksetzen"
+
+#: editor_actions.cc:1943
+msgid "Reset Gain"
+msgstr "Lautstärke zurücksetzen"
+
+#: editor_actions.cc:1948
+msgid "Envelope Active"
+msgstr "Lautstärkekurve ist aktiv"
+
+#: editor_actions.cc:1956 editor_actions.cc:1957
+msgid "Insert Patch Change..."
+msgstr "Patch Change einfügen..."
+
+#: editor_actions.cc:1958
+msgid "Unlink from other copies"
+msgstr "Von anderen Kopien entkoppeln"
+
+#: editor_actions.cc:1959
+msgid "Strip Silence..."
+msgstr "Stille entfernen..."
+
+#: editor_actions.cc:1960
+msgid "Set Range Selection"
+msgstr "Bereich auswählen"
+
+#: editor_actions.cc:1962 editor_actions.cc:1963
+msgid "Nudge Later"
+msgstr "Schritt nach hinten"
+
+#: editor_actions.cc:1964 editor_actions.cc:1965
+msgid "Nudge Earlier"
+msgstr "Schritt nach vorne"
+
+#: editor_actions.cc:1967
+msgid "Sequence Regions"
+msgstr "Regionen aneinanderreihen"
+
+#: editor_actions.cc:1972
+msgid "Nudge Later by Capture Offset"
+msgstr "Schritt nach hinten um Aufnahme-Offset"
+
+#: editor_actions.cc:1979
+msgid "Nudge Earlier by Capture Offset"
+msgstr "Schritt nach vorne um Aufnahme-Offset"
+
+#: editor_actions.cc:1983
+msgid "Trim to Loop"
+msgstr "Auf Schleife kürzen"
+
+#: editor_actions.cc:1984
+msgid "Trim to Punch"
+msgstr "Auf Punchbereich kürzen"
+
+#: editor_actions.cc:1986
+msgid "Trim to Previous"
+msgstr "Zur vorherigen Region aufschließen"
+
+#: editor_actions.cc:1987
+msgid "Trim to Next"
+msgstr "Zur nächsten Region aufschließen"
+
+#: editor_actions.cc:1994
+msgid "Insert Region From Region List"
+msgstr "Region von Regionenliste hinzufügen"
+
+#: editor_actions.cc:2000
+msgid "Set Sync Position"
+msgstr "Synchronisationspunkt setzen"
+
+#: editor_actions.cc:2001
+msgid "Place Transient"
+msgstr "Transienten setzen"
+
+#: editor_actions.cc:2002
+msgid "Split/Separate"
+msgstr "Teilen/Auftrennen"
+
+#: editor_actions.cc:2003
+msgid "Trim Start at Edit Point"
+msgstr "Anfang der Region am Arbeitspunkt abschneiden"
+
+#: editor_actions.cc:2004
+msgid "Trim End at Edit Point"
+msgstr "Ende der Region am Arbeitspunkt abschneiden"
+
+#: editor_actions.cc:2009
+msgid "Align Start"
+msgstr "Anfang ausrichten"
+
+#: editor_actions.cc:2016
+msgid "Align Start Relative"
+msgstr "Anfang relativ ausrichten"
+
+#: editor_actions.cc:2020
+msgid "Align End"
+msgstr "Ende ausrichten"
+
+#: editor_actions.cc:2025
+msgid "Align End Relative"
+msgstr "Ende relativ ausrichten"
+
+#: editor_actions.cc:2032
+msgid "Align Sync"
+msgstr "Synchronisationspunkt ausrichten"
+
+#: editor_actions.cc:2039
+msgid "Align Sync Relative"
+msgstr "Synchronisationspunkt relativ ausrichten"
+
+#: editor_actions.cc:2043 editor_actions.cc:2046
+msgid "Choose Top..."
+msgstr "Oberste Region auswählen..."
+
+#: editor_audio_import.cc:77 editor_audio_import.cc:99
+msgid "You can't import or embed an audiofile until you have a session loaded."
+msgstr ""
+"Sie können keine Audiodatei importieren, solange kein Projekt geladen ist."
+
+#: editor_audio_import.cc:83 editor_audio_import.cc:127
+msgid "Add Existing Media"
+msgstr "Vorhandenes Material importieren"
+
+#: editor_audio_import.cc:175
+msgid ""
+"The session already contains a source file named %1. Do you want to import "
+"%1 as a new file, or skip it?"
+msgstr ""
+"Das Projekt enthält bereits eine Datei namens %1. Wollen Sie %1 als neue "
+"Datei importieren, oder überspringen?"
+
+#: editor_audio_import.cc:177
+msgid ""
+"The session already contains a source file named %1. Do you want to import "
+"%2 as a new source, or skip it?"
+msgstr ""
+"Das Projekt enthält bereits eine Datei namens %1. Wollen Sie %2 als neue "
+"Quelle importieren, oder überspringen?"
+
+#: editor_audio_import.cc:282 editor_pt_import.cc:148
+#: editor_videotimeline.cc:91
+msgid "Cancel Import"
+msgstr "Importieren Abbrechen"
+
+#: editor_audio_import.cc:562
+msgid "Editor: cannot open file \"%1\", (%2)"
+msgstr "Editor: kann die Datei \"%1\" nicht öffnen (%2)"
+
+#: editor_audio_import.cc:570
+msgid "Cancel entire import"
+msgstr "Importieren Abbrechen"
+
+#: editor_audio_import.cc:571
+msgid "Don't embed it"
+msgstr "Nicht einbetten"
+
+#: editor_audio_import.cc:572
+msgid "Embed all without questions"
+msgstr "Alle Importieren ohne nachzufragen"
+
+#: editor_audio_import.cc:575 editor_audio_import.cc:601
+#: export_format_dialog.cc:60
+msgid "Sample rate"
+msgstr "Samplerate"
+
+#: editor_audio_import.cc:576 editor_audio_import.cc:602
+msgid ""
+"%1\n"
+"This audiofile's sample rate doesn't match the session sample rate!"
+msgstr ""
+"%1\n"
+"Die Samplerate dieser Audiodatei unterscheidet sich von der Samplerate "
+"dieses Projekts."
+
+#: editor_audio_import.cc:598
+msgid "Embed it anyway"
+msgstr "Trotzdem importieren"
+
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+"Sie können ein PT Projekt nur in ein bereits geöffnetes Projekt importieren."
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr "PT Projekt importieren"
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr "%1: dies ist nur der Verzeichnisname, nicht der Dateiname."
+
+#: editor_pt_import.cc:131
+msgid "Doesn't seem to be a valid PT session file"
+msgstr "Scheint keine gültige PT Projektdatei zu sein"
+
+#: editor_pt_import.cc:135
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 Audiodateien\n"
+"%4 Regionen\n"
+"%5 aktive Regionen\n"
+"\n"
+"Fortfahren..."
+
+#: editor_canvas_events.cc:1311 editor_drag.cc:1402
+msgid "Could not create new track after region placed in the drop zone"
+msgstr ""
+"Konnte keine neue Spur erzeugen, nachdem die Region in der Drop Zone "
+"platziert wurde"
+
+#: editor_drag.cc:1294
+msgid "fixed time region drag"
+msgstr "Region zeitgleich verschieben"
+
+#: editor_drag.cc:2228
+msgid "Ripple drag"
+msgstr "Wellenmodus-Ziehen"
+
+#: editor_drag.cc:2389 midi_region_view.cc:2850
+msgid "resize notes"
+msgstr "Notenlänge ändern"
+
+#: editor_drag.cc:2584
+msgid "Video Start:"
+msgstr "Videostart"
+
+#: editor_drag.cc:2586
+msgid "Diff:"
+msgstr "Diff:"
+
+#: editor_drag.cc:2605
+msgid "Move Video"
+msgstr "Bewege Video"
+
+#: editor_drag.cc:3113
+msgid "copy meter mark"
+msgstr "Taktmarker kopieren"
+
+#: editor_drag.cc:3121
+msgid "move meter mark"
+msgstr "Taktwechsel bewegen"
+
+#: editor_drag.cc:3244
+msgid "copy tempo mark"
+msgstr "Tempomarker kopieren"
+
+#: editor_drag.cc:3252
+msgid "move tempo mark"
+msgstr "Tempowechsel bewegen"
+
+#: editor_drag.cc:3504
+msgid "change fade in length"
+msgstr "Ändere Fade-In Länge"
+
+#: editor_drag.cc:3629
+msgid "change fade out length"
+msgstr "Fade-Out verändern"
+
+#: editor_drag.cc:3991
+msgid "move marker"
+msgstr "Marker bewegen"
+
+#: editor_drag.cc:4239 editor_drag.cc:5622
+msgid "automation range move"
+msgstr "Automationsbereich bewegen"
+
+#: editor_drag.cc:4596
+msgid "An error occurred while executing time stretch operation"
+msgstr "Beim Ausführen der Timestretch-Operation trat ein Fehler auf"
+
+#: editor_drag.cc:5057
+msgid "programming_error: %1"
+msgstr "Programmierfehler: %1"
+
+#: editor_drag.cc:5126 editor_drag.cc:5136
+msgid "new skip marker"
+msgstr "neuer Sprungmarker"
+
+#: editor_drag.cc:5127
+msgid "skip"
+msgstr "Sprung"
+
+#: editor_drag.cc:5131 location_ui.cc:56
+msgid "CD"
+msgstr "CD"
+
+#: editor_drag.cc:5132
+msgid "new CD marker"
+msgstr "neuer CD Marker"
+
+#: editor_drag.cc:5137 editor_route_groups.cc:437 mixer_ui.cc:1513
+msgid "unnamed"
+msgstr "unbenannt"
+
+#: editor_drag.cc:5443
+msgid "Automation range drag created for invalid region type"
+msgstr "Automationsbereichs-Ziehen für ungültigen Regionstyp erzeugt"
+
+#: editor_route_groups.cc:96
+msgid "Col"
+msgstr "Spalte"
+
+#: editor_route_groups.cc:96
+msgid "Group Tab Color"
+msgstr "Farbe des Gruppen-Reiters"
+
+#: editor_route_groups.cc:97
+msgid "Name of Group"
+msgstr "Gruppenname"
+
+#: editor_route_groups.cc:98 editor_routes.cc:208
+msgid "Visible|V"
+msgstr "V"
+
+#: editor_route_groups.cc:98
+msgid "Group is visible?"
+msgstr "Gruppe sichtbar?"
+
+#: editor_route_groups.cc:99
+msgid "On"
+msgstr "An"
+
+#: editor_route_groups.cc:99
+msgid "Group is enabled?"
+msgstr "Ist die Gruppe aktiviert?"
+
+#: editor_route_groups.cc:100
+msgid "Group|G"
+msgstr "G"
+
+#: editor_route_groups.cc:100
+msgid "Sharing Gain?"
+msgstr "Lautstärke teilen?"
+
+#: editor_route_groups.cc:101
+msgid "Relative|Rel"
+msgstr "Rel"
+
+#: editor_route_groups.cc:101
+msgid "Relative Gain Changes?"
+msgstr "Relative Lautstärke-Änderungen"
+
+#: editor_route_groups.cc:102 editor_regions.cc:121 editor_routes.cc:212
+#: mixer_strip.cc:2094 meter_strip.cc:367 route_time_axis.cc:2741
+#: time_axis_view.cc:1201
+msgid "Mute|M"
+msgstr "M"
+
+#: editor_route_groups.cc:102
+msgid "Sharing Mute?"
+msgstr "Stummschaltung teilen?"
+
+#: editor_route_groups.cc:103 editor_routes.cc:213 mixer_strip.cc:2104
+#: meter_strip.cc:375 route_time_axis.cc:2738
+msgid "Solo|S"
+msgstr "S"
+
+#: editor_route_groups.cc:103
+msgid "Sharing Solo?"
+msgstr "Solo teilen?"
+
+#: editor_route_groups.cc:104 midi_time_axis.cc:1623 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1629
+msgid "Rec"
+msgstr "Rec"
+
+#: editor_route_groups.cc:104
+msgid "Sharing Record-enable Status?"
+msgstr "Aufnahmebereitschaft teilen?"
+
+#: editor_route_groups.cc:105
+msgid "Monitoring|Mon"
+msgstr "Mon"
+
+#: editor_route_groups.cc:105
+msgid "Sharing Monitoring Choice?"
+msgstr "Monitoring-Wahl teilen?"
+
+#: editor_route_groups.cc:106
+msgid "Selection|Sel"
+msgstr "Sel"
+
+#: editor_route_groups.cc:106
+msgid "Sharing Selected/Editing Status?"
+msgstr "Auswahl-/Editierzustand teilen?"
+
+#: editor_route_groups.cc:107 editor_routes.cc:209
+msgid "Active|A"
+msgstr "A"
+
+#: editor_route_groups.cc:107
+msgid "Sharing Active Status?"
+msgstr "Einschaltzustand teilen?"
+
+#: editor_export_audio.cc:92 editor_markers.cc:733 editor_markers.cc:820
+#: editor_markers.cc:1005 editor_markers.cc:1023 editor_markers.cc:1041
+#: editor_markers.cc:1060 editor_markers.cc:1079 editor_markers.cc:1109
+#: editor_markers.cc:1140 editor_markers.cc:1170 editor_markers.cc:1198
+#: editor_markers.cc:1229 editor_markers.cc:1254 editor_markers.cc:1305
+#: editor_markers.cc:1349 editor_markers.cc:1375 editor_markers.cc:1569
+#: editor_mouse.cc:2140
+msgid "programming error: marker canvas item has no marker object pointer!"
+msgstr "Programmierfehler: marker canvas item has no marker object pointer!"
+
+#: editor_export_audio.cc:145 editor_export_audio.cc:150
+msgid "File Exists!"
+msgstr "Datei existiert!"
+
+#: editor_export_audio.cc:153
+msgid "Overwrite Existing File"
+msgstr "Vorhandenes Material überschreiben"
+
+#: editor_group_tabs.cc:176
+msgid "Fit to Window"
+msgstr "An Fenster anpassen"
+
+#: editor_markers.cc:139
+msgid "start"
+msgstr "Start"
+
+#: editor_markers.cc:140
+msgid "end"
+msgstr "Ende"
+
+#: editor_markers.cc:645
+msgid "mark"
+msgstr "Marker"
+
+#: editor_markers.cc:650 editor_ops.cc:2100 editor_ops.cc:2122
+#: editor_ops.cc:2238 editor_ops.cc:2275 location_ui.cc:1023
+msgid "add marker"
+msgstr "Marker hinzufügen"
+
+#: editor_markers.cc:682 editor_markers.cc:1449
+msgid "set loop range"
+msgstr "Loopbereich festlegen"
+
+#: editor_markers.cc:698 editor_markers.cc:1455
+msgid "set punch range"
+msgstr "Punchbereich festlegen"
+
+#: editor_markers.cc:715 editor_ops.cc:4169
+msgid "range"
+msgstr "Bereich"
+
+#: editor_markers.cc:718
+msgid "new range marker"
+msgstr "Neuer Bereich"
+
+#: editor_markers.cc:751 editor_ops.cc:2206 location_ui.cc:859
+msgid "remove marker"
+msgstr "Marker entfernen"
+
+#: editor_markers.cc:887
+msgid "Locate to Here"
+msgstr "Hierhin setzen"
+
+#: editor_markers.cc:888
+msgid "Play from Here"
+msgstr "Wiedergabe ab hier"
+
+#: editor_markers.cc:889
+msgid "Move Mark to Playhead"
+msgstr "Marker zum Positionszeiger verschieben"
+
+#: editor_markers.cc:893
+msgid "Create Range to Next Marker"
+msgstr "Bereich bis zum nächsten Marker erstellen"
+
+#: editor_markers.cc:934
+msgid "Locate to Marker"
+msgstr "Positionszeiger zu Marker setzen"
+
+#: editor_markers.cc:935
+msgid "Play from Marker"
+msgstr "Wiedergabe ab Marker"
+
+#: editor_markers.cc:938
+msgid "Set Marker from Playhead"
+msgstr "Marker beim Positionszeiger erzeugen"
+
+#: editor_markers.cc:940
+msgid "Set Range from Selection"
+msgstr "Bereich aus Auswahl bilden"
+
+#: editor_markers.cc:950
+msgid "Hide Range"
+msgstr "Bereich verbergen"
+
+#: editor_markers.cc:951
+msgid "Rename Range..."
+msgstr "Bereich umbenennen..."
+
+#: editor_markers.cc:955
+msgid "Remove Range"
+msgstr "Bereich entfernen"
+
+#: editor_markers.cc:962
+msgid "Separate Regions in Range"
+msgstr "Regionen an Bereichsgrenzen teilen"
+
+#: editor_markers.cc:965
+msgid "Select Range"
+msgstr "Bereich auswählen"
+
+#: editor_markers.cc:994
+msgid "Set Punch Range"
+msgstr "Punchbereich erstellen"
+
+#: editor_markers.cc:1400 editor_ops.cc:2055
+msgid "New Name:"
+msgstr "Neuer Name: "
+
+#: editor_markers.cc:1403
+msgid "Rename Mark"
+msgstr "Marker umbenennen"
+
+#: editor_markers.cc:1405
+msgid "Rename Range"
+msgstr "Bereich umbenennen"
+
+#: editor_markers.cc:1412 editor_mouse.cc:2157 processor_box.cc:2060
+#: processor_box.cc:2531 route_time_axis.cc:1107 route_ui.cc:1574
+msgid "Rename"
+msgstr "Umbenennen"
+
+#: editor_markers.cc:1425
+msgid "rename marker"
+msgstr "Marker umbenennen"
+
+#: editor_mixer.cc:90
+msgid "This screen is not tall enough to display the editor mixer"
+msgstr ""
+"Dieser Bildschirm ist nicht hoch genug, um den Editor-Mixer darzustellen"
+
+#: editor_mouse.cc:1235 editor_mouse.cc:1253 editor_tempodisplay.cc:270
+msgid ""
+"programming error: tempo marker canvas item has no marker object pointer!"
+msgstr ""
+"Programmierfehler: tempo marker canvas item has no marker object pointer!"
+
+#: editor_mouse.cc:1240 editor_tempodisplay.cc:275
+msgid "programming error: marker for tempo is not a tempo marker!"
+msgstr "Programmierfehler: marker for tempo is not a tempo marker!"
+
+#: editor_mouse.cc:1258 editor_tempodisplay.cc:375
+msgid "programming error: marker for meter is not a meter marker!"
+msgstr "Programmierfehler: marker for meter is not a meter marker!"
+
+#: editor_mouse.cc:1905 editor_mouse.cc:1930 editor_mouse.cc:1943
+msgid ""
+"programming error: control point canvas item has no control point object "
+"pointer!"
+msgstr ""
+"Programmierfehler: control point canvas item has no control point object "
+"pointer!"
+
+#: editor_mouse.cc:2078
+msgid "start point trim"
+msgstr "Startpunkt ändern"
+
+#: editor_mouse.cc:2103
+msgid "End point trim"
+msgstr "Endpunkt verändern"
+
+#: editor_mouse.cc:2155
+msgid "Name for region:"
+msgstr "Name für Region:"
+
+#: editor_ops.cc:165
+msgid "split"
+msgstr "teile"
+
+#: editor_ops.cc:339
+msgid "alter selection"
+msgstr "Auswahl ändern"
+
+#: editor_ops.cc:381
+msgid "nudge regions forward"
+msgstr "Regionen Schritt vorwärts"
+
+#: editor_ops.cc:435 editor_ops.cc:526
+msgid "nudge location forward"
+msgstr "Position Schritt vorwärts"
+
+#: editor_ops.cc:466
+msgid "nudge regions backward"
+msgstr "Regionen Schritt nach hinten"
+
+#: editor_ops.cc:558
+msgid "nudge forward"
+msgstr "Schritt vorwärts"
+
+#: editor_ops.cc:582
+msgid "nudge backward"
+msgstr "Schritt nach hinten"
+
+#: editor_ops.cc:647
+msgid "sequence regions"
+msgstr "Regionen aneinanderreihen"
+
+#: editor_ops.cc:709
+msgid "build_region_boundary_cache called with snap_type = %1"
+msgstr "build_region_boundary_cache wurde mit snap_type = %1 aufgerufen"
+
+#: editor_ops.cc:2057
+msgid "New Location Marker"
+msgstr "Neuer Positionsmarker"
+
+#: editor_ops.cc:2148 editor_ops.cc:2172
+msgid "Set session start"
+msgstr "Projektstart setzen"
+
+#: editor_ops.cc:2238
+msgid "add markers"
+msgstr "Marker hinzufügen"
+
+#: editor_ops.cc:2334
+msgid "clear markers"
+msgstr "Marker zurücksetzen"
+
+#: editor_ops.cc:2349
+msgid "clear ranges"
+msgstr "Bereiche zurücksetzen"
+
+#: editor_ops.cc:2365
+msgid "clear locations"
+msgstr "Positionen zurücksetzen"
+
+#: editor_ops.cc:2428
+msgid "insert region"
+msgstr "Region einfügen"
+
+#: editor_ops.cc:2619
+msgid "raise regions"
+msgstr "Regionen weiter nach oben"
+
+#: editor_ops.cc:2621
+msgid "raise region"
+msgstr "Region weiter nach oben"
+
+#: editor_ops.cc:2627
+msgid "raise regions to top"
+msgstr "Regionen ganz nach oben"
+
+#: editor_ops.cc:2629
+msgid "raise region to top"
+msgstr "Region ganz nach oben"
+
+#: editor_ops.cc:2635
+msgid "lower regions"
+msgstr "Regionen weiter nach unten"
+
+#: editor_ops.cc:2637 editor_ops.cc:2645
+msgid "lower region"
+msgstr "Region weiter nach unten"
+
+#: editor_ops.cc:2643
+msgid "lower regions to bottom"
+msgstr "Regionen ganz nach unten"
+
+#: editor_ops.cc:2728
+msgid "Rename Region"
+msgstr "Region umbenennen"
+
+#: editor_ops.cc:2730 processor_box.cc:2058 route_ui.cc:1572
+msgid "New name:"
+msgstr "Neuer Name: "
+
+#: editor_ops.cc:3047
+msgid "separate"
+msgstr "Teilen"
+
+#: editor_ops.cc:3159
+msgid "separate region under"
+msgstr "Bereich unter aktueller Region entfernen"
+
+#: editor_ops.cc:3305
+msgid "trim to selection"
+msgstr "Auf Auswahl kürzen"
+
+#: editor_ops.cc:3454
+msgid "set sync point"
+msgstr "Einrastpunkt definieren"
+
+#: editor_ops.cc:3478
+msgid "remove region sync"
+msgstr "Synchronisationspunkt löschen"
+
+#: editor_ops.cc:3500
+msgid "move regions to original position"
+msgstr "Regionen zu ihrer Ursprungsposition verschieben"
+
+#: editor_ops.cc:3502
+msgid "move region to original position"
+msgstr "Region zu ihrer Ursprungsposition verschieben"
+
+#: editor_ops.cc:3523
+msgid "align selection"
+msgstr "Auswahl ausrichten"
+
+#: editor_ops.cc:3597
+msgid "align selection (relative)"
+msgstr "Auswahl relativ ausrichten"
+
+#: editor_ops.cc:3631
+msgid "align region"
+msgstr "Region ausrichten"
+
+#: editor_ops.cc:3682
+msgid "trim front"
+msgstr "vorne abschneiden"
+
+#: editor_ops.cc:3682
+msgid "trim back"
+msgstr "hinten Abschneiden"
+
+#: editor_ops.cc:3712
+msgid "trim to loop"
+msgstr "Auf Schleife kürzen"
+
+#: editor_ops.cc:3722
+msgid "trim to punch"
+msgstr "Auf Punchbereich kürzen"
+
+#: editor_ops.cc:3844
+msgid "trim to region"
+msgstr "Auf Region kürzen"
+
+#: editor_ops.cc:3903
+msgid ""
+"This track/bus cannot be frozen because the signal adds or loses channels "
+"before reaching the outputs.\n"
+"This is typically caused by plugins that generate stereo output from mono "
+"input or vice versa."
+msgstr ""
+"Diese Spur/dieser Bus kann nicht eingefroren werden, da sich die Kanalanzahl "
+"des Signals vor dem Ausgang ändert.\n"
+"Typischerweise wird dies durch ein Plugin verursacht, das Stereo aus einer "
+"Monoquelle oder umgekehrt erzeugt."
+
+#: editor_ops.cc:3906
+msgid "Cannot freeze"
+msgstr "Einfrieren nicht möglich"
+
+#: editor_ops.cc:3912
+msgid ""
+"<b>%1</b>\n"
+"\n"
+"This track has at least one send/insert/return as part of its signal flow.\n"
+"\n"
+"Freezing will only process the signal as far as the first send/insert/return."
+msgstr ""
+"<b>%1</b>\n"
+"\n"
+"Der Signalfluss dieser Spur hat mindestens ein Send/Insert/Return.\n"
+"\n"
+"Einfrieren wird das Signal nur bis zum ersten Send/Insert/Return verarbeiten."
+
+#: editor_ops.cc:3916
+msgid "Freeze anyway"
+msgstr "Trotzdem einfrieren"
+
+#: editor_ops.cc:3917
+msgid "Don't freeze"
+msgstr "Nicht einfrieren"
+
+#: editor_ops.cc:3918
+msgid "Freeze Limits"
+msgstr "Einfrier-Grenzen"
+
+#: editor_ops.cc:3933
+msgid "Cancel Freeze"
+msgstr "Einfrieren abbrechen"
+
+#: editor_ops.cc:3963
+msgid ""
+"You can't perform this operation because the processing of the signal will "
+"cause one or more of the tracks to end up with a region with more channels "
+"than this track has inputs.\n"
+"\n"
+"You can do this without processing, which is a different operation."
+msgstr ""
+"Diese Operation kann nicht ausgeführt werden, da durch die "
+"Signalverarbeitung eine oder mehrere Spuren eine Region mit mehr Kanälen "
+"bekäme, als die Spur Eingänge hat.\n"
+"\n"
+"Sie können dies ohne Signalverarbeitung tun, das ist aber eine andere "
+"Operation."
+
+#: editor_ops.cc:3967
+msgid "Cannot bounce"
+msgstr "Kann nicht bouncen"
+
+#: editor_ops.cc:4018
+msgid "bounce range"
+msgstr "Bereich bouncen"
+
+#: editor_ops.cc:4085
+msgid "delete"
+msgstr "Löschen"
+
+#: editor_ops.cc:4088
+msgid "cut"
+msgstr "Ausschneiden"
+
+#: editor_ops.cc:4091
+msgid "copy"
+msgstr "Kopieren"
+
+#: editor_ops.cc:4094
+msgid "clear"
+msgstr "Leeren"
+
+#: editor_ops.cc:4142
+msgid "objects"
+msgstr "Objekte"
+
+#: editor_ops.cc:4352 editor_ops.cc:4437
+msgid "remove region"
+msgstr "Region(en) löschen"
+
+#: editor_ops.cc:4862
+msgid "duplicate selection"
+msgstr "Auswahl duplizieren"
+
+#: editor_ops.cc:4948
+msgid "nudge track"
+msgstr "Spur verschieben"
+
+#: editor_ops.cc:4975
+msgid ""
+"Do you really want to destroy the last capture?\n"
+"(This is destructive and cannot be undone)"
+msgstr ""
+"Wollen Sie wirklich die letzte Aufnahme rückgängig machen?\n"
+"(Dies ist destruktiv und kann nicht rückgängig gemacht werden!)"
+
+#: editor_ops.cc:4978 editor_ops.cc:7078 editor_regions.cc:462
+#: editor_snapshots.cc:159
+msgid "No, do nothing."
+msgstr "Nein, nichts machen."
+
+#: editor_ops.cc:4979
+msgid "Yes, destroy it."
+msgstr "Ja, entfernen."
+
+#: editor_ops.cc:4981
+msgid "Destroy last capture"
+msgstr "Lösche letzte Aufnahme"
+
+#: editor_ops.cc:5057
+msgid "normalize"
+msgstr "Normalisieren"
+
+#: editor_ops.cc:5155
+msgid "reverse regions"
+msgstr "Regionen umkehren"
+
+#: editor_ops.cc:5189
+msgid "strip silence"
+msgstr "Stille entfernen"
+
+#: editor_ops.cc:5270
+msgid "Fork Region(s)"
+msgstr "Region(en) abzweigen"
+
+#: editor_ops.cc:5277
+msgid "Could not unlink %1"
+msgstr "Konnte die Bindung von %1 nicht lösen"
+
+#: editor_ops.cc:5517
+msgid "reset region gain"
+msgstr "Lautstärkekurve zurücksetzen"
+
+#: editor_ops.cc:5575
+msgid "region gain envelope active"
+msgstr "Lautstärkekurve aktiv"
+
+#: editor_ops.cc:5600
+msgid "toggle region lock"
+msgstr "Regionensperre umschalten"
+
+#: editor_ops.cc:5624
+msgid "Toggle Video Lock"
+msgstr "Videosperre umschalten"
+
+#: editor_ops.cc:5648
+msgid "region lock style"
+msgstr "Art der Regionensperre"
+
+#: editor_ops.cc:5673
+msgid "change region opacity"
+msgstr "Regionen-Deckkraft ändern"
+
+#: editor_ops.cc:5766
+msgid "fade range"
+msgstr "Bereich faden"
+
+#: editor_ops.cc:5804
+msgid "set fade in length"
+msgstr "Ändere Fade-In Länge"
+
+#: editor_ops.cc:5811
+msgid "set fade out length"
+msgstr "Ändere Fade-Out Länge"
+
+#: editor_ops.cc:5876
+msgid "set fade in shape"
+msgstr "Fade-In Kurve bearbeiten"
+
+#: editor_ops.cc:5911
+msgid "set fade out shape"
+msgstr "Fade-Out Kurve ändern"
+
+#: editor_ops.cc:5947
+msgid "set fade in active"
+msgstr "Fade-In aktivieren"
+
+#: editor_ops.cc:5981
+msgid "set fade out active"
+msgstr "Fade-Out aktivieren"
+
+#: editor_ops.cc:6041
+msgid "toggle fade active"
+msgstr "Fade umschalten"
+
+#: editor_ops.cc:6227
+msgid "set loop range from selection"
+msgstr "Schleife aus Auswahl erstellen"
+
+#: editor_ops.cc:6241
+msgid "set loop range from region"
+msgstr "Schleife aus Region erstellen"
+
+#: editor_ops.cc:6260
+msgid "set punch range from selection"
+msgstr "Punchbereich aus Auswahl erstellen"
+
+#: editor_ops.cc:6284
+msgid "set session start/end from selection"
+msgstr "Projektstart/ende auf Auswahl setzen"
+
+#: editor_ops.cc:6299
+msgid "set punch range from region"
+msgstr "Punchbereich aus Region erstellen"
+
+#: editor_ops.cc:6408
+msgid "Add new marker"
+msgstr "Marker hinzufügen"
+
+#: editor_ops.cc:6409
+msgid "Set global tempo"
+msgstr "Globales tempo setzen"
+
+#: editor_ops.cc:6412
+msgid "Define one bar"
+msgstr "Einen Takt definieren"
+
+#: editor_ops.cc:6413
+msgid "Do you want to set the global tempo or add a new tempo marker?"
+msgstr ""
+"Möchten Sie das globale Tempo ändern oder einen neuen Tempo-Marker setzen?"
+
+#: editor_ops.cc:6439
+msgid "set tempo from region"
+msgstr "Tempo anhand von Region setzen"
+
+#: editor_ops.cc:6469
+msgid "split regions"
+msgstr "Region teilen (Split)"
+
+#: editor_ops.cc:6511
+msgid ""
+"You are about to split\n"
+"%1\n"
+"into %2 pieces.\n"
+"This could take a long time."
+msgstr ""
+"Sie versuchen %1 in %2 Teile zu teilen.\n"
+"Das könnte sehr lange dauern."
+
+#: editor_ops.cc:6518
+msgid "Call for the Ferret!"
+msgstr "Call for the Ferret!"
+
+#: editor_ops.cc:6519
+msgid ""
+"Press OK to continue with this split operation\n"
+"or ask the Ferret dialog to tune the analysis"
+msgstr ""
+"Drücken Sie OK um mit der aufteiloperation (Split) fortzufahren\n"
+"oder versuchen sie im Ferret-Fenster die Analyse zu verbessern."
+
+#: editor_ops.cc:6521
+msgid "Press OK to continue with this split operation"
+msgstr "Drücken Sie OK um mit der aufteiloperation (Split) fortzufahren"
+
+#: editor_ops.cc:6524
+msgid "Excessive split?"
+msgstr "Übermäßige Aufteilung?"
+
+#: editor_ops.cc:6676
+msgid "place transient"
+msgstr "Transienten platzieren"
+
+#: editor_ops.cc:6711
+msgid "snap regions to grid"
+msgstr "Regionen an Raster einrasten"
+
+#: editor_ops.cc:6750
+msgid "Close Region Gaps"
+msgstr "Regionenlücken schließen"
+
+#: editor_ops.cc:6755
+msgid "Crossfade length"
+msgstr "Länge des Crossfades"
+
+#: editor_ops.cc:6764 editor_ops.cc:6775 rhythm_ferret.cc:119
+#: session_option_editor.cc:141
+msgid "ms"
+msgstr "ms"
+
+#: editor_ops.cc:6766
+msgid "Pull-back length"
+msgstr "Öffnungslänge vorne"
+
+#: editor_ops.cc:6779
+msgid "Ok"
+msgstr "Ok"
+
+#: editor_ops.cc:6794
+msgid "close region gaps"
+msgstr "Schließe Lücken zwischen Regionen"
+
+#: editor_ops.cc:7036
+msgid "That would be bad news ...."
+msgstr "Lieber nicht!"
+
+#: editor_ops.cc:7041
+msgid ""
+"Removing the master or monitor bus is such a bad idea\n"
+"that %1 is not going to allow it.\n"
+"\n"
+"If you really want to do this sort of thing\n"
+"edit your ardour.rc file to set the\n"
+"\"allow-special-bus-removal\" option to be \"yes\""
+msgstr ""
+"Den Master- oder Monitorbus zu entfernen ist eine so\n"
+"schlechte Idee, dass %1 es nicht zulässt.\n"
+"\n"
+"Um dies dennoch zu tun, kann die Datei ardour.rc\n"
+"bearbeitet werden. \"allow-special-bus-removal\" muss\n"
+"dazu auf \"yes\" gesetzt werden."
+
+#: editor_ops.cc:7057 route_ui.cc:1938
+msgid "track"
+msgid_plural "tracks"
+msgstr[0] "Spur"
+msgstr[1] "Spuren"
+
+#: editor_ops.cc:7058 route_ui.cc:1938
+msgid "bus"
+msgid_plural "busses"
+msgstr[0] "Bus"
+msgstr[1] "Busse"
+
+#: editor_ops.cc:7062
+msgid ""
+"Do you really want to remove %1 %2 and %3 %4?\n"
+"(You may also lose the playlists associated with the %2)\n"
+"\n"
+"This action cannot be undone, and the session file will be overwritten!"
+msgstr ""
+"Wollen Sie wirklich %1 %2 und %3 %4 entfernen?\n"
+"(Sie werden auch die mit der %2 assoziierten Wiedergabelisten verlieren)\n"
+"\n"
+"Dies kann nicht rückgängig gemacht werden, und die Projektdatei wird "
+"überschrieben werden!"
+
+#: editor_ops.cc:7067
+msgid ""
+"Do you really want to remove %1 %2?\n"
+"(You may also lose the playlists associated with the %2)\n"
+"\n"
+"This action cannot be undone, and the session file will be overwritten!"
+msgstr ""
+"Wollen Sie wirklich %1 %2 entfernen?\n"
+"(Sie werden auch die mit der %2 assoziierten Wiedergabelisten verlieren)\n"
+"\n"
+"Dies kann nicht rückgängig gemacht werden, und die Projektdatei wird "
+"überschrieben werden!"
+
+#: editor_ops.cc:7073
+msgid ""
+"Do you really want to remove %1 %2?\n"
+"\n"
+"This action cannot be undone, and the session file will be overwritten"
+msgstr ""
+"Wollen Sie wirklich %1 %2 entfernen\n"
+"\n"
+"Diese Aktion kann nicht rückgängig gemacht werden, und die Projektdatei wird "
+"überschrieben werden"
+
+#: editor_ops.cc:7080
+msgid "Yes, remove them."
+msgstr "Ja, entfernen."
+
+#: editor_ops.cc:7082 editor_snapshots.cc:160
+msgid "Yes, remove it."
+msgstr "Ja, entfernen."
+
+#: editor_ops.cc:7087 editor_ops.cc:7089
+msgid "Remove %1"
+msgstr "Entferne %1"
+
+#: editor_ops.cc:7191 editor_ops.cc:7205 editor_ops.cc:7245 editor_ops.cc:7255
+msgid "insert time"
+msgstr "Stille einfügen"
+
+#: editor_ops.cc:7308
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr "Kann im Sperr-Bearbeitungsmodus keine Zeit einfügen oder löschen"
+
+#: editor_ops.cc:7328 editor_ops.cc:7340 editor_ops.cc:7413
+msgid "cut time"
+msgstr "Zeit ausschneiden"
+
+#: editor_ops.cc:7426
+msgid "remove time"
+msgstr "Zeit entfernen"
+
+#: editor_ops.cc:7500
+msgid "There are too many tracks to fit in the current window"
+msgstr "Es gibt zu viele Spuren, sie in das aktuelle Fenster zu einzupassen"
+
+#: editor_ops.cc:7561
+msgid "Sel"
+msgstr "Sel"
+
+#: editor_ops.cc:7600
+#, c-format
+msgid "Saved view %u"
+msgstr "Ansicht %u gespeichert"
+
+#: editor_ops.cc:7625
+msgid "mute regions"
+msgstr "Regionen stummschalten"
+
+#: editor_ops.cc:7627
+msgid "mute region"
+msgstr "Region stummschalten"
+
+#: editor_ops.cc:7664
+msgid "combine regions"
+msgstr "Regionen verbinden (combine)"
+
+#: editor_ops.cc:7702
+msgid "uncombine regions"
+msgstr "Regionen trennen (uncombine)"
+
+#: editor_ops.cc:7739
+msgid "%1: Locked"
+msgstr "%1: Gesperrt"
+
+#: editor_ops.cc:7746
+msgid "Click to unlock"
+msgstr "Klicken, um Sperre aufzuheben"
+
+#: editor_ops.cc:7793
+msgid "Moving embedded files into session folder"
+msgstr "Verschiebe eingebettete Dateien in den Projektordner"
+
+#: editor_regions.cc:112
+msgid "Region name, with number of channels in []'s"
+msgstr "Name der Region, mit Kanalzahl in []"
+
+#: editor_regions.cc:113
+msgid "Position of start of region"
+msgstr "Position des Regionen-Anfangs"
+
+#: editor_regions.cc:114 editor_regions.cc:859 time_info_box.cc:101
+msgid "End"
+msgstr "Ende"
+
+#: editor_regions.cc:114
+msgid "Position of end of region"
+msgstr "Position des Regionen-Endes"
+
+#: editor_regions.cc:115
+msgid "Length of the region"
+msgstr "Länge der Region"
+
+#: editor_regions.cc:116
+msgid "Position of region sync point, relative to start of the region"
+msgstr ""
+"Position des Regionen-Synchronisationspunktes, relativ zu Regionenanfang"
+
+#: editor_regions.cc:117
+msgid "Length of region fade-in (units: secondary clock), () if disabled"
+msgstr "Länge des Einblendens (Einheiten: sekundäre Uhr), () falls inaktiv"
+
+#: editor_regions.cc:118
+msgid "Length of region fade-out (units: secondary clock), () if disabled"
+msgstr "Länge des Ausblendens (Einheiten: sekundäre Uhr), () falls inaktiv"
+
+#: editor_regions.cc:119
+msgid "Lock|L"
+msgstr "L"
+
+#: editor_regions.cc:119
+msgid "Region position locked?"
+msgstr "Position der Region gesperrt?"
+
+#: editor_regions.cc:120
+msgid "Gain|G"
+msgstr "G"
+
+#: editor_regions.cc:120
+msgid "Region position glued to Bars|Beats time?"
+msgstr "Regionenposition an Takt und Schäge gebunden?"
+
+#: editor_regions.cc:121
+msgid "Region muted?"
+msgstr "Region stummgeschaltet?"
+
+#: editor_regions.cc:122
+msgid "Opaque|O"
+msgstr "O"
+
+#: editor_regions.cc:122
+msgid "Region opaque (blocks regions below it from being heard)?"
+msgstr "Region deckend (hindert darunterliegende Regionen, gehört zu werden)?"
+
+#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+msgid "Hidden"
+msgstr "Versteckt"
+
+#: editor_regions.cc:391
+msgid "(MISSING) "
+msgstr "(FEHLT)"
+
+#: editor_regions.cc:459
+msgid ""
+"Do you really want to remove unused regions?\n"
+"(This is destructive and cannot be undone)"
+msgstr ""
+"Wollen Sie ungenutzte Regionen wirklich entfernen?\n"
+"(Dies ist destruktiv und kann nicht rückgängig gemacht werden)"
+
+#: editor_regions.cc:463
+msgid "Yes, remove."
+msgstr "Ja, entfernen."
+
+#: editor_regions.cc:465
+msgid "Remove unused regions"
+msgstr "Ungenutzte Regionen entfernen"
+
+#: editor_regions.cc:694
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr "EditorRegions::format_position: Negative Timecode Position: %1"
+
+#: editor_regions.cc:824 editor_regions.cc:840 editor_regions.cc:854
+msgid "Mult."
+msgstr "Viele"
+
+#: editor_regions.cc:857 midi_list_editor.cc:104 time_info_box.cc:94
+msgid "Start"
+msgstr "Start"
+
+#: editor_regions.cc:875 editor_regions.cc:891
+msgid "Multiple"
+msgstr "Viele"
+
+#: editor_regions.cc:960
+msgid "MISSING "
+msgstr "FEHLT"
+
+#: editor_routes.cc:183
+msgid "SS"
+msgstr "SS"
+
+#: editor_routes.cc:207
+msgid "Track/Bus Name"
+msgstr "Spur/Busname"
+
+#: editor_routes.cc:208
+msgid "Track/Bus visible ?"
+msgstr "Spuren/Busse sichtbar?"
+
+#: editor_routes.cc:209
+msgid "Track/Bus active ?"
+msgstr "Spur/Bus aktiv?"
+
+#: editor_routes.cc:210
+msgid "MidiInput|I"
+msgstr "I"
+
+#: editor_routes.cc:210
+msgid "MIDI input enabled"
+msgstr "MIDI Eingänge aktiv"
+
+#: editor_routes.cc:211
+msgid "Rec|R"
+msgstr "R"
+
+#: editor_routes.cc:211
+msgid "Record enabled"
+msgstr "Aufnahme bereit"
+
+#: editor_routes.cc:212
+msgid "Muted"
+msgstr "Stumm"
+
+#: editor_routes.cc:213
+msgid "Soloed"
+msgstr "Solo ein"
+
+#: editor_routes.cc:214
+msgid "SoloIso|SI"
+msgstr "SI"
+
+#: editor_routes.cc:214
+msgid "Solo Isolated"
+msgstr "Isoliertes Solo"
+
+#: editor_routes.cc:215
+msgid "SoloLock|SS"
+msgstr "SS"
+
+#: editor_routes.cc:215
+msgid "Solo Safe (Locked)"
+msgstr "Solo Safe (gesperrt)"
+
+#: editor_routes.cc:485 mixer_ui.cc:1213
+msgid "Hide All"
+msgstr "Alle verbergen"
+
+#: editor_routes.cc:486 mixer_ui.cc:1214
+msgid "Show All Audio Tracks"
+msgstr "Zeige alle Audiospuren"
+
+#: editor_routes.cc:487 mixer_ui.cc:1215
+msgid "Hide All Audio Tracks"
+msgstr "Verberge alle Audiospuren"
+
+#: editor_routes.cc:488 mixer_ui.cc:1216
+msgid "Show All Audio Busses"
+msgstr "Zeige alle Audiobusse"
+
+#: editor_routes.cc:489 mixer_ui.cc:1217
+msgid "Hide All Audio Busses"
+msgstr "Verberge alle Audiobusse"
+
+#: editor_routes.cc:490 mixer_ui.cc:1218
+msgid "Show All Midi Tracks"
+msgstr "Zeige alle MIDI-Spuren"
+
+#: editor_routes.cc:491 mixer_ui.cc:1219
+msgid "Hide All Midi Tracks"
+msgstr "Verberge alle MIDI-Spuren"
+
+#: editor_routes.cc:492
+msgid "Show Tracks With Regions Under Playhead"
+msgstr "Zeige Spuren mit Regionen unter dem Positionszeiger"
+
+#: editor_rulers.cc:211
+msgid "New location marker"
+msgstr "Neuer Positionsmarker"
+
+#: editor_rulers.cc:212
+msgid "Clear all locations"
+msgstr "Alle Positionsmarker entfernen"
+
+#: editor_rulers.cc:213
+msgid "Unhide locations"
+msgstr "Positionen anzeigen"
+
+#: editor_rulers.cc:217
+msgid "New range"
+msgstr "Neuer Bereich"
+
+#: editor_rulers.cc:218
+msgid "Clear all ranges"
+msgstr "Alle Bereiche entfernen"
+
+#: editor_rulers.cc:219
+msgid "Unhide ranges"
+msgstr "Bereiche anzeigen"
+
+#: editor_rulers.cc:224
+msgid "New Loop range"
+msgstr "Neuer Schleifenbereich"
+
+#: editor_rulers.cc:225
+msgid "New Punch range"
+msgstr "Neuer Punchbereich"
+
+#: editor_rulers.cc:230
+msgid "New CD track marker"
+msgstr "Neuer CD-Track Marker"
+
+#: editor_rulers.cc:235 tempo_dialog.cc:38
+msgid "New Tempo"
+msgstr "Tempowechsel einfügen..."
+
+#: editor_rulers.cc:239 tempo_dialog.cc:315
+msgid "New Meter"
+msgstr "Taktwechsel einfügen..."
+
+#: editor_snapshots.cc:137
+msgid "Rename Snapshot"
+msgstr "Schnappschuss umbenennen"
+
+#: editor_snapshots.cc:139
+msgid "New name of snapshot"
+msgstr "Name für neuen Schnappschuss"
+
+#: editor_snapshots.cc:157
+msgid ""
+"Do you really want to remove snapshot \"%1\" ?\n"
+"(which cannot be undone)"
+msgstr ""
+"Wollen Sie den Schnappschuss \"%1\" wirklich löschen?\n"
+"(Dies kann nicht rückgängig gemacht werden)"
+
+#: editor_snapshots.cc:162
+msgid "Remove snapshot"
+msgstr "Schnappschuss entfernen"
+
+#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
+msgid "add"
+msgstr "Hinzufügen"
+
+#: editor_tempodisplay.cc:215
+msgid "add tempo mark"
+msgstr "Tempowechsel einfügen"
+
+#: editor_tempodisplay.cc:254
+msgid "add meter mark"
+msgstr "Taktwechsel einfügen"
+
+#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+msgid "done"
+msgstr "Fertig"
+
+#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+msgid "replace tempo mark"
+msgstr "Tempowechsel ersetzen"
+
+#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+msgid "remove tempo mark"
+msgstr "Tempowechsel entfernen"
+
+#: editor_tempodisplay.cc:370
+msgid ""
+"programming error: meter marker canvas item has no marker object pointer!"
+msgstr ""
+"pProgrammierfehler: meter marker canvas item has no marker object pointer!"
+
+#: editor_timefx.cc:68
+msgid "stretch/shrink"
+msgstr "strecken/stauchen"
+
+#: editor_timefx.cc:130
+msgid "pitch shift"
+msgstr "pitch-shift"
+
+#: editor_timefx.cc:304
+msgid "timefx cannot be started - thread creation error"
+msgstr ""
+"Time-Stretch konnte nicht gestartet werden - Fehler beim erstellen des "
+"Threads"
+
+#: engine_dialog.cc:87
+msgid "Device Control Panel"
+msgstr "Gerätekontrollfeld"
+
+#: engine_dialog.cc:88
+msgid "Midi Device Setup"
+msgstr "MIDI Geräteeinstellungen"
+
+#: engine_dialog.cc:89
+msgid "Stop (Reconfigure)"
+msgstr "Stop (Neu konfigurieren)"
+
+#: engine_dialog.cc:90 engine_dialog.cc:2693
+msgid "Measure"
+msgstr "Messen"
+
+#: engine_dialog.cc:91
+msgid "Use results"
+msgstr "Benutze Ergebnisse"
+
+#: engine_dialog.cc:92
+msgid "Back to settings ... (ignore results)"
+msgstr "Zurücksetzen ... (Resultate ignorieren)"
+
+#: engine_dialog.cc:93
+msgid "Calibrate Audio"
+msgstr "AUdio kalibrieren"
+
+#: engine_dialog.cc:97
+msgid "Back to settings"
+msgstr "Zurück zu Einstellungen"
+
+#: engine_dialog.cc:117
+msgid ""
+"No audio/MIDI backends detected. %1 cannot run\n"
+"\n"
+"(This is a build/packaging/system error. It should never happen.)"
+msgstr ""
+"Kein Audio/MIDI backend gefunden. %1 kann nicht laufen\n"
+"\n"
+"(Das ist ein Kompilier-/Paket-/Systemfehler und sollte nie passieren.)"
+
+#: engine_dialog.cc:142
+msgid "Latency Measurement Tool"
+msgstr "Latenzmeßwerkzeug"
+
+#: engine_dialog.cc:154
+msgid ""
+"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
+"low level.</span>"
+msgstr ""
+"<span weight=\"bold\">Drehen Sie die Lautstärke Ihrer Audioanlage sehr leise."
+"</span>"
+
+#: engine_dialog.cc:163
+msgid "Select two channels below and connect them using a cable."
+msgstr "Wählen Sie unten zwei Kanäle aus und verbinden sie mit einem Kabel."
+
+#: engine_dialog.cc:168
+msgid "Output channel"
+msgstr "Ausgangskanal"
+
+#: engine_dialog.cc:176
+msgid "Input channel"
+msgstr "Eingangskanal"
+
+#: engine_dialog.cc:209
+msgid "Once the channels are connected, click the \"Measure\" button."
+msgstr "Wenn die Kanäle verbunden sind, klicken Sie den \"Messen\"-Knopf."
+
+#: engine_dialog.cc:216
+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:231 engine_dialog.cc:2813 engine_dialog.cc:2823
+msgid "No measurement results yet"
+msgstr "Noch keine Messergebnisse"
+
+#: engine_dialog.cc:241 route_params_ui.cc:106
+msgid "Latency"
+msgstr "Latenz"
+
+#: engine_dialog.cc:465
+msgid "Audio System:"
+msgstr "Audiosystem:"
+
+#: engine_dialog.cc:507
+msgid "Driver:"
+msgstr "Treiber:"
+
+#: engine_dialog.cc:514
+msgid "Input Device:"
+msgstr "Eingangsgerät:"
+
+#: engine_dialog.cc:518
+msgid "Output Device:"
+msgstr "Ausgangsgerät:"
+
+#: engine_dialog.cc:525
+msgid "Device:"
+msgstr "Gerät:"
+
+#: engine_dialog.cc:534 engine_dialog.cc:639 sfdb_ui.cc:152 sfdb_ui.cc:347
+#: sfdb_ui.cc:352
+msgid "Sample rate:"
+msgstr "Samplerate:"
+
+#: engine_dialog.cc:540 engine_dialog.cc:646
+msgid "Buffer size:"
+msgstr "Puffergröße"
+
+#: engine_dialog.cc:558
+msgid "Input Channels:"
+msgstr "Eingangskanäle:"
+
+#: engine_dialog.cc:571
+msgid "Output Channels:"
+msgstr "Ausgangskanäle:"
+
+#: engine_dialog.cc:583
+msgid "Hardware input latency:"
+msgstr "Hardware Eingangslatenz (Samples)"
+
+#: engine_dialog.cc:586 engine_dialog.cc:599
+msgid "samples"
+msgstr "Samples"
+
+#: engine_dialog.cc:596
+msgid "Hardware output latency:"
+msgstr "Hardware Ausgangslatenz (Samples)"
+
+#: engine_dialog.cc:607
+msgid "MIDI System:"
+msgstr "MIDI System:"
+
+#: engine_dialog.cc:631
+msgid ""
+"%1 is already running. %2 will connect to it and use the existing settings."
+msgstr ""
+"%1 läuft bereits. %2 wird zu ihm verbinden und die existierenden "
+"Einstellungen übernehmen."
+
+#: engine_dialog.cc:684
+msgid ""
+"Failed to start or connect to audio-engine.\n"
+"\n"
+"Latency calibration requires a working audio interface."
+msgstr ""
+"Das Starten oder Verbinden mit der Audio-Engine ist fehlgeschlagen.\n"
+"\n"
+"Latenzkalibrierung erfordert ein funktionierendes Audio-Interface."
+
+#: engine_dialog.cc:690
+msgid ""
+"Your selected audio configuration is playback- or capture-only.\n"
+"\n"
+"Latency calibration requires playback and capture"
+msgstr ""
+"Ihre aktuelle Audiokonfiguration erlaubt nur Playback oder Aufnahme "
+"alleine.\n"
+"\n"
+"Latenzkalibrierung verlangt Duplexbetrieb (gleichzeitig Aufnahme und "
+"Wiedergabe)"
+
+#: engine_dialog.cc:870
+msgid "MIDI Devices"
+msgstr "MIDI Geräte"
+
+#: engine_dialog.cc:876
+msgid "Device"
+msgstr "Gerät"
+
+#: engine_dialog.cc:878
+msgid "Hardware Latencies"
+msgstr "Hardware-Latenzen"
+
+#: engine_dialog.cc:919
+msgid "Calibrate"
+msgstr "Kalibrieren"
+
+#: engine_dialog.cc:1008
+msgid "all available channels"
+msgstr "alle verfügbaren Kanäle"
+
+#: engine_dialog.cc:1441 latency_gui.cc:39
+msgid "sample"
+msgid_plural "samples"
+msgstr[0] "Sample"
+msgstr[1] "Samples"
+
+#: engine_dialog.cc:1494
+#, c-format
+msgid "(%.1f ms)"
+msgstr "(%.1f ms)"
+
+#: engine_dialog.cc:2161
+msgid "Could not start backend engine %1"
+msgstr "Konnte Backend Engine %1 nicht starten"
+
+#: engine_dialog.cc:2212
+msgid "Cannot set driver to %1"
+msgstr "Kann Treiber nicht auf %1 setzen"
+
+#: engine_dialog.cc:2217
+msgid "Cannot set input device name to %1"
+msgstr "Kann Namen des Eingangsgeräts nicht auf %1 setzen"
+
+#: engine_dialog.cc:2221
+msgid "Cannot set output device name to %1"
+msgstr "Kann Namen des Ausgangsgeräts nicht auf %1 setzen"
+
+#: engine_dialog.cc:2226
+msgid "Cannot set device name to %1"
+msgstr "Kann Gerät nicht auf %1 setzen"
+
+#: engine_dialog.cc:2231
+msgid "Cannot set sample rate to %1"
+msgstr "Kann Samplerate nicht auf %1 setzen"
+
+#: engine_dialog.cc:2235
+msgid "Cannot set buffer size to %1"
+msgstr "Kann Buffergröße nicht auf %1 setzen"
+
+#: engine_dialog.cc:2241
+msgid "Cannot set input channels to %1"
+msgstr "Kann Eingangskanäle nicht auf %1 setzen"
+
+#: engine_dialog.cc:2245
+msgid "Cannot set output channels to %1"
+msgstr "Kann Ausgangskanäle nicht auf %1 setzen"
+
+#: engine_dialog.cc:2251
+msgid "Cannot set input latency to %1"
+msgstr "Kann Eingangslatenz nicht auf %1 setzen"
+
+#: engine_dialog.cc:2255
+msgid "Cannot set output latency to %1"
+msgstr "Kann Ausgangslatenz nicht auf %1 setzen"
+
+#: engine_dialog.cc:2551 engine_dialog.cc:2610
+msgid "No signal detected "
+msgstr "Kein Signal erkannt"
+
+#: engine_dialog.cc:2564 engine_dialog.cc:2618 port_insert_ui.cc:70
+#: port_insert_ui.cc:98
+msgid "Disconnected from audio engine"
+msgstr "Von Audio-Engine getrennt"
+
+#: engine_dialog.cc:2573 engine_dialog.cc:2626
+msgid "Detected roundtrip latency: "
+msgstr "Entdeckte Roundtrip-Latenz:"
+
+#: engine_dialog.cc:2575 engine_dialog.cc:2628
+msgid "Systemic latency: "
+msgstr "Systemische Latenz:"
+
+#: engine_dialog.cc:2582
+msgid "(signal detection error)"
+msgstr "(Fehler bei der Signalerkennung)"
+
+#: engine_dialog.cc:2588
+msgid "(inverted - bad wiring)"
+msgstr "(invertiert - schlechte Verkabelung)"
+
+#: engine_dialog.cc:2635
+msgid "(averaging)"
+msgstr "(durchschnittlich)"
+
+#: engine_dialog.cc:2641
+msgid "(too large jitter)"
+msgstr "(zu viel Jitter)"
+
+#: engine_dialog.cc:2645
+msgid "(large jitter)"
+msgstr "(viel Jitter)"
+
+#: engine_dialog.cc:2657
+msgid "Timeout - large MIDI jitter."
+msgstr "Timeout - viel MIDI Jitter."
+
+#: engine_dialog.cc:2673 port_insert_ui.cc:134
+msgid "Detecting ..."
+msgstr "Messe..."
+
+#: engine_dialog.cc:2764
+msgid "Disconnect from %1"
+msgstr "Trenne von %1"
+
+#: engine_dialog.cc:2769
+msgid "Running"
+msgstr "Läuft"
+
+#: engine_dialog.cc:2771
+msgid "Connected"
+msgstr "Verbunden"
+
+#: engine_dialog.cc:2782
+msgid "Connect to %1"
+msgstr "Verbinde zu %1"
+
+#: export_channel_selector.cc:51 sfdb_ui.cc:150
+msgid "Channels:"
+msgstr "Kanäle:"
+
+#: export_channel_selector.cc:52
+msgid "Split to mono files"
+msgstr "In Monodateien aufteilen"
+
+#: export_channel_selector.cc:197
+msgid "Bus or Track"
+msgstr "Bus oder Spur"
+
+#: export_channel_selector.cc:473
+msgid "Region contents without fades nor region gain (channels: %1)"
+msgstr "Regioneninhalt ohne Fades und Regionenlautstärke (Kanäle: %1)"
+
+#: export_channel_selector.cc:477
+msgid "Region contents with fades and region gain (channels: %1)"
+msgstr "Regioneninhalt mit Fades und Regionenlautstärke (Kanäle: %1)"
+
+#: export_channel_selector.cc:481
+msgid "Track output (channels: %1)"
+msgstr "Spurausgang (%1 Kanäle)"
+
+#: export_channel_selector.cc:550
+msgid "Apply track/bus processing"
+msgstr "Signalverarbeitung der Spur/des Busses anwenden"
+
+#: export_channel_selector.cc:551
+msgid "Select all tracks"
+msgstr "Alle Spuren auswählen"
+
+#: export_channel_selector.cc:552
+msgid "Select all busses"
+msgstr "Alle Busse auswählen"
+
+#: export_channel_selector.cc:553
+msgid "Deselect all"
+msgstr "Alles deselektieren"
+
+#: export_channel_selector.cc:587
+msgid "Track name"
+msgstr "Spurname"
+
+#: export_dialog.cc:46
+msgid ""
+"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
+"span>"
+msgstr ""
+"<span color=\"#ffa755\">Einige existierende Dateien werden überschrieben "
+"werden.</span>"
+
+#: export_dialog.cc:47
+msgid "List files"
+msgstr "Dateien auflisten"
+
+#: export_dialog.cc:158 export_format_dialog.cc:59
+msgid "File format"
+msgstr "Dateiformat"
+
+#: export_dialog.cc:159 export_timespan_selector.cc:374
+#: export_timespan_selector.cc:436
+msgid "Time Span"
+msgstr "Zeitspanne"
+
+#: export_dialog.cc:160
+msgid "Channels"
+msgstr "Kanäle"
+
+#: export_dialog.cc:182
+msgid ""
+"Export has been aborted due to an error!\n"
+"See the Log for details."
+msgstr ""
+"Das Exportieren wurde aufgrund eines Fehlers abgebrochen!\n"
+"Details dazu stehen in der Log."
+
+#: export_dialog.cc:251
+msgid "Files that will be overwritten"
+msgstr "Dateien, die überschrieben werden"
+
+#: export_dialog.cc:296
+msgid "Export initialization failed: %1"
+msgstr "Exportinitialisierung gescheitert: %1"
+
+#: export_dialog.cc:306
+msgid "Stop Export"
+msgstr "Export Abbrechen"
+
+#: export_dialog.cc:327
+msgid "export"
+msgstr "Exportieren"
+
+#: export_dialog.cc:346
+msgid "Normalizing '%3' (timespan %1 of %2)"
+msgstr "Normalisiere '%3' (Zeitspanne %1 von %2)"
+
+#: export_dialog.cc:350
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "Exportiere '%3' (Zeitspanne %1 von %2)"
+
+#: export_dialog.cc:373 export_dialog.cc:375
+msgid "<span color=\"#ffa755\">Error: "
+msgstr "<span color=\"#ffa755\">Fehler: "
+
+#: export_dialog.cc:385
+msgid "<span color=\"#ffa755\">Warning: "
+msgstr "<span color=\"#ffa755\">Warnung: "
+
+#: export_dialog.cc:387
+msgid ""
+"\n"
+"<span color=\"#ffa755\">Warning: "
+msgstr ""
+"\n"
+"<span color=\"#ffa755\">Warnung: "
+
+#: export_dialog.cc:411
+msgid "Export Selection"
+msgstr "Auswahl exportieren"
+
+#: export_dialog.cc:425
+msgid "Export Region"
+msgstr "Region exportieren"
+
+#: export_dialog.cc:434
+msgid "Source"
+msgstr "Quelle"
+
+#: export_dialog.cc:450
+msgid "Stem Export"
+msgstr "Stem Export"
+
+#: export_file_notebook.cc:39
+msgid "Add another format"
+msgstr "Ein weiteres Format hinzuzufügen"
+
+#: export_file_notebook.cc:193
+msgid "Format"
+msgstr "Format"
+
+#: export_file_notebook.cc:194
+msgid "Location"
+msgstr "Ort"
+
+#: export_file_notebook.cc:195
+msgid "Upload to Soundcloud"
+msgstr "Zu Soundcloud hochladen"
+
+#: export_file_notebook.cc:273
+msgid "No format!"
+msgstr "Kein Format!"
+
+#: export_file_notebook.cc:291
+msgid "Format %1: %2"
+msgstr "Format: %1: %2"
+
+#: export_filename_selector.cc:32
+msgid "Label:"
+msgstr "Name:"
+
+#: export_filename_selector.cc:33
+msgid "Session Name"
+msgstr "Projektname"
+
+#: export_filename_selector.cc:34
+msgid "Revision:"
+msgstr "Revision:"
+
+#: export_filename_selector.cc:36
+msgid "Folder:"
+msgstr "Ordner:"
+
+#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
+msgid "Browse"
+msgstr "Durchsuchen"
+
+#: export_filename_selector.cc:41
+msgid "<i>Build filename(s) from these components:</i>"
+msgstr "<i>Dateiname(n) aus diesen Bestandteilen erzeugen:</i>"
+
+#: export_filename_selector.cc:212
+msgid ""
+"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
+msgstr ""
+"<small><i>Leider kann zur Zeit kein Dateinamen-Beispiel gezeigt werden</i></"
+"small>"
+
+#: export_filename_selector.cc:214
+msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+msgstr "<small><i>Momentaner (ungefährer) Dateiname: \"%1\"</i></small>"
+
+#: export_filename_selector.cc:250 export_filename_selector.cc:336
+msgid ""
+"%1: this is only the directory/folder name, not the filename.\n"
+"The filename will be chosen from the information just above the folder "
+"selector."
+msgstr ""
+"%1: dies ist nur der Verzeichnisname, nicht der Dateiname.\n"
+"Der Dateiname wird aus den Informationen über der "
+"Verzeichnisauswahlgeneriert."
+
+#: export_filename_selector.cc:322
+msgid "Choose export folder"
+msgstr "Wähle den Exportordner"
+
+#: export_format_dialog.cc:31
+msgid "New Export Format Profile"
+msgstr "Neues Exportformat-Profil"
+
+#: export_format_dialog.cc:31
+msgid "Edit Export Format Profile"
+msgstr "Exportformat-Profil bearbeiten"
+
+#: export_format_dialog.cc:38
+msgid "Label: "
+msgstr "Name:"
+
+#: export_format_dialog.cc:41 normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normalisieren auf:"
+
+#: export_format_dialog.cc:46
+msgid "Trim silence at start"
+msgstr "Stille am Anfang abschneiden"
+
+#: export_format_dialog.cc:47
+msgid "Add silence at start:"
+msgstr "Füge Stille am Anfang hinzu:"
+
+#: export_format_dialog.cc:50
+msgid "Trim silence at end"
+msgstr "Stille am Ende abschneiden"
+
+#: export_format_dialog.cc:51
+msgid "Add silence at end:"
+msgstr "Füge Stille am Ende hinzu:"
+
+#: export_format_dialog.cc:54
+msgid ""
+"Command to run post-export\n"
+"(%f=full path & filename, %d=directory, %b=basename):"
+msgstr ""
+"Kommando, das nach dem Export ausgeführt werden soll\n"
+"(%f=full path & filename, %d=directory, %b=basename):"
+
+#: export_format_dialog.cc:57
+msgid "Compatibility"
+msgstr "Kompatibilität"
+
+#: export_format_dialog.cc:58
+msgid "Quality"
+msgstr "Qualität"
+
+#: export_format_dialog.cc:61
+msgid "Sample rate conversion quality:"
+msgstr "Qualität bei Konvertierung der Samplerate:"
+
+#: export_format_dialog.cc:68
+msgid "Dithering"
+msgstr "Dithering"
+
+#: export_format_dialog.cc:70
+msgid "Create CUE file for disk-at-once CD/DVD creation"
+msgstr "Schreibe CUE-Datei für Disk-at-once CD/DVD Erzeugung"
+
+#: export_format_dialog.cc:71
+msgid "Create TOC file for disk-at-once CD/DVD creation"
+msgstr "Schreibe TOC-Datei für Disk-at-once CD/DVD Erzeugung"
+
+#: export_format_dialog.cc:72
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr "Erzeuge Kapitelmarkierungsdatei für MP4 Kapitelmarkierungen"
+
+#: export_format_dialog.cc:74
+msgid "Tag file with session's metadata"
+msgstr "Datei mit den Metadaten des Projekt taggen"
+
+#: export_format_dialog.cc:474
+msgid "Best (sinc)"
+msgstr "Beste (sinc)"
+
+#: export_format_dialog.cc:479
+msgid "Medium (sinc)"
+msgstr "Mittel (sinc)"
+
+#: export_format_dialog.cc:484
+msgid "Fast (sinc)"
+msgstr "Schnellste (sinc)"
+
+#: export_format_dialog.cc:494
+msgid "Zero order hold"
+msgstr "Halteglied nullter Ordnung (ZOH)"
+
+#: export_format_dialog.cc:904
+msgid "Linear encoding options"
+msgstr "Optionen für lineare Codierung"
+
+#: export_format_dialog.cc:920
+msgid "Ogg Vorbis options"
+msgstr "Ogg Vorbis Optionen"
+
+#: export_format_dialog.cc:931
+msgid "FLAC options"
+msgstr "FLAC Optionen"
+
+#: export_format_dialog.cc:948
+msgid "Broadcast Wave options"
+msgstr "Broadcast Wave Optionen"
+
+#: export_format_selector.cc:136
+msgid "Do you really want to remove the format?"
+msgstr "Wollen Sie das Format wirklich entfernen?"
+
+#: export_preset_selector.cc:28
+msgid "Preset"
+msgstr "Preset"
+
+#: export_preset_selector.cc:104
+msgid ""
+"The selected preset did not load successfully!\n"
+"Perhaps it references a format that has been removed?"
+msgstr ""
+"Das ausgewählte Preset konnte nicht geladen werden!\n"
+"Möglicherweise verwendet es ein Format, das entfernt wurde."
+
+#: export_preset_selector.cc:156
+msgid "Do you really want to remove this preset?"
+msgstr "Wollen Sie dieses Preset wirklich entfernen?"
+
+#: export_timespan_selector.cc:46
+msgid "Show Times as:"
+msgstr "Zeitanzeige:"
+
+#: export_timespan_selector.cc:53 processor_box.cc:2533
+msgid "Select All"
+msgstr "Alles auswählen"
+
+#: export_timespan_selector.cc:223 transform_dialog.cc:93
+msgid " to "
+msgstr " bis"
+
+#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+msgid "Range"
+msgstr "Bereiche"
+
+#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
+msgid "curl error %1 (%2)"
+msgstr "curl Fehler %1 (%2)"
+
+#: sfdb_freesound_mootcher.cc:266
+msgid "getSoundResourceFile: There is no valid root in the xml file"
+msgstr "getSoundResourceFile: Keine gültige Wurzel in der XML-Datei"
+
+#: sfdb_freesound_mootcher.cc:271
+msgid "getSoundResourceFile: root = %1, != response"
+msgstr "getSoundResourceFile: Wurzel = %1, != Antwort"
+
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2298
+msgid "%1"
+msgstr "%1"
+
+#: gain_meter.cc:134 gain_meter.cc:402 gain_meter.cc:507 gain_meter.cc:898
+msgid "-inf"
+msgstr "-inf"
+
+#: gain_meter.cc:149 gain_meter.cc:962
+msgid "Fader automation mode"
+msgstr "Fader Automationsmodus"
+
+#: gain_meter.cc:150 gain_meter.cc:963
+msgid "Fader automation type"
+msgstr "Fader-Automationstyp"
+
+#: gain_meter.cc:159 gain_meter.cc:831 panner_ui.cc:177 panner_ui.cc:639
+msgid "Abs"
+msgstr "Abs"
+
+#: gain_meter.cc:795
+msgid "M"
+msgstr "M"
+
+#: gain_meter.cc:798
+msgid "P"
+msgstr "P"
+
+#: gain_meter.cc:801
+msgid "T"
+msgstr "T"
+
+#: gain_meter.cc:804
+msgid "W"
+msgstr "W"
+
+#: generic_pluginui.cc:83
+msgid "<span size=\"large\">Presets</span>"
+msgstr "<span size=\"large\">Voreinstellungen</span>"
+
+#: generic_pluginui.cc:98
+msgid "Manual"
+msgstr "Manuell"
+
+#: generic_pluginui.cc:107
+msgid "All Automation"
+msgstr "Alle Automation"
+
+#: generic_pluginui.cc:251
+msgid "Switches"
+msgstr "Schalter"
+
+#: generic_pluginui.cc:261 generic_pluginui.cc:437 processor_box.cc:2507
+msgid "Controls"
+msgstr "Steuerelemente"
+
+#: generic_pluginui.cc:294
+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:319
+msgid "Plugin Editor: no control for property %1"
+msgstr "Plugin Editor: kein Regler für Eigenschaft %1"
+
+#: generic_pluginui.cc:325
+msgid "Plugin Editor: could not build control element for property %1"
+msgstr "Plugin Editor: konnte kein Kontrollelement für Eigenschaft %1 erzeugen"
+
+#: generic_pluginui.cc:469
+msgid "Meters"
+msgstr "Pegelanzeigen"
+
+#: generic_pluginui.cc:491
+msgid "Automation control"
+msgstr "Automation"
+
+#: generic_pluginui.cc:498
+msgid "Mgnual"
+msgstr "Mgnuell"
+
+#: global_port_matrix.cc:158
+msgid "Audio Connection Manager"
+msgstr "Audio Verbindungsmanager"
+
+#: global_port_matrix.cc:161
+msgid "MIDI Connection Manager"
+msgstr "Midi Verbindungsmanager"
+
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:826
+#: mixer_strip.cc:927 monitor_section.cc:1279 monitor_selector.cc:189
+msgid "Disconnect"
+msgstr "Trenne"
+
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
+msgid "port"
+msgstr "Port"
+
+#: group_tabs.cc:312
+msgid "Selection..."
+msgstr "Ausgewählten Spuren"
+
+#: group_tabs.cc:313
+msgid "Record Enabled..."
+msgstr "Spuren, deren Aufnahme aktiviert ist"
+
+#: group_tabs.cc:314
+msgid "Soloed..."
+msgstr "Solo-Spuren/Busse"
+
+#: group_tabs.cc:320
+msgid "Create New Group ..."
+msgstr "Neue Gruppe erzeugen ..."
+
+#: group_tabs.cc:321
+msgid "Create New Group From"
+msgstr "Neue Gruppe erzeugen aus"
+
+#: group_tabs.cc:324
+msgid "Edit Group..."
+msgstr "Gruppe bearbeiten..."
+
+#: group_tabs.cc:325
+msgid "Collect Group"
+msgstr "Gruppe sammeln"
+
+#: group_tabs.cc:326
+msgid "Remove Group"
+msgstr "Gruppe entfernen"
+
+#: group_tabs.cc:329
+msgid "Remove Subgroup Bus"
+msgstr "Subgruppen-Bus entfernen"
+
+#: group_tabs.cc:331
+msgid "Add New Subgroup Bus"
+msgstr "Subgruppen-Bus hinzufügen"
+
+#: group_tabs.cc:333
+msgid "Add New Aux Bus (pre-fader)"
+msgstr "Aux-Send zur Subgruppe hinzufügen (Pre-Fader)"
+
+#: group_tabs.cc:334
+msgid "Add New Aux Bus (post-fader)"
+msgstr "Aux-Send zur Subgruppe hinzufügen (Post-Fader)"
+
+#: group_tabs.cc:340
+msgid "Enable All Groups"
+msgstr "Alle Gruppen aktivieren"
+
+#: group_tabs.cc:341
+msgid "Disable All Groups"
+msgstr "Alle Gruppen deaktivieren"
+
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr "Zu entfernende Zeit"
+
+#: insert_remove_time_dialog.cc:52
+msgid "Time to insert:"
+msgstr "Einzufügende Zeit:"
+
+#: insert_remove_time_dialog.cc:61
+msgid "Intersected regions should:"
+msgstr "Regionen am Positionsmarker:"
+
+#: insert_remove_time_dialog.cc:64
+msgid "stay in position"
+msgstr "Unverändert lassen"
+
+#: insert_remove_time_dialog.cc:65
+msgid "move"
+msgstr "Verschieben"
+
+#: insert_remove_time_dialog.cc:66
+msgid "be split"
+msgstr "Aufteilen"
+
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
+msgstr "Auf alle Wiedergabelisten der Spur anwenden"
+
+#: insert_remove_time_dialog.cc:76
+msgid "Move glued regions"
+msgstr "Taktgebundene Regionen mitbewegen"
+
+#: insert_remove_time_dialog.cc:78
+msgid "Move markers"
+msgstr "Marker mitbewegen"
+
+#: insert_remove_time_dialog.cc:81
+msgid "Move glued markers"
+msgstr "Taktgebundene Marker mitbewegen"
+
+#: insert_remove_time_dialog.cc:86
+msgid "Move locked markers"
+msgstr "Gesperrte Marker mitbewegen"
+
+#: insert_remove_time_dialog.cc:91
+msgid ""
+"Move tempo and meter changes\n"
+"<i>(may cause oddities in the tempo map)</i>"
+msgstr ""
+"Bewege Tempo- und Taktartänderungen\n"
+"<i>(kann in der Tempo-Tabelle seltsames Verhalten verursachen)</i>"
+
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr "Zeit entfernen"
+
+#: insert_remove_time_dialog.cc:99
+msgid "Insert time"
+msgstr "Stille einfügen"
+
+#: instrument_selector.cc:62
+msgid "-none-"
+msgstr "-keine-"
+
+#: interthread_progress_window.cc:103
+msgid "Importing file: %1 of %2"
+msgstr "Importiere Datei: %1 von %2"
+
+#: io_selector.cc:221
+msgid "I/O selector"
+msgstr "E/A Auswahl"
+
+#: io_selector.cc:266 monitor_selector.cc:244
+msgid "%1 input"
+msgstr "%1 Eingang"
+
+#: io_selector.cc:268 monitor_selector.cc:246
+msgid "%1 output"
+msgstr "%1 Ausgang"
+
+#: keyboard.cc:78
+msgid "your own"
+msgstr "Eigenes"
+
+#: keyboard.cc:141 keyboard.cc:165
+msgid "Default keybindings not found - %1 will be hard to use!"
+msgstr ""
+"Keine Tastatur-Standardbelegung gefunden - %1 wird sich schwer bedienen "
+"lassen!"
+
+#: keyboard.cc:144
+msgid "Key bindings file \"%1\" not found. Default bindings used instead"
+msgstr ""
+"Die Datei \"%1\" für Tastaturkürzel wurde nicht gefunden. Stattdessen wird "
+"die Standard-Belegung verwendet."
+
+#: keyeditor.cc:54
+msgid "Remove shortcut"
+msgstr "Tastenkürzel entfernen"
+
+#: keyeditor.cc:63
+msgid "Action"
+msgstr "Aktion"
+
+#: keyeditor.cc:64
+msgid "Shortcut"
+msgstr "Tastenkürzel"
+
+#: keyeditor.cc:84
+msgid "Select an action, then press the key(s) to (re)set its shortcut"
+msgstr ""
+"Wählen Sie eine Aktion und drücken Sie dann die Taste(n) \n"
+"um das Tastaturkürzel zu setzen"
+
+#: keyeditor.cc:98
+msgid "Reset Bindings to Defaults"
+msgstr "Setze Kürzel auf Vorgabewerte zurück"
+
+#: keyeditor.cc:263
+msgid "Main_menu"
+msgstr "Hauptmenü"
+
+#: keyeditor.cc:265
+msgid "redirectmenu"
+msgstr "Umleitungsmenü"
+
+#: keyeditor.cc:267
+msgid "Editor_menus"
+msgstr "Editor-Menü"
+
+#: keyeditor.cc:269
+msgid "RegionList"
+msgstr "Regionenliste"
+
+#: keyeditor.cc:271
+msgid "ProcessorMenu"
+msgstr "Prozessor-Menü"
+
+#: latency_gui.cc:40
+msgid "msec"
+msgstr "ms"
+
+#: latency_gui.cc:41
+msgid "period"
+msgstr "Periode"
+
+#: latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 Sample"
+msgstr[1] "%1 Samples"
+
+#: latency_gui.cc:72 panner_ui.cc:409 plugin_ui.cc:421
+msgid "Reset"
+msgstr "Reset"
+
+#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1911
+msgid "programming error: %1 (%2)"
+msgstr "Programmierfehler: %1 (%2)"
+
+#: location_ui.cc:52 location_ui.cc:54
+msgid "Use PH"
+msgstr "zu PZ"
+
+#: location_ui.cc:59
+msgid "Glue"
+msgstr "Bindung"
+
+#: location_ui.cc:87
+msgid "Performer:"
+msgstr "Performer:"
+
+#: location_ui.cc:88
+msgid "Composer:"
+msgstr "Komponist:"
+
+#: location_ui.cc:90
+msgid "Pre-Emphasis"
+msgstr "Präemphase"
+
+#: location_ui.cc:317
+msgid "Remove this range"
+msgstr "Diesen Bereich entfernen"
+
+#: location_ui.cc:318
+msgid "Start time - middle click to locate here"
+msgstr "Startzeit - Mittelklick, um hierher zu positionieren"
+
+#: location_ui.cc:319
+msgid "End time - middle click to locate here"
+msgstr "Endzeit - Mittelklick, um hierher zu positionieren"
+
+#: location_ui.cc:322
+msgid "Set range start from playhead location"
+msgstr "Bereichsbeginn auf Positionszeiger setzen"
+
+#: location_ui.cc:323
+msgid "Set range end from playhead location"
+msgstr "Bereichsende auf Positionszeiger setzen"
+
+#: location_ui.cc:327
+msgid "Remove this marker"
+msgstr "Diesen Marker entfernen"
+
+#: location_ui.cc:328
+msgid "Position - middle click to locate here"
+msgstr "Position - Mittelklick, um hierher zu positionieren"
+
+#: location_ui.cc:330
+msgid "Set marker time from playhead location"
+msgstr "Markerposition auf Positionszeiger setzen"
+
+#: location_ui.cc:499
+msgid "You cannot put a CD marker at the start of the session"
+msgstr "Sie können keinen CD-Marker am Anfang des Projekts erstellen"
+
+#: location_ui.cc:725
+msgid "New Marker"
+msgstr "Neuer Marker"
+
+#: location_ui.cc:726
+msgid "New Range"
+msgstr "Neuer Bereich"
+
+#: location_ui.cc:739
+msgid "<b>Loop/Punch Ranges</b>"
+msgstr "<b>Schleifen/Punchbereiche</b>"
+
+#: location_ui.cc:764
+msgid "<b>Markers (Including CD Index)</b>"
+msgstr "<b>Marker (auch CD-Index)</b>"
+
+#: location_ui.cc:799
+msgid "<b>Ranges (Including CD Track Ranges)</b>"
+msgstr "<b>Bereiche (auch CD-Track-Bereichen)</b>"
+
+#: location_ui.cc:1042
+msgid "add range marker"
+msgstr "Bereich hinzufügen"
+
+#: main.cc:82
+msgid "%1 could not connect to the audio backend."
+msgstr "%1 konnte nicht zum Audiobackend verbinden."
+
+#: main.cc:129 main.cc:145
+msgid "The audio backend (%1) has failed, or terminated"
+msgstr "Das Audiobackend (%1) funktioniert nicht oder wurde beendet"
+
+#: main.cc:132
+msgid ""
+"%2 exited unexpectedly, and without notifying %1.\n"
+"\n"
+"This could be due to misconfiguration or to an error inside %2.\n"
+"\n"
+"Click OK to exit %1."
+msgstr ""
+"%2 wurde unerwartet und ohne %1 zu benachrichtigen beendet .\n"
+"\n"
+"Dies liegt entweder an einer fehlerhaften Konfiguration oder an einem Fehler "
+"in %2.\n"
+"\n"
+"Klicke OK, um %1 zu verlassen."
+
+#: main.cc:146
+msgid "%2 exited unexpectedly, and without notifying %1."
+msgstr "%2 wurde unerwartet und ohne %1 zu benachrichtigen beendet "
+
+#: main.cc:241
+msgid ""
+"\n"
+" %1 could not understand your command line "
+msgstr ""
+"\n"
+" %1 konnte Ihre Kommandozeile nicht verstehen "
+
+#: main.cc:243
+msgid "An error was encountered while launching %1"
+msgstr "Während des Programmstarts von %1 ist ein Fehler aufgetreten"
+
+#: main.cc:332
+msgid " (built using "
+msgstr " (kompiliert mit Version "
+
+#: main.cc:335
+msgid " and GCC version "
+msgstr " und GCC Version"
+
+#: main.cc:345
+msgid "Copyright (C) 1999-2015 Paul Davis"
+msgstr "Copyright (C) 1999-2015 Paul Davis"
+
+#: main.cc:346
+msgid ""
+"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
+"Baker, Robin Gareus"
+msgstr ""
+"Einige Teile Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
+"Baker, Robin Gareus"
+
+#: main.cc:348
+msgid "%1 comes with ABSOLUTELY NO WARRANTY"
+msgstr "%1 wird Ihnen ohne jegliche Gewährleistung"
+
+#: main.cc:349
+msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+msgstr ""
+"für allgemeine oder spezielle Gebrauchstauglichkeit zur Verfügung gestellt."
+
+#: main.cc:350
+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:351
+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:356
+msgid "could not initialize %1."
+msgstr "Konnte %1 nicht initialisieren."
+
+#: main.cc:366
+msgid "Cannot xinstall SIGPIPE error handler"
+msgstr "Kann die SIGPIPE Fehlerbehandlung nicht installieren"
+
+#: main.cc:373
+msgid "Could not complete pre-GUI initialization"
+msgstr "Konnte Initialisierung (pre-GUI) nicht abschließen"
+
+#: main.cc:380
+msgid "could not create %1 GUI"
+msgstr "konnte das %1 GUI nicht erstellen"
+
+#: main_clock.cc:50
+msgid "Display delta to edit cursor"
+msgstr "Zeige Abstand zu Arbeitspunkt"
+
+#: main_clock.cc:65 tempo_dialog.cc:54
+msgid "Edit Tempo"
+msgstr "Tempo bearbeiten"
+
+#: main_clock.cc:66 tempo_dialog.cc:326
+msgid "Edit Meter"
+msgstr "Taktart bearbeiten"
+
+#: main_clock.cc:67
+msgid "Insert Tempo Change"
+msgstr "Tempowechsel einfügen"
+
+#: main_clock.cc:68
+msgid "Insert Meter Change"
+msgstr "Taktartwechsel einfügen"
+
+#: marker.cc:276
+msgid "MarkerText"
+msgstr "MarkerText"
+
+#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2044
+#: rc_option_editor.cc:2677 sfdb_ui.cc:664
+msgid "None"
+msgstr "Kein"
+
+#: midi_channel_selector.cc:165 midi_channel_selector.cc:405
+#: midi_channel_selector.cc:441
+msgid "Invert"
+msgstr "Invert"
+
+#: midi_channel_selector.cc:169
+msgid "Force"
+msgstr "Force"
+
+#: midi_channel_selector.cc:328 midi_channel_selector.cc:370
+msgid "MIDI Channel Control"
+msgstr "MIDI-Kanalkontrolle"
+
+#: midi_channel_selector.cc:330
+msgid "Playback all channels"
+msgstr "Alle Kanäle wiedergeben"
+
+#: midi_channel_selector.cc:331
+msgid "Play only selected channels"
+msgstr "Nur ausgewählte Kanäle abspielen"
+
+#: midi_channel_selector.cc:332
+msgid "Use a single fixed channel for all playback"
+msgstr "Benutze einen einzelnen festen Kanal für gesamte Wiedergabe"
+
+#: midi_channel_selector.cc:333
+msgid "Record all channels"
+msgstr "Alle Kanäle aufnehmen"
+
+#: midi_channel_selector.cc:334
+msgid "Record only selected channels"
+msgstr "Nur ausgewählte Kanäle aufnehmen"
+
+#: midi_channel_selector.cc:335
+msgid "Force all channels to 1 channel"
+msgstr "Alle Kanäle auf einem Kanal wiedergeben"
+
+#: midi_channel_selector.cc:376
+msgid "Inbound"
+msgstr "Eingehend"
+
+#: midi_channel_selector.cc:396
+msgid "Click to enable recording all channels"
+msgstr "Klicke, um Aufnahme aller Kanäle zuzulassen"
+
+#: midi_channel_selector.cc:401
+msgid "Click to disable recording all channels"
+msgstr "Klicke, um Aufnahme für alle Kanäle abzuschalten"
+
+#: midi_channel_selector.cc:406
+msgid "Click to invert currently selected recording channels"
+msgstr ""
+"Klicke, um die gegenwärtige Auswahl der aufnehmenden Kanäle zu invertieren"
+
+#: midi_channel_selector.cc:413
+msgid "Playback"
+msgstr "Wiedergabe"
+
+#: midi_channel_selector.cc:432
+msgid "Click to enable playback of all channels"
+msgstr "Klicke, um Wiedergabe aller Kanäle zuzulassen"
+
+#: midi_channel_selector.cc:437
+msgid "Click to disable playback of all channels"
+msgstr "Klicke, um Wiedergabe aller Kanäle abzuschalten"
+
+#: midi_channel_selector.cc:442
+msgid "Click to invert current selected playback channels"
+msgstr ""
+"Klicke, um die gegenwärtige Auswahl der wiedergebenden Kanäle zu invertieren"
+
+#: midi_channel_selector.cc:620
+msgid "Click to toggle playback of channel %1"
+msgstr "Klicke, um die Wiedergabe von Kanal %1 umzuschalten"
+
+#: midi_channel_selector.cc:628
+msgid "Click to force all MIDI channel messages to channel %1"
+msgstr "Klicke, um alle MIDI Channel Messages auf Kanal %1 auszugeben"
+
+#: midi_channel_selector.cc:718
+msgid "Click to toggle recording of channel %1"
+msgstr "Klicke, um die Aufnahme von Kanal %1 umzuschalten"
+
+#: midi_channel_selector.cc:726
+msgid "Click to force all recorded channels to %1"
+msgstr "Klicke, um alle aufgenommenen Kanäle an %1 zu zwingen"
+
+#: midi_export_dialog.cc:35
+msgid "Export MIDI: %1"
+msgstr "Exportiere MIDI: %1"
+
+#: midi_list_editor.cc:56
+msgid "Whole"
+msgstr "Ganze"
+
+#: midi_list_editor.cc:57
+msgid "Half"
+msgstr "Halbe"
+
+#: midi_list_editor.cc:58
+msgid "Triplet"
+msgstr "Triole"
+
+#: midi_list_editor.cc:59
+msgid "Quarter"
+msgstr "Viertel"
+
+#: midi_list_editor.cc:60
+msgid "Eighth"
+msgstr "Achtel"
+
+#: midi_list_editor.cc:61
+msgid "Sixteenth"
+msgstr "Sechzehntel"
+
+#: midi_list_editor.cc:62
+msgid "Thirty-second"
+msgstr "Zweiunddreissigstel"
+
+#: midi_list_editor.cc:63
+msgid "Sixty-fourth"
+msgstr "Vierundsechzigstel"
+
+#: midi_list_editor.cc:106
+msgid "Num"
+msgstr "Nr."
+
+#: midi_list_editor.cc:108
+msgid "Vel"
+msgstr "Vel"
+
+#: midi_list_editor.cc:216
+msgid "edit note start"
+msgstr "Notenbeginn bearbeiten"
+
+#: midi_list_editor.cc:225
+msgid "edit note channel"
+msgstr "Kanal bearbeiten"
+
+#: midi_list_editor.cc:235
+msgid "edit note number"
+msgstr "Notennummer bearbeiten"
+
+#: midi_list_editor.cc:245
+msgid "edit note velocity"
+msgstr "Velocity bearbeiten"
+
+#: midi_list_editor.cc:259
+msgid "edit note length"
+msgstr "Notenlänge ändern"
+
+#: midi_list_editor.cc:463
+msgid "insert new note"
+msgstr "Neue Note einfügen"
+
+#: midi_list_editor.cc:527
+msgid "delete notes (from list)"
+msgstr "Noten (aus Liste) löschen"
+
+#: midi_list_editor.cc:602
+msgid "change note channel"
+msgstr "Kanal ändern"
+
+#: midi_list_editor.cc:610
+msgid "change note number"
+msgstr "Notennummerändern"
+
+#: midi_list_editor.cc:620
+msgid "change note velocity"
+msgstr "Velocity ändern"
+
+#: midi_list_editor.cc:690
+msgid "change note length"
+msgstr "Notenlänge ändern"
+
+#: midi_port_dialog.cc:39
+msgid "Add MIDI Port"
+msgstr "Neuen MIDI-Port hinzufügen"
+
+#: midi_port_dialog.cc:40
+msgid "Port name:"
+msgstr "Portname:"
+
+#: midi_port_dialog.cc:45
+msgid "MidiPortDialog"
+msgstr "MidiPortDialog"
+
+#: midi_region_view.cc:863
+msgid "channel edit"
+msgstr "Kanal editieren"
+
+#: midi_region_view.cc:899
+msgid "velocity edit"
+msgstr "Velocity bearbeiten"
+
+#: midi_region_view.cc:958
+msgid "add note"
+msgstr "Note hinzufügen"
+
+#: midi_region_view.cc:1890
+msgid "step add"
+msgstr "Schritt hinzufügen"
+
+#: midi_region_view.cc:1984 midi_region_view.cc:2007
+msgid "alter patch change"
+msgstr "Patch Change ändern"
+
+#: midi_region_view.cc:2043
+msgid "add patch change"
+msgstr "Patch Change hinzufügen"
+
+#: midi_region_view.cc:2065 midi_region_view.cc:2066
+msgid "move patch change"
+msgstr "Patch Change verschieben"
+
+#: midi_region_view.cc:2078 midi_region_view.cc:2079
+msgid "delete patch change"
+msgstr "Patch Change löschen"
+
+#: midi_region_view.cc:2117
+msgid "delete selection"
+msgstr "Auswahl löschen"
+
+#: midi_region_view.cc:2133
+msgid "delete note"
+msgstr "Note löschen"
+
+#: midi_region_view.cc:2592
+msgid "move notes"
+msgstr "Noten verschieben"
+
+#: midi_region_view.cc:3123
+msgid "change velocities"
+msgstr "Velocity ändern"
+
+#: midi_region_view.cc:3189
+msgid "transpose"
+msgstr "Transponieren"
+
+#: midi_region_view.cc:3217
+msgid "change note lengths"
+msgstr "Notenlänge ändern"
+
+#: midi_region_view.cc:3293
+msgid "nudge"
+msgstr "Verschieben"
+
+#: midi_region_view.cc:3308
+msgid "change channel"
+msgstr "Kanal ändern"
+
+#: midi_region_view.cc:3348
+msgid "Bank "
+msgstr "Bank"
+
+#: midi_region_view.cc:3349
+msgid "Program "
+msgstr "Programm"
+
+#: midi_region_view.cc:3350
+msgid "Channel "
+msgstr "Kanal"
+
+#: midi_region_view.cc:3537
+msgid "paste"
+msgstr "Einfügen"
+
+#: midi_streamview.cc:185
+msgid "attempt to display MIDI region with no source"
+msgstr "versuche, eine MIDI Region ohne Datenquelle darzustellen"
+
+#: midi_streamview.cc:195
+msgid "attempt to display MIDI region with no model"
+msgstr "versuche, eine MIDI Region ohne Datenmodell darzustellen"
+
+#: midi_streamview.cc:506
+msgid "failed to create MIDI region"
+msgstr "konnte MIDI-Region nicht erzeugen"
+
+#: midi_time_axis.cc:309
+msgid "External MIDI Device"
+msgstr "Externes MIDI-Gerät"
+
+#: midi_time_axis.cc:310
+msgid "External Device Mode"
+msgstr "Modus Externes Gerät"
+
+#: midi_time_axis.cc:318
+msgid "Chns"
+msgstr "Chns"
+
+#: midi_time_axis.cc:320
+msgid "Click to edit channel settings"
+msgstr "Klicke, um Kanaleinstellungen zu bearbeiten"
+
+#: midi_time_axis.cc:519
+msgid "Show Full Range"
+msgstr "Ganzen Bereich anzeigen"
+
+#: midi_time_axis.cc:524
+msgid "Fit Contents"
+msgstr "Auf Inhalt anpassen"
+
+#: midi_time_axis.cc:528
+msgid "Note Range"
+msgstr "Notenbereich"
+
+#: midi_time_axis.cc:529
+msgid "Note Mode"
+msgstr "Noten-Modus"
+
+#: midi_time_axis.cc:530
+msgid "Channel Selector"
+msgstr "Kanalauswahl"
+
+#: midi_time_axis.cc:535
+msgid "Color Mode"
+msgstr "Farbmodus"
+
+#: midi_time_axis.cc:594
+msgid "Bender"
+msgstr "Bender"
+
+#: midi_time_axis.cc:598
+msgid "Pressure"
+msgstr "Druckdaten"
+
+#: midi_time_axis.cc:610
+msgid "Controllers"
+msgstr "Controller"
+
+#: midi_time_axis.cc:615
+msgid "No MIDI Channels selected"
+msgstr "Keine MIDI-Kanäle ausgewählt"
+
+#: midi_time_axis.cc:672 midi_time_axis.cc:801
+msgid "Hide all channels"
+msgstr "Alle Kanäle verbergen"
+
+#: midi_time_axis.cc:676 midi_time_axis.cc:805
+msgid "Show all channels"
+msgstr "Alle Kanäle anzeigen"
+
+#: midi_time_axis.cc:687 midi_time_axis.cc:816
+msgid "Channel %1"
+msgstr "Kanal %1"
+
+#: midi_time_axis.cc:942 midi_time_axis.cc:974
+msgid "Controllers %1-%2"
+msgstr "Controller %1-%2"
+
+#: midi_time_axis.cc:965 midi_time_axis.cc:968
+msgid "Controller %1"
+msgstr "Controller %1"
+
+#: midi_time_axis.cc:991
+msgid "Sustained"
+msgstr "Sustain"
+
+#: midi_time_axis.cc:998
+msgid "Percussive"
+msgstr "Perkussiv"
+
+#: midi_time_axis.cc:1018
+msgid "Meter Colors"
+msgstr "Nach Lautstärke"
+
+#: midi_time_axis.cc:1025
+msgid "Channel Colors"
+msgstr "Kanalfarben"
+
+#: midi_time_axis.cc:1032
+msgid "Track Color"
+msgstr "Spurfarbe"
+
+#: midi_time_axis.cc:1607 midi_time_axis.cc:1613 midi_time_axis.cc:1623
+#: midi_time_axis.cc:1629
+msgid "all"
+msgstr "alle"
+
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1626
+msgid "some"
+msgstr "einige"
+
+#: midi_tracer.cc:48
+msgid "Line history: "
+msgstr "Aktionsliste:"
+
+#: midi_tracer.cc:55
+msgid "Auto-Scroll"
+msgstr "Auto-Scroll"
+
+#: midi_tracer.cc:56
+msgid "Decimal"
+msgstr "Dezimal"
+
+#: midi_tracer.cc:57 rc_option_editor.cc:1191
+msgid "Enabled"
+msgstr "Aktiviert"
+
+#: midi_tracer.cc:58
+msgid "Delta times"
+msgstr "Deltazeiten"
+
+#: midi_tracer.cc:71
+msgid "Port:"
+msgstr "Port:"
+
+#: midi_velocity_dialog.cc:31
+msgid "New velocity"
+msgstr "Neue Velocity"
+
+#: missing_file_dialog.cc:35
+msgid "Missing File"
+msgstr "Fehlende Datei"
+
+#: missing_file_dialog.cc:37
+msgid "Select a folder to search"
+msgstr "Ordner zum Suchen auswählen"
+
+#: missing_file_dialog.cc:38
+msgid "Add chosen folder to search path, and try again"
+msgstr "Ausgewählten Ordner zur Suche hinzufügen und es nochmal versuchen"
+
+#: missing_file_dialog.cc:40
+msgid "Stop loading this session"
+msgstr "Laden des Projekts abbrechen"
+
+#: missing_file_dialog.cc:41
+msgid "Skip all missing files"
+msgstr "Alle fehlenden Dateien überspringen"
+
+#: missing_file_dialog.cc:42
+msgid "Skip this file"
+msgstr "Diese Datei überspringen"
+
+#: missing_file_dialog.cc:53
+msgid "audio"
+msgstr "Audio"
+
+#: missing_file_dialog.cc:70
+msgid ""
+"%1 cannot find the %2 file\n"
+"\n"
+"<i>%3</i>\n"
+"\n"
+"in any of these folders:\n"
+"\n"
+"<tt>%4</tt>\n"
+"\n"
+msgstr ""
+"%1 kann die %2datei\n"
+"\n"
+"<i>%3</i>\n"
+"\n"
+"in keinem dieser Ordner finden:\n"
+"\n"
+"<tt>%4</tt>\n"
+"\n"
+
+#: missing_file_dialog.cc:104
+msgid "Click to choose an additional folder"
+msgstr "Einen weiteren Ordner für die Suche auswählen"
+
+#: missing_plugin_dialog.cc:29
+msgid "Missing Plugins"
+msgstr "Fehlende Plugins"
+
+#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+msgid "OK"
+msgstr "OK"
+
+#: mixer_actor.cc:55
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "Im Mixer ausgewählte Spuren/Busse auf Solo schalten"
+
+#: mixer_actor.cc:56
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "Stummschaltung der im Mixer ausgewählten Spuren/Busse ändern"
+
+#: mixer_actor.cc:57
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr "Aufnahmebereitschaft auf im Mixer ausgewählten Spuren ändern"
+
+#: mixer_actor.cc:58
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse reduzieren"
+
+#: mixer_actor.cc:59
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse erhöhen"
+
+#: mixer_actor.cc:60
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse auf 0dB setzen"
+
+#: mixer_actor.cc:63
+msgid "Copy Selected Processors"
+msgstr "Ausgewählte Prozessoren kopieren"
+
+#: mixer_actor.cc:64
+msgid "Cut Selected Processors"
+msgstr "Ausgewählte Prozessoren ausschneiden"
+
+#: mixer_actor.cc:65
+msgid "Paste Selected Processors"
+msgstr "Ausgewählte Prozessoren einfügen"
+
+#: mixer_actor.cc:66
+msgid "Delete Selected Processors"
+msgstr "Ausgewählte Prozessoren löschen"
+
+#: mixer_actor.cc:67
+msgid "Select All (visible) Processors"
+msgstr "Alle (sichtbaren) Prozessoren auswählen"
+
+#: mixer_actor.cc:68
+msgid "Toggle Selected Processors"
+msgstr "Ausgewählte Prozessoren umschalten"
+
+#: mixer_actor.cc:69
+msgid "Toggle Selected Plugins"
+msgstr "Ausgewählte Plugins umschalten "
+
+#: mixer_actor.cc:70
+msgid "Deselect all strips and processors"
+msgstr "Alle Kanalzüge und Prozessoren deselektieren"
+
+#: mixer_actor.cc:72 mixer_actor.cc:73
+msgid "Scroll Mixer Window to the left"
+msgstr "Mixerfenster nach links scrollen"
+
+#: mixer_actor.cc:75
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr "MIDI Eingang für im Mixer ausgewählte Spuren/Busse de/aktivieren"
+
+#: mixer_actor.cc:90
+msgid "Loaded mixer bindings from %1"
+msgstr "Mixer-Tastenkürzel aus %1 geladen"
+
+#: mixer_actor.cc:92
+msgid "Could not find mixer.bindings in search path %1"
+msgstr "Konnte mixer.bindings im Suchpfad %1 nicht finden"
+
+#: mixer_strip.cc:97 mixer_strip.cc:127
+msgid "pre"
+msgstr "Pre"
+
+#: mixer_strip.cc:99 mixer_strip.cc:129 mixer_strip.cc:384 mixer_strip.cc:1456
+#: rc_option_editor.cc:2833
+msgid "Comments"
+msgstr "Kommentare"
+
+#: mixer_strip.cc:152
+msgid "Click to toggle the width of this mixer strip."
+msgstr "Klicken Sie, um die Breite dieses Kanalzuges umzuschalten"
+
+#: mixer_strip.cc:154
+msgid ""
+"\n"
+"%1-%2-click to toggle the width of all strips."
+msgstr ""
+"\n"
+"%1-%2-Klicken Sie, um die Breite aller Kanalzüge umzuschalten."
+
+#: mixer_strip.cc:161
+msgid "Hide this mixer strip"
+msgstr "Diesen Kanalzug verbergen"
+
+#: mixer_strip.cc:172
+msgid "Click to select metering point"
+msgstr "Abgreifpunkt der Pegelanzeige auswählen"
+
+#: mixer_strip.cc:188
+msgid "Isolate Solo"
+msgstr "Solo isolieren"
+
+#: mixer_strip.cc:196
+msgid "Lock Solo Status"
+msgstr "Solostatus sperren"
+
+#: mixer_strip.cc:198 mixer_strip.cc:2090
+msgid "SoloLock|Lock"
+msgstr "Lock"
+
+#: mixer_strip.cc:199 mixer_strip.cc:2089
+msgid "Iso"
+msgstr "Iso"
+
+#: mixer_strip.cc:253
+msgid "Mix group"
+msgstr "Bearbeitungsgruppe"
+
+#: mixer_strip.cc:263
+msgid "Trim: "
+msgstr "Anpassen: "
+
+#: mixer_strip.cc:380 rc_option_editor.cc:2829
+msgid "Phase Invert"
+msgstr "Phaseninvertierung"
+
+#: mixer_strip.cc:381 rc_option_editor.cc:2830
+msgid "Record & Monitor"
+msgstr "Aufnahme & Monitor..."
+
+#: mixer_strip.cc:382 rc_option_editor.cc:2831
+msgid "Solo Iso / Lock"
+msgstr "Solo Iso / Sperre"
+
+#: mixer_strip.cc:546
+msgid "Enable/Disable MIDI input"
+msgstr "Aktiviert/Deaktiviert MIDI Input"
+
+#: mixer_strip.cc:712
+msgid "Aux"
+msgstr "Aux"
+
+#: mixer_strip.cc:738
+msgid "Snd"
+msgstr "Snd"
+
+#: mixer_strip.cc:809 mixer_strip.cc:912 processor_box.cc:2449
+msgid "Not connected to audio engine - no I/O changes are possible"
+msgstr ""
+"Nicht mit Audioengine verbunden - es sind keine Änderungen an Ein-/Ausgängen "
+"möglich"
+
+#: mixer_strip.cc:866 mixer_strip.cc:968
+msgid "Add %1 port"
+msgstr "%1-Port hinzufügen"
+
+#: mixer_strip.cc:873 mixer_strip.cc:975 monitor_section.cc:1315
+msgid "Routing Grid"
+msgstr "Verbindungsraster"
+
+#: mixer_strip.cc:1204
+msgid "MIDI "
+msgstr "MIDI"
+
+#: mixer_strip.cc:1209
+msgid "<b>INPUT</b> to %1"
+msgstr "<b>EINGANG</b> zu %1"
+
+#: mixer_strip.cc:1212 monitor_section.cc:1366
+msgid "<b>OUTPUT</b> from %1"
+msgstr "<b>AUSGANG</b> von %1"
+
+#: mixer_strip.cc:1330 monitor_section.cc:1453
+msgid "Disconnected"
+msgstr "Getrennt"
+
+#: mixer_strip.cc:1459
+msgid "*Comments*"
+msgstr "*Kommentare*"
+
+#: mixer_strip.cc:1466
+msgid "Cmt"
+msgstr "Kmt"
+
+#: mixer_strip.cc:1469
+msgid "*Cmt*"
+msgstr "*Kmt*"
+
+#: mixer_strip.cc:1475
+msgid "Click to Add/Edit Comments"
+msgstr "Kommentare hinzufügen/ändern"
+
+#: mixer_strip.cc:1519
+msgid "Grp"
+msgstr "Grp"
+
+#: mixer_strip.cc:1522
+msgid "~G"
+msgstr "~G"
+
+#: mixer_strip.cc:1551 route_time_axis.cc:572
+msgid "Color..."
+msgstr "Farbe..."
+
+#: mixer_strip.cc:1553 route_time_axis.cc:574
+msgid "Comments..."
+msgstr "Kommentare"
+
+#: mixer_strip.cc:1555 route_time_axis.cc:576
+msgid "Inputs..."
+msgstr "Eingänge..."
+
+#: mixer_strip.cc:1557 route_time_axis.cc:578
+msgid "Outputs..."
+msgstr "Ausgänge..."
+
+#: mixer_strip.cc:1562
+msgid "Save As Template..."
+msgstr "Als Vorlage Speichern..."
+
+#: mixer_strip.cc:1568 route_group_dialog.cc:45 route_time_axis.cc:852
+msgid "Active"
+msgstr "Aktiv"
+
+#: mixer_strip.cc:1576
+msgid "Adjust Latency..."
+msgstr "Latenz einstellen..."
+
+#: mixer_strip.cc:1579
+msgid "Protect Against Denormals"
+msgstr "Schütze vor Denormals"
+
+#: mixer_strip.cc:1585 route_time_axis.cc:591
+msgid "Remote Control ID..."
+msgstr "ID für Fernsteuerung..."
+
+#: mixer_strip.cc:1885
+msgid "Pre"
+msgstr "Pre"
+
+#: mixer_strip.cc:1889
+msgid "Post"
+msgstr "Post"
+
+#: mixer_strip.cc:1905
+msgid "Meter|In"
+msgstr "In"
+
+#: mixer_strip.cc:1909
+msgid "Meter|Pr"
+msgstr "Pr"
+
+#: mixer_strip.cc:1913
+msgid "Meter|Po"
+msgstr "Po"
+
+#: mixer_strip.cc:1917
+msgid "Meter|O"
+msgstr "O"
+
+#: mixer_strip.cc:1922
+msgid "Meter|C"
+msgstr "C"
+
+#: mixer_strip.cc:2070 route_ui.cc:170
+msgid "Disk"
+msgstr "Disk"
+
+#: mixer_strip.cc:2082 monitor_section.cc:76
+msgid "AFL"
+msgstr "AFL"
+
+#: mixer_strip.cc:2085 monitor_section.cc:77
+msgid "PFL"
+msgstr "PFL"
+
+#: mixer_strip.cc:2095 meter_strip.cc:387
+msgid "MonitorInput|I"
+msgstr "I"
+
+#: mixer_strip.cc:2096 meter_strip.cc:388
+msgid "MonitorDisk|D"
+msgstr "D"
+
+#: mixer_strip.cc:2108 meter_strip.cc:379 route_time_axis.cc:2729
+msgid "AfterFader|A"
+msgstr "A"
+
+#: mixer_strip.cc:2111
+msgid "Prefader|P"
+msgstr "P"
+
+#: mixer_strip.cc:2116
+msgid "SoloIso|I"
+msgstr "I"
+
+#: mixer_strip.cc:2117
+msgid "SoloLock|L"
+msgstr "L"
+
+#: mixer_strip.cc:2303
+msgid "Pre Fader"
+msgstr "Pre Fader"
+
+#: mixer_strip.cc:2304
+msgid "Post Fader"
+msgstr "Post Fader"
+
+#: mixer_strip.cc:2349 meter_strip.cc:860
+msgid "Change all in Group to %1"
+msgstr "Alle in Gruppe zu %1 ändern"
+
+#: mixer_strip.cc:2351 meter_strip.cc:862
+msgid "Change all to %1"
+msgstr "Alle zu %1 ändern"
+
+#: mixer_strip.cc:2353 meter_strip.cc:864
+msgid "Change same track-type to %1"
+msgstr "Gleichen Spurtyp zu %1 ändern"
+
+#: mixer_ui.cc:130 route_time_axis.cc:829
+msgid "Group"
+msgstr "Gruppe"
+
+#: mixer_ui.cc:1242
+msgid "track display list item for renamed strip not found!"
+msgstr ""
+"Konnte Bezeichnung für umbenannten Kanalzug nicht in der Spurliste finden!"
+
+#: mixer_ui.cc:1336
+msgid "-all-"
+msgstr "-alle-"
+
+#: mixer_ui.cc:1873
+msgid "Strips"
+msgstr "Kanalzüge"
+
+#: meter_strip.cc:161
+msgid "Reset Peak"
+msgstr "Peaks zurücksetzen"
+
+#: meter_strip.cc:382 route_time_axis.cc:2733
+msgid "PreFader|P"
+msgstr "P"
+
+#: meter_strip.cc:896
+msgid "Variable height"
+msgstr "Variable Höhe"
+
+#: meter_strip.cc:897
+msgid "Short"
+msgstr "Short"
+
+#: meter_strip.cc:898
+msgid "Tall"
+msgstr "Tall"
+
+#: meter_strip.cc:899
+msgid "Grande"
+msgstr "Grande"
+
+#: meter_strip.cc:900
+msgid "Venti"
+msgstr "Venti"
+
+#: meter_patterns.cc:82
+msgid "Peak (+6dBFS)"
+msgstr "Spitzenwert (+6dBFS)"
+
+#: meter_patterns.cc:85
+msgid "Peak (0dBFS)"
+msgstr "Spitzenwert (0dBFS)"
+
+#: meter_patterns.cc:88
+msgid "RMS + Peak"
+msgstr "RMS + Spitzenwert"
+
+#: meter_patterns.cc:91
+msgid "IEC1/DIN"
+msgstr "IEC1/DIN"
+
+#: meter_patterns.cc:94
+msgid "IEC1/Nordic"
+msgstr "IEC1/Nordisch"
+
+#: meter_patterns.cc:97
+msgid "IEC2/BBC"
+msgstr "IEC2/BBC"
+
+#: meter_patterns.cc:100
+msgid "IEC2/EBU"
+msgstr "IEC2/EBU"
+
+#: meter_patterns.cc:103
+msgid "K20/RMS"
+msgstr "K20/RMS"
+
+#: meter_patterns.cc:106
+msgid "K14/RMS"
+msgstr "K14/RMS"
+
+#: meter_patterns.cc:109
+msgid "K12/RMS"
+msgstr "K12/RMS"
+
+#: meter_patterns.cc:112
+msgid "VU"
+msgstr "VU"
+
+#: monitor_section.cc:75
+msgid "SiP"
+msgstr "SiP"
+
+#: monitor_section.cc:102 route_group_dialog.cc:49
+msgid "Soloing"
+msgstr "Soloing"
+
+#: monitor_section.cc:106
+msgid "Isolated"
+msgstr "Isoliert"
+
+#: monitor_section.cc:110
+msgid "Auditioning"
+msgstr "Vorhören"
+
+#: monitor_section.cc:120
+msgid ""
+"When active, something is solo-isolated.\n"
+"Click to de-isolate everything"
+msgstr ""
+"Wenn aktiv, ist etwas auf isoliertes Solo geschalten.\n"
+"Klick, schaltet isoliertes Solo überall aus."
+
+#: monitor_section.cc:123
+msgid ""
+"When active, auditioning is active.\n"
+"Click to stop the audition"
+msgstr ""
+"Wird beim Vorhören aktiv.\n"
+"Klicken stoppt das Vorhören."
+
+#: monitor_section.cc:140
+msgid "Solo controls affect solo-in-place"
+msgstr "Solo-Kontrollelemente beeinflussen solo-in-place"
+
+#: monitor_section.cc:146
+msgid "Solo controls toggle after-fader-listen"
+msgstr "Solo-Kontrollelemente schalten AFL um"
+
+#: monitor_section.cc:152
+msgid "Solo controls toggle pre-fader-listen"
+msgstr "Solo-Kontrollelemente schalten PFL um"
+
+#: monitor_section.cc:162
+msgid "Gain increase for soloed signals (0dB is normal)"
+msgstr "Erhöhung der Lautstärke für Solosignale (0dB ist üblich)"
+
+#: monitor_section.cc:167 monitor_section.cc:196 monitor_section.cc:222
+#: monitor_section.cc:322
+msgid "0 dB"
+msgstr "0 dB"
+
+#: monitor_section.cc:168
+msgid "3 dB"
+msgstr "3 dB"
+
+#: monitor_section.cc:169
+msgid "6 dB"
+msgstr "6 dB"
+
+#: monitor_section.cc:170
+msgid "10 dB"
+msgstr "10 dB"
+
+#: monitor_section.cc:176
+msgid "Solo Boost"
+msgstr "Solo Boost"
+
+#: monitor_section.cc:191
+msgid ""
+"Gain reduction non-soloed signals\n"
+"A value above -inf dB causes \"solo-in-front\""
+msgstr ""
+"Reduzierung der Lautstärke für Signale, die nicht Solo geschalten sind.\n"
+"Ein Wert über -inf dB bedeutet \"solo-in-front\""
+
+#: monitor_section.cc:197 monitor_section.cc:224 monitor_section.cc:324
+msgid "-6 dB"
+msgstr "-6 dB"
+
+#: monitor_section.cc:198 monitor_section.cc:225 monitor_section.cc:325
+msgid "-12 dB"
+msgstr "-12 dB"
+
+#: monitor_section.cc:199 monitor_section.cc:226 monitor_section.cc:326
+msgid "-20 dB"
+msgstr "-20 dB"
+
+#: monitor_section.cc:200
+msgid "OFF"
+msgstr "OFF"
+
+#: monitor_section.cc:202
+msgid "SiP Cut"
+msgstr "SiP Cut"
+
+#: monitor_section.cc:217
+msgid "Gain reduction to use when dimming monitor outputs"
+msgstr "Lautstärkereduzierung beim Abschwächen der Monitorausgänge"
+
+#: monitor_section.cc:223 monitor_section.cc:323
+msgid "-3 dB"
+msgstr "-3 dB"
+
+#: monitor_section.cc:231 monitor_section.cc:289 monitor_section.cc:372
+msgid "Dim"
+msgstr "Dim"
+
+#: monitor_section.cc:241
+msgid "Excl. Solo"
+msgstr "Exkl. Solo"
+
+#: monitor_section.cc:243
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr ""
+"Exklusives Solo bedeutet, daß nur ein Solo zu einem Zeitpunkt aktiv ist"
+
+#: monitor_section.cc:250
+msgid "Solo » Mute"
+msgstr "Solo » Mute"
+
+#: monitor_section.cc:252
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+"Wenn aktiviert, hat Solo Priorität über Mute\n"
+"(eine Spur mit aktiviertem Mute & Solo ist hörbar)"
+
+#: monitor_section.cc:327
+msgid "-30 dB"
+msgstr "-30 dB"
+
+#: monitor_section.cc:341
+msgid "Monitor"
+msgstr "Monitor"
+
+#: monitor_section.cc:380
+msgid "Inv"
+msgstr "Inv"
+
+#: monitor_section.cc:784
+msgid "Switch monitor to mono"
+msgstr "Monitor auf Mono schalten"
+
+#: monitor_section.cc:787
+msgid "Cut monitor"
+msgstr "Monitor stummschalten"
+
+#: monitor_section.cc:790
+msgid "Dim monitor"
+msgstr "Monitor abschwächen"
+
+#: monitor_section.cc:793
+msgid "Toggle exclusive solo mode"
+msgstr "Exklusives Solo umschalten"
+
+#: monitor_section.cc:799
+msgid "Toggle mute overrides solo mode"
+msgstr "Mute-Status hat höhere Priorität als Solo-Modus"
+
+#: monitor_section.cc:811
+msgid "Cut monitor channel %1"
+msgstr "Monitorkanal %1 stummschalten"
+
+#: monitor_section.cc:816
+msgid "Dim monitor channel %1"
+msgstr "Monitorkanal %1 abschwächen"
+
+#: monitor_section.cc:821
+msgid "Solo monitor channel %1"
+msgstr "Monitorkanal %1 Solo"
+
+#: monitor_section.cc:826
+msgid "Invert monitor channel %1"
+msgstr "Invertiere Monitorkanal %1"
+
+#: monitor_section.cc:836
+msgid "In-place solo"
+msgstr "In-Place Solo"
+
+#: monitor_section.cc:838
+msgid "After Fade Listen (AFL) solo"
+msgstr "Solo nach Fader (AFL) abhören"
+
+#: monitor_section.cc:840
+msgid "Pre Fade Listen (PFL) solo"
+msgstr "Solo vor Fader (PFL) abhören"
+
+#: monitor_section.cc:1262
+msgid "No session - no I/O changes are possible"
+msgstr "Kein Projekt - es sind keine Änderungen an Ein-/Ausgängen möglich"
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr "Auswahl des Monitorausgangs"
+
+#: mono_panner.cc:104 stereo_panner.cc:114
+msgid "bypassed"
+msgstr "überbrückt"
+
+#: mono_panner.cc:118
+#, c-format
+msgid "L:%3d R:%3d"
+msgstr "L:%3d R:%3d"
+
+#: mono_panner.cc:202 panner2d.cc:277 stereo_panner.cc:251
+#: stereo_panner.cc:274
+msgid "Panner|L"
+msgstr "L"
+
+#: mono_panner.cc:219 panner2d.cc:278 stereo_panner.cc:249
+#: stereo_panner.cc:276
+msgid "Panner|R"
+msgstr "R"
+
+#: mono_panner_editor.cc:33
+msgid "Mono Panner"
+msgstr "Mono Panner"
+
+#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
+#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+msgid "%"
+msgstr "%"
+
+#: nag.cc:41
+msgid "Support %1 Development"
+msgstr "Unterstütze die Entwicklung von %1"
+
+#: nag.cc:42
+msgid "I'd like to make a one-time donation"
+msgstr "Ich möchte etwas spenden"
+
+#: nag.cc:43
+msgid "Tell me more about becoming a subscriber"
+msgstr "Ich möchte mehr über eine dauerhafte Unterstützung (Abonnement) wissen"
+
+#: nag.cc:44
+msgid "I'm already a subscriber!"
+msgstr "Ich bin schon Abonnent!"
+
+#: nag.cc:45
+msgid "Ask about this the next time I export"
+msgstr "Frage mich nach dem nächsten Export"
+
+#: nag.cc:46
+msgid "Never ever ask me about this again"
+msgstr "Frage nicht mehr danach"
+
+#: nag.cc:49
+msgid ""
+"Congratulations on your session export.\n"
+"\n"
+"It looks as if you may already be a subscriber. If so, thanks, and sorry\n"
+"to bother you again about this - I'm working on improving our subscriber "
+"system\n"
+"so that I don't have to keep annoying you with this message.\n"
+"\n"
+"If you're not a subscriber, perhaps you might consider supporting my work\n"
+"on Ardour with either a one-time donation or subscription. Nothing will \n"
+"happen if you choose not to do so. However Ardour's continuing development\n"
+"relies on a stable, sustainable income stream. Thanks for using Ardour!"
+msgstr ""
+"Herzlichen Glückwunsch zu Ihrem Projektexport.\n"
+"\n"
+"Es sieht so aus, als wären Sie schon ein Abonnent/eine Abonnentin. Wenn ja,\n"
+"dann vielen Dank und Entschuldigung für die Störung - ich arbeite daran, "
+"das\n"
+"Abo-System zu verbessern, damit ich Sie nicht dauernd störe.\n"
+"\n"
+"Wenn Sie Ardour noch nicht regelmäßig finanziell unterstützen, wäre es "
+"schön\n"
+"wenn Sie sich überlegen würden, meine Arbeit mit einer einmaligen Spende "
+"oder\n"
+"einem Abonnement zu unterstützen. Falls Sie das nicht tun, wird nichts "
+"passieren.\n"
+"Die weitere Entwicklung hängt allerdings von einem stabilen und "
+"verlässlichen Einkommen ab.\n"
+"Danke, dass Sie Ardour verwenden!"
+
+#: nag.cc:58
+msgid ""
+"Congratulations on your session export.\n"
+"\n"
+"I hope you find Ardour a useful tool. I'd like to ask you to consider "
+"supporting\n"
+"its development with either a one-time donation or subscription. Nothing\n"
+"will happen if you choose not to do so. However Ardour's continuing "
+"development\n"
+"relies on a stable, sustainable income stream. Thanks for using Ardour!"
+msgstr ""
+"Herzlichen Glückwunsch zu Ihrem Projektexport.\n"
+"\n"
+"Ich hoffe, dass Ardour ein nützliches Werkzeug für Sie ist. Ich möchte Sie\n"
+"darum bitten, Ardours Entwicklung entweder durch eine einmalige Spende\n"
+"oder ein Abonnement zu unterstützen. Falls Sie das nicht tun, wird nichts\n"
+"passieren. Die weitere Entwicklung hängt allerdings von einem stabilen\n"
+"und verlässlichen Einkommen ab. Danke, dass Sie Ardour verwenden!"
+
+#: new_plugin_preset_dialog.cc:29
+msgid "New Preset"
+msgstr "Neues Preset"
+
+#: new_plugin_preset_dialog.cc:30
+msgid "Replace existing preset with this name"
+msgstr "Ersetze vorhandenes Preset mit diesem Namen"
+
+#: new_plugin_preset_dialog.cc:34
+msgid "Name of new preset"
+msgstr "Name für neues Preset"
+
+#: normalize_dialog.cc:34
+msgid "Normalize regions"
+msgstr "Regionen normalisieren"
+
+#: normalize_dialog.cc:34
+msgid "Normalize region"
+msgstr "Region normalisieren"
+
+#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
+msgid "dbFS"
+msgstr "dbFS"
+
+#: normalize_dialog.cc:56
+msgid "Normalize each region using its own peak value"
+msgstr "Normalisiere jede Region mit ihrem eigenen Spitzenwert"
+
+#: normalize_dialog.cc:58
+msgid "Normalize each region using the peak value of all regions"
+msgstr "Normalisiere jede Region mit dem Spitzenwert aller Regionen"
+
+#: normalize_dialog.cc:73
+msgid "Normalize"
+msgstr "Normalisieren"
+
+#: note_select_dialog.cc:33
+msgid "Select Note"
+msgstr "Note auswählen"
+
+#: opts.cc:57
+msgid "Usage: "
+msgstr "Aufruf:"
+
+#: opts.cc:58
+msgid " [SESSION_NAME] Name of session to load\n"
+msgstr " [PROJEKTNAME] Name des zu ladenden Projekts\n"
+
+#: opts.cc:59
+msgid " -v, --version Show version information\n"
+msgstr " -v, --version Versionsinformation ausgeben\n"
+
+#: opts.cc:60
+msgid " -h, --help Print this message\n"
+msgstr " -h, --help Diese Hinweise ausgeben\n"
+
+#: opts.cc:61
+msgid ""
+" -a, --no-announcements Do not contact website for announcements\n"
+msgstr ""
+" -a, --no-announcements Webseite nicht für Neuigkeiten kontaktieren\n"
+
+#: opts.cc:62
+msgid ""
+" -b, --bindings Print all possible keyboard binding names\n"
+msgstr ""
+" -b, --bindings Alle möglichen Tastaturkürzelnamen "
+"ausgeben\n"
+
+#: opts.cc:63
+msgid ""
+" -c, --name <name> Use a specific backend client name, default is "
+"ardour\n"
+msgstr ""
+" -c, --name name Benutze speziellen Backend-Clientnamen, "
+"Voreinstellung: ardour\n"
+
+#: opts.cc:64
+msgid ""
+" -d, --disable-plugins Disable all plugins in an existing session\n"
+msgstr ""
+"-d, --disable-plugins Alle Plugins eines bestehenden Projekts "
+"deaktivieren\n"
+
+#: opts.cc:65
+msgid ""
+" -D, --debug <options> Set debug flags. Use \"-D list\" to see "
+"available options\n"
+msgstr ""
+" -D, --debug <options> Setze Debug-flags. Verwende \"-D list\" um die "
+"verfügbaren Optionen zu sehen\n"
+
+#: opts.cc:66
+msgid " -n, --no-splash Do not show splash screen\n"
+msgstr " -n, --no-splash Splashscreen nicht anzeigen\n"
+
+#: opts.cc:67
+msgid " -m, --menus file Use \"file\" to define menus\n"
+msgstr " -m, --menus file Benutze \"file\" für die Menüs\n"
+
+#: opts.cc:68
+msgid ""
+" -N, --new session-name Create a new session from the command line\n"
+msgstr ""
+" -N, --new session-name Erstelle neues Projekt aus der "
+"Kommandozeile\n"
+
+#: opts.cc:69
+msgid " -O, --no-hw-optimizations Disable h/w specific optimizations\n"
+msgstr ""
+" -O, --no-hw-optimizations Hardwarespezifische Optimierungen "
+"deaktivieren\n"
+
+#: opts.cc:70
+msgid " -P, --no-connect-ports Do not connect any ports at startup\n"
+msgstr ""
+" -P, --no-connect-ports beim Programmstart keine Ports verbinden\n"
+
+#: opts.cc:71
+msgid " -S, --sync Draw the gui synchronously \n"
+msgstr " -S, --sync\t Zeichne die GUI synchron \n"
+
+#: opts.cc:73
+msgid " -V, --novst Do not use VST support\n"
+msgstr " -V, --novst VST-Unterstützung ausschalten\n"
+
+#: opts.cc:75
+msgid ""
+" -E, --save <file> Load the specified session, save it to <file> "
+"and then quit\n"
+msgstr ""
+" -E, --save <file> Lädt das angegebene Projekt, speichert es "
+"unter <file> und beendet sich\n"
+
+#: opts.cc:76
+msgid " -C, --curvetest filename Curve algorithm debugger\n"
+msgstr " -C, --curvetest filename Curve algorithm debugger\n"
+
+#: opts.cc:77
+msgid " -k, --keybindings filename Name of key bindings to load\n"
+msgstr ""
+" -k, --keybindings dateiname Dateiname für die Tastaturbelegungen"
+
+#: panner2d.cc:897
+msgid "Panner (2D)"
+msgstr "Panner (2D)"
+
+#: panner2d.cc:899 panner_ui.cc:400 plugin_ui.cc:458
+msgid "Bypass"
+msgstr "Bypass"
+
+#: panner2d.cc:905
+msgid "Panner"
+msgstr "Panner"
+
+#: panner_ui.cc:70
+msgid "Pan automation mode"
+msgstr "Pan-Automationsmodus"
+
+#: panner_ui.cc:71
+msgid "Pan automation type"
+msgstr "Pan-Automationstyp"
+
+#: panner_ui.cc:603
+msgid "Manual|M"
+msgstr "M"
+
+#: panner_ui.cc:606
+msgid "Play|P"
+msgstr "P"
+
+#: panner_ui.cc:609
+msgid "Touch|T"
+msgstr "T"
+
+#: panner_ui.cc:612
+msgid "Write|W"
+msgstr "W"
+
+#: playlist_selector.cc:43
+msgid "Playlists"
+msgstr "Wiedergabelisten"
+
+#: playlist_selector.cc:54
+msgid "Playlists grouped by track"
+msgstr "Wiedergabelisten, nach Spur gruppiert"
+
+#: playlist_selector.cc:101
+msgid "Playlist for %1"
+msgstr "Wiedergabeliste für %1"
+
+#: playlist_selector.cc:114
+msgid "Other tracks"
+msgstr "Andere Spuren"
+
+#: playlist_selector.cc:139
+msgid "unassigned"
+msgstr "nicht zugewiesen"
+
+#: playlist_selector.cc:194
+msgid "Imported"
+msgstr "Importierte"
+
+#: plugin_eq_gui.cc:85 plugin_eq_gui.cc:109
+msgid "dB scale"
+msgstr "dB Skala"
+
+#: plugin_eq_gui.cc:116
+msgid "Show phase"
+msgstr "Zeige Phase"
+
+#: plugin_selector.cc:53 plugin_selector.cc:225
+msgid "Name contains"
+msgstr "Name enthält"
+
+#: plugin_selector.cc:54 plugin_selector.cc:229
+msgid "Type contains"
+msgstr "Typ enthält"
+
+#: plugin_selector.cc:55 plugin_selector.cc:227
+msgid "Category contains"
+msgstr "Kategorie enthält"
+
+#: plugin_selector.cc:56 plugin_selector.cc:249
+msgid "Author contains"
+msgstr "Autor enthält"
+
+#: plugin_selector.cc:57 plugin_selector.cc:251
+msgid "Library contains"
+msgstr "Katalog enthält"
+
+#: plugin_selector.cc:58 plugin_selector.cc:215 plugin_selector.cc:527
+msgid "Favorites only"
+msgstr "nur Favoriten"
+
+#: plugin_selector.cc:59 plugin_selector.cc:219 plugin_selector.cc:527
+msgid "Hidden only"
+msgstr "Nur versteckte"
+
+#: plugin_selector.cc:64
+msgid "Plugin Manager"
+msgstr "Alle Plugins ..."
+
+#: plugin_selector.cc:85
+msgid "Fav"
+msgstr "Fav"
+
+#: plugin_selector.cc:87
+msgid "Available Plugins"
+msgstr "Verfügbare Plugins"
+
+#: plugin_selector.cc:88
+msgid "Type"
+msgstr "Typ"
+
+#: plugin_selector.cc:89
+msgid "Category"
+msgstr "Kategorie"
+
+#: plugin_selector.cc:90
+msgid "Creator"
+msgstr "Ersteller"
+
+#: plugin_selector.cc:91
+msgid "# Audio In"
+msgstr "# Audio In"
+
+#: plugin_selector.cc:92
+msgid "# Audio Out"
+msgstr "# Audio Out"
+
+#: plugin_selector.cc:93
+msgid "# MIDI In"
+msgstr "# MIDI In"
+
+#: plugin_selector.cc:94
+msgid "# MIDI Out"
+msgstr "# MIDI Out"
+
+#: plugin_selector.cc:116
+msgid "Plugins to be connected"
+msgstr "Plugins, die verbunden werden"
+
+#: plugin_selector.cc:129
+msgid "Add a plugin to the effect list"
+msgstr "Plugin zur Effektliste hinzufügen"
+
+#: plugin_selector.cc:133
+msgid "Remove a plugin from the effect list"
+msgstr "Plugin aus der Effektliste entfernen"
+
+#: plugin_selector.cc:169
+msgid "Insert Plugin(s)"
+msgstr "Plugin(s) einfügen"
+
+#: plugin_selector.cc:333 plugin_selector.cc:334 plugin_selector.cc:335
+#: plugin_selector.cc:336
+msgid "variable"
+msgstr "variabel"
+
+#: plugin_selector.cc:486
+msgid ""
+"The plugin \"%1\" could not be loaded\n"
+"\n"
+"See the Log window for more details (maybe)"
+msgstr ""
+"Das Plugin \"%1\" konnte nicht geladen werden\n"
+"\n"
+"Im Logfenster befinden sich möglicherweise mehr Informationen"
+
+#: plugin_selector.cc:634
+msgid "Favorites"
+msgstr "Favoriten"
+
+#: plugin_selector.cc:636
+msgid "Plugin Manager..."
+msgstr "Plugin Manager..."
+
+#: plugin_selector.cc:640
+msgid "By Creator"
+msgstr "Nach Urheber"
+
+#: plugin_selector.cc:643
+msgid "By Category"
+msgstr "Nach Kategorie"
+
+#: plugin_ui.cc:113
+msgid "Eh? LADSPA plugins don't have editors!"
+msgstr "Merkwürdig... LADSPA-Plugins sollten kein GUI haben!"
+
+#: plugin_ui.cc:122 plugin_ui.cc:227
+msgid ""
+"unknown type of editor-supplying plugin (note: no VST support in this "
+"version of %1)"
+msgstr ""
+"Unbekannter Plugintyp mit eigenem Editor (Hinweis: diese %1-Version "
+"unterstützt keine VST-Plugins)"
+
+#: plugin_ui.cc:125
+msgid "unknown type of editor-supplying plugin"
+msgstr "Unbekannter Plugintyp"
+
+#: plugin_ui.cc:257
+msgid ""
+"unknown type of editor-supplying plugin (note: no linuxVST support in this "
+"version of %1)"
+msgstr ""
+"Unbekannter Plugintyp mit eigenem Editor (Hinweis: diese %1-Version "
+"unterstützt keine linuxVST-Plugins)"
+
+#: plugin_ui.cc:329
+msgid "create_lv2_editor called on non-LV2 plugin"
+msgstr "create_lv2_editor auf nicht-LV2-Plugin angewandt"
+
+#: plugin_ui.cc:418
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: plugin_ui.cc:423
+msgid "Description"
+msgstr "Beschreibung"
+
+#: plugin_ui.cc:424
+msgid "Plugin analysis"
+msgstr "Pluginanalyse"
+
+#: plugin_ui.cc:431
+msgid ""
+"Presets (if any) for this plugin\n"
+"(Both factory and user-created)"
+msgstr ""
+"Presets (falls existent) für dieses Plugin\n"
+"(Hersteller- und Benutzerpresets)"
+
+#: plugin_ui.cc:432
+msgid "Save a new preset"
+msgstr "Neues Preset speichern"
+
+#: plugin_ui.cc:433
+msgid "Save the current preset"
+msgstr "Momentanes Preset speichern"
+
+#: plugin_ui.cc:434
+msgid "Delete the current preset"
+msgstr "Lösche das aktuelle Preset"
+
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+"Parameter auf Vorgabewert zurücksetzen (falls keine Parameter im "
+"Automations-Wiedergabemodus sind)"
+
+#: plugin_ui.cc:436
+msgid "Disable signal processing by the plugin"
+msgstr "Deaktiviere die Signalverarbeitung des Plugins"
+
+#: plugin_ui.cc:473 plugin_ui.cc:685
+msgid ""
+"Click to allow the plugin to receive keyboard events that %1 would normally "
+"use as a shortcut"
+msgstr ""
+"Klicke, damit das Plugin Tastaturbefehle erhält, die %1 sonst als "
+"Tastenkürzel verwenden würde"
+
+#: plugin_ui.cc:474
+msgid "Click to enable/disable this plugin"
+msgstr "Klicke, um dieses Plugin zu ein/auszuschalten"
+
+#: plugin_ui.cc:517
+msgid "latency (%1 sample)"
+msgid_plural "latency (%1 samples)"
+msgstr[0] "Latenz (%1 Sample)"
+msgstr[1] "Latenz (%1 Samples)"
+
+#: plugin_ui.cc:519
+msgid "latency (%1 ms)"
+msgstr "Latenz (%1 ms)"
+
+#: plugin_ui.cc:530
+msgid "Edit Latency"
+msgstr "Latenz bearbeiten"
+
+#: plugin_ui.cc:576
+msgid ""
+"Plugin presets are not supported in this build of %1. Consider paying for a "
+"full version"
+msgstr ""
+"Pluginpresets werden in diesem Version von %1 nicht unterstützt. Erwägen "
+"Sie, für eine Vollversion zu zahlen"
+
+#: plugin_ui.cc:584
+msgid ""
+"Plugin presets are not supported in this build, see the Log window for more "
+"information."
+msgstr ""
+"Pluginpresets werden von dieser Ausgabe des Programms nicht unterstützt, "
+"weitere Informationen sind im Logfenster zu finden."
+
+#: plugin_ui.cc:692
+msgid "Click to allow normal use of %1 keyboard shortcuts"
+msgstr "Klicke, um die normale Verwendung von %1 Tastaturkürzeln zu aktivieren"
+
+#: plugin_ui.cc:789
+msgid "(none)"
+msgstr "(kein)"
+
+#: port_group.cc:337
+msgid "%1 Busses"
+msgstr "%1 Busse"
+
+#: port_group.cc:338
+msgid "%1 Tracks"
+msgstr "%1 Spuren"
+
+#: port_group.cc:339
+msgid "Hardware"
+msgstr "Hardware"
+
+#: port_group.cc:340
+msgid "%1 Misc"
+msgstr "%1 Sonstige"
+
+#: port_group.cc:341
+msgid "Other"
+msgstr "Andere"
+
+#: port_group.cc:432 port_group.cc:433
+msgid "LTC Out"
+msgstr "LTC Out"
+
+#: port_group.cc:436 port_group.cc:437
+msgid "LTC In"
+msgstr "LTC In"
+
+#: port_group.cc:463
+msgid "MTC in"
+msgstr "MTC in"
+
+#: port_group.cc:466
+msgid "MIDI control in"
+msgstr "MIDI control in"
+
+#: port_group.cc:469
+msgid "MIDI clock in"
+msgstr "MIDI clock in"
+
+#: port_group.cc:472
+msgid "MMC in"
+msgstr "MMC in"
+
+#: port_group.cc:476
+msgid "MTC out"
+msgstr "MTC out"
+
+#: port_group.cc:479
+msgid "MIDI control out"
+msgstr "MIDI control out"
+
+#: port_group.cc:482
+msgid "MIDI clock out"
+msgstr "MIDI clock out"
+
+#: port_group.cc:485
+msgid "MMC out"
+msgstr "MMC out"
+
+#: port_group.cc:532
+msgid ":monitor"
+msgstr ":monitor"
+
+#: port_group.cc:544
+msgid "system:"
+msgstr "system:"
+
+#: port_group.cc:545
+msgid "alsa_pcm"
+msgstr "alsa_pcm"
+
+#: port_insert_ui.cc:39
+msgid "Measure Latency"
+msgstr "Latenz messen"
+
+#: port_insert_ui.cc:50
+msgid "Send/Output"
+msgstr "Send/Ausgang"
+
+#: port_insert_ui.cc:51
+msgid "Return/Input"
+msgstr "Return/Input"
+
+#: port_insert_ui.cc:85
+msgid "No signal detected"
+msgstr "Kein Signal erkannt"
+
+#: port_insert_ui.cc:165
+msgid "Port Insert "
+msgstr "Port Insert "
+
+#: port_matrix.cc:340 port_matrix.cc:366
+msgid "<b>Sources</b>"
+msgstr "<b>Quellen</b>"
+
+#: port_matrix.cc:341 port_matrix.cc:367
+msgid "<b>Destinations</b>"
+msgstr "<b>Ziele</b>"
+
+#: port_matrix.cc:449 port_matrix.cc:457
+#, c-format
+msgid "Add %s %s"
+msgstr "Füge %s %s hinzu"
+
+#: port_matrix.cc:465
+#, c-format
+msgid "Rename '%s'..."
+msgstr "Benenne '%s' um..."
+
+#: port_matrix.cc:481
+msgid "Remove all"
+msgstr "Alle löschen"
+
+#: port_matrix.cc:501 port_matrix.cc:513
+#, c-format
+msgid "%s all"
+msgstr "%s alle"
+
+#: port_matrix.cc:536
+msgid "Rescan"
+msgstr "Aktualisieren"
+
+#: port_matrix.cc:538
+msgid "Show individual ports"
+msgstr "Individuelle Ports anzeigen"
+
+#: port_matrix.cc:544
+msgid "Flip"
+msgstr "Drehen"
+
+#: port_matrix.cc:731
+msgid ""
+"It is not possible to add a port here, as the first processor in the track "
+"or buss cannot support the new configuration."
+msgstr ""
+"Hier kann kein Port hinzugefügt werden, da der erste Prozessor der Spur/des "
+"Busses die neue Portanzahl nicht unterstützt."
+
+#: port_matrix.cc:734
+msgid "Cannot add port"
+msgstr "Kann Port nicht hinzufügen"
+
+#: port_matrix.cc:756
+msgid "Port removal not allowed"
+msgstr "Entfernen des Ports nicht erlaubt"
+
+#: port_matrix.cc:757
+msgid ""
+"This port cannot be removed.\n"
+"Either the first plugin in the track or buss cannot accept\n"
+"the new number of inputs or the last plugin has more outputs."
+msgstr ""
+"Dieser Port kann nicht entfernt werden.\n"
+"Entweder kann das erste Plugin auf der Spur oder dem Bus \n"
+"die neue Anzahl an Eingängen nicht verarbeiten, oder das \n"
+"letzte Plugin hat mehr Ausgänge."
+
+#: port_matrix.cc:974
+#, c-format
+msgid "Remove '%s'"
+msgstr "Lösche '%s'"
+
+#: port_matrix.cc:989
+#, c-format
+msgid "%s all from '%s'"
+msgstr "%s alle von '%s'"
+
+#: port_matrix.cc:1055 transform_dialog.cc:62
+msgid "channel"
+msgstr "Kanal"
+
+#: port_matrix_body.cc:82
+msgid "There are no ports to connect."
+msgstr "Es gibt keine Ports, zu denen verbunden werden kann."
+
+#: port_matrix_body.cc:84
+msgid "There are no %1 ports to connect."
+msgstr "Es gibt keine %1 Ports, zu denen verbunden werden kann."
+
+#: processor_box.cc:150
+msgid "Send"
+msgstr "Send"
+
+#: processor_box.cc:152
+msgid "Return"
+msgstr "Return"
+
+#: processor_box.cc:310
+msgid ""
+"\n"
+"This mono plugin has been replicated %1 times."
+msgstr ""
+"\n"
+"Dieses Mono-Plugin wurde %1 mal repliziert."
+
+#: processor_box.cc:314
+msgid ""
+"<b>%1</b>\n"
+"Double-click to show GUI.\n"
+"Alt+double-click to show generic GUI.%2"
+msgstr ""
+"<b>%1</b>\n"
+"Doppelklick, um GUI zu zeigen.\n"
+"Alt+Doppelklick, um einfaches GUI zu zeigen.%2"
+
+#: processor_box.cc:317
+msgid ""
+"<b>%1</b>\n"
+"Double-click to show generic GUI.%2"
+msgstr ""
+"<b>%1</b>\n"
+"Doppelklick, um einfaches GUI zu zeigen.%2"
+
+#: processor_box.cc:361
+#, c-format
+msgid "(%1x1) "
+msgstr "(%1x1) "
+
+#: processor_box.cc:437
+msgid "Show All Controls"
+msgstr "Alle Regler zeigen"
+
+#: processor_box.cc:441
+msgid "Hide All Controls"
+msgstr "Alle Regler verbergen"
+
+#: processor_box.cc:475
+msgid "Link panner controls"
+msgstr "Panner-Elemente verknüpfen"
+
+#: processor_box.cc:573
+msgid "on"
+msgstr "an"
+
+#: processor_box.cc:573 rc_option_editor.cc:2862 rc_option_editor.cc:2876
+msgid "off"
+msgstr "Aus"
+
+#: processor_box.cc:1021
+msgid ""
+"Right-click to add/remove/edit\n"
+"plugins,inserts,sends and more"
+msgstr ""
+"Rechtsklick, um Plugins, Inserts, Sends etc.\n"
+"hinzuzufügen/zu editieren/zu löschen"
+
+#: processor_box.cc:1495 processor_box.cc:1870
+msgid "Plugin Incompatibility"
+msgstr "Plugin-Inkompatibilität"
+
+#: processor_box.cc:1498
+msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
+msgstr "Sie haben versucht, das Plugin \"%1\" im Einschub %2 hinzuzufügen.\n"
+
+#: processor_box.cc:1504
+msgid ""
+"\n"
+"This plugin has:\n"
+msgstr ""
+"\n"
+"Dieses Plugin hat:\n"
+
+#: processor_box.cc:1507
+msgid "\t%1 MIDI input\n"
+msgid_plural "\t%1 MIDI inputs\n"
+msgstr[0] "\t%1 MIDI Eingang\n"
+msgstr[1] "\t%1 MIDI Eingänge\n"
+
+#: processor_box.cc:1511
+msgid "\t%1 audio input\n"
+msgid_plural "\t%1 audio inputs\n"
+msgstr[0] "\t%1 Audio-Eingang\n"
+msgstr[1] "\t%1 Audio-Eingänge\n"
+
+#: processor_box.cc:1514
+msgid ""
+"\n"
+"but at the insertion point, there are:\n"
+msgstr ""
+"\n"
+"aber am Einfügepunkt gibt es:\n"
+
+#: processor_box.cc:1517
+msgid "\t%1 MIDI channel\n"
+msgid_plural "\t%1 MIDI channels\n"
+msgstr[0] "\t%1 MIDI-Kanal\n"
+msgstr[1] "\t%1 MIDI-Kanäle\n"
+
+#: processor_box.cc:1521
+msgid "\t%1 audio channel\n"
+msgid_plural "\t%1 audio channels\n"
+msgstr[0] "\t%1 Audio-Kanal\n"
+msgstr[1] "\t%1 Audio-Kanäle\n"
+
+#: processor_box.cc:1524
+msgid ""
+"\n"
+"%1 is unable to insert this plugin here.\n"
+msgstr ""
+"\n"
+"%1 kann dieses Plugin hier nicht einfügen.\n"
+
+#: processor_box.cc:1561
+msgid "Cannot set up new send: %1"
+msgstr "Kann keinen neuen Send erstellen: %1"
+
+#: processor_box.cc:1873
+msgid ""
+"You cannot reorder these plugins/sends/inserts\n"
+"in that way because the inputs and\n"
+"outputs will not work correctly."
+msgstr ""
+"Sie können diese Plugins/Sends/Inserts\n"
+"nicht auf diese Weise verändern, sonst würden\n"
+"die Ein-/Ausgänge nicht mehr richtig funktionieren."
+
+#: processor_box.cc:2057
+msgid "Rename Processor"
+msgstr "Prozessor umbenennen"
+
+#: processor_box.cc:2088
+msgid "At least 100 IO objects exist with a name like %1 - name not changed"
+msgstr ""
+"Es gibt mindestens 100 E/A-Objekte mit einem Namen wie %1 - Name nicht "
+"geändert"
+
+#: processor_box.cc:2226
+msgid "plugin insert constructor failed"
+msgstr "Einfügen des Plugins gescheitert"
+
+#: processor_box.cc:2237
+msgid ""
+"Copying the set of processors on the clipboard failed,\n"
+"probably because the I/O configuration of the plugins\n"
+"could not match the configuration of this track."
+msgstr ""
+"Konnte die Prozessoren aus der Zwischenablage nicht\n"
+"kopieren, vermutlich weil die E/A Konfiguration der Plugins\n"
+"nicht mit der dieser Spur übereinstimmt."
+
+#: processor_box.cc:2283
+msgid ""
+"Do you really want to remove all processors from %1?\n"
+"(this cannot be undone)"
+msgstr ""
+"Wollen Sie wirklich alle Prozessoren von %1 entfernen?\n"
+"(Dies kann nicht rückgängig gemacht werden)"
+
+#: processor_box.cc:2287 processor_box.cc:2312
+msgid "Yes, remove them all"
+msgstr "Ja, alle löschen"
+
+#: processor_box.cc:2289 processor_box.cc:2314
+msgid "Remove processors"
+msgstr "Prozessoren entfernen"
+
+#: processor_box.cc:2304
+msgid ""
+"Do you really want to remove all pre-fader processors from %1?\n"
+"(this cannot be undone)"
+msgstr ""
+"Wollen Sie wirklich alle Pre-Fader-Prozessoren von %1 entfernen?\n"
+"(Dies kann nicht rückgängig gemacht werden)"
+
+#: processor_box.cc:2307
+msgid ""
+"Do you really want to remove all post-fader processors from %1?\n"
+"(this cannot be undone)"
+msgstr ""
+"Wollen Sie wirklich alle Post-Fader-Prozessoren von %1 entfernen?\n"
+"(Dies kann nicht rückgängig gemacht werden)"
+
+#: processor_box.cc:2495
+msgid "New Plugin"
+msgstr "Plugin einfügen"
+
+#: processor_box.cc:2498
+msgid "New Insert"
+msgstr "Insert einfügen"
+
+#: processor_box.cc:2501
+msgid "New External Send ..."
+msgstr "Neuer externer Send..."
+
+#: processor_box.cc:2505
+msgid "New Aux Send ..."
+msgstr "Neuer Aux-Send..."
+
+#: processor_box.cc:2508
+msgid "Send Options"
+msgstr "Send Optionen"
+
+#: processor_box.cc:2510
+msgid "Clear (all)"
+msgstr "Leeren (alle)"
+
+#: processor_box.cc:2512
+msgid "Clear (pre-fader)"
+msgstr "Leeren (Pre-Fader)"
+
+#: processor_box.cc:2514
+msgid "Clear (post-fader)"
+msgstr "Leeren (Post-Fader)"
+
+#: processor_box.cc:2540
+msgid "Activate All"
+msgstr "Alle aktivieren"
+
+#: processor_box.cc:2542
+msgid "Deactivate All"
+msgstr "Alle deaktivieren"
+
+#: processor_box.cc:2544
+msgid "A/B Plugins"
+msgstr "A/B Plugins"
+
+#: processor_box.cc:2553
+msgid "Edit with generic controls..."
+msgstr "Mit einfachen Kontrollelementen editieren..."
+
+#: processor_box.cc:2856
+msgid "%1: %2 (by %3)"
+msgstr "%1: %2 (von %3)"
+
+#: processor_box.cc:2858
+msgid "%1 (by %2)"
+msgstr "%1 (von %2)"
+
+#: patch_change_dialog.cc:50
+msgid "Patch Change"
+msgstr "Patch Change"
+
+#: patch_change_dialog.cc:76
+msgid "Patch Bank"
+msgstr "Patch Bank"
+
+#: patch_change_dialog.cc:83
+msgid "Patch"
+msgstr "Patch"
+
+#: patch_change_dialog.cc:98 step_entry.cc:430
+msgid "Program"
+msgstr "Programm"
+
+#: patch_change_dialog.cc:106 step_entry.cc:422
+msgid "Bank"
+msgstr "Bank"
+
+#: quantize_dialog.cc:36
+msgid "main grid"
+msgstr "Hauptraster"
+
+#: quantize_dialog.cc:52 quantize_dialog.cc:109
+msgid "Quantize"
+msgstr "Quantisieren"
+
+#: quantize_dialog.cc:56
+msgid "Strength"
+msgstr "Stärke"
+
+#: quantize_dialog.cc:59
+msgid "Swing"
+msgstr "Swing"
+
+#: quantize_dialog.cc:62
+msgid "Threshold (ticks)"
+msgstr "Threshold (ticks)"
+
+#: quantize_dialog.cc:63
+msgid "Snap note start"
+msgstr "Notenanfang einrasten an"
+
+#: quantize_dialog.cc:64
+msgid "Snap note end"
+msgstr "Notenende einrasten an"
+
+#: rc_option_editor.cc:80
+msgid "Click audio file:"
+msgstr "Audiodatei für Klick"
+
+#: rc_option_editor.cc:83 rc_option_editor.cc:90
+msgid "Browse..."
+msgstr "Durchsuchen..."
+
+#: rc_option_editor.cc:87
+msgid "Click emphasis audio file:"
+msgstr "Audiodatei für Klick-Betonung"
+
+#: rc_option_editor.cc:119
+msgid "Choose Click"
+msgstr "Click auswählen"
+
+#: rc_option_editor.cc:142
+msgid "Choose Click Emphasis"
+msgstr "Click-Betonung auswählen"
+
+#: rc_option_editor.cc:173
+msgid "Limit undo history to"
+msgstr "Limitiere Aktionsliste auf"
+
+#: rc_option_editor.cc:174
+msgid "Save undo history of"
+msgstr "Speichere Aktionsliste von"
+
+#: rc_option_editor.cc:183 rc_option_editor.cc:190
+msgid "commands"
+msgstr "Aktionen"
+
+#: rc_option_editor.cc:333
+msgid "Select Keyboard layout:"
+msgstr "Tastaturlayout wählen:"
+
+#: rc_option_editor.cc:352
+msgid "When Clicking:"
+msgstr "Bei Klick:"
+
+#: rc_option_editor.cc:359
+msgid "Edit using:"
+msgstr "Bearbeiten mit:"
+
+#: rc_option_editor.cc:365 rc_option_editor.cc:394 rc_option_editor.cc:423
+msgid "+ button"
+msgstr "+ Maustaste"
+
+#: rc_option_editor.cc:388
+msgid "Delete using:"
+msgstr "Entfernen mit:"
+
+#: rc_option_editor.cc:417
+msgid "Insert note using:"
+msgstr "Note einfügen:"
+
+#: rc_option_editor.cc:435
+msgid "When Beginning a Drag:"
+msgstr "Bei Mauszieh-Beginn:"
+
+#: rc_option_editor.cc:453
+msgid "Copy items using:"
+msgstr "Kopiere Objekte mittels:"
+
+#: rc_option_editor.cc:473
+msgid "Constrain drag using:"
+msgstr "Beschränke Mausziehen mittels:"
+
+#: rc_option_editor.cc:481
+msgid "When Beginning a Trim:"
+msgstr "Bei Beginn einer Anpassung (Trim):"
+
+#: rc_option_editor.cc:499
+msgid "Trim contents using:"
+msgstr "Inhalte anpassen mittels:"
+
+#: rc_option_editor.cc:519
+msgid "Anchored trim using:"
+msgstr "Verankertes Anpassen mittels:"
+
+#: rc_option_editor.cc:562
+msgid "Resize notes relatively using:"
+msgstr "Relative Notenlängenänderung mittels:"
+
+#: rc_option_editor.cc:571
+msgid "While Dragging:"
+msgstr "Währens Mausziehens:"
+
+#: rc_option_editor.cc:589
+msgid "Ignore snap using:"
+msgstr "Einrasten ignorieren mittels:"
+
+#: rc_option_editor.cc:609
+msgid "Snap relatively using:"
+msgstr "Relativ Einrasten mittels:"
+
+#: rc_option_editor.cc:617
+msgid "While Trimming:"
+msgstr "Während des Anpassens:"
+
+#: rc_option_editor.cc:635
+msgid "Resize overlaped regions using:"
+msgstr "Längenänderung überlappender Regionen mittels:"
+
+#: rc_option_editor.cc:643
+msgid "While Dragging Control Points:"
+msgstr "Beim Mausziehen von Kontrollpunkten:"
+
+#: rc_option_editor.cc:661
+msgid "Fine adjust using:"
+msgstr "Feinjustierung mittels:"
+
+#: rc_option_editor.cc:681
+msgid "Push points using:"
+msgstr "Punkte \"stoßen\" mittels:"
+
+#: rc_option_editor.cc:922
+msgid "GUI and Font scaling:"
+msgstr "GUI- und Zeichensatzskalierung:"
+
+#: rc_option_editor.cc:925
+msgid "Default"
+msgstr "Voreinstellung"
+
+#: rc_option_editor.cc:951
+msgid "Adjusting the scale require an application restart to re-layout."
+msgstr ""
+"Änderungen an der Skalierung verlangen einen Neustart des Programms, um das "
+"Layout anzupassen."
+
+#: rc_option_editor.cc:992
+msgid "Waveform Clip Level (dBFS):"
+msgstr "Wellenform Clipping-Wert (dBFS):"
+
+#: rc_option_editor.cc:1046
+msgid "Small sessions (4-16 tracks)"
+msgstr "Kleine Projekte (4-16 Spuren)"
+
+#: rc_option_editor.cc:1047
+msgid "Medium sessions (16-64 tracks)"
+msgstr "Mittlere Projekte (16 - 64 Spuren)"
+
+#: rc_option_editor.cc:1048
+msgid "Large sessions (64+ tracks)"
+msgstr "Große Projekte (64+ Spuren)"
+
+#: rc_option_editor.cc:1049
+msgid "Custom (set by sliders below)"
+msgstr "Benutzerdefiniert (setze über untere Schieberegler)"
+
+#: rc_option_editor.cc:1053 export_video_dialog.cc:168
+msgid "Preset:"
+msgstr "Preset:"
+
+#: rc_option_editor.cc:1065
+msgid "Playback (seconds of buffering):"
+msgstr "Wiedergabe (gepufferte Sekunden):"
+
+#: rc_option_editor.cc:1078
+msgid "Recording (seconds of buffering):"
+msgstr "Aufnahme (gepufferte Sekunden):"
+
+#: rc_option_editor.cc:1156
+msgid "programming error: unknown buffering preset string, index = %1"
+msgstr ""
+"Programmierfehler: unbekannte Zeichenkette für Puffer-Voreinstellung, index "
+"= %1"
+
+#: rc_option_editor.cc:1188
+msgid "Control Surface Protocol"
+msgstr "Eingabegeräteprotokoll"
+
+#: rc_option_editor.cc:1197
+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:1354
+msgid "Show Video Export Info before export"
+msgstr "Zeige Video-Exportinformationen vor dem Exportieren"
+
+#: rc_option_editor.cc:1355
+msgid "Show Video Server Startup Dialog"
+msgstr "Zeige den Videoserver-Startdialog"
+
+#: rc_option_editor.cc:1356
+msgid "Advanced Setup (remote video server)"
+msgstr "Ausführliche Einrichtung (entfernter Videoserver)"
+
+#: rc_option_editor.cc:1364
+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."
+msgstr ""
+"<b>Wenn aktiviert</b>, können Sie eine benutzerdefinierte URL und docroot "
+"für den Videoserver eingeben. - Aktivieren Sie diese Option nur, wenn Sie "
+"wissen, was Sie tun."
+
+#: rc_option_editor.cc:1366
+msgid "Video Server URL:"
+msgstr "Videoserver URL:"
+
+#: rc_option_editor.cc:1371
+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 "
+"the video-server is running locally"
+msgstr ""
+"Basis-URL des Videoservers mit http-Prefix. Dies ist normalerweise 'http://"
+"hostname.example.org:1554/' und ist auf 'http://localhost:1554/' "
+"voreingestellt, wenn der Videoserver lokal läuft"
+
+#: rc_option_editor.cc:1373
+msgid "Video Folder:"
+msgstr "Videoordner:"
+
+#: rc_option_editor.cc:1378
+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 "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
+msgstr ""
+"Lokaler Pfad zum document-root des Videoservers. Nur Dateien unterhalb "
+"dieses Verzeichnisses sind dem Videoserver zugänglich.Falls der Server auf "
+"einem entfernten Rechner läuft, sollte der Pfad auf ein im Netzwerk "
+"gemountetes Verzeichnis der docroot des Servers verweisen, oder leergelassen "
+"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:1385
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
+msgstr ""
+"<b>Wenn aktiviert</b> , wird vor dem Videoexport-Dialog ein "
+"Informationsfenster mit Details angezeigt."
+
+#: rc_option_editor.cc:1390
+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:1473
+msgid "Always Display Plugin Scan Progress"
+msgstr "Plugin Scan-Fortschritt immer anzeigen"
+
+#: rc_option_editor.cc:1474
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr "Bei Programmstart nach [neuen] VST Plugins scannen"
+
+#: rc_option_editor.cc:1475
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr "Bei Programmstart nach AudioUnit Plugins scannen"
+
+#: rc_option_editor.cc:1476
+msgid "Verbose Plugin Scan"
+msgstr "Gesprächiger Plugin-Scan"
+
+#: rc_option_editor.cc:1487
+msgid "General"
+msgstr "Allgemein"
+
+#: rc_option_editor.cc:1493 startup.cc:349
+msgid "Scan for Plugins"
+msgstr "Scanne nach Plugins"
+
+#: rc_option_editor.cc:1500
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+"<b>Wenn aktiviert,</b> wird ein Popupfenster dargestellt, um Plugin Scan-"
+"Fortschritt, Indizierung(Laden des Cace) und Entdeckung (neue Plugins "
+"finden) anzuzeigen"
+
+#: rc_option_editor.cc:1507
+msgid ""
+"Specify the default timeout for plugin instantiation in 1/10 seconds. "
+"Plugins that require more time to load will be blacklisted. A value of 0 "
+"disables the timeout."
+msgstr ""
+"Geben Sie die Voreinstellung für das Timeout bei der Plugin-Instanzierung in "
+"1/10 Sekunden an. Plugins, die mehr Zeit benötigen um zu laden, werden auf "
+"die schwarze Liste gesetzt. Ein Wert von 0 deaktiviert das Timeout."
+
+#: rc_option_editor.cc:1509
+msgid "Scan Time Out [deciseconds]"
+msgstr "Scan-Timeout [Zehntelsekunden]"
+
+#: rc_option_editor.cc:1517
+msgid "VST"
+msgstr "VST"
+
+#: rc_option_editor.cc:1523
+msgid "Clear VST Cache"
+msgstr "VST Cache leeren"
+
+#: rc_option_editor.cc:1527
+msgid "Clear VST Blacklist"
+msgstr "VST Blacklist leeren"
+
+#: rc_option_editor.cc:1535
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+"<b>Wenn aktiviert<b>, werden bei Programmstart neue VST Plugins gesucht, "
+"getestet und dem Cache-Index hinzugefügt. Wenn nicht aktiviert, werden neue "
+"Plugins nur nach einem manuellen Scan verfügbar sein"
+
+#: rc_option_editor.cc:1538
+msgid "Linux VST Path:"
+msgstr "Linux VST Pfad:"
+
+#: rc_option_editor.cc:1545
+msgid "Windows VST Path:"
+msgstr "Windows VST Pfad:"
+
+#: rc_option_editor.cc:1554
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+"<b>Wenn aktiviert</b>, wird zusätzliche Information für jedes Plugin ins "
+"Logfenster geschrieben."
+
+#: rc_option_editor.cc:1560
+msgid "Audio Unit"
+msgstr "Audio Unit"
+
+#: rc_option_editor.cc:1569
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+"<b>Wenn aktiviert<b>, werden bei Programmstart AudioUnit Plugins entdeckt. "
+"Wenn nicht aktiviert, werden neue Plugins nur nach einem manuellen Scan "
+"verfügbar sein. Der erste erfolgreiche Scan wird weitere automatische AU-"
+"Scans aktivieren, ein Crash während der Pluginentdeckung wird sie "
+"deaktivieren."
+
+#: rc_option_editor.cc:1572
+msgid "Clear AU Cache"
+msgstr "AU Cache leeren"
+
+#: rc_option_editor.cc:1576
+msgid "Clear AU Blacklist"
+msgstr "AU Blacklist leeren"
+
+#: rc_option_editor.cc:1670
+msgid "Set Windows VST Search Path"
+msgstr "Windows VST Suchpfad setzen"
+
+#: rc_option_editor.cc:1685
+msgid "Set Linux VST Search Path"
+msgstr "Linux VST Suchpfad setzen"
+
+#: rc_option_editor.cc:1766
+msgid "%1 Preferences"
+msgstr "%1 Einstellungen"
+
+#: rc_option_editor.cc:1778
+msgid "DSP CPU Utilization"
+msgstr "DSP CPU Nutzung"
+
+#: rc_option_editor.cc:1782
+msgid "Signal processing uses"
+msgstr "Die Signalverarbeitung verwendet"
+
+#: rc_option_editor.cc:1787
+msgid "all but one processor"
+msgstr "Alle außer einem Prozessor"
+
+#: rc_option_editor.cc:1788
+msgid "all available processors"
+msgstr "Alle verfügbaren Prozessoren"
+
+#: rc_option_editor.cc:1791
+msgid "%1 processors"
+msgstr "%1 Prozessoren"
+
+#: rc_option_editor.cc:1794
+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:1799
+msgid "Options|Undo"
+msgstr "Undo"
+
+#: rc_option_editor.cc:1806
+msgid "Verify removal of last capture"
+msgstr "Verwerfen der letzten Aufnahme bestätigen"
+
+#: rc_option_editor.cc:1814
+msgid "Make periodic backups of the session file"
+msgstr "Erstelle regelmäßig Backups der Projektdatei"
+
+#: rc_option_editor.cc:1819
+msgid "Session Management"
+msgstr "Projektmanagement:"
+
+#: rc_option_editor.cc:1824
+msgid "Always copy imported files"
+msgstr "Importierte Dateien immer kopieren"
+
+#: rc_option_editor.cc:1831
+msgid "Default folder for new sessions:"
+msgstr "Standardordner für neue Projekte"
+
+#: rc_option_editor.cc:1839
+msgid "Maximum number of recent sessions"
+msgstr "Maximale Anzahl kürzlich geöffneter Projekte"
+
+#: rc_option_editor.cc:1852
+msgid "Click gain level"
+msgstr "Lautstärke für Klick"
+
+#: rc_option_editor.cc:1857 route_time_axis.cc:268 route_time_axis.cc:832
+msgid "Automation"
+msgstr "Automationen"
+
+#: rc_option_editor.cc:1862
+msgid "Thinning factor (larger value => less data)"
+msgstr "Ausdünnungsfaktor (größerer Wert => weniger Daten)"
+
+#: rc_option_editor.cc:1871
+msgid "Automation sampling interval (milliseconds)"
+msgstr "Meßintervall für Automation (Millisekunden)"
+
+#: rc_option_editor.cc:1879
+msgid "Transport Options"
+msgstr "Transport Optionen"
+
+#: rc_option_editor.cc:1885
+msgid "Keep record-enable engaged on stop"
+msgstr "Aufnahme bleibt nach Stopp aktiviert"
+
+#: rc_option_editor.cc:1894
+msgid "Play loop is a transport mode"
+msgstr "Schleifenwiedergabe ist ein Transportmodus"
+
+#: rc_option_editor.cc:1899
+msgid ""
+"<b>When enabled</b> the loop button does not start playback but forces "
+"playback to always play the loop\n"
+"\n"
+"<b>When disabled</b> the loop button starts playing the loop, but stop then "
+"cancels loop playback"
+msgstr ""
+"<b>Wenn aktiviert<b>, startet die Schleifen-Schaltfläche nicht die "
+"Wiedergabe, zwingt aber die Wiedergabe, immer die Schleife zu spielen\n"
+"\n"
+"<b>Wenn deaktiviert<b>, startet die Schleifen-Schaltfläche die Wiedergabe, "
+"ein späteres \"Stop\" beendet aber die Wiedergabe als Schleife"
+
+#: rc_option_editor.cc:1905
+msgid "Stop recording when an xrun occurs"
+msgstr "Aufnahme bei xrun stoppen"
+
+#: rc_option_editor.cc:1910
+msgid ""
+"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
+"detected by the audio engine"
+msgstr ""
+"<b>Falls an</b>, wird %1 Aufnahmen bei Auftreten von Over- oder Underruns "
+"abbrechen"
+
+#: rc_option_editor.cc:1916
+msgid "Create markers where xruns occur"
+msgstr "Bei xrun Marker erzeugen"
+
+#: rc_option_editor.cc:1925
+msgid "Stop at the end of the session"
+msgstr "Am Ende des Projektes anhalten"
+
+#: rc_option_editor.cc:1930
+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"
+"\n"
+"<b>When disabled</b> %1 will continue to roll past the session end marker at "
+"all times"
+msgstr ""
+"<b>Falls an</b>, und %1 </b>nimmt nicht auf</b>, wird es bei Erreichen ds "
+"Projektende-Markers die Wiedergabe stoppen\n"
+"\n"
+"<b>Falls aus</b> , wird %1 am Ende des Projektes immer weiterlaufen"
+
+#: rc_option_editor.cc:1938
+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:1943
+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 "
+"the loop\n"
+"\n"
+"<b>When disabled</b> looping is done by locating back to the start of the "
+"loop when %1 reaches the end which will often cause a small click or delay"
+msgstr ""
+"<b>Falls an</b>, wird dies vorauslesen und am Schleifenendpunkt "
+"zurückspringen, wodurch eine Neupositionierung am Schleifenende vermieden "
+"wird\n"
+"\n"
+"<b>Falls aus</b>, wird %1 bei Erreichen des Schleifenendes zum Anfang der "
+"Schleife springen, was oft einen hörbaren Klick oder kurze Verzögerung "
+"verursacht"
+
+#: rc_option_editor.cc:1951
+msgid "Disable per-track record disarm while rolling"
+msgstr "Während der Aufnahme Aufnahmestatus einzelner Spuren sperren"
+
+#: rc_option_editor.cc:1955
+msgid ""
+"<b>When enabled</b> this will prevent you from accidentally stopping "
+"specific tracks recording during a take"
+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:1960
+msgid "12dB gain reduction during fast-forward and fast-rewind"
+msgstr "Beim Spulen Pegel um 12dB absenken"
+
+#: rc_option_editor.cc:1964
+msgid ""
+"This will reduce the unpleasant increase in perceived volume that occurs "
+"when fast-forwarding or rewinding through some kinds of audio"
+msgstr ""
+"Dies wird die unangenehme Steigerung der wahrgenommenen Lautstärke "
+"verringern, die bei manchem Material bei Vor/Rücklauf auftritt"
+
+#: rc_option_editor.cc:1968
+msgid "Sync/Slave"
+msgstr "Sync/Slave"
+
+#: rc_option_editor.cc:1972
+msgid "External timecode source"
+msgstr "Externe Timecode-Quelle"
+
+#: rc_option_editor.cc:1981
+msgid "Match session video frame rate to external timecode"
+msgstr "Videoframerate des Projekts an externen Timecode anpassen"
+
+#: rc_option_editor.cc:1987
+msgid ""
+"This option controls the value of the video frame rate <i>while chasing</i> "
+"an external timecode source.\n"
+"\n"
+"<b>When enabled</b> the session video frame rate will be changed to match "
+"that of the selected external timecode source.\n"
+"\n"
+"<b>When disabled</b> the session video frame rate will not be changed to "
+"match that of the selected external timecode source.Instead the frame rate "
+"indication in the main clock will flash red and %1 will convert between the "
+"external timecode standard and the session standard."
+msgstr ""
+"Diese Option bestimmt den Wert der Videoframerate <i>während der "
+"Synchronisation</i> mit einer externen Timecode-Quelle. \n"
+"\n"
+"<b>Falls an</b>, wird die Videoframerate des Projektes an die der externen "
+"Timecode-Quelle angepasst. \n"
+"\n"
+"<b>Falls aus</b>, wird die Videoframerate des Projektes nicht geändert. "
+"Stattdessen wird die Anzeige der Framerate in der Uhr rot blinken und %1 "
+"wird zwischen den Standards der externen Quelle und des Projektes "
+"konvertieren."
+
+#: rc_option_editor.cc:1997
+msgid "Sync-lock timecode to clock (disable drift compensation)"
+msgstr ""
+"Starre Synchronisation von Timecode und Uhr (unterbinde Driftkompensation)"
+
+#: rc_option_editor.cc:2003
+msgid ""
+"<b>When enabled</b> %1 will never varispeed when slaved to external "
+"timecode. Sync Lock indicates that the selected external timecode source "
+"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
+"interface. This option disables drift compensation. The transport speed is "
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
+"\n"
+"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
+"the timecode sources shares clock sync."
+msgstr ""
+"<b>Wenn aktiviert</b>, wird %1 niemals mit variabler Geschwindigkeit "
+"abspielen, während zu externem Timecode synchronisiert wird. Starre "
+"Synchronisation zeigt an, dass die ausgewählte externe Timecodequelle mit "
+"dem Audiointerface Clock-Sync teilt (Black & Burst, Wordclock, etc.) "
+"Diese Option deaktiviert Driftkompensation. Die Transportgeschwindigkeit ist "
+"auf 1,0 fixiert. Varispeed LTC wird ignoriert und wird Drift verursachen.\n"
+"\n"
+"<b>Wenn deaktiviert</b>, wird %1 potentiellen Drift kompensieren, "
+"ungeachtet, ob die Timecodequellen Clock Sync teilen."
+
+#: rc_option_editor.cc:2018
+msgid "Lock to 29.9700 fps instead of 30000/1001"
+msgstr "Fest auf 29.9700 fps statt 30000/1001"
+
+#: rc_option_editor.cc:2024
+msgid ""
+"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
+"instead of 30000/1001.\n"
+"SMPTE 12M-1999 specifies 29.97df as 30000/1001. The spec further mentions "
+"that drop-frame timecode has an accumulated error of -86ms over a 24-hour "
+"period.\n"
+"Drop-frame timecode would compensate exactly for a NTSC color frame rate of "
+"30 * 0.9990 (ie 29.970000). That is not the actual rate. However, some "
+"vendors use that rate - despite it being against the specs - because the "
+"variant of using exactly 29.97 fps has zero timecode drift.\n"
+msgstr ""
+"<b>Wenn aktiv</b>, wird erwartet, daß die externe Timecode-Quelle 29.97 fps "
+"statt 30000/1001 benutzt.\n"
+"SMPTE 12M-1999 spezifiziert 29.97df as 30000/1001. Die Spezifikation erwähnt "
+"darüber hinaus, daß Drop-frame Timecode einen Fehler von -86ms im Zeitraum "
+"von 24 Stunden akkumuliert.\n"
+"Drop-frame Timecode würde eine NTSC Farb-Framerate von 30 * 0.9990 "
+"(entspricht29.970000) exakt kompensieren. Das ist nicht die tatsächliche "
+"Rate, jedoch benutzen manche Hersteller diese - der Spezifikation "
+"widersprechend - da bei der Variante mit exakt 29.97 fps kein Timecode-Drift "
+"auftritt.\n"
+
+#: rc_option_editor.cc:2034
+msgid "LTC Reader"
+msgstr "LTC-Leser"
+
+#: rc_option_editor.cc:2038
+msgid "LTC incoming port"
+msgstr "LTC Eingangsport"
+
+#: rc_option_editor.cc:2053
+msgid "LTC Generator"
+msgstr "LTC-Generator"
+
+#: rc_option_editor.cc:2058
+msgid "Enable LTC generator"
+msgstr "LTC-Generator aktivieren"
+
+#: rc_option_editor.cc:2065
+msgid "Send LTC while stopped"
+msgstr "LTC senden, während Transport stillsteht"
+
+#: rc_option_editor.cc:2071
+msgid ""
+"<b>When enabled</b> %1 will continue to send LTC information even when the "
+"transport (playhead) is not moving"
+msgstr ""
+"<b>Falls an</b>, wird %1 weiterhin LTC-Information senden, sogar wenn der "
+"Transport (Positionszeiger) stillsteht"
+
+#: rc_option_editor.cc:2077
+msgid "LTC generator level"
+msgstr "LTC-Generator-Lautstärke"
+
+#: rc_option_editor.cc:2081
+msgid ""
+"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
+"is 0dBu ^= -18dbFS in an EBU calibrated system"
+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:2093
+msgid "Allow dragging of playhead"
+msgstr "Erlaube Ziehen des Positionszeigers"
+
+#: rc_option_editor.cc:2101
+msgid "Move relevant automation when audio regions are moved"
+msgstr "Verschiebe relevante Automationen mit Region"
+
+#: rc_option_editor.cc:2109
+msgid "Show meters on tracks in the editor"
+msgstr "Aktiviere Pegelanzeigen im Editor"
+
+#: rc_option_editor.cc:2117
+msgid "Display master-meter in the toolbar"
+msgstr "Master-Pegelanzeige in der Werkzeugleiste anzeigen"
+
+#: rc_option_editor.cc:2124
+msgid "Default fade shape"
+msgstr "Voreingestellte Fade-Art"
+
+#: rc_option_editor.cc:2143
+msgid "Regions in active edit groups are edited together"
+msgstr "Regionen der aktiven Bearbeitungsgruppen werden gemeinsam bearbeitet"
+
+#: rc_option_editor.cc:2144
+msgid "whenever they overlap in time"
+msgstr "immer, wenn sie sich auf der Zeitachse überlappen"
+
+#: rc_option_editor.cc:2145
+msgid "only if they have identical length, position and origin"
+msgstr "nur bei identischer Länge, Position und Herkunft"
+
+#: rc_option_editor.cc:2154
+msgid "Layering model"
+msgstr "Layering-Modell"
+
+#: rc_option_editor.cc:2159
+msgid "later is higher"
+msgstr "später ist höher"
+
+#: rc_option_editor.cc:2160
+msgid "manual layering"
+msgstr "manuelles Layering"
+
+#: rc_option_editor.cc:2166
+msgid "Make rubberband selection rectangle snap to the grid"
+msgstr "Gummiband-Auswahl an Raster ausrichten"
+
+#: rc_option_editor.cc:2174
+msgid "Show waveforms in regions"
+msgstr "Zeige Wellenformen in Regionen"
+
+#: rc_option_editor.cc:2182
+msgid "Show gain envelopes in audio regions"
+msgstr "Zeige Lautstärkekurven in Regionen an"
+
+#: rc_option_editor.cc:2183
+msgid "in all modes"
+msgstr "in allen Modi"
+
+#: rc_option_editor.cc:2184
+msgid "only in Draw and Internal Edit modes"
+msgstr "nur in Zeichen- und internem Bearbeitungsmodus"
+
+#: rc_option_editor.cc:2191
+msgid "Waveform scale"
+msgstr "Wellenformskalierung"
+
+#: rc_option_editor.cc:2196
+msgid "linear"
+msgstr "Linear"
+
+#: rc_option_editor.cc:2197
+msgid "logarithmic"
+msgstr "Logarithmisch"
+
+#: rc_option_editor.cc:2203
+msgid "Waveform shape"
+msgstr "Wellenform Anzeigeart"
+
+#: rc_option_editor.cc:2208
+msgid "traditional"
+msgstr "Traditionell"
+
+#: rc_option_editor.cc:2209
+msgid "rectified"
+msgstr "Rectified"
+
+#: rc_option_editor.cc:2218
+msgid "Show waveforms for audio while it is being recorded"
+msgstr "Zeige bei Aufnahmen die Wellenformen des aufgenommenen Audiomaterials"
+
+#: rc_option_editor.cc:2226
+msgid "Show zoom toolbar"
+msgstr "Zeige Zoom Toolbar"
+
+#: rc_option_editor.cc:2234
+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:2241
+msgid "Name new markers"
+msgstr "Neue Marker benennen"
+
+#: rc_option_editor.cc:2247
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
+msgstr ""
+"Falls an, wird bei Erzeugung eines neuen Markers ein Dialog eingeblendet, "
+"damit der Name sofort bearbeitet werden kann.\n"
+"\n"
+"Marker können jederzeit per Rechtsklick umbenannt werden"
+
+#: rc_option_editor.cc:2253
+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:2260
+msgid "After splitting selected regions, select"
+msgstr "Nach dem Teilen"
+
+#: rc_option_editor.cc:2265
+msgid "no regions"
+msgstr "keine Regionen"
+
+#: rc_option_editor.cc:2268
+msgid "newly-created regions"
+msgstr "neu erzeugte Regionen"
+
+#: rc_option_editor.cc:2272
+msgid "existing selection and newly-created regions"
+msgstr "existierende Auswahl und neu erzeugte Regionen"
+
+#: rc_option_editor.cc:2279
+msgid "Buffering"
+msgstr "Pufferung"
+
+#: rc_option_editor.cc:2287
+msgid "Record monitoring handled by"
+msgstr "Aufnahmemonitoring wird verwaltet von"
+
+#: rc_option_editor.cc:2293
+msgid "via Audio Driver"
+msgstr "via Audiotreiber"
+
+#: rc_option_editor.cc:2299
+msgid "audio hardware"
+msgstr "Audiohardware"
+
+#: rc_option_editor.cc:2306
+msgid "Tape machine mode"
+msgstr "Bandmaschinen-Modus"
+
+#: rc_option_editor.cc:2311
+msgid "Connection of tracks and busses"
+msgstr "Verbindung von Spuren und Bussen"
+
+#: rc_option_editor.cc:2316
+msgid "Auto-connect master/monitor busses"
+msgstr "Master/Monitor-Busse automatisch verbinden"
+
+#: rc_option_editor.cc:2323
+msgid "Connect track inputs"
+msgstr "Verbinde Spureingänge"
+
+#: rc_option_editor.cc:2328
+msgid "automatically to physical inputs"
+msgstr "automatisch mit Audioeingängen"
+
+#: rc_option_editor.cc:2329 rc_option_editor.cc:2342
+msgid "manually"
+msgstr "manuell"
+
+#: rc_option_editor.cc:2335
+msgid "Connect track and bus outputs"
+msgstr "Verbinde Spur- und Busausgänge"
+
+#: rc_option_editor.cc:2340
+msgid "automatically to physical outputs"
+msgstr "automatisch mit Audioausgängen"
+
+#: rc_option_editor.cc:2341
+msgid "automatically to master bus"
+msgstr "automatisch mit dem Master-Bus"
+
+#: rc_option_editor.cc:2346
+msgid "Denormals"
+msgstr "Denormals"
+
+#: rc_option_editor.cc:2351
+msgid "Use DC bias to protect against denormals"
+msgstr "Nutze DC bias als Schutz vor Denormals"
+
+#: rc_option_editor.cc:2358
+msgid "Processor handling"
+msgstr "Umgang des Prozessors mit Denormals"
+
+#: rc_option_editor.cc:2364
+msgid "no processor handling"
+msgstr "nicht behandeln"
+
+#: rc_option_editor.cc:2370
+msgid "use FlushToZero"
+msgstr "Benutze FlushToZero"
+
+#: rc_option_editor.cc:2377
+msgid "use DenormalsAreZero"
+msgstr "Benutze DenormalsAreZero"
+
+#: rc_option_editor.cc:2384
+msgid "use FlushToZero and DenormalsAreZero"
+msgstr "Benutze FlushToZero & DenormalsAreZero"
+
+#: rc_option_editor.cc:2400
+msgid "Silence plugins when the transport is stopped"
+msgstr "Deaktiviere Plugins, wenn der Transport gestoppt ist."
+
+#: rc_option_editor.cc:2408
+msgid "Make new plugins active"
+msgstr "Neue Plugins sind aktiv"
+
+#: rc_option_editor.cc:2418
+msgid "Enable automatic analysis of audio"
+msgstr "Audiodaten automatisch analysieren"
+
+#: rc_option_editor.cc:2426
+msgid "Replicate missing region channels"
+msgstr "Fehlende Kanäle in Regionen durch Kopien ersetzen"
+
+#: rc_option_editor.cc:2433 rc_option_editor.cc:2435 rc_option_editor.cc:2450
+#: rc_option_editor.cc:2462 rc_option_editor.cc:2474 rc_option_editor.cc:2486
+#: rc_option_editor.cc:2490 rc_option_editor.cc:2498 rc_option_editor.cc:2506
+#: rc_option_editor.cc:2514 rc_option_editor.cc:2516 rc_option_editor.cc:2524
+#: rc_option_editor.cc:2532 rc_option_editor.cc:2540 rc_option_editor.cc:2548
+#: rc_option_editor.cc:2550
+msgid "Solo / mute"
+msgstr "Solo / Mute"
+
+#: rc_option_editor.cc:2438
+msgid "Solo-in-place mute cut (dB)"
+msgstr "Solo-in-Place Mute Dämpfung (dB)"
+
+#: rc_option_editor.cc:2445
+msgid "Solo controls are Listen controls"
+msgstr "Solo-Schalter arbeiten als AFL/PFL"
+
+#: rc_option_editor.cc:2454
+msgid "Listen Position"
+msgstr "Abhörpunkt"
+
+#: rc_option_editor.cc:2459
+msgid "after-fader (AFL)"
+msgstr "After-Fader (AFL)"
+
+#: rc_option_editor.cc:2460
+msgid "pre-fader (PFL)"
+msgstr "Pre-Fader (PFL)"
+
+#: rc_option_editor.cc:2466
+msgid "PFL signals come from"
+msgstr "Abgreifpunkt der PFL Signale"
+
+#: rc_option_editor.cc:2471
+msgid "before pre-fader processors"
+msgstr "Vor den Pre-Fader Prozessoren"
+
+#: rc_option_editor.cc:2472
+msgid "pre-fader but after pre-fader processors"
+msgstr "Pre-Fader, aber nach den Prozessoren"
+
+#: rc_option_editor.cc:2478
+msgid "AFL signals come from"
+msgstr "Abgreifpunkt der AFL Signale"
+
+#: rc_option_editor.cc:2483
+msgid "immediately post-fader"
+msgstr "Direkt nach dem Fader"
+
+#: rc_option_editor.cc:2484
+msgid "after post-fader processors (before pan)"
+msgstr "Nach den Post-Fader Prozessoren (vor Pan)"
+
+#: rc_option_editor.cc:2493
+msgid "Exclusive solo"
+msgstr "Exclusives Solo"
+
+#: rc_option_editor.cc:2501
+msgid "Show solo muting"
+msgstr "Solo auf anderen Kanälen als Mute anzeigen"
+
+#: rc_option_editor.cc:2509
+msgid "Soloing overrides muting"
+msgstr "Solo ist trotz Mute hörbar"
+
+#: rc_option_editor.cc:2514
+msgid "Default track / bus muting options"
+msgstr "Standardeinstellungen für Mute von Spuren / Bussen"
+
+#: rc_option_editor.cc:2519
+msgid "Mute affects pre-fader sends"
+msgstr "Mute schaltet Pre-Fader Sends stumm"
+
+#: rc_option_editor.cc:2527
+msgid "Mute affects post-fader sends"
+msgstr "Mute schaltet Post-Fader Sends stumm"
+
+#: rc_option_editor.cc:2535
+msgid "Mute affects control outputs"
+msgstr "Mute schaltet Abhörausgänge stumm"
+
+#: rc_option_editor.cc:2543
+msgid "Mute affects main outputs"
+msgstr "Mute schaltet Hauptausgänge stumm"
+
+#: rc_option_editor.cc:2548
+msgid "Send Routing"
+msgstr "Send Routing"
+
+#: rc_option_editor.cc:2553
+msgid "Link panners of Aux and External Sends with main panner by default"
+msgstr "Verknüpfe Aux- und External-Send-Panner mit Hauptpanner"
+
+#: rc_option_editor.cc:2561
+msgid "MIDI read-ahead time (seconds)"
+msgstr "MIDI read-ahead Zeit (Sekunden)"
+
+#: rc_option_editor.cc:2579
+msgid "Send MIDI Time Code"
+msgstr "Sende MIDI Time Code"
+
+#: rc_option_editor.cc:2587
+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:2596
+msgid "Obey MIDI Machine Control commands"
+msgstr "MIDI Machine Control Commands empfangen"
+
+#: rc_option_editor.cc:2604
+msgid "Send MIDI Machine Control commands"
+msgstr "MIDI Machine Control Commands senden"
+
+#: rc_option_editor.cc:2612
+msgid "Send MIDI control feedback"
+msgstr "MIDI Control Feedback senden"
+
+#: rc_option_editor.cc:2620
+msgid "Inbound MMC device ID"
+msgstr "ID des eingehenden MMC-Geräts"
+
+#: rc_option_editor.cc:2629
+msgid "Outbound MMC device ID"
+msgstr "ID des ausgehenden MMC-Geräts"
+
+#: rc_option_editor.cc:2638
+msgid "Initial program change"
+msgstr "Erstmaliger Programmwechsel"
+
+#: rc_option_editor.cc:2647
+msgid "Display first MIDI bank/program as 0"
+msgstr "Erste(s) MIDI Bank/Programm als 0 anzeigen"
+
+#: rc_option_editor.cc:2655
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr "Periodische MIDI Nachrichten nie anzeigen (MTC, MIDI Clock)"
+
+#: rc_option_editor.cc:2663
+msgid "Sound MIDI notes as they are selected"
+msgstr "MIDI Noten ertönen bei Auswahl"
+
+#: rc_option_editor.cc:2668
+msgid "Midi Audition"
+msgstr "Midi vorhören"
+
+#: rc_option_editor.cc:2672
+msgid "Midi Audition Synth (LV2)"
+msgstr "Midi Vorhör-Synth (LV2)"
+
+#: rc_option_editor.cc:2703 rc_option_editor.cc:2713 rc_option_editor.cc:2715
+msgid "User interaction"
+msgstr "Benutzerinteraktion"
+
+#: rc_option_editor.cc:2706
+msgid ""
+"Use translations of %1 messages\n"
+" <i>(requires a restart of %1 to take effect)</i>\n"
+" <i>(if available for your language preferences)</i>"
+msgstr ""
+"Benutze Übersetzung der %1-Oberfläche\n"
+" <i>(erfordert Neustart von %1)</i>\n"
+" <i>(falls für Ihre gewünschte Sprache verfügbar)</i>"
+
+#: rc_option_editor.cc:2713
+msgid "Keyboard"
+msgstr "Tastatur"
+
+#: rc_option_editor.cc:2723
+msgid "Control surface remote ID"
+msgstr "Remote ID des Eingabegeräts"
+
+#: rc_option_editor.cc:2728
+msgid "assigned by user"
+msgstr "vom Benutzer festgelegt"
+
+#: rc_option_editor.cc:2729
+msgid "follows order of mixer"
+msgstr "folgt Reihenfolge im Mixer"
+
+#: rc_option_editor.cc:2746
+msgid "Possibly improve slow graphical performance"
+msgstr "Versuche, langsame Grafikperformance zu verbessern"
+
+#: rc_option_editor.cc:2751
+msgid "This requires restarting %1 before having an effect"
+msgstr "Diese Einstellung wird erst nach einem Neustart von %1 wirksam"
+
+#: rc_option_editor.cc:2752 rc_option_editor.cc:2755 rc_option_editor.cc:2764
+#: rc_option_editor.cc:2773 rc_option_editor.cc:2783 rc_option_editor.cc:2808
+#: rc_option_editor.cc:2823 rc_option_editor.cc:2836 rc_option_editor.cc:2845
+msgid "Preferences|GUI"
+msgstr "GUI"
+
+#: rc_option_editor.cc:2758
+msgid "Graphically indicate mouse pointer hovering over various widgets"
+msgstr "Mouseover-Effekt über verschiedenen Anzeigen"
+
+#: rc_option_editor.cc:2767
+msgid "Show tooltips if mouse hovers over a control"
+msgstr "Zeige Tooltips, wenn die Maus über einem Element schwebt"
+
+#: rc_option_editor.cc:2776
+msgid "Use name highlight bars in region displays (requires a restart)"
+msgstr ""
+"Verwende Farbbalken zur Namenshervorhebung in der Regionendarstellung "
+"(erfordert Neustart)"
+
+#: rc_option_editor.cc:2789
+msgid "update transport clock display at FPS instead of every 100ms"
+msgstr "Auffrischen der Transport-Uhranzeige in FPS statt alle 100 ms"
+
+#: rc_option_editor.cc:2799
+msgid "Waveform image cache size (megabytes)"
+msgstr "Wellenformbild Cachegröße (Megabyte)"
+
+#: rc_option_editor.cc:2807
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+"Ein größerer Cache benutzt mehr RAM-Speicher, was die Grafikperformance "
+"verbessern kann."
+
+#: rc_option_editor.cc:2814
+msgid "Lock timeout (seconds)"
+msgstr "Sperr-Timeout (Sekunden)"
+
+#: rc_option_editor.cc:2822
+msgid "Lock GUI after this many idle seconds (zero to never lock)"
+msgstr "Sperre GUI nach so vielen untätigen Sekunden (null, um nie zu sperren)"
+
+#: rc_option_editor.cc:2838
+msgid "Mixer Strip"
+msgstr "Anzeige im Kanalzug"
+
+#: rc_option_editor.cc:2848
+msgid "Use narrow strips in the mixer by default"
+msgstr "Standardmäßig schmale Kanalzüge verwenden"
+
+#: rc_option_editor.cc:2853 rc_option_editor.cc:2867 rc_option_editor.cc:2884
+#: rc_option_editor.cc:2900 rc_option_editor.cc:2916 rc_option_editor.cc:2930
+#: rc_option_editor.cc:2956 rc_option_editor.cc:2974 rc_option_editor.cc:2985
+#: rc_option_editor.cc:2992 rc_option_editor.cc:2994
+msgid "Preferences|Metering"
+msgstr "Pegelanzeige"
+
+#: rc_option_editor.cc:2857
+msgid "Peak hold time"
+msgstr "Haltezeit für Spitzenwert"
+
+#: rc_option_editor.cc:2863
+msgid "short"
+msgstr "Kurz"
+
+#: rc_option_editor.cc:2864
+msgid "medium"
+msgstr "Mittel"
+
+#: rc_option_editor.cc:2865
+msgid "long"
+msgstr "Lange"
+
+#: rc_option_editor.cc:2871
+msgid "DPM fall-off"
+msgstr "Abfall der digitalen Pegelanzeige"
+
+#: rc_option_editor.cc:2877
+msgid "slowest [6.6dB/sec]"
+msgstr "am langsamsten [6.6dB/sec]"
+
+#: rc_option_editor.cc:2878
+msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
+msgstr "langsam [8.6dB/sec] (BBC PPM, EBU PPM)"
+
+#: rc_option_editor.cc:2879
+msgid "moderate [12.0dB/sec] (DIN)"
+msgstr "moderat [12.0dB/sec] (DIN)"
+
+#: rc_option_editor.cc:2880
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+msgstr "mittel [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+
+#: rc_option_editor.cc:2881
+msgid "fast [20dB/sec]"
+msgstr "schnell [20dB/sec]"
+
+#: rc_option_editor.cc:2882
+msgid "very fast [32dB/sec]"
+msgstr "sehr schnell [32dB/sec]"
+
+#: rc_option_editor.cc:2888
+msgid "Meter line-up level; 0dBu"
+msgstr "Ausrichtung der Pegelanzeige; 0dBu"
+
+#: rc_option_editor.cc:2893 rc_option_editor.cc:2909
+msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
+msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
+
+#: rc_option_editor.cc:2894 rc_option_editor.cc:2910
+msgid "-20dBFS (SMPTE RP.0155)"
+msgstr "-20dBFS (SMPTE RP.0155)"
+
+#: rc_option_editor.cc:2895 rc_option_editor.cc:2911
+msgid "-18dBFS (EBU, BBC)"
+msgstr "-18dBFS (EBU, BBC)"
+
+#: rc_option_editor.cc:2896 rc_option_editor.cc:2912
+msgid "-15dBFS (DIN)"
+msgstr "-15dBFS (DIN)"
+
+#: rc_option_editor.cc:2898
+msgid ""
+"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
+"level for IEC1/Nordic, IEC2 PPM and VU meter."
+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:2904
+msgid "IEC1/DIN Meter line-up level; 0dBu"
+msgstr "Ausrichtung der IEC1/DIN Pegelanzeige; 0dBu"
+
+#: rc_option_editor.cc:2914
+msgid "Reference level for IEC1/DIN meter."
+msgstr "Referenzpegel für IEC1/DIN Pegelanzeige."
+
+#: rc_option_editor.cc:2920
+msgid "VU Meter standard"
+msgstr "Standard für VU-Pegelanzeige"
+
+#: rc_option_editor.cc:2925
+msgid "0VU = -2dBu (France)"
+msgstr "0VU = -2dBu (Frankreich)"
+
+#: rc_option_editor.cc:2926
+msgid "0VU = 0dBu (North America, Australia)"
+msgstr "0VU = 0dBu (Nordamerika, Australien)"
+
+#: rc_option_editor.cc:2927
+msgid "0VU = +4dBu (standard)"
+msgstr "0VU = +4dBu (Standard)"
+
+#: rc_option_editor.cc:2928
+msgid "0VU = +8dBu"
+msgstr "0VU = +8dBu"
+
+#: rc_option_editor.cc:2934
+msgid "Peak threshold [dBFS]"
+msgstr "Schwelle für Spitzenwert [dBFS]"
+
+#: rc_option_editor.cc:2943
+msgid "Default Meter Type for Master Bus"
+msgstr "Voreingestellter Metertyp für Masterbus"
+
+#: rc_option_editor.cc:2961
+msgid "Default Meter Type for Busses"
+msgstr "Voreingestellter Metertyp für Busse"
+
+#: rc_option_editor.cc:2978
+msgid "Default Meter Type for Tracks"
+msgstr "Voreingestellter Metertyp für Spuren"
+
+#: rc_option_editor.cc:2990
+msgid ""
+"Specify the audio signal level in dbFS at and above which the meter-peak "
+"indicator will flash red."
+msgstr ""
+"Geben Sie den Signalpegel in dbFS an, bei dessen Erreichen oder "
+"Überschreitung die Spitzenwertanzeige in der Pegelanzeige rot blinkt"
+
+#: rc_option_editor.cc:2997
+msgid "LED meter style"
+msgstr "Pegelanzeigen im LED-Stil"
+
+#: rc_option_editor.cc:3005
+msgid "Theme"
+msgstr "Thema"
+
+#: region_editor.cc:79
+msgid "audition this region"
+msgstr "Diese Region vorhören"
+
+#: region_editor.cc:88 region_layering_order_editor.cc:75
+msgid "Position:"
+msgstr "Position:"
+
+#: region_editor.cc:90 add_video_dialog.cc:155
+msgid "End:"
+msgstr "Ende:"
+
+#: region_editor.cc:92 sfdb_ui.cc:144
+msgid "Length:"
+msgstr "Länge:"
+
+#: region_editor.cc:94
+msgid "Sync point (relative to region):"
+msgstr "Synchronisationspunkt (relativ zur Region)"
+
+#: region_editor.cc:96
+msgid "Sync point (absolute):"
+msgstr "Synchronisationspunkt (absolut)"
+
+#: region_editor.cc:98
+msgid "File start:"
+msgstr "Dateibeginn:"
+
+#: region_editor.cc:102
+msgid "Sources:"
+msgstr "Quellen:"
+
+#: region_editor.cc:104
+msgid "Source:"
+msgstr "Quelle:"
+
+#: region_editor.cc:166
+msgid "Region '%1'"
+msgstr "Region '%1'"
+
+#: region_editor.cc:277
+msgid "change region start position"
+msgstr "Startposition der Region ändern"
+
+#: region_editor.cc:297
+msgid "change region end position"
+msgstr "Endposition der Region ändern"
+
+#: region_editor.cc:320
+msgid "change region length"
+msgstr "Länge der Region verändern"
+
+#: region_editor.cc:414 region_editor.cc:426
+msgid "change region sync point"
+msgstr "Synchronisationspunkt der Region ändern"
+
+#: region_layering_order_editor.cc:42
+msgid "RegionLayeringOrderEditor"
+msgstr "RegionenLayeringOrdnungEditor"
+
+#: region_layering_order_editor.cc:55
+msgid "Region Name"
+msgstr "Name der Region"
+
+#: region_layering_order_editor.cc:72
+msgid "Track:"
+msgstr "Spur:"
+
+#: region_layering_order_editor.cc:104
+msgid "Choose Top Region"
+msgstr "Oberste Region auswählen"
+
+#: region_view.cc:277
+msgid "SilenceText"
+msgstr "StilleText"
+
+#: region_view.cc:292 region_view.cc:311
+msgid "minutes"
+msgstr "Minuten"
+
+#: region_view.cc:295 region_view.cc:314
+msgid "msecs"
+msgstr "ms"
+
+#: region_view.cc:298 region_view.cc:317
+msgid "secs"
+msgstr "s"
+
+#: region_view.cc:301
+msgid "%1 silent segment"
+msgid_plural "%1 silent segments"
+msgstr[0] "%1 stilles Segment"
+msgstr[1] "%1 stille Segmente"
+
+#: region_view.cc:303
+msgid "shortest = %1 %2"
+msgstr "kürzestes = %1 %2"
+
+#: region_view.cc:320
+msgid ""
+"\n"
+" (shortest audible segment = %1 %2)"
+msgstr ""
+"\n"
+" (kürzestes hörbares Segment = %1 %2)"
+
+#: return_ui.cc:102
+msgid "Return "
+msgstr "Return "
+
+#: rhythm_ferret.cc:48
+msgid "Percussive Onset"
+msgstr "Percussive Onset"
+
+#: rhythm_ferret.cc:49
+msgid "Note Onset"
+msgstr "Note Onset"
+
+#: rhythm_ferret.cc:54
+msgid "Energy Based"
+msgstr "Energy Based"
+
+#: rhythm_ferret.cc:55
+msgid "Spectral Difference"
+msgstr "Spectral Difference"
+
+#: rhythm_ferret.cc:56
+msgid "High-Frequency Content"
+msgstr "High-Frequency Content"
+
+#: rhythm_ferret.cc:57
+msgid "Complex Domain"
+msgstr "Complex Domain"
+
+#: rhythm_ferret.cc:58
+msgid "Phase Deviation"
+msgstr "Phasenabweichung"
+
+#: rhythm_ferret.cc:59
+msgid "Kullback-Liebler"
+msgstr "Kullback-Liebler"
+
+#: rhythm_ferret.cc:60
+msgid "Modified Kullback-Liebler"
+msgstr "Modified Kullback-Liebler"
+
+#: rhythm_ferret.cc:65
+msgid "Split region"
+msgstr "Region teilen"
+
+#: rhythm_ferret.cc:66
+msgid "Snap regions"
+msgstr "Regionen einrasten"
+
+#: rhythm_ferret.cc:67
+msgid "Conform regions"
+msgstr "Region angleichen"
+
+#: rhythm_ferret.cc:72
+msgid "Rhythm Ferret"
+msgstr "Rhythm Ferret"
+
+#: rhythm_ferret.cc:78
+msgid "Analyze"
+msgstr "Daten analysieren"
+
+#: rhythm_ferret.cc:113
+msgid "Detection function"
+msgstr "Erkennungsfunktion"
+
+#: rhythm_ferret.cc:117
+msgid "Trigger gap"
+msgstr "Mindestauslöseabstand"
+
+#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
+msgid "Threshold"
+msgstr "Threshold"
+
+#: rhythm_ferret.cc:127
+msgid "Peak threshold"
+msgstr "Schwelle für Spitzenwert"
+
+#: rhythm_ferret.cc:132
+msgid "Silence threshold"
+msgstr "Silence threshold"
+
+#: rhythm_ferret.cc:137
+msgid "Sensitivity"
+msgstr "Empfindlichkeit"
+
+#: rhythm_ferret.cc:141
+msgid "Operation"
+msgstr "Aktionen"
+
+#: rhythm_ferret.cc:355
+msgid "split regions (rhythm ferret)"
+msgstr "Regionen teilen (rhythm ferret)"
+
+#: route_group_dialog.cc:42
+msgid "Track/bus Group"
+msgstr "Spur/Bus-Gruppe"
+
+#: route_group_dialog.cc:47
+msgid "Relative"
+msgstr "Relativ"
+
+#: route_group_dialog.cc:48
+msgid "Muting"
+msgstr "Muting"
+
+#: route_group_dialog.cc:50
+msgid "Record enable"
+msgstr "Aufnahmestatus"
+
+#: route_group_dialog.cc:52
+msgid "Active state"
+msgstr "Aktiv-Status"
+
+#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:92
+msgid "Color"
+msgstr "Farbe"
+
+#: route_group_dialog.cc:59
+msgid "RouteGroupDialog"
+msgstr "Bearbeitungsgruppendialog"
+
+#: route_group_dialog.cc:100
+msgid "<b>Sharing</b>"
+msgstr "<b>Geteilte Funktionen</b>"
+
+#: route_group_dialog.cc:200
+msgid "The group name is not unique. Please use a different name."
+msgstr ""
+"Der Gruppenname ist nicht einzigartig. Bitte benutzen Sie einen anderen "
+"Namen."
+
+#: route_params_ui.cc:84
+msgid "Tracks/Busses"
+msgstr "Spuren/Busse"
+
+#: route_params_ui.cc:103
+msgid "Inputs"
+msgstr "Eingänge"
+
+#: route_params_ui.cc:104
+msgid "Outputs"
+msgstr "Ausgänge"
+
+#: route_params_ui.cc:105
+msgid "Plugins, Inserts & Sends"
+msgstr "Plugins, Inserts & Sends"
+
+#: route_params_ui.cc:209
+msgid "route display list item for renamed route not found!"
+msgstr ""
+"Konnte Bezeichnung für umbenannten Verbindung nicht in der Liste der "
+"Verbindungen finden!"
+
+#: route_params_ui.cc:279 route_params_ui.cc:307
+#, c-format
+msgid "Playback delay: %<PRId64> samples"
+msgstr "Wiedergabeverzögerung: %<PRId64> Samples"
+
+#: route_params_ui.cc:499
+msgid "NO TRACK"
+msgstr "KEINE SPUR"
+
+#: route_params_ui.cc:637 route_params_ui.cc:638
+msgid "No Track or Bus Selected"
+msgstr "Keine Spuren oder Busse ausgewählt"
+
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr "G"
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr "P"
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr "A"
+
+#: route_time_axis.cc:183
+msgid "Record (Right-click for Step Edit)"
+msgstr "Aufnahme (Rechtsklick für Step Entry)"
+
+#: route_time_axis.cc:186
+msgid "Record"
+msgstr "Aufnahme"
+
+#: route_time_axis.cc:256
+msgid "Route Group"
+msgstr "Bearbeitungsgruppe"
+
+#: route_time_axis.cc:266
+msgid "MIDI Controllers and Automation"
+msgstr "MIDI-Controller und Automation"
+
+#: route_time_axis.cc:497
+msgid "Show All Automation"
+msgstr "Alle Automationen anzeigen"
+
+#: route_time_axis.cc:500
+msgid "Show Existing Automation"
+msgstr "Genutzte Automationen zeigen"
+
+#: route_time_axis.cc:503
+msgid "Hide All Automation"
+msgstr "Alle Automationen verbergen"
+
+#: route_time_axis.cc:512
+msgid "Processor automation"
+msgstr "Prozessorautomation"
+
+#: route_time_axis.cc:519
+msgid "Fader"
+msgstr "Fader"
+
+#: route_time_axis.cc:546
+msgid "Pan"
+msgstr "Pan"
+
+#: route_time_axis.cc:637
+msgid "Overlaid"
+msgstr "Overlaid"
+
+#: route_time_axis.cc:643
+msgid "Stacked"
+msgstr "Stacked"
+
+#: route_time_axis.cc:651
+msgid "Layers"
+msgstr "Layers"
+
+#: route_time_axis.cc:720
+msgid "Automatic (based on I/O connections)"
+msgstr "Automatisch (auf den I/O Verbindungen basierend)"
+
+#: route_time_axis.cc:729
+msgid "(Currently: Existing Material)"
+msgstr "(Momentan: An vorhandenem Material ausrichten)"
+
+#: route_time_axis.cc:732
+msgid "(Currently: Capture Time)"
+msgstr "(Momentan: An Aufnahmezeit ausrichten)"
+
+#: route_time_axis.cc:740
+msgid "Align With Existing Material"
+msgstr "An vorhandenem Material ausrichten"
+
+#: route_time_axis.cc:745
+msgid "Align With Capture Time"
+msgstr "An Aufnahmezeit ausrichten"
+
+#: route_time_axis.cc:750
+msgid "Alignment"
+msgstr "Ausrichtung"
+
+#: route_time_axis.cc:785
+msgid "Normal Mode"
+msgstr "Normaler Modus"
+
+#: route_time_axis.cc:791
+msgid "Tape Mode"
+msgstr "Band-Modus"
+
+#: route_time_axis.cc:797
+msgid "Non-Layered Mode"
+msgstr "Non-Layered Mode"
+
+#: route_time_axis.cc:803
+msgid "Record Mode"
+msgstr "Aufnahmemodus"
+
+#: route_time_axis.cc:810 route_time_axis.cc:1801
+msgid "Playlist"
+msgstr "Wiedergabeliste"
+
+#: route_time_axis.cc:1104
+msgid "Rename Playlist"
+msgstr "Wiedergabeliste umbenennen"
+
+#: route_time_axis.cc:1105
+msgid "New name for playlist:"
+msgstr "Neuer Name für Wiedergabeliste:"
+
+#: route_time_axis.cc:1190
+msgid "New Copy Playlist"
+msgstr "Neue Kopie der Wiedergabeliste"
+
+#: route_time_axis.cc:1191 route_time_axis.cc:1244
+msgid "Name for new playlist:"
+msgstr "Name für die neue Wiedergabeliste:"
+
+#: route_time_axis.cc:1243
+msgid "New Playlist"
+msgstr "Neue Wiedergabeliste"
+
+#: route_time_axis.cc:1447
+msgid "You cannot create a track with that name as it is reserved for %1"
+msgstr ""
+"Sie können keine Spur mit einem Namen erstellen, der für %1 reserviert ist."
+
+#: route_time_axis.cc:1690
+msgid "New Copy..."
+msgstr "Neue Kopie..."
+
+#: route_time_axis.cc:1694
+msgid "New Take"
+msgstr "Neuer Take"
+
+#: route_time_axis.cc:1695
+msgid "Copy Take"
+msgstr "Take kopieren"
+
+#: route_time_axis.cc:1700
+msgid "Clear Current"
+msgstr "Aktuelle leeren"
+
+#: route_time_axis.cc:1703
+msgid "Select From All..."
+msgstr "Aus allen auswählen..."
+
+#: route_time_axis.cc:1791
+msgid "Take: %1.%2"
+msgstr "Take: %1.%2"
+
+#: route_time_axis.cc:2197 selection.cc:1007 selection.cc:1061
+msgid "programming error: "
+msgstr "Programmierfehler:"
+
+#: route_time_axis.cc:2613
+msgid "Underlays"
+msgstr "Darunterliegende"
+
+#: route_time_axis.cc:2616
+msgid "Remove \"%1\""
+msgstr "Lösche \"%1\""
+
+#: route_time_axis.cc:2666 route_time_axis.cc:2703
+msgid "programming error: underlay reference pointer pairs are inconsistent!"
+msgstr "programming error: underlay reference pointer pairs are inconsistent!"
+
+#: route_time_axis.cc:2730
+msgid "After-fade listen (AFL)"
+msgstr "After-Fader (AFL)"
+
+#: route_time_axis.cc:2734
+msgid "Pre-fade listen (PFL)"
+msgstr "Pre-Fader (PFL)"
+
+#: route_ui.cc:142
+msgid "Mute this track"
+msgstr "Diese Spur stummschalten"
+
+#: route_ui.cc:146
+msgid "Mute other (non-soloed) tracks"
+msgstr "Andere (nicht Solo-)Spuren stummschalten"
+
+#: route_ui.cc:152
+msgid "Enable recording on this track"
+msgstr "Aktiviere die Aufnahme auf dieser Spur"
+
+#: route_ui.cc:160
+msgid "make mixer strips show sends to this bus"
+msgstr "Kanalzüge zeigen Sends zu diesem Bus"
+
+#: route_ui.cc:165
+msgid "Monitor input"
+msgstr "Eingang abhören"
+
+#: route_ui.cc:171
+msgid "Monitor playback"
+msgstr "Vorhandenes Material abhören"
+
+#: route_ui.cc:678
+msgid "Not connected to AudioEngine - cannot engage record"
+msgstr "Nicht mit Audio-Engine verbunden - Aufnahme nicht möglich"
+
+#: route_ui.cc:877
+msgid "Step Entry"
+msgstr "Eingabemodus (Step Entry)"
+
+#: route_ui.cc:950
+msgid "Assign all tracks (prefader)"
+msgstr "Alle Audiospuren zuweisen (Pre-Fader)"
+
+#: route_ui.cc:954
+msgid "Assign all tracks and buses (prefader)"
+msgstr "Alle Audiospuren und Busse zuweisen (Pre-Fader)"
+
+#: route_ui.cc:958
+msgid "Assign all tracks (postfader)"
+msgstr "Alle Audiospuren zuweisen (Post-Fader)"
+
+#: route_ui.cc:962
+msgid "Assign all tracks and buses (postfader)"
+msgstr "Alle Audiospuren und Busse zuweisen (Post-Fader)"
+
+#: route_ui.cc:966
+msgid "Assign selected tracks (prefader)"
+msgstr "Ausgewählte Audiospuren zuweisen (Pre-Fader)"
+
+#: route_ui.cc:970
+msgid "Assign selected tracks and buses (prefader)"
+msgstr "Ausgewählte Audiospuren und Busse zuweisen (Pre-Fader)"
+
+#: route_ui.cc:973
+msgid "Assign selected tracks (postfader)"
+msgstr "Ausgewählte Audiospuren zuweisen (Post-Fader)"
+
+#: route_ui.cc:977
+msgid "Assign selected tracks and buses (postfader)"
+msgstr "Ausgewählte Audiospuren und Busse zuweisen (Post-Fader)"
+
+#: route_ui.cc:980
+msgid "Copy track/bus gains to sends"
+msgstr "Lautstärken der Spuren/Busse auf ihre Sends kopieren"
+
+#: route_ui.cc:981
+msgid "Set sends gain to -inf"
+msgstr "Setze Sends-Lautstärken to -inf"
+
+#: route_ui.cc:982
+msgid "Set sends gain to 0dB"
+msgstr "Setze Sends-Lautstärken to 0dB"
+
+#: route_ui.cc:1301
+msgid "Solo Isolate"
+msgstr "Isoliertes Solo"
+
+#: route_ui.cc:1308
+msgid "Solo Safe"
+msgstr "Solo sperren"
+
+#: route_ui.cc:1330
+msgid "Pre Fader Sends"
+msgstr "Pre-Fader Sends"
+
+#: route_ui.cc:1336
+msgid "Post Fader Sends"
+msgstr "Post-Fader Sends"
+
+#: route_ui.cc:1342
+msgid "Control Outs"
+msgstr "Vorhörausgang"
+
+#: route_ui.cc:1348
+msgid "Main Outs"
+msgstr "Hauptausgänge"
+
+#: route_ui.cc:1485
+msgid "Color Selection"
+msgstr "Farbauswahl"
+
+#: route_ui.cc:1550
+msgid ""
+"The use of colons (':') is discouraged in track and bus names.\n"
+"Do you want to use this new name?"
+msgstr ""
+"Die Verwendung von Doppelpunkten (':') in Spur- und Busnamen\n"
+"wird nicht empfohlen.\n"
+"Wollen Sie diesen neuen Namen verwenden?"
+
+#: route_ui.cc:1554
+msgid "Use the new name"
+msgstr "Neuen Namen verwenden"
+
+#: route_ui.cc:1555
+msgid "Re-edit the name"
+msgstr "Namen bearbeiten"
+
+#: route_ui.cc:1568
+msgid "Rename Track"
+msgstr "Spur umbenennen"
+
+#: route_ui.cc:1570
+msgid "Rename Bus"
+msgstr "Bus umbenennen"
+
+#: route_ui.cc:1638
+msgid ": comment editor"
+msgstr ": Kommentare bearbeiten"
+
+#: route_ui.cc:1804
+msgid " latency"
+msgstr " Latenz"
+
+#: route_ui.cc:1817
+msgid "Cannot create route template directory %1"
+msgstr "Kann das Vorlagenverzeichnis für Spuren/Busse %1 nicht erzeugen"
+
+#: route_ui.cc:1823
+msgid "Save As Template"
+msgstr "Als Vorlage speichern"
+
+#: route_ui.cc:1824
+msgid "Template name:"
+msgstr "Name der Vorlage:"
+
+#: route_ui.cc:1905
+msgid "Remote Control ID"
+msgstr "ID für Fernsteuerung"
+
+#: route_ui.cc:1915
+msgid "Remote control ID:"
+msgstr "ID für Fernsteuerung:"
+
+#: route_ui.cc:1929
+msgid ""
+"The remote control ID of %1 is: %2\n"
+"\n"
+"\n"
+"The remote control ID of %3 cannot be changed."
+msgstr ""
+"Die Fernbedienungs-ID von %1 ist: %2\n"
+"\n"
+"\n"
+"Die Fernbedienungs-ID von %3 kann nicht geändert werden."
+
+#: route_ui.cc:1933
+msgid "the master bus"
+msgstr "der Master-Bus"
+
+#: route_ui.cc:1933
+msgid "the monitor bus"
+msgstr "der Monitor-Bus"
+
+#: route_ui.cc:1935
+msgid ""
+"The remote control ID of %5 is: %2\n"
+"\n"
+"\n"
+"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
+"\n"
+"%3Use the User Interaction tab of the Preferences window if you want to "
+"change this%4"
+msgstr ""
+"Die Fernbedienungs-ID von %5 ist: %2\n"
+"\n"
+"\n"
+"Fernbedienungs-IDs werden zur Zeit durch die Reihenfolge der Spuren/Busse in "
+"%6 bestimmt.\n"
+"\n"
+"%3Benutzen Sie den Reiter GUI im Fenster \"Einstellungen\", um dies zu ändern"
+"%4"
+
+#: route_ui.cc:1992
+msgid ""
+"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
+"to show menu."
+msgstr ""
+"Linksklick, um die Phase von Kanal %1 zu invertieren. Rechtsklick zeigt das "
+"Menü."
+
+#: route_ui.cc:1994
+msgid "Click to show a menu of channels for inversion (phase reverse)"
+msgstr ""
+"Klicken, um ein Menü zum Invertieren der Kanäle (Phasendrehung) anzuzeigen"
+
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
+msgstr "Zu neu erzeugter Version wechseln"
+
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
+msgstr "Medien in das neue Projekt kopieren"
+
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
+msgstr "Externe Medien in das neue Projekt kopieren"
+
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
+msgstr "Das neu gesicherte Projekt sollte leer sein"
+
+#: save_as_dialog.cc:48
+msgid "Save as session name"
+msgstr "Sichern als Projektname"
+
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
+msgstr "Übergeordnetes Verzeichnis"
+
+#: search_path_option.cc:35
+msgid "Select folder to search for media"
+msgstr "Verzeichnis zur Mediensuche auswählen"
+
+#: search_path_option.cc:44
+msgid "Click to add a new location"
+msgstr "Hier klicken, um einen Pfad hinzuzufügen"
+
+#: search_path_option.cc:51
+msgid "the session folder"
+msgstr "Projektordner"
+
+#: send_ui.cc:134
+msgid "Send "
+msgstr "Send "
+
+#: session_dialog.cc:61
+msgid "Session Setup"
+msgstr "Projekteinrichtung"
+
+#: session_dialog.cc:66
+msgid "Advanced options ..."
+msgstr "Erweiterte Einstellungen..."
+
+#: session_dialog.cc:263
+msgid "New Session"
+msgstr "Neues Projekt"
+
+#: session_dialog.cc:301
+msgid "Check the website for more..."
+msgstr "Informieren Sie sich auf der Webseite weiter..."
+
+#: session_dialog.cc:304
+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:324
+msgid "Sample Rate"
+msgstr "Samplerate"
+
+#: session_dialog.cc:325
+msgid "Disk Format"
+msgstr "Dateiformat"
+
+#: session_dialog.cc:343
+msgid "Select session file"
+msgstr "Projektdatei auswählen"
+
+#: session_dialog.cc:358
+msgid "Other Sessions"
+msgstr "Andere Projekte"
+
+#: session_dialog.cc:384
+msgid "Open"
+msgstr "Öffnen"
+
+#: session_dialog.cc:451
+msgid "Session name:"
+msgstr "Projektname:"
+
+#: session_dialog.cc:473
+msgid "Create session folder in:"
+msgstr "Ort des Projektverzeichnisses:"
+
+#: session_dialog.cc:496
+msgid "Select folder for session"
+msgstr "Ordner für Projekt wählen"
+
+#: session_dialog.cc:525
+msgid "Use this template"
+msgstr "Diese Vorlage verwenden"
+
+#: session_dialog.cc:528
+msgid "no template"
+msgstr "keine Vorlage"
+
+#: session_dialog.cc:663 session_dialog.cc:699
+msgid "32 bit float"
+msgstr "32 Bit float"
+
+#: session_dialog.cc:666 session_dialog.cc:702
+msgid "24 bit"
+msgstr "24 Bit"
+
+#: session_dialog.cc:669 session_dialog.cc:705
+msgid "16 bit"
+msgstr "16 Bit"
+
+#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+msgid "channels"
+msgstr "Kanäle"
+
+#: session_dialog.cc:763
+msgid "<b>Busses</b>"
+msgstr "<b>Busse</b>"
+
+#: session_dialog.cc:764
+msgid "<b>Inputs</b>"
+msgstr "<b>Eingänge</b>"
+
+#: session_dialog.cc:765
+msgid "<b>Outputs</b>"
+msgstr "<b>Ausgänge</b>"
+
+#: session_dialog.cc:773
+msgid "Create master bus"
+msgstr "Master-Bus erstellen"
+
+#: session_dialog.cc:783
+msgid "Automatically connect to physical inputs"
+msgstr "Automatisch mit Audioeingängen verbinden"
+
+#: session_dialog.cc:790 session_dialog.cc:849
+msgid "Use only"
+msgstr "Benutze nur"
+
+#: session_dialog.cc:843
+msgid "Automatically connect outputs"
+msgstr "Ausgänge automatisch verbinden"
+
+#: session_dialog.cc:865
+msgid "... to master bus"
+msgstr "... mit dem Master-Bus"
+
+#: session_dialog.cc:875
+msgid "... to physical outputs"
+msgstr "... mit den Audioausgängen"
+
+#: session_import_dialog.cc:65
+msgid "Import from Session"
+msgstr "Aus Projekt importieren"
+
+#: session_import_dialog.cc:74
+msgid "Elements"
+msgstr "Elemente"
+
+#: session_import_dialog.cc:111
+msgid "Cannot load XML for session from %1"
+msgstr "Konnte XML für das Projekt von %1 nicht laden"
+
+#: session_import_dialog.cc:128 session_import_dialog.cc:212
+msgid "Some elements had errors in them. Please see the log for details"
+msgstr ""
+"Einige Elemente beinhalteten Fehler. Für Einzelheiten lesen Sie bitte das Log"
+
+#: session_import_dialog.cc:164
+msgid "Import from session"
+msgstr "Aus Projekt importieren"
+
+#: session_import_dialog.cc:228
+msgid "This will select all elements of this type!"
+msgstr "Dies wird alle Elemente dieses Typs auswählen!"
+
+#: session_metadata_dialog.cc:285
+msgid "EAN Check digit OK"
+msgstr "EAN Prüfziffer OK"
+
+#: session_metadata_dialog.cc:289
+msgid "EAN Check digit error"
+msgstr "EAN Prüfziffernfehler"
+
+#: session_metadata_dialog.cc:289
+msgid "expected"
+msgstr "erwartet"
+
+#: session_metadata_dialog.cc:294
+msgid "EAN Length error"
+msgstr "EAN Längenfehler"
+
+#: session_metadata_dialog.cc:423
+msgid "Field"
+msgstr "Feld"
+
+#: session_metadata_dialog.cc:427
+msgid "Values (current value on top)"
+msgstr "Werte (aktueller oben)"
+
+#: session_metadata_dialog.cc:641
+msgid "User"
+msgstr "Benutzer"
+
+#: session_metadata_dialog.cc:649
+msgid "Email"
+msgstr "E-Mail"
+
+#: session_metadata_dialog.cc:652
+msgid "Web"
+msgstr "Web"
+
+#: session_metadata_dialog.cc:655
+msgid "Organization"
+msgstr "Organisation"
+
+#: session_metadata_dialog.cc:658
+msgid "Country"
+msgstr "Land"
+
+#: session_metadata_dialog.cc:672
+msgid "Title"
+msgstr "Titel"
+
+#: session_metadata_dialog.cc:675
+msgid "Track Number"
+msgstr "Liednummer"
+
+#: session_metadata_dialog.cc:678
+msgid "Subtitle"
+msgstr "Untertitel"
+
+#: session_metadata_dialog.cc:681
+msgid "Grouping"
+msgstr "Gruppierung"
+
+#: session_metadata_dialog.cc:684
+msgid "Artist"
+msgstr "Künstler"
+
+#: session_metadata_dialog.cc:687
+msgid "Genre"
+msgstr "Genre"
+
+#: session_metadata_dialog.cc:690
+msgid "Comment"
+msgstr "Kommentar"
+
+#: session_metadata_dialog.cc:693
+msgid "Copyright"
+msgstr "Copyright"
+
+#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+msgid "Album"
+msgstr "Album"
+
+#: session_metadata_dialog.cc:709
+msgid "Year"
+msgstr "Jahr"
+
+#: session_metadata_dialog.cc:712
+msgid "Album Artist"
+msgstr "Albumkünstler"
+
+#: session_metadata_dialog.cc:715
+msgid "Total Tracks"
+msgstr "Spuranzahl"
+
+#: session_metadata_dialog.cc:718
+msgid "Disc Subtitle"
+msgstr "CD-Untertitel"
+
+#: session_metadata_dialog.cc:721
+msgid "Disc Number"
+msgstr "CD-Nummer"
+
+#: session_metadata_dialog.cc:724
+msgid "Total Discs"
+msgstr "CDs insgesamt"
+
+#: session_metadata_dialog.cc:727
+msgid "Compilation"
+msgstr "Compilation"
+
+#: session_metadata_dialog.cc:730
+msgid "ISRC"
+msgstr "ISRC"
+
+#: session_metadata_dialog.cc:733
+msgid "EAN barcode"
+msgstr "EAN Strichcode"
+
+#: session_metadata_dialog.cc:746
+msgid "People"
+msgstr "Mitwirkenden"
+
+#: session_metadata_dialog.cc:751
+msgid "Lyricist"
+msgstr "Texter"
+
+#: session_metadata_dialog.cc:754
+msgid "Composer"
+msgstr "Komponist"
+
+#: session_metadata_dialog.cc:757
+msgid "Conductor"
+msgstr "Leiter"
+
+#: session_metadata_dialog.cc:760
+msgid "Remixer"
+msgstr "Remixer"
+
+#: session_metadata_dialog.cc:763
+msgid "Arranger"
+msgstr "Arranger"
+
+#: session_metadata_dialog.cc:766
+msgid "Engineer"
+msgstr "Bearbeiter"
+
+#: session_metadata_dialog.cc:769
+msgid "Producer"
+msgstr "Produzent"
+
+#: session_metadata_dialog.cc:772
+msgid "DJ Mixer"
+msgstr "DJ Mixer"
+
+#: session_metadata_dialog.cc:775
+msgid "Metadata|Mixer"
+msgstr "Mixer"
+
+#: session_metadata_dialog.cc:783
+msgid "School"
+msgstr "Schule"
+
+#: session_metadata_dialog.cc:788
+msgid "Instructor"
+msgstr "Lehrender"
+
+#: session_metadata_dialog.cc:791
+msgid "Course"
+msgstr "Kurs"
+
+#: session_metadata_dialog.cc:799
+msgid "Edit Session Metadata"
+msgstr "Projekt-Metadaten bearbeiten"
+
+#: session_metadata_dialog.cc:830
+msgid "Import session metadata"
+msgstr "Projekt-Metadaten importieren"
+
+#: session_metadata_dialog.cc:851
+msgid "Choose session to import metadata from"
+msgstr "Wählen Sie das Projekt, aus dem Metadaten importiert werden sollen"
+
+#: session_metadata_dialog.cc:889
+msgid "This session file could not be read!"
+msgstr "Diese Projektdatei konnte nicht gelesen werden!"
+
+#: session_metadata_dialog.cc:899
+msgid ""
+"The session file didn't contain metadata!\n"
+"Maybe this is an old session format?"
+msgstr ""
+"Das Projekt enthält keine Metadaten!\n"
+"Eventuell ein altes Projektformat?"
+
+#: session_metadata_dialog.cc:918
+msgid "Import all from:"
+msgstr "Alles importieren von:"
+
+#: session_option_editor.cc:32
+msgid "Session Properties"
+msgstr "Projekteinstellungen"
+
+#: session_option_editor.cc:41
+msgid "Timecode Settings"
+msgstr "Timecode Einstellungen"
+
+#: session_option_editor.cc:45
+msgid "Timecode frames-per-second"
+msgstr "Timecode frames-per-second"
+
+#: session_option_editor.cc:50
+msgid "23.976"
+msgstr "23,976"
+
+#: session_option_editor.cc:51
+msgid "24"
+msgstr "24"
+
+#: session_option_editor.cc:52
+msgid "24.975"
+msgstr "24,976"
+
+#: session_option_editor.cc:53
+msgid "25"
+msgstr "25"
+
+#: session_option_editor.cc:54
+msgid "29.97"
+msgstr "29,97"
+
+#: session_option_editor.cc:55
+msgid "29.97 drop"
+msgstr "29,97 (drop)"
+
+#: session_option_editor.cc:56
+msgid "30"
+msgstr "30"
+
+#: session_option_editor.cc:57
+msgid "30 drop"
+msgstr "30 (drop)"
+
+#: session_option_editor.cc:58
+msgid "59.94"
+msgstr "59,94"
+
+#: session_option_editor.cc:59
+msgid "60"
+msgstr "60"
+
+#: session_option_editor.cc:65
+msgid "Pull-up / pull-down"
+msgstr "Pull-Up / Pull-Down"
+
+#: session_option_editor.cc:70
+msgid "4.1667 + 0.1%"
+msgstr "+4,1667 + 0,1%"
+
+#: session_option_editor.cc:71
+msgid "4.1667"
+msgstr "+4,1667"
+
+#: session_option_editor.cc:72
+msgid "4.1667 - 0.1%"
+msgstr "+4,1667 - 0,1%"
+
+#: session_option_editor.cc:73
+msgid "0.1"
+msgstr "0,1"
+
+#: session_option_editor.cc:74
+msgid "none"
+msgstr "keine"
+
+#: session_option_editor.cc:75
+msgid "-0.1"
+msgstr "-0,1"
+
+#: session_option_editor.cc:76
+msgid "-4.1667 + 0.1%"
+msgstr "-4,1667% + 0,1%"
+
+#: session_option_editor.cc:77
+msgid "-4.1667"
+msgstr "-4,1667"
+
+#: session_option_editor.cc:78
+msgid "-4.1667 - 0.1%"
+msgstr "-4,1667 - 0,1%"
+
+#: session_option_editor.cc:84
+msgid ""
+"Use Video File's FPS Instead of Timecode Value for Timeline and Video "
+"Monitor."
+msgstr ""
+"Benutze FPS aus Videodatei statt des Timecode-Wertes für Zeitleiste und "
+"Videomonitor."
+
+#: session_option_editor.cc:91
+msgid ""
+"Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless using JACK-"
+"sync)."
+msgstr ""
+"Pull-Up/Down auf Video-Zeitleiste und Videomonitor anwenden (außer wenn JACK "
+"Sync verwendet wird)."
+
+#: session_option_editor.cc:96
+msgid "Ext Timecode Offsets"
+msgstr "Ext. Timecode Offsets"
+
+#: session_option_editor.cc:100
+msgid "Slave Timecode offset"
+msgstr "Slave Timecode Offset"
+
+#: session_option_editor.cc:107
+msgid "The specified offset is added to the received timecode (MTC or LTC)."
+msgstr ""
+"Der angegebene Offset wird dem empfangenen Timecode hinzuaddiert (MTC oder "
+"LTC)."
+
+#: session_option_editor.cc:113
+msgid "Timecode Generator offset"
+msgstr "Timecode-Generator Offset"
+
+#: session_option_editor.cc:120
+msgid ""
+"Specify an offset which is added to the generated timecode (so far only LTC)."
+msgstr ""
+"Geben Sie einen Offset an, der dem generierten Timecode hinzuaddiert wird "
+"(derzeit nur LTC)."
+
+#: session_option_editor.cc:124
+msgid "JACK Transport/Time Settings"
+msgstr "JACK Transport/Time Einstellungen"
+
+#: session_option_editor.cc:128
+msgid ""
+"%1 is JACK Time Master (provides Bar|Beat|Tick and other information to JACK)"
+msgstr ""
+"%1 ist JACK Time Master (übergibt Takt|Schlag|Tick und andere Information an "
+"JACK)"
+
+#: session_option_editor.cc:136
+msgid "destructive-xfade-seconds"
+msgstr "destruktive Xfade-Sekunden"
+
+#: session_option_editor.cc:137
+msgid "Destructive crossfade length"
+msgstr "Länge für destruktive Crossfades"
+
+#: session_option_editor.cc:146
+msgid "Region fades active"
+msgstr "Regionen Fade-Ins/Fade-Outs sind aktiv"
+
+#: session_option_editor.cc:153
+msgid "Region fades visible"
+msgstr "Regionen Fade-Ins/Fade-Outs sind sichtbar"
+
+#: session_option_editor.cc:160 session_option_editor.cc:173
+#: session_option_editor.cc:187
+msgid "Media"
+msgstr "Medien"
+
+#: session_option_editor.cc:160
+msgid "Audio file format"
+msgstr "Audio-Dateiformat"
+
+#: session_option_editor.cc:164
+msgid "Sample format"
+msgstr "Sampleformat"
+
+#: session_option_editor.cc:169
+msgid "32-bit floating point"
+msgstr "32-bit floating point"
+
+#: session_option_editor.cc:170
+msgid "24-bit integer"
+msgstr "24-bit integer"
+
+#: session_option_editor.cc:171
+msgid "16-bit integer"
+msgstr "16-bit integer"
+
+#: session_option_editor.cc:177
+msgid "File type"
+msgstr "Dateiformat"
+
+#: session_option_editor.cc:182
+msgid "Broadcast WAVE"
+msgstr "Broadcast WAVE"
+
+#: session_option_editor.cc:183
+msgid "WAVE"
+msgstr "WAVE"
+
+#: session_option_editor.cc:184
+msgid "WAVE-64"
+msgstr "WAVE-64"
+
+#: session_option_editor.cc:189
+msgid "File locations"
+msgstr "Dateipfade"
+
+#: session_option_editor.cc:191
+msgid "Search for audio files in:"
+msgstr "Suche hier nach Audiodateien:"
+
+#: session_option_editor.cc:197
+msgid "Search for MIDI files in:"
+msgstr "Suche hier nach MIDI-Dateien:"
+
+#: session_option_editor.cc:206 session_option_editor.cc:218
+#: session_option_editor.cc:228 session_option_editor.cc:239
+msgid "Filenames"
+msgstr "Dateinamen"
+
+#: session_option_editor.cc:206
+msgid "File Naming"
+msgstr "Dateibenennung"
+
+#: session_option_editor.cc:212
+msgid "Prefix Track number"
+msgstr "Füge Spurnummer vorne ein"
+
+#: session_option_editor.cc:217
+msgid ""
+"Adds the current track number to the beginning of the recorded file name."
+msgstr ""
+"Fügt die momentane Spurnummer am Beginn des Dateinamens der Aufnahme hinzu."
+
+#: session_option_editor.cc:222
+msgid "Prefix Take Name"
+msgstr "Füge Takenamen vorne ein"
+
+#: session_option_editor.cc:227
+msgid "Adds the Take Name to the beginning of the recorded file name."
+msgstr "Fügt den Take-Namen am Beginn des Dateinamens der Aufnahme hinzu."
+
+#: session_option_editor.cc:232
+msgid "Take Name"
+msgstr "Name übernehmen"
+
+#: session_option_editor.cc:245
+msgid ""
+"Track Input Monitoring automatically follows transport state (\"auto-input\")"
+msgstr ""
+"Spur-Eingangs-Monitoring folgt automatisch dem Transportstatus (\"auto-input"
+"\")"
+
+#: session_option_editor.cc:252
+msgid "Use monitor section in this session"
+msgstr "In diesem Projekt eine Monitorsektion verwenden"
+
+#: session_option_editor.cc:257 session_option_editor.cc:259
+#: session_option_editor.cc:266 session_option_editor.cc:273
+#: session_option_editor.cc:280 session_option_editor.cc:282
+#: session_option_editor.cc:289 session_option_editor.cc:296
+#: session_option_editor.cc:303 session_option_editor.cc:310
+#: session_option_editor.cc:312
+msgid "Meterbridge"
+msgstr "Meterbridge"
+
+#: session_option_editor.cc:257
+msgid "Route Display"
+msgstr "Routenanzeige"
+
+#: session_option_editor.cc:261
+msgid "Show Midi Tracks"
+msgstr "Zeige MIDI-Spuren"
+
+#: session_option_editor.cc:268
+msgid "Show Busses"
+msgstr "Zeige Busse"
+
+#: session_option_editor.cc:275
+msgid "Include Master Bus"
+msgstr "Zeige Master-Bus"
+
+#: session_option_editor.cc:280
+msgid "Button Area"
+msgstr "Schaltflächenbereich"
+
+#: session_option_editor.cc:284
+msgid "Rec-enable Button"
+msgstr "Schaltfläche für Aufnahmebereitschaft"
+
+#: session_option_editor.cc:291
+msgid "Mute Button"
+msgstr "Schaltfläche für Stummschaltung"
+
+#: session_option_editor.cc:298
+msgid "Solo Button"
+msgstr "Schaltfläche für Solostatus"
+
+#: session_option_editor.cc:305
+msgid "Monitor Buttons"
+msgstr "Monitor-Knöpfe"
+
+#: session_option_editor.cc:310
+msgid "Name Labels"
+msgstr "Namensfelder"
+
+#: session_option_editor.cc:314
+msgid "Track Name"
+msgstr "Spurname"
+
+#: session_option_editor.cc:325
+msgid "MIDI region copies are independent"
+msgstr "Kopien von MIDI Regionen sind unabhängig"
+
+#: session_option_editor.cc:332
+msgid ""
+"Policy for handling overlapping notes\n"
+" on the same MIDI channel"
+msgstr ""
+"Vorgehen bei überlappenden Noten\n"
+"am selben MIDI-Kanal"
+
+#: session_option_editor.cc:337
+msgid "never allow them"
+msgstr "Niemals erlauben"
+
+#: session_option_editor.cc:338
+msgid "don't do anything in particular"
+msgstr "Nichts bestimmtes tun"
+
+#: session_option_editor.cc:339
+msgid "replace any overlapped existing note"
+msgstr "Überlagerte Note ersetzen"
+
+#: session_option_editor.cc:340
+msgid "shorten the overlapped existing note"
+msgstr "Überlagerte Note kürzen"
+
+#: session_option_editor.cc:341
+msgid "shorten the overlapping new note"
+msgstr "Die überlagernde neue Note kürzen"
+
+#: session_option_editor.cc:342
+msgid "replace both overlapping notes with a single note"
+msgstr "Überlagernde Note mit einer einzelnen ersetzen"
+
+#: session_option_editor.cc:346
+msgid "Glue to bars and beats"
+msgstr "An Takte und Schläge binden"
+
+#: session_option_editor.cc:350
+msgid "Glue new markers to bars and beats"
+msgstr "Neue Marker an Takte und Schläge binden"
+
+#: session_option_editor.cc:357
+msgid "Glue new regions to bars and beats"
+msgstr "Neue Regionen an Takte und Schläge binden"
+
+#: session_option_editor.cc:362
+msgid "Defaults"
+msgstr "Voreinstellungen"
+
+#: session_option_editor.cc:364
+msgid "Use these settings as defaults"
+msgstr "Diese Einstellungen als Voreinstellungen nehmen"
+
+#: sfdb_ui.cc:89 sfdb_ui.cc:109 sfdb_ui.cc:118
+msgid "as new tracks"
+msgstr "als neue Spuren"
+
+#: sfdb_ui.cc:91 sfdb_ui.cc:111
+msgid "to selected tracks"
+msgstr "zu ausgewählten Spuren"
+
+#: sfdb_ui.cc:93 sfdb_ui.cc:113
+msgid "to region list"
+msgstr "zur Liste der Regionen"
+
+#: sfdb_ui.cc:95 sfdb_ui.cc:115
+msgid "as new tape tracks"
+msgstr "als neue Band-Spuren"
+
+#: sfdb_ui.cc:99
+msgid "programming error: unknown import mode string %1"
+msgstr "Programmierfehler: unbekannter Importmodus %1"
+
+#: sfdb_ui.cc:126
+msgid "Auto-play"
+msgstr "Auto-Play"
+
+#: sfdb_ui.cc:134 sfdb_ui.cc:323
+msgid "<b>Sound File Information</b>"
+msgstr "<b>Eigenschaften der Audiodatei</b>"
+
+#: sfdb_ui.cc:146
+msgid "Timestamp:"
+msgstr "Zeitstempel:"
+
+#: sfdb_ui.cc:148
+msgid "Format:"
+msgstr "Format:"
+
+#: sfdb_ui.cc:187 sfdb_ui.cc:652
+msgid "Tags:"
+msgstr "Stichworte:"
+
+#: sfdb_ui.cc:292 sfdb_ui.cc:408
+msgid "Could not read file: %1 (%2)."
+msgstr "Konnte Datei nicht lesen: %1 (%2)."
+
+#: sfdb_ui.cc:296
+msgid "<b>Midi File Information</b>"
+msgstr "<b>Midi Datei Information</b>"
+
+#: sfdb_ui.cc:457
+msgid "Could not access soundfile: "
+msgstr "Konnte auf Audiodatei nicht zugreifen: "
+
+#: sfdb_ui.cc:529
+msgid "SoundFileBox: Could not tokenize string: "
+msgstr "SoundFileBox: Konnte Zeichenkette nicht zerlegen: "
+
+#: sfdb_ui.cc:549 sfdb_ui.cc:551
+msgid "Search"
+msgstr "Suchen"
+
+#: sfdb_ui.cc:575
+msgid "Audio and MIDI files"
+msgstr "Audio- und MIDIdateien"
+
+#: sfdb_ui.cc:578
+msgid "Audio files"
+msgstr "Audiodateien"
+
+#: sfdb_ui.cc:581
+msgid "MIDI files"
+msgstr "MIDI-Dateien"
+
+#: sfdb_ui.cc:584 add_video_dialog.cc:123
+msgid "All files"
+msgstr "Alle Dateien"
+
+#: sfdb_ui.cc:603 add_video_dialog.cc:246
+msgid "Browse Files"
+msgstr "Durchsuchen"
+
+#: sfdb_ui.cc:632
+msgid "Paths"
+msgstr "Pfade"
+
+#: sfdb_ui.cc:641
+msgid "Search Tags"
+msgstr "Stichwortsuche"
+
+#: sfdb_ui.cc:657
+msgid "Sort:"
+msgstr "Sortierung:"
+
+#: sfdb_ui.cc:665
+msgid "Longest"
+msgstr "Längste"
+
+#: sfdb_ui.cc:666
+msgid "Shortest"
+msgstr "Kürzeste"
+
+#: sfdb_ui.cc:667
+msgid "Newest"
+msgstr "Neueste"
+
+#: sfdb_ui.cc:668
+msgid "Oldest"
+msgstr "Ältestes"
+
+#: sfdb_ui.cc:669
+msgid "Most downloaded"
+msgstr "Am häufigsten heruntergeladen"
+
+#: sfdb_ui.cc:670
+msgid "Least downloaded"
+msgstr "Am seltensten heruntergeladen"
+
+#: sfdb_ui.cc:671
+msgid "Highest rated"
+msgstr "Bestbewertetes"
+
+#: sfdb_ui.cc:672
+msgid "Lowest rated"
+msgstr "Am schlechtesten bewertetes"
+
+#: sfdb_ui.cc:677
+msgid "More"
+msgstr "Mehr"
+
+#: sfdb_ui.cc:681
+msgid "Similar"
+msgstr "Ähnlich"
+
+#: sfdb_ui.cc:693
+msgid "ID"
+msgstr "ID"
+
+#: sfdb_ui.cc:694 add_video_dialog.cc:83
+msgid "Filename"
+msgstr "Dateiname"
+
+#: sfdb_ui.cc:696
+msgid "Duration"
+msgstr "Dauer"
+
+#: sfdb_ui.cc:697
+msgid "Size"
+msgstr "Größe"
+
+#: sfdb_ui.cc:698
+msgid "Samplerate"
+msgstr "Samplerate"
+
+#: sfdb_ui.cc:699
+msgid "License"
+msgstr "Lizenz"
+
+#: sfdb_ui.cc:717
+msgid "Search Freesound"
+msgstr "Freesound durchsuchen"
+
+#: sfdb_ui.cc:737
+msgid "Press to import selected files and close this window"
+msgstr ""
+"Drücken Sie hier, um die angewählten Dateien zu importieren und dieses "
+"Fenster zu schließen"
+
+#: sfdb_ui.cc:738
+msgid "Press to import selected files and leave this window open"
+msgstr ""
+"Drücken Sie hier, um die angewählten Dateien zu importieren und dieses "
+"Fenster offen zu lassen"
+
+#: sfdb_ui.cc:739
+msgid "Press to close this window without importing any files"
+msgstr ""
+"Drücken Sie hier, um dieses Fenster zu schließen, ohne Dateien zu importieren"
+
+#: sfdb_ui.cc:935
+msgid "SoundFileBrowser: Could not tokenize string: "
+msgstr "SoundFileBrowser: Konnte Zeichenkete nicht zerlegen:"
+
+#: sfdb_ui.cc:1135
+msgid "%1 more page of 100 results available"
+msgid_plural "%1 more pages of 100 results available"
+msgstr[0] "%1 weitere Seite von 100 Ergebnissen verfügbar"
+msgstr[1] "%1 weitere Seiten von 100 Ergebnissen verfügbar"
+
+#: sfdb_ui.cc:1140
+msgid "No more results available"
+msgstr "Keine weiteren Ergebnisse verfügbar"
+
+#: sfdb_ui.cc:1204
+msgid "B"
+msgstr "B"
+
+#: sfdb_ui.cc:1206
+msgid "kB"
+msgstr "kB"
+
+#: sfdb_ui.cc:1208 sfdb_ui.cc:1210
+msgid "MB"
+msgstr "MB"
+
+#: sfdb_ui.cc:1212
+msgid "GB"
+msgstr "GB"
+
+#: sfdb_ui.cc:1424 sfdb_ui.cc:1737 sfdb_ui.cc:1800 sfdb_ui.cc:1818
+msgid "one track per file"
+msgstr "eine Spur pro Datei"
+
+#: sfdb_ui.cc:1427 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+msgid "one track per channel"
+msgstr "eine Spur pro Kanal"
+
+#: sfdb_ui.cc:1435 sfdb_ui.cc:1803 sfdb_ui.cc:1820
+msgid "sequence files"
+msgstr "Dateien aneinanderreihen"
+
+#: sfdb_ui.cc:1438 sfdb_ui.cc:1808
+msgid "all files in one track"
+msgstr "Alle Dateien in eine Spur"
+
+#: sfdb_ui.cc:1439 sfdb_ui.cc:1802
+msgid "merge files"
+msgstr "Dateien zusammenfügen"
+
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1805
+msgid "one region per file"
+msgstr "eine Region pro Datei"
+
+#: sfdb_ui.cc:1448 sfdb_ui.cc:1806
+msgid "one region per channel"
+msgstr "eine Region pro Kanal"
+
+#: sfdb_ui.cc:1453 sfdb_ui.cc:1807 sfdb_ui.cc:1821
+msgid "all files in one region"
+msgstr "alle Dateien in einer Region"
+
+#: sfdb_ui.cc:1520
+msgid ""
+"One or more of the selected files\n"
+"cannot be used by %1"
+msgstr ""
+"Eine oder mehrere der ausgewählten Dateien\n"
+"können von %1 nicht verwendet werden"
+
+#: sfdb_ui.cc:1664
+msgid "Copy files to session"
+msgstr "Kopiere Dateien in Projekt"
+
+#: sfdb_ui.cc:1681 sfdb_ui.cc:1858
+msgid "file timestamp"
+msgstr "Zeitstempel"
+
+#: sfdb_ui.cc:1682 sfdb_ui.cc:1860
+msgid "edit point"
+msgstr "Arbeitspunkt"
+
+#: sfdb_ui.cc:1683 sfdb_ui.cc:1862
+msgid "playhead"
+msgstr "Positionszeiger"
+
+#: sfdb_ui.cc:1684
+msgid "session start"
+msgstr "Projektanfang"
+
+#: sfdb_ui.cc:1690
+msgid "<b>Add files as ...</b>"
+msgstr "<b>Füge Dateien hinzu als...</b>"
+
+#: sfdb_ui.cc:1712
+msgid "<b>Insert at</b>"
+msgstr "<b>Einfügen bei</b>"
+
+#: sfdb_ui.cc:1725
+msgid "<b>Mapping</b>"
+msgstr "<b>Zuordnung</b>"
+
+#: sfdb_ui.cc:1743
+msgid "<b>Conversion quality</b>"
+msgstr "<b>Konvertierungsqualität:</b>"
+
+#: sfdb_ui.cc:1755
+msgid "<b>Instrument</b>"
+msgstr "<b>Instrument</b>"
+
+#: sfdb_ui.cc:1767 sfdb_ui.cc:1874
+msgid "Best"
+msgstr "bestmöglich"
+
+#: sfdb_ui.cc:1768 sfdb_ui.cc:1876
+msgid "Good"
+msgstr "gut"
+
+#: sfdb_ui.cc:1769 sfdb_ui.cc:1878
+msgid "Quick"
+msgstr "schnell"
+
+#: sfdb_ui.cc:1771
+msgid "Fastest"
+msgstr "Schnellstmöglich"
+
+#: shuttle_control.cc:56
+msgid "Shuttle speed control (Context-click for options)"
+msgstr "Abspielgeschwindigkeit (Rechtsklick für Optionen)"
+
+#: shuttle_control.cc:183
+msgid "Percent"
+msgstr "Prozent"
+
+#: shuttle_control.cc:191
+msgid "Units"
+msgstr "Einheiten"
+
+#: shuttle_control.cc:197 shuttle_control.cc:620
+msgid "Sprung"
+msgstr "Feder"
+
+#: shuttle_control.cc:201 shuttle_control.cc:623
+msgid "Wheel"
+msgstr "Drehrad"
+
+#: shuttle_control.cc:235
+msgid "Maximum speed"
+msgstr "Max. Geschwindigkeit"
+
+#: shuttle_control.cc:579
+msgid "Playing"
+msgstr "Wiedergabe"
+
+#: shuttle_control.cc:594
+#, c-format
+msgid "<<< %+d semitones"
+msgstr "<<< %+d Halbtöne"
+
+#: shuttle_control.cc:596
+#, c-format
+msgid ">>> %+d semitones"
+msgstr ">>> %+d Halbtöne"
+
+#: shuttle_control.cc:601
+msgid "Stopped"
+msgstr "Gestoppt"
+
+#: soundcloud_export_selector.cc:44
+msgid "User Email"
+msgstr "Benutzer Email"
+
+#: soundcloud_export_selector.cc:45
+msgid "Password"
+msgstr "Passwort"
+
+#: soundcloud_export_selector.cc:46
+msgid "Make files public"
+msgstr "Dateien öffentlich machen"
+
+#: soundcloud_export_selector.cc:47
+msgid "Open uploaded files in browser"
+msgstr "Hochgeladene Dateien in Browser öffnen"
+
+#: soundcloud_export_selector.cc:48
+msgid "Make files downloadable"
+msgstr "Dateien herunterladbar machen"
+
+#: soundcloud_export_selector.cc:107
+msgid "%1: %2 of %3 bytes uploaded"
+msgstr "%1: %2 von %3 bytes hochgeladen"
+
+#: splash.cc:73
+msgid "%1 loading ..."
+msgstr "%1 startet ..."
+
+#: speaker_dialog.cc:40
+msgid "Add Speaker"
+msgstr "Lautsprecher hinzufügen"
+
+#: speaker_dialog.cc:41
+msgid "Remove Speaker"
+msgstr "Lautsprecher entfernen"
+
+#: speaker_dialog.cc:63
+msgid "Azimuth:"
+msgstr "Azimut:"
+
+#: startup.cc:68
+msgid ""
+"Use an external mixer or the hardware mixer of your audio interface.\n"
+"%1 will play NO role in monitoring"
+msgstr ""
+"Verwende einen externen Mixer oder den Hardwaremixer der Audiohardware.\n"
+"%1 wird das Monitoring NICHT übernehmen."
+
+#: startup.cc:70
+msgid "Ask %1 to play back material as it is being recorded"
+msgstr "%1 soll laufende Aufnahmen wiedergeben"
+
+#: startup.cc:143
+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 "
+"video soundtracks, or experiment with new ideas about music and sound. \n"
+"\n"
+"There are a few things that need to be configured before you start using the "
+"program.</span> "
+msgstr ""
+"<span size=\"larger\">%1 ist eine Digital Audio Workstation (DAW). Sie "
+"können damit Mehrspuraufnahmen aufnehmen, editieren und mischen. Sie können "
+"Ihre eigenen CDs produzieren, Video Soundtracks mischen oder einfach mit "
+"neuen Musik- und Klangideen experimentieren.\n"
+"\n"
+"Es gibt ein paar Dinge, die vor dem ersten Programmstart konfiguriert werden "
+"müssen.</span>"
+
+#: startup.cc:169
+msgid "Welcome to %1"
+msgstr "Willkommen bei %1"
+
+#: startup.cc:192
+msgid "Default folder for %1 sessions"
+msgstr "Standardordner für %1 Projekte"
+
+#: startup.cc:198
+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"
+"\n"
+"Where would you like new %1 sessions to be stored by default?\n"
+"\n"
+"<i>(You can put new sessions anywhere, this is just a default)</i>"
+msgstr ""
+"Jedes Projekt in %1 hat seinen eigenen Ordner.\n"
+"Diese Ordner können sehr groß werden, wenn Sie aufnehmen.\n"
+"\n"
+"Wo soll %1 neue Projekte standardmäßig abspeichern?\n"
+"\n"
+"<i>(Neue Projekte können überall abgespeichert werden, dies ist nur die "
+"Vorgabe)</i>"
+
+#: startup.cc:221
+msgid "Default folder for new sessions"
+msgstr "Standardordner für neue Projekte"
+
+#: startup.cc:242
+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"
+"different ways to do this depending on the equipment you have and the\n"
+"configuration of that equipment. The two most common are presented here.\n"
+"Please choose whichever one is right for your setup.\n"
+"\n"
+"<i>(You can change this preference at any time, via the Preferences dialog)</"
+"i>\n"
+"\n"
+"<i>If you do not understand what this is about, just accept the default.</i>"
+msgstr ""
+"Während der Aufnahme von Instrumenten oder Gesang soll das Signal\n"
+"wahrscheinlich gleichzeitig abgehört und aufgenommen werden.\n"
+"Dies wird \"Monitoring\" genannt. Ausgehend von Ihrer\n"
+"Hardware gibt es verschiedenen Möglichkeiten hierfür.\n"
+"Die zwei meistgenutzten stehen hier zur Auswahl.\n"
+"Bitte wählen Sie, welche Konfiguration Ihren Wünschen entspricht.\n"
+"\n"
+"<i>(Diese Einstellung kann jederzeit über die globalen Einstellungen "
+"geändert werden)</i> \n"
+"\n"
+"<i>Im Zweifelsfall akzeptieren Sie einfach die Voreinstellung.</i>"
+
+#: startup.cc:263
+msgid "Monitoring Choices"
+msgstr "Auswahl des Monitoring"
+
+#: startup.cc:286
+msgid "Use a Master bus directly"
+msgstr "Nutze den Master-Bus direkt"
+
+#: startup.cc:288
+msgid ""
+"Connect the Master bus directly to your hardware outputs. This is preferable "
+"for simple usage."
+msgstr ""
+"Verbinde den Master-Bus direkt mit den Audioausgängen. Wird für einfache "
+"Anwendungen empfohlen."
+
+#: startup.cc:297
+msgid "Use an additional Monitor bus"
+msgstr "Nutze einen zusätzlichen Monitor-Bus"
+
+#: startup.cc:300
+msgid ""
+"Use a Monitor bus between Master bus and hardware outputs for \n"
+"greater control in monitoring without affecting the mix."
+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:322
+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"
+"\n"
+"<i>If you do not understand what this is about, just accept the default.</i>"
+msgstr ""
+"<i>Diese Einstellung können Sie jederzeit über den Dialog "
+"Projekteinstellungen \n"
+"ändern. Sie können auch die Monitorsektion in Ihren Projekten hinzufügen \n"
+"oder entfernen.</i>\n"
+"\n"
+"</i>Im Zweifelsfall akzeptieren Sie einfach die Voreinstellung.</i>"
+
+#: startup.cc:333
+msgid "Monitor Section"
+msgstr "Monitorsektion"
+
+#: step_entry.cc:60
+msgid "Step Entry: %1"
+msgstr "Eingabemodus (Step Entry): %1"
+
+#: step_entry.cc:65
+msgid ">beat"
+msgstr ">Schlag"
+
+#: step_entry.cc:66
+msgid ">bar"
+msgstr ">Takt"
+
+#: step_entry.cc:67
+msgid ">EP"
+msgstr ">AP"
+
+#: step_entry.cc:68
+msgid "sustain"
+msgstr "Sustain"
+
+#: step_entry.cc:69
+msgid "rest"
+msgstr "Pause"
+
+#: step_entry.cc:70
+msgid "g-rest"
+msgstr "R-Pause"
+
+#: step_entry.cc:71
+msgid "back"
+msgstr "zurück"
+
+#: step_entry.cc:82 step_entry.cc:85
+msgid "+"
+msgstr "+"
+
+#: step_entry.cc:191
+msgid "Set note length to a whole note"
+msgstr "Notenwert auf ganze Note setzen"
+
+#: step_entry.cc:192
+msgid "Set note length to a half note"
+msgstr "Notenwert auf halbe Note setzen"
+
+#: step_entry.cc:193
+msgid "Set note length to a quarter note"
+msgstr "Notenwert auf Viertelnote setzen"
+
+#: step_entry.cc:194
+msgid "Set note length to a eighth note"
+msgstr "Notenwert auf Achtelnote setzen"
+
+#: step_entry.cc:195
+msgid "Set note length to a sixteenth note"
+msgstr "Notenwert auf Sechzehntelnote setzen"
+
+#: step_entry.cc:196
+msgid "Set note length to a thirty-second note"
+msgstr "Notenwert auf Zweiunddreißigstelnote setzen"
+
+#: step_entry.cc:197
+msgid "Set note length to a sixty-fourth note"
+msgstr "Notenwert auf Vierundsechzigstelnote setzen"
+
+#: step_entry.cc:276
+msgid "Set volume (velocity) to pianississimo"
+msgstr "Lautstärke (velocity) auf pianississimo setzen"
+
+#: step_entry.cc:277
+msgid "Set volume (velocity) to pianissimo"
+msgstr "Lautstärke (velocity) auf pianissimo setzen"
+
+#: step_entry.cc:278
+msgid "Set volume (velocity) to piano"
+msgstr "Lautstärke (velocity) auf piano setzen"
+
+#: step_entry.cc:279
+msgid "Set volume (velocity) to mezzo-piano"
+msgstr "Lautstärke (velocity) auf mezzo-piano setzen"
+
+#: step_entry.cc:280
+msgid "Set volume (velocity) to mezzo-forte"
+msgstr "Lautstärke (velocity) auf mezzo-forte setzen"
+
+#: step_entry.cc:281
+msgid "Set volume (velocity) to forte"
+msgstr "Lautstärke (velocity) auf forte setzen"
+
+#: step_entry.cc:282
+msgid "Set volume (velocity) to fortissimo"
+msgstr "Lautstärke (Velocity) auf fortissimo setzen"
+
+#: step_entry.cc:283
+msgid "Set volume (velocity) to fortississimo"
+msgstr "Lautstärke (Velocity) auf fortississimo setzen"
+
+#: step_entry.cc:331
+msgid "Stack inserted notes to form a chord"
+msgstr "Einen Akkord eingeben (Noten stapeln)"
+
+#: step_entry.cc:332
+msgid "Extend selected notes by note length"
+msgstr "Ausgewählte Noten um Notenwert verlängern"
+
+#: step_entry.cc:333
+msgid "Use undotted note lengths"
+msgstr "Keine punktierten Notenwerte verwenden"
+
+#: step_entry.cc:334
+msgid "Use dotted (* 1.5) note lengths"
+msgstr "Punktierte Notenwerte (* 1,5)"
+
+#: step_entry.cc:335
+msgid "Use double-dotted (* 1.75) note lengths"
+msgstr "Doppelt punktierte Notenwerte (* 1,75)"
+
+#: step_entry.cc:336
+msgid "Use triple-dotted (* 1.875) note lengths"
+msgstr "Dreifach punktierte Notenwerte (* 1,875)"
+
+#: step_entry.cc:337
+msgid "Insert a note-length's rest"
+msgstr "Eine Pause einfügen"
+
+#: step_entry.cc:338
+msgid "Insert a grid-unit's rest"
+msgstr "Eine Pause in der Länge einer Rastereinheit einfügen"
+
+#: step_entry.cc:339
+msgid "Insert a rest until the next beat"
+msgstr "Eine Pause bis zum nächsten Schlag einfügen"
+
+#: step_entry.cc:340
+msgid "Insert a rest until the next bar"
+msgstr "Eine Pause bis zum nächsten Takt einfügen"
+
+#: step_entry.cc:341
+msgid "Insert a bank change message"
+msgstr "MIDI Bank Change einfügen"
+
+#: step_entry.cc:342
+msgid "Insert a program change message"
+msgstr "MIDI Program Change einfügen"
+
+#: step_entry.cc:343 step_entry.cc:700
+msgid "Move Insert Position Back by Note Length"
+msgstr "Um einen Notenwert zurück gehen"
+
+#: step_entry.cc:344 step_entry.cc:698
+msgid "Move Insert Position to Edit Point"
+msgstr "Eingabepunkt zum Arbeitspunkt verschieben"
+
+#: step_entry.cc:401
+msgid "1/Note"
+msgstr "1/Note"
+
+#: step_entry.cc:415
+msgid "Octave"
+msgstr "Oktave"
+
+#: step_entry.cc:598
+msgid "Insert Note A"
+msgstr "Note A Einfügen"
+
+#: step_entry.cc:599
+msgid "Insert Note A-sharp"
+msgstr "Ais einfügen"
+
+#: step_entry.cc:600
+msgid "Insert Note B"
+msgstr "Note H Einfügen"
+
+#: step_entry.cc:601
+msgid "Insert Note C"
+msgstr "Note C Einfügen"
+
+#: step_entry.cc:602
+msgid "Insert Note C-sharp"
+msgstr "Cis einfügen"
+
+#: step_entry.cc:603
+msgid "Insert Note D"
+msgstr "Note D Einfügen"
+
+#: step_entry.cc:604
+msgid "Insert Note D-sharp"
+msgstr "Dis einfügen"
+
+#: step_entry.cc:605
+msgid "Insert Note E"
+msgstr "Note E Einfügen"
+
+#: step_entry.cc:606
+msgid "Insert Note F"
+msgstr "Note F Einfügen"
+
+#: step_entry.cc:607
+msgid "Insert Note F-sharp"
+msgstr "Fis einfügen"
+
+#: step_entry.cc:608
+msgid "Insert Note G"
+msgstr "Note G Einfügen"
+
+#: step_entry.cc:609
+msgid "Insert Note G-sharp"
+msgstr "Gis einfügen"
+
+#: step_entry.cc:611
+msgid "Insert a Note-length Rest"
+msgstr "Eine Pause einfügen"
+
+#: step_entry.cc:612
+msgid "Insert a Snap-length Rest"
+msgstr "Eine Pause in der Länge einer Rastereinheit einfügen"
+
+#: step_entry.cc:614 step_entry.cc:615
+msgid "Move to next octave"
+msgstr "Zu nächster Oktave gehen"
+
+#: step_entry.cc:617
+msgid "Move to Next Note Length"
+msgstr "Zu nächster Notenlänge gehen"
+
+#: step_entry.cc:618
+msgid "Move to Previous Note Length"
+msgstr "Zu voriger Notenlänge gehen"
+
+#: step_entry.cc:620
+msgid "Increase Note Length"
+msgstr "Notenwert verlängern"
+
+#: step_entry.cc:621
+msgid "Decrease Note Length"
+msgstr "Notenwert kürzen"
+
+#: step_entry.cc:623
+msgid "Move to Next Note Velocity"
+msgstr "Zu nächster Velocity gehen"
+
+#: step_entry.cc:624
+msgid "Move to Previous Note Velocity"
+msgstr "Zu voriger Velocity gehen"
+
+#: step_entry.cc:626
+msgid "Increase Note Velocity"
+msgstr "Velocity erhöhen"
+
+#: step_entry.cc:627
+msgid "Decrease Note Velocity"
+msgstr "Velocity verringern"
+
+#: step_entry.cc:629
+msgid "Switch to the 1st octave"
+msgstr "Zur 1. Oktave wechseln"
+
+#: step_entry.cc:630
+msgid "Switch to the 2nd octave"
+msgstr "Zur 2. Oktave wechseln"
+
+#: step_entry.cc:631
+msgid "Switch to the 3rd octave"
+msgstr "Zur 3. Oktave wechseln"
+
+#: step_entry.cc:632
+msgid "Switch to the 4th octave"
+msgstr "Zur 4. Oktave wechseln"
+
+#: step_entry.cc:633
+msgid "Switch to the 5th octave"
+msgstr "Zur 5. Oktave wechseln"
+
+#: step_entry.cc:634
+msgid "Switch to the 6th octave"
+msgstr "Zur 6. Oktave wechseln"
+
+#: step_entry.cc:635
+msgid "Switch to the 7th octave"
+msgstr "Zur 7. Oktave wechseln"
+
+#: step_entry.cc:636
+msgid "Switch to the 8th octave"
+msgstr "Zur 8. Oktave wechseln"
+
+#: step_entry.cc:637
+msgid "Switch to the 9th octave"
+msgstr "Zur 9. Oktave wechseln"
+
+#: step_entry.cc:638
+msgid "Switch to the 10th octave"
+msgstr "Zur 10. Oktave wechseln"
+
+#: step_entry.cc:639
+msgid "Switch to the 11th octave"
+msgstr "Zur 11. Oktave wechseln"
+
+#: step_entry.cc:644
+msgid "Set Note Length to Whole"
+msgstr "Notenwert auf ganze Note setzen"
+
+#: step_entry.cc:646
+msgid "Set Note Length to 1/2"
+msgstr "Notenwert auf halbe Note setzen"
+
+#: step_entry.cc:648
+msgid "Set Note Length to 1/3"
+msgstr "Notenwert auf drittel Note setzen"
+
+#: step_entry.cc:650
+msgid "Set Note Length to 1/4"
+msgstr "Notenwert auf Viertelnote setzen"
+
+#: step_entry.cc:652
+msgid "Set Note Length to 1/8"
+msgstr "Notenwert auf Achtelnote setzen"
+
+#: step_entry.cc:654
+msgid "Set Note Length to 1/16"
+msgstr "Notenwert auf Sechzehntelnote setzen"
+
+#: step_entry.cc:656
+msgid "Set Note Length to 1/32"
+msgstr "Notenwert auf Zweiunddreißigstelnote setzen"
+
+#: step_entry.cc:658
+msgid "Set Note Length to 1/64"
+msgstr "Notenwert auf Vierundsechzigstelnote setzen"
+
+#: step_entry.cc:663
+msgid "Set Note Velocity to Pianississimo"
+msgstr "Lautstärke (velocity) auf pianississimo setzen"
+
+#: step_entry.cc:665
+msgid "Set Note Velocity to Pianissimo"
+msgstr "Lautstärke (velocity) auf pianissimo setzen"
+
+#: step_entry.cc:667
+msgid "Set Note Velocity to Piano"
+msgstr "Lautstärke (velocity) auf piano setzen"
+
+#: step_entry.cc:669
+msgid "Set Note Velocity to Mezzo-Piano"
+msgstr "Lautstärke (velocity) auf mezzo-piano setzen"
+
+#: step_entry.cc:671
+msgid "Set Note Velocity to Mezzo-Forte"
+msgstr "Lautstärke (velocity) auf mezzo-forte setzen"
+
+#: step_entry.cc:673
+msgid "Set Note Velocity to Forte"
+msgstr "Lautstärke (velocity) auf forte setzen"
+
+#: step_entry.cc:675 step_entry.cc:677
+msgid "Set Note Velocity to Fortississimo"
+msgstr "Lautstärke (velocity) auf fortississimo setzen"
+
+#: step_entry.cc:679
+msgid "Toggle Triple Notes"
+msgstr "Triolen an/aus"
+
+#: step_entry.cc:684
+msgid "No Dotted Notes"
+msgstr "Keine punktierten Noten"
+
+#: step_entry.cc:686
+msgid "Toggled Dotted Notes"
+msgstr "Punktierte Noten an/aus"
+
+#: step_entry.cc:688
+msgid "Toggled Double-Dotted Notes"
+msgstr "Doppelt punktierte Noten an/aus"
+
+#: step_entry.cc:690
+msgid "Toggled Triple-Dotted Notes"
+msgstr "Punktierte Triolen an/aus"
+
+#: step_entry.cc:693
+msgid "Toggle Chord Entry"
+msgstr "Akkordeingabe umschalten"
+
+#: step_entry.cc:695
+msgid "Sustain Selected Notes by Note Length"
+msgstr "Ausgewählte Noten ertönen über Notenlänge"
+
+#: stereo_panner.cc:128
+#, c-format
+msgid "L:%3d R:%3d Width:%d%%"
+msgstr "L:%3d R:%3d Breite:%d%%"
+
+#: stereo_panner.cc:271
+msgid "Panner|M"
+msgstr "M"
+
+#: stereo_panner_editor.cc:35
+msgid "Stereo Panner"
+msgstr "Stereo Panner"
+
+#: stereo_panner_editor.cc:49
+msgid "Width"
+msgstr "Breite"
+
+#: strip_silence_dialog.cc:44
+msgid "Strip Silence"
+msgstr "Stille entfernen"
+
+#: strip_silence_dialog.cc:75
+msgid "Minimum length"
+msgstr "Mindestlänge"
+
+#: strip_silence_dialog.cc:83
+msgid "Fade length"
+msgstr "Fade-Länge"
+
+#: tempo_dialog.cc:41 tempo_dialog.cc:57
+msgid "bar:"
+msgstr "Takt:"
+
+#: tempo_dialog.cc:42 tempo_dialog.cc:58
+msgid "beat:"
+msgstr "Schlag:"
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:59
+msgid "Pulse note"
+msgstr "Pulsnote"
+
+#: tempo_dialog.cc:44 tempo_dialog.cc:60
+msgid "Tap tempo"
+msgstr "Tempo tappen"
+
+#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:343
+#: tempo_dialog.cc:344
+msgid "whole"
+msgstr "Ganze"
+
+#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:345
+#: tempo_dialog.cc:346
+msgid "second"
+msgstr "Halbe"
+
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:347
+#: tempo_dialog.cc:348
+msgid "third"
+msgstr "Drittel"
+
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:349
+#: tempo_dialog.cc:350
+msgid "quarter"
+msgstr "Viertel"
+
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:351
+#: tempo_dialog.cc:352
+msgid "eighth"
+msgstr "Achtel"
+
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:353
+#: tempo_dialog.cc:354
+msgid "sixteenth"
+msgstr "Sechzehntel"
+
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:355
+#: tempo_dialog.cc:356
+msgid "thirty-second"
+msgstr "Zweiunddreissigstel"
+
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:357
+#: tempo_dialog.cc:358
+msgid "sixty-fourth"
+msgstr "Vierundsechzigstelnote"
+
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:359
+#: tempo_dialog.cc:360
+msgid "one-hundred-twenty-eighth"
+msgstr "Hundertachtundzwanzigstelnote"
+
+#: tempo_dialog.cc:121
+msgid "Beats per minute:"
+msgstr "Schläge pro Minute:"
+
+#: tempo_dialog.cc:155
+msgid "Tempo begins at"
+msgstr "Tempo beginnt bei"
+
+#: tempo_dialog.cc:254
+msgid "incomprehensible pulse note type (%1)"
+msgstr "Unverständlicher Puls-Notentyp (%1)"
+
+#: tempo_dialog.cc:375
+msgid "Note value:"
+msgstr "Notenwert:"
+
+#: tempo_dialog.cc:376
+msgid "Beats per bar:"
+msgstr "Schläge pro Takt:"
+
+#: tempo_dialog.cc:390
+msgid "Meter begins at bar:"
+msgstr "Taktart beginnt bei Takt:"
+
+#: tempo_dialog.cc:503
+msgid "incomprehensible meter note type (%1)"
+msgstr "Unverständlicher Signatur-Notentyp (%1)"
+
+#: theme_manager.cc:67
+msgid "Dark Theme"
+msgstr "Dunkles Thema"
+
+#: theme_manager.cc:68
+msgid "Light Theme"
+msgstr "Helles Thema"
+
+#: theme_manager.cc:69
+msgid "Restore Defaults"
+msgstr "Standards wiederherstellen"
+
+#: theme_manager.cc:70
+msgid "Draw \"flat\" buttons"
+msgstr "Zeichne \"flache\" Schaltflächen"
+
+#: theme_manager.cc:71
+msgid "Blink Rec-Arm buttons"
+msgstr "Aufnahmebereitschaftsknopf blinkt"
+
+#: theme_manager.cc:72
+msgid "Color regions using their track's color"
+msgstr "Färbe Regionen in der Spurfarbe ein"
+
+#: theme_manager.cc:73
+msgid "Show waveform clipping"
+msgstr "Clipping der Wellenform anzeigen"
+
+#: theme_manager.cc:75
+msgid "Waveforms color gradient depth"
+msgstr "Farbverlaufs-Intensität der Wellenform"
+
+#: theme_manager.cc:77
+msgid "Timeline item gradient depth"
+msgstr "Farbverlaufs-Intensität von Zeitleisten-Objekten "
+
+#: theme_manager.cc:78
+msgid "All floating windows are dialogs"
+msgstr "Alle schwebenden Fenster sind Dialoge"
+
+#: theme_manager.cc:79
+msgid "Transient windows follow front window."
+msgstr "Transientenfenster folgt Hauptfenster"
+
+#: theme_manager.cc:80
+msgid "Icon Set"
+msgstr "Icon-Satz"
+
+#: theme_manager.cc:89
+msgid "Object"
+msgstr "Objekt"
+
+#: theme_manager.cc:165
+msgid "Items"
+msgstr "Objekte"
+
+#: theme_manager.cc:166
+msgid "Palette"
+msgstr "Palette"
+
+#: theme_manager.cc:167
+msgid "Transparency"
+msgstr "Transparenz"
+
+#: theme_manager.cc:197
+msgid ""
+"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
+"\" for some.\n"
+"This may help with some window managers. This requires a restart of %1 to "
+"take effect"
+msgstr ""
+"Markiere alle schwebenden Fenster als Typ \"Dialog\", statt für einige "
+"\"Utility\" zu verwenden.\n"
+"Dies kann bei einigen Fenstermanagern helfen. Sie müssen %1 starten, um "
+"diese Option zu aktivieren"
+
+#: theme_manager.cc:201
+msgid ""
+"Make transient windows follow the front window when toggling between the "
+"editor and mixer.\n"
+"This requires a restart of %1 to take effect"
+msgstr ""
+"Kurzlebige Fenster folgen bei Wechsel zwischen Editor und Mixer dem "
+"Vordergrund-Fenster.\n"
+"Dies erfordert einen Neustart von %1."
+
+#: theme_manager.cc:635
+msgid "Color Palette"
+msgstr "Farbpalette"
+
+#: time_axis_view.cc:150
+msgid "Track/Bus name (double click to edit)"
+msgstr "Spur-/Busname (Doppelklick zum Bearbeiten)"
+
+#: time_axis_view_item.cc:333
+msgid "new duration %1 frame is out of bounds for %2"
+msgid_plural "new duration of %1 frames is out of bounds for %2"
+msgstr[0] "neue Dauer %1 Frame ist außerhalb des erlaubten Bereichs für %2"
+msgstr[1] "neue Dauer %1 Frames ist außerhalb des erlaubten Bereichs für %2"
+
+#: time_fx_dialog.cc:62
+msgid "Quick but Ugly"
+msgstr "Schnell, aber hässlich"
+
+#: time_fx_dialog.cc:63
+msgid "Skip Anti-aliasing"
+msgstr "Überspringe Anti-Aliasing"
+
+#: time_fx_dialog.cc:64
+msgid "Contents:"
+msgstr "Inhalt:"
+
+#: time_fx_dialog.cc:65
+msgid "Minimize time distortion"
+msgstr "zeitliche Verzerrung minimieren"
+
+#: time_fx_dialog.cc:66
+msgid "Preserve Formants"
+msgstr "Formanten beibehalten"
+
+#: time_fx_dialog.cc:71
+msgid "TimeFXDialog"
+msgstr "TimeFXDialog"
+
+#: time_fx_dialog.cc:74
+msgid "Pitch Shift Audio"
+msgstr "Tonhöhe ändern"
+
+#: time_fx_dialog.cc:76
+msgid "Time Stretch Audio"
+msgstr "Time Stretch Audio"
+
+#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+msgid "Octaves:"
+msgstr "Oktaven:"
+
+#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+msgid "Semitones:"
+msgstr "Halbtöne:"
+
+#: time_fx_dialog.cc:114
+msgid "Cents:"
+msgstr "Cents:"
+
+#: time_fx_dialog.cc:122
+msgid "Time|Shift"
+msgstr "Tonhöhe ändern"
+
+#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+msgid "TimeFXButton"
+msgstr "TimeFXButton"
+
+#: time_fx_dialog.cc:154
+msgid "Stretch/Shrink"
+msgstr "Strecken/Stauchen"
+
+#: time_fx_dialog.cc:164
+msgid "<b>Progress</b>"
+msgstr "<b>Fortschritt</b>"
+
+#: time_info_box.cc:124
+msgid "Start recording at auto-punch start"
+msgstr "Aufnahme am Anfang des Punchbereichs starten"
+
+#: time_info_box.cc:125
+msgid "Stop recording at auto-punch end"
+msgstr "Aufnahme am Ende des Punchbereichs beenden"
+
+#: time_selection.cc:40
+msgid "programming error: request for non-existent audio range (%1)!"
+msgstr ""
+"Programmierfehler: nichtexistenter Audiobereich wurde angefordert (%1)!"
+
+#: transform_dialog.cc:39
+msgid "this note's"
+msgstr "dieser Note"
+
+#: transform_dialog.cc:40
+msgid "the previous note's"
+msgstr "der vorigen Note"
+
+#: transform_dialog.cc:41
+msgid "this note's index"
+msgstr "Index der Note"
+
+#: transform_dialog.cc:42
+msgid "the number of notes"
+msgstr "Anzahl der Noten"
+
+#: transform_dialog.cc:43
+msgid "exactly"
+msgstr "genau"
+
+#: transform_dialog.cc:44
+msgid "a random number from"
+msgstr "eine zufällige Nummer von"
+
+#: transform_dialog.cc:55
+msgid "equal steps from"
+msgstr "gleiche Schritte von"
+
+#: transform_dialog.cc:58
+msgid "note number"
+msgstr "Notennummer"
+
+#: transform_dialog.cc:59
+msgid "velocity"
+msgstr "Velocity"
+
+#: transform_dialog.cc:60
+msgid "start time"
+msgstr "Beginnzeit"
+
+#: transform_dialog.cc:61
+msgid "length"
+msgstr "Länge"
+
+#: transform_dialog.cc:82 transform_dialog.cc:113
+msgid "Transform"
+msgstr "Transformiere"
+
+#: transform_dialog.cc:91
+msgid "Set "
+msgstr "Setze"
+
+#: transpose_dialog.cc:30
+msgid "Transpose MIDI"
+msgstr "MIDI Transponieren"
+
+#: transpose_dialog.cc:55
+msgid "Transpose"
+msgstr "Transponieren"
+
+#: ui_config.cc:179 ui_config.cc:317
+msgid "Loading default ui configuration file %1"
+msgstr "lade voreingestellte UI-Konfigurationsdatei %1"
+
+#: ui_config.cc:182 ui_config.cc:320
+msgid "cannot read default ui configuration file \"%1\""
+msgstr "Kann die voreingestellte UI-Konfigurationsdatei \"%1\" nicht lesen"
+
+#: ui_config.cc:185 ui_config.cc:325
+msgid "default ui configuration file \"%1\" not loaded successfully."
+msgstr ""
+"Die voreingestellte UI-Konfigurationsdatei \"%1\" konnte nicht geladen "
+"werden."
+
+#: ui_config.cc:193
+msgid "Could not find default UI configuration file %1"
+msgstr "Konnte UI-Konfigurationsdatei für Voreinstellungen %1 nicht finden"
+
+#: ui_config.cc:236
+msgid "Loading color file %1"
+msgstr "Lade Farbdatei %1"
+
+#: ui_config.cc:239
+msgid "cannot read color file \"%1\""
+msgstr "kann Farbdatei \"%1\" nicht lesen"
+
+#: ui_config.cc:244
+msgid "color file \"%1\" not loaded successfully."
+msgstr "Farbdatei \"%1\" konnte nicht geladen werden."
+
+#: ui_config.cc:250
+msgid "Color file %1 not found"
+msgstr "Farbdatei %1 nicht gefunden"
+
+#: ui_config.cc:299 ui_config.cc:378
+msgid "Color file %1 not saved"
+msgstr "Farbdatei %1 nicght gespeichert"
+
+#: ui_config.cc:334
+msgid "Loading user ui configuration file %1"
+msgstr "Lade benutzerdefinierte UI-Konfigurationsdatei %1"
+
+#: ui_config.cc:337
+msgid "cannot read ui configuration file \"%1\""
+msgstr "kann die UI-Konfigurationsdatei \"%1\" nicht lesen"
+
+#: ui_config.cc:342
+msgid "user ui configuration file \"%1\" not loaded successfully."
+msgstr ""
+"Die benutzerdefinierte UI-Konfigurationsdatei \"%1\" konnte nicht geladen "
+"werden."
+
+#: ui_config.cc:350
+msgid "could not find any ui configuration file, canvas will look broken."
+msgstr ""
+"Konnte keine UI-Konfigurationsdatei finden, die Arbeitsfläche wird nicht "
+"korrekt dargestellt werden."
+
+#: ui_config.cc:368
+msgid "Config file %1 not saved"
+msgstr "Konfigurationsdatei %1 nicht gespeichert"
+
+#: ui_config.cc:609
+msgid "Color %1 not found"
+msgstr "Farbe %1 nicht gefunden"
+
+#: ui_config.cc:679
+msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
+msgstr ""
+"Kann den UI-Stil Datei %1 im Suchpfad %2 nicht finden. %3 wird merkwürdig "
+"aussehen"
+
+#: utils.cc:117 utils.cc:160
+msgid "bad XPM header %1"
+msgstr "Fehlerhafter XPM Header %1"
+
+#: utils.cc:577
+msgid "cannot find XPM file for %1"
+msgstr "Konnte XPM-Datei für %1 nicht finden"
+
+#: utils.cc:597 utils.cc:627 utils.cc:641
+msgid "default"
+msgstr "voreingestellt"
+
+#: utils.cc:642
+msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
+msgstr ""
+"Icon \"%1\" wurde im Icon-Satz \"%2\" nicht gefunden, greife auf "
+"Voreinstellung zurück"
+
+#: utils.cc:649
+msgid "cannot find icon image for %1 using %2"
+msgstr "Konnte Icon-Bild für %1 unter %2 nicht finden"
+
+#: utils.cc:666 utils.cc:682
+msgid "Caught exception while loading icon named %1"
+msgstr ""
+"Während des Ladens des Icons mit dem Namen %1 trat ein Ausnahmefehler auf"
+
+#: add_video_dialog.cc:54
+msgid "Set Video Track"
+msgstr "Videospur-Einstellungen"
+
+#: add_video_dialog.cc:62
+msgid "Open Video Monitor Window"
+msgstr "Videomonitorfenster öffnen"
+
+#: add_video_dialog.cc:63
+msgid "Adjust Session Framerate to Match Video Framerate"
+msgstr "Projekt-Framerate an Video-Framerate anpassen"
+
+#: add_video_dialog.cc:65
+msgid "Reload docroot"
+msgstr "docroot neu laden"
+
+#: add_video_dialog.cc:120
+msgid "Video files"
+msgstr "Videodateien"
+
+#: add_video_dialog.cc:149
+msgid "<b>Video Information</b>"
+msgstr "<b>Videoinformationen</b>"
+
+#: add_video_dialog.cc:152
+msgid "Start:"
+msgstr "Start:"
+
+#: add_video_dialog.cc:158
+msgid "Frame rate:"
+msgstr "Framerate:"
+
+#: add_video_dialog.cc:161
+msgid "Aspect Ratio:"
+msgstr "Seitenverhältnis:"
+
+#: add_video_dialog.cc:244
+msgid "VideoServerIndex"
+msgstr "VideoServerIndex"
+
+#: add_video_dialog.cc:675
+msgid " %1 fps"
+msgstr " %1 fps"
+
+#: video_timeline.cc:472
+msgid ""
+"Parsing video file info failed. Is the Video Server running? Is the file "
+"readable by the Video Server? Does the docroot match? Is it a video file?"
+msgstr ""
+"Fehler beim Parsen der Videodatei. Läuft der Videoserver? Ist die Datei für "
+"den Videoserver lesbar? Ist die docroot passend eingestellt? Ist die Datei "
+"tatsächlich eine Videodatei?"
+
+#: video_timeline.cc:510
+msgid ""
+"Failed to set session-framerate: '%1' does not have a corresponding option "
+"setting in %2."
+msgstr ""
+"Setzen der Projektframerate fehlgeschlagen: '%1' hat keine entsprechende "
+"Einstellungsoption in %2."
+
+#: video_timeline.cc:518
+msgid ""
+"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
+"vs '%3'"
+msgstr ""
+"Framerate der Videodatei entspricht nicht der Framerate des Timecodes im %1-"
+"Projekt: '%2' vs. '%3'"
+
+#: video_timeline.cc:591
+msgid ""
+"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
+"means that the video server was not started by %1 and uses a different "
+"document-root."
+msgstr ""
+"Docroot des Videoserver stimmt nicht überein. %1: '%2', Videoserver: '%3'. "
+"Das bedeutet üblicherweise, dass der Videoserver nicht von %1 gestartet "
+"wurde und einen anderen Dokumenten-Wurzelpfad verwendet."
+
+#: video_timeline.cc:728
+msgid ""
+"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
+"(a custom path to xjadeo can be specified by setting the XJREMOTE "
+"environment variable. It should point to an application compatible with "
+"xjadeo's remote-control interface 'xjremote').\n"
+"\n"
+"see also http://manual.ardour.org/video-timeline/setup/"
+msgstr ""
+"Der Videomonitor 'xjadeo' wurde nicht gefunden. Bitte installieren Sie "
+"http://xjadeo.sf.net/ (ein benutzerspezifischer Pfad für xjadeo kann durch "
+"Setzen der Umgebungsvariablen XJREMOTE angegeben werden. Er sollte auf ein "
+"Programm zeigen, das zu dem Fernsteuerungsprotokoll 'xjremote' von xjadeo "
+"kompatibel ist).\n"
+"\n"
+"Siehe auch http://manual.ardour.org/video-timeline/setup/"
+
+#: video_timeline.cc:743
+msgid "Video-monitor 'xjadeo' cannot be launched."
+msgstr "Videomonitor 'xjadeo' kann nicht gestartet werden."
+
+#: video_timeline.cc:769
+msgid ""
+"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.8.0 or "
+"later. http://xjadeo.sf.net/"
+msgstr ""
+"Videomonitor 'xjadeo' ist zu alt. Bitte installieren Sie xjadeo in Version "
+"0.8.0 oder "
+"höher. http://xjadeo.sf.net/"
+
+#: video_monitor.cc:285
+msgid "Video Monitor: File Not Found."
+msgstr "Videomonitor: Datei nicht gefunden."
+
+#: transcode_ffmpeg.cc:56
+msgid ""
+"No ffprobe or ffmpeg executables could be found on this system.\n"
+"Video import and export is not possible until you install those tools.\n"
+"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"\n"
+"The tools are included with the %1 releases from ardour.org and also "
+"available with the video-server at http://x42.github.com/harvid/\n"
+"\n"
+"Important: the files need to be installed in $PATH and named ffmpeg_harvid "
+"and ffprobe_harvid.\n"
+"If you already have a suitable ffmpeg installation on your system, we "
+"recommend creating symbolic links from ffmpeg to ffmpeg_harvid and from "
+"ffprobe to ffprobe_harvid.\n"
+"\n"
+"see also http://manual.ardour.org/video-timeline/setup/"
+msgstr ""
+"Die Programme ffprobe oder ffmpeg konnten auf diesem System nicht gefunden "
+"werden.\n"
+"Bis diese Werkzeuge installiert sind, ist Videoexport nicht möglich.\n"
+"%1 benötigt ffmpeg und ffprobe von ffmpeg.org in der Version 1.1 oder "
+"neuer.\n"
+"\n"
+"Diese Werkzeuge sind in den %1-Paketen von ardour.org inkludiert und auch "
+"mit dem Videoserver auf http://x42.github.com/harvid/ erhältlich.\n"
+"\n"
+"Wichtig: die Dateien müssen in $PATH installiert sein und die Namen "
+"ffmpeg_harvid und ffprobe_harvid.\n"
+"Falls Sie bereits eine ffmpeg Installation auf Ihrem System haben, empfehlen "
+"wir, symbolische Links von ffmpeg zu ffmpeg_harvid und von ffprobe zu "
+"ffprobe_harvid anzulegen.\n"
+"\n"
+"Siehe auch http://manual.ardour.org/video-timeline/setup/"
+
+#: transcode_video_dialog.cc:56
+msgid "Transcode/Import Video File "
+msgstr "Videodatei transkodieren/importieren"
+
+#: transcode_video_dialog.cc:58
+msgid "Output File:"
+msgstr "Ausgabedatei:"
+
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
+msgid "Abort"
+msgstr "Abbruch"
+
+#: transcode_video_dialog.cc:63
+msgid "Height = "
+msgstr "Höhe ="
+
+#: transcode_video_dialog.cc:66
+msgid "Manual Override"
+msgstr "Manuelle Eingabe"
+
+#: transcode_video_dialog.cc:70 export_video_dialog.cc:99
+msgid "Debug Mode: Print ffmpeg command and output to stdout."
+msgstr "Debug-Modus: gibt die ffmpeg-Befehlszeile und -Ausgabe an stdout aus."
+
+#: transcode_video_dialog.cc:107
+msgid "<b>File Information</b>"
+msgstr "<b>Dateiinformationen</b>"
+
+#: transcode_video_dialog.cc:113
+msgid ""
+"No ffprobe or ffmpeg executables could be found on this system. Video Import "
+"is not possible until you install those tools. See the Log window for more "
+"information."
+msgstr ""
+"Die Programme ffprobe oder ffmpeg konnten auf diesem System nicht gefunden "
+"werden. Bis diese Werkzeuge installiert sind, ist Videoimport nicht möglich. "
+"Sehen Sie im Log-Fenster nach weiteren Informationen."
+
+#: transcode_video_dialog.cc:120
+msgid ""
+"File-info can not be read. Most likely '%1' is not a valid video-file or an "
+"unsupported video codec or format."
+msgstr ""
+"Dateiinformationen können nicht gelesen werden. Vermutlich ist '%1' keine "
+"gültige Videodatei, oder enthält einen nicht unterstützten Videocodec bzw. "
+"ein nicht unterstütztes Videoformat."
+
+#: transcode_video_dialog.cc:137
+msgid "FPS:"
+msgstr "FPS:"
+
+#: transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr "Dauer:"
+
+#: transcode_video_dialog.cc:141
+msgid "Codec:"
+msgstr "Codec:"
+
+#: transcode_video_dialog.cc:143
+msgid "Geometry:"
+msgstr "Geometrie:"
+
+#: transcode_video_dialog.cc:158
+msgid "??"
+msgstr "??"
+
+#: transcode_video_dialog.cc:179
+msgid "<b>Import Settings</b>"
+msgstr "<b>Importeinstellungen</b>"
+
+#: transcode_video_dialog.cc:186
+msgid "Reference From Current Location (Previously Transcoded Files Only)"
+msgstr ""
+"Referenz von momentaner Position (vorher nur von transkodierten Dateien)"
+
+#: transcode_video_dialog.cc:187
+msgid "Import/Transcode Video to Session"
+msgstr "Video ins Projekt transkodieren/importieren"
+
+#: transcode_video_dialog.cc:190 transcode_video_dialog.cc:200
+msgid "Do Not Import Video (Audio Import Only)"
+msgstr "Video nicht importieren (nur Audio)"
+
+#: transcode_video_dialog.cc:210
+msgid "Do Not Import Video"
+msgstr "Video nicht importieren"
+
+#: transcode_video_dialog.cc:226
+msgid "Scale Video: Width = "
+msgstr "Video skalieren: Breite = "
+
+#: transcode_video_dialog.cc:233
+msgid "Original Width"
+msgstr "Originalbreite"
+
+#: transcode_video_dialog.cc:248
+msgid "Bitrate (KBit/s):"
+msgstr "Bitrate (KBit/s):"
+
+#: transcode_video_dialog.cc:253
+msgid "Extract Audio:"
+msgstr "Audio extrahieren:"
+
+#: transcode_video_dialog.cc:258
+msgid "No Audio Track Present"
+msgstr "Keine Audiospur"
+
+#: transcode_video_dialog.cc:261
+msgid "Do Not Extract Audio"
+msgstr "Audio nicht extrahieren"
+
+#: transcode_video_dialog.cc:376
+msgid "Extracting Audio.."
+msgstr "Extrahiere Audio..."
+
+#: transcode_video_dialog.cc:379
+msgid "Audio Extraction Failed."
+msgstr "Extrahieren des Audio gescheitert."
+
+#: transcode_video_dialog.cc:405
+msgid "Transcoding Video.."
+msgstr "Transkodiere Video.."
+
+#: transcode_video_dialog.cc:439
+msgid "Transcoding Failed."
+msgstr "Transkodieren gescheitert"
+
+#: transcode_video_dialog.cc:529
+msgid "Save Transcoded Video File"
+msgstr "Sichere transkodierte Videodatei"
+
+#: video_server_dialog.cc:52
+msgid "Launch Video Server"
+msgstr "Video-Server starten"
+
+#: video_server_dialog.cc:53
+msgid "Server Executable:"
+msgstr "Server-Datei:"
+
+#: video_server_dialog.cc:55
+msgid "Server Docroot:"
+msgstr "Server Docroot:"
+
+#: video_server_dialog.cc:61
+msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
+msgstr ""
+"Diesen Dialog nicht mehr anzeigen (kann in Einstellungen geändert werden)."
+
+#: video_server_dialog.cc:97
+msgid ""
+"The external video server 'harvid' can not be found.\n"
+"The tool is included with the %1 releases from ardour.org, alternatively you "
+"can download it from http://x42.github.com/harvid/ or acquire it from your "
+"distribution.\n"
+"\n"
+"see also http://manual.ardour.org/video-timeline/setup/"
+msgstr "key"
+
+#: video_server_dialog.cc:129
+msgid "Listen Address:"
+msgstr "Eingehende Adresse:"
+
+#: video_server_dialog.cc:134
+msgid "Listen Port:"
+msgstr "Eingehender Port:"
+
+#: video_server_dialog.cc:139
+msgid "Cache Size:"
+msgstr "Cachegröße"
+
+#: video_server_dialog.cc:145
+msgid ""
+"%1 relies on an external video server for the videotimeline.\n"
+"The server configured in Edit -> Preferences -> Video is not reachable.\n"
+"Do you want %1 to launch 'harvid' on this machine?"
+msgstr ""
+"%1 benötigt einen externen Videoserver für die Video-Zeitleiste.\n"
+"Der in Bearbeiten -> Globale Einstellungen -> Video konfigurierte Server ist "
+"nicht erreichbar.\n"
+"Möchten Sie, daß %1 \"harvid\" auf diesem Computer startet?"
+
+#: video_server_dialog.cc:189
+msgid "Set Video Server Executable"
+msgstr "Setze Video-Serverpfad"
+
+#: video_server_dialog.cc:209
+msgid "Server docroot"
+msgstr "Server-docroot"
+
+#: utils_videotl.cc:60
+msgid "Destination is outside Video Server's docroot. "
+msgstr "Ziel ist ausserhalb der docroot des Videoservers."
+
+#: utils_videotl.cc:61
+msgid ""
+"The destination file path is outside of the Video Server's docroot. The file "
+"will not be readable by the Video Server. Do you still want to continue?"
+msgstr ""
+"Der Dateipfad des Zieles befindet sich ausserhalb der docroot des "
+"Videoservers. Die Datei wird für den Videoserver nicht lesbar sein. Wollen "
+"Sie wirklich fortfahren?"
+
+#: utils_videotl.cc:64
+msgid "Continue"
+msgstr "Fortfahren"
+
+#: utils_videotl.cc:70
+msgid "Confirm Overwrite"
+msgstr "Bestätige das Überschreiben"
+
+#: utils_videotl.cc:71
+msgid "A file with the same name already exists. Do you want to overwrite it?"
+msgstr ""
+"Eine Datei mit diesem Namen existiert bereits. Wollen Sie sie überschreiben?"
+
+#: utils_videotl.cc:81 utils_videotl.cc:97
+msgid "Cannot create video folder \"%1\" (%2)"
+msgstr "Kann Videoordner \"%1\" nicht erstellen (%2)"
+
+#: export_video_dialog.cc:67
+msgid "Export Video File "
+msgstr "Exportiere Videodatei"
+
+#: export_video_dialog.cc:78
+msgid "Video:"
+msgstr "Video:"
+
+#: export_video_dialog.cc:83
+msgid "Scale Video (W x H):"
+msgstr "Skaliere Video (W x H):"
+
+#: export_video_dialog.cc:84
+msgid "Retain Aspect"
+msgstr "Seitenverhältnis beibehalten"
+
+#: export_video_dialog.cc:89
+msgid "Set Aspect Ratio:"
+msgstr "Seitenverhältnis:"
+
+#: export_video_dialog.cc:90
+msgid "Normalize Audio"
+msgstr "Audio normalisieren"
+
+#: export_video_dialog.cc:91
+msgid "2 Pass Encoding"
+msgstr "Enkodiere in 2 Durchgängen"
+
+#: export_video_dialog.cc:92
+msgid "Codec Optimizations:"
+msgstr "Codec-Optimierungen:"
+
+#: export_video_dialog.cc:94
+msgid "Deinterlace"
+msgstr "Deinterlacing anwenden"
+
+#: export_video_dialog.cc:95
+msgid "Use [2] B-frames (MPEG 2 or 4 only)"
+msgstr "Verwende [2] B-frames (nur MPEG 2 oder 4)"
+
+#: export_video_dialog.cc:96
+msgid "Override FPS (Default is to retain FPS from the input video file):"
+msgstr "FPS erzwingen (Voreinstellung: FPS der Videodatei wird beibehalten):"
+
+#: export_video_dialog.cc:97
+msgid "Include Session Metadata"
+msgstr "Projekt-Metadaten verwenden"
+
+#: export_video_dialog.cc:115
+msgid ""
+"No ffprobe or ffmpeg executables could be found on this system. Video Export "
+"is not possible until you install those tools. See the Log window for more "
+"information."
+msgstr ""
+"Die Programme ffprobe oder ffmpeg konnten auf diesem System nicht gefunden "
+"werden. Bis diese Werkzeuge installiert sind, ist Videoexport nicht möglich. "
+"Sehen Sie im Log-Fenster nach weiteren Informationen."
+
+#: export_video_dialog.cc:126
+msgid "<b>Output:</b> (file extension defines format)"
+msgstr "<b>Ausgabe:</b> (Dateierweiterung definiert das Format)"
+
+#: export_video_dialog.cc:136
+msgid "<b>Input Video:</b>"
+msgstr "<b>Eingabevideo:</b>"
+
+#: export_video_dialog.cc:147
+msgid "Audio:"
+msgstr "Audio:"
+
+#: export_video_dialog.cc:149
+msgid "Master Bus"
+msgstr "Masterbus"
+
+#: export_video_dialog.cc:154
+msgid "from the %1 session's start to the session's end"
+msgstr "von %1 Projektbeginn bis -ende"
+
+#: export_video_dialog.cc:157
+msgid "<b>Settings:</b>"
+msgstr "<b>Einstellungen:</b>"
+
+#: export_video_dialog.cc:165
+msgid "Range:"
+msgstr "Bereich:"
+
+#: export_video_dialog.cc:171
+msgid "Video Codec:"
+msgstr "Videocodec:"
+
+#: export_video_dialog.cc:174
+msgid "Video KBit/s:"
+msgstr "Video KBit/s:"
+
+#: export_video_dialog.cc:177
+msgid "Audio Codec:"
+msgstr "Audiocodec:"
+
+#: export_video_dialog.cc:180
+msgid "Audio KBit/s:"
+msgstr "Audio KBit/s:"
+
+#: export_video_dialog.cc:183
+msgid "Audio Samplerate:"
+msgstr "Audiosamplerate:"
+
+#: export_video_dialog.cc:218 export_video_dialog.cc:227
+#: export_video_dialog.cc:810 export_video_dialog.cc:813
+msgid "(default for format)"
+msgstr "(Voreinstellung für Format)"
+
+#: export_video_dialog.cc:238 export_video_dialog.cc:251
+#: export_video_dialog.cc:817 export_video_dialog.cc:826
+msgid "(default)"
+msgstr "(Voreinstellung)"
+
+#: export_video_dialog.cc:252 export_video_dialog.cc:820
+msgid "(retain)"
+msgstr "(beibehalten)"
+
+#: export_video_dialog.cc:344
+msgid "from 00:00:00:00 to the video's end"
+msgstr "von 00:00:00:00 bis Videoende"
+
+#: export_video_dialog.cc:346
+msgid "from the video's start to the video's end"
+msgstr "von Videostart bis Videoende"
+
+#: export_video_dialog.cc:349
+msgid "Selected range"
+msgstr "Ausgewählter Bereich"
+
+#: export_video_dialog.cc:569
+msgid "Normalizing audio"
+msgstr "Audio normalisieren"
+
+#: export_video_dialog.cc:573
+msgid "Exporting audio"
+msgstr "Exportiere Audio"
+
+#: export_video_dialog.cc:628
+msgid "Exporting Audio..."
+msgstr "Exportiere Audio..."
+
+#: export_video_dialog.cc:685
+msgid ""
+"Export Video: Cannot query duration of video-file, using duration from "
+"timeline instead."
+msgstr ""
+"Exportiere Video: Kann die Dauer der Videodatei nicht eruieren, verwende "
+"statt dessen die Dauer aus der Zeitleiste."
+
+#: export_video_dialog.cc:715
+msgid "Export Video: export-range does not include video."
+msgstr "Video Export: Exportbereich enthält kein Video."
+
+#: export_video_dialog.cc:728
+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:770
+msgid "Encoding Video..."
+msgstr "Enkodiere Video..."
+
+#: export_video_dialog.cc:790
+msgid "Export Video: Video input file cannot be read."
+msgstr "Exportiere Video: Die Videoquelldatei kann nicht gelesen werden."
+
+#: export_video_dialog.cc:896
+msgid "Encoding Video.. Pass 1/2"
+msgstr "Kodiere Video.. Durchgang 1/2"
+
+#: export_video_dialog.cc:908
+msgid "Encoding Video.. Pass 2/2"
+msgstr "Kodiere Video.. Durchgang 2/2"
+
+#: export_video_dialog.cc:1011
+msgid "Transcoding failed."
+msgstr "Transkodieren fehlgeschlagen."
+
+#: export_video_dialog.cc:1247 export_video_dialog.cc:1267
+msgid "Save Exported Video File"
+msgstr "Sichere exportierte Videodatei"
+
+#: export_video_infobox.cc:33
+msgid "Video Export Info"
+msgstr "Video-Exportinformationen"
+
+#: export_video_infobox.cc:34
+msgid "Do Not Show This Dialog Again (Reset in Edit > Preferences > Video)."
+msgstr ""
+"Diesen Dialog nicht wieder anzeigen (kann in Bearbeiten > Globale "
+"Einstellungen > Video zurückgesetzt werden)."
+
+#: export_video_infobox.cc:46
+msgid "<b>Video Export Info</b>"
+msgstr "<b>Videoexport Informationen</b>"
+
+#: export_video_infobox.cc:51
+msgid ""
+"Video encoding is a non-trivial task with many details.\n"
+"\n"
+"Please see the manual at %1/video-timeline/operations/#export.\n"
+"\n"
+"Open Manual in Browser? "
+msgstr ""
+"Das Kodieren von Video ist eine komplexe Aufgabe mit vielen Details.\n"
+"\n"
+"Lesen Sie bitte darüber im Handbuch unter %1/video-timeline/operations/"
+"#export nach.\n"
+"\n"
+"Handbuch im Browser öffnen? "
diff --git a/gtk2_ardour/po/ru.po b/gtk2_ardour/po/ru.po
index cf4491d..5cfb07a 100644
--- a/gtk2_ardour/po/ru.po
+++ b/gtk2_ardour/po/ru.po
@@ -10,15 +10,15 @@ msgid ""
msgstr ""
"Project-Id-Version: Ardour 4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-18 20:02+0300\n"
-"PO-Revision-Date: 2015-04-19 00:46+0300\n"
+"POT-Creation-Date: 2015-08-13 09:58+0300\n"
+"PO-Revision-Date: 2015-08-13 10:25+0300\n"
"Last-Translator: Alexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
"Language-Team: русский <>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Gtranslator 2.91.6\n"
+"X-Generator: Gtranslator 2.91.7\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2);\n"
"%100>=20) ? 1: 2);\n"
@@ -268,10 +268,14 @@ msgid "Thorsten Wilms"
msgstr "Thorsten Wilms"
#: about.cc:186
+msgid "Damien Zammit"
+msgstr "Damien Zammit"
+
+#: about.cc:187
msgid "Grygorii Zharun"
msgstr "Grygorii Zharun"
-#: about.cc:191
+#: about.cc:192
msgid ""
"French:\n"
"\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -285,7 +289,7 @@ msgstr ""
"\tMartin Blanchard\n"
"\tRomain Arnaud <roming22 at gmail.com>\n"
-#: about.cc:192
+#: about.cc:193
msgid ""
"German:\n"
"\tKarsten Petersen <kapet at kapet.de>\n"
@@ -305,7 +309,7 @@ msgstr ""
"\tRichard Oax <richard at pagliacciempire.de>\n"
"\tRobin Gloster <robin at loc-com.de>\n"
-#: about.cc:199
+#: about.cc:200
msgid ""
"Italian:\n"
"\tFilippo Pappalardo <filippo at email.it>\n"
@@ -315,7 +319,7 @@ msgstr ""
"\tFilippo Pappalardo <filippo at email.it>\n"
"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
-#: about.cc:200
+#: about.cc:201
msgid ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -323,7 +327,7 @@ msgstr ""
"Португальский:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
-#: about.cc:201
+#: about.cc:202
msgid ""
"Brazilian Portuguese:\n"
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -333,7 +337,7 @@ msgstr ""
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
"\tChris Ross <chris at tebibyte.org>\n"
-#: about.cc:203
+#: about.cc:204
msgid ""
"Spanish:\n"
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
@@ -343,7 +347,7 @@ msgstr ""
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
"\tPablo Fernández <pablo.fbus at gmail.com>\n"
-#: about.cc:204
+#: about.cc:205
msgid ""
"Russian:\n"
"\t Igor Blinov <pitstop at nm.ru>\n"
@@ -354,7 +358,7 @@ msgstr ""
"\tАлександр Прокудин <alexandre.prokoudine at gmail.com>\n"
"\tАлександр Кольцов <ag1455 at mail.ru>"
-#: about.cc:206
+#: about.cc:207
msgid ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -362,7 +366,7 @@ msgstr ""
"Греческий:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
-#: about.cc:207
+#: about.cc:208
msgid ""
"Swedish:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
@@ -370,7 +374,7 @@ msgstr ""
"Шведский:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
-#: about.cc:208
+#: about.cc:209
msgid ""
"Polish:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
@@ -378,7 +382,7 @@ msgstr ""
"Польский:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
-#: about.cc:209
+#: about.cc:210
msgid ""
"Czech:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
@@ -386,7 +390,7 @@ msgstr ""
"Чешский:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
-#: about.cc:210
+#: about.cc:211
msgid ""
"Norwegian:\n"
"\t Eivind Ødegård\n"
@@ -394,7 +398,7 @@ msgstr ""
"Норвежский:\n"
"\t Eivind Ødegård\n"
-#: about.cc:211
+#: about.cc:212
msgid ""
"Chinese:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
@@ -402,15 +406,15 @@ msgstr ""
"Китайский:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
-#: about.cc:591
+#: about.cc:592
msgid "Copyright (C) 1999-2015 Paul Davis\n"
msgstr "Авторские права (C) 1999-2015 Paul Davis\n"
-#: about.cc:595
+#: about.cc:596
msgid "http://ardour.org/"
msgstr "http://ardour.org/"
-#: about.cc:596
+#: about.cc:597
msgid ""
"%1%2\n"
"(built from revision %3)"
@@ -418,7 +422,7 @@ msgstr ""
"%1%2\n"
"(собрано из редакции %3)"
-#: about.cc:600
+#: about.cc:601
msgid "Config"
msgstr "Конфигурация сборки"
@@ -509,23 +513,23 @@ msgid "Insert:"
msgstr "Вставить:"
#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:238 rc_option_editor.cc:1797
-#: rc_option_editor.cc:1799 rc_option_editor.cc:1801 rc_option_editor.cc:1819
-#: rc_option_editor.cc:1821 rc_option_editor.cc:1829 rc_option_editor.cc:1831
-#: rc_option_editor.cc:1849 rc_option_editor.cc:1862 rc_option_editor.cc:1864
-#: rc_option_editor.cc:1866 rc_option_editor.cc:1911 rc_option_editor.cc:1913
-#: rc_option_editor.cc:1915 rc_option_editor.cc:1923 rc_option_editor.cc:1931
-#: rc_option_editor.cc:1933 rc_option_editor.cc:1941
+#: ardour_ui_ed.cc:548 engine_dialog.cc:240 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2283 rc_option_editor.cc:2301
+#: rc_option_editor.cc:2303 rc_option_editor.cc:2311 rc_option_editor.cc:2313
+#: rc_option_editor.cc:2331 rc_option_editor.cc:2344 rc_option_editor.cc:2346
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2393 rc_option_editor.cc:2395
+#: rc_option_editor.cc:2397 rc_option_editor.cc:2405 rc_option_editor.cc:2413
+#: rc_option_editor.cc:2415 rc_option_editor.cc:2423
msgid "Audio"
msgstr "Аудио"
#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:240 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2076 rc_option_editor.cc:2086 rc_option_editor.cc:2094
-#: rc_option_editor.cc:2102 rc_option_editor.cc:2111 rc_option_editor.cc:2119
-#: rc_option_editor.cc:2127 rc_option_editor.cc:2135 rc_option_editor.cc:2144
-#: rc_option_editor.cc:2153 rc_option_editor.cc:2162 rc_option_editor.cc:2170
-#: rc_option_editor.cc:2178 rc_option_editor.cc:2186 rc_option_editor.cc:2209
+#: editor_actions.cc:109 engine_dialog.cc:242 missing_file_dialog.cc:56
+#: rc_option_editor.cc:2558 rc_option_editor.cc:2568 rc_option_editor.cc:2576
+#: rc_option_editor.cc:2584 rc_option_editor.cc:2593 rc_option_editor.cc:2601
+#: rc_option_editor.cc:2609 rc_option_editor.cc:2617 rc_option_editor.cc:2626
+#: rc_option_editor.cc:2635 rc_option_editor.cc:2644 rc_option_editor.cc:2652
+#: rc_option_editor.cc:2660 rc_option_editor.cc:2668 rc_option_editor.cc:2691
msgid "MIDI"
msgstr "MIDI"
@@ -552,8 +556,8 @@ msgstr ""
"Если вы не собираетесь использовать такие плагины, используйте обычные "
"звуковые и MIDI-дорожки."
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:420
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:431
+#: editor_rulers.cc:251 time_axis_view.cc:1385
msgid "Normal"
msgstr "Обычный"
@@ -565,7 +569,7 @@ msgstr "Бесслойный"
msgid "Tape"
msgstr "Плёночный"
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:431 monitor_section.cc:296
msgid "Mono"
msgstr "Моно"
@@ -597,7 +601,7 @@ msgstr "8 каналов"
msgid "12 Channel"
msgstr "3 канала"
-#: add_route_dialog.cc:483 mixer_strip.cc:1855 mixer_strip.cc:2263
+#: add_route_dialog.cc:483 mixer_strip.cc:1898 mixer_strip.cc:2306
msgid "Custom"
msgstr "На заказ"
@@ -671,7 +675,7 @@ msgstr "Нормировать значения"
msgid "FFT analysis window"
msgstr "Спектральный анализ"
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:60 editor.cc:1835
msgid "Spectral Analysis"
msgstr "Спектральный анализ"
@@ -679,8 +683,8 @@ msgstr "Спектральный анализ"
msgid "Track"
msgstr "Дорожка"
-#: analysis_window.cc:68 editor_actions.cc:646 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:68 editor_actions.cc:657 mixer_ui.cc:131
+#: mixer_ui.cc:1874
msgid "Show"
msgstr "Показать"
@@ -688,15 +692,15 @@ msgstr "Показать"
msgid "Re-analyze data"
msgstr "Повторно проанализировать данные"
-#: ardour_button.cc:1116
+#: ardour_button.cc:820
msgid "button cannot watch state of non-existing Controllable\n"
msgstr "Кнопка не может видеть состояние несуществующего управляемого\n"
-#: ardour_button.cc:1384
+#: ardour_button.cc:1088
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-#: ardour_ui.cc:164
+#: ardour_ui.cc:172
msgid ""
"%1 %2.x has discovered configuration files from %1 %3.x.\n"
"\n"
@@ -710,82 +714,82 @@ msgstr ""
"\n"
"(%1 придётся перезапустить.)\n"
-#: ardour_ui.cc:216 editor_actions.cc:640 region_editor.cc:51
+#: ardour_ui.cc:252 editor_actions.cc:651 region_editor.cc:51
msgid "Audition"
msgstr "Контроль"
-#: ardour_ui.cc:217 editor_actions.cc:136 mixer_strip.cc:2035
-#: monitor_section.cc:357 rc_option_editor.cc:1951 route_time_axis.cc:252
-#: route_time_axis.cc:2707
+#: ardour_ui.cc:253 editor_actions.cc:136 mixer_strip.cc:2078
+#: monitor_section.cc:376 rc_option_editor.cc:2433 route_time_axis.cc:254
+#: route_time_axis.cc:2739
msgid "Solo"
msgstr "Соло"
-#: ardour_ui.cc:218 rc_option_editor.cc:741
+#: ardour_ui.cc:254 rc_option_editor.cc:1192
msgid "Feedback"
msgstr "Отклик"
-#: ardour_ui.cc:224 speaker_dialog.cc:36
+#: ardour_ui.cc:265 speaker_dialog.cc:36
msgid "Speaker Configuration"
msgstr "Конфигурация громкоговорителей"
-#: ardour_ui.cc:225 keyeditor.cc:53
+#: ardour_ui.cc:266 keyeditor.cc:53
msgid "Key Bindings"
msgstr "Клавиатурные комбинации"
-#: ardour_ui.cc:226
+#: ardour_ui.cc:267
msgid "Preferences"
msgstr "Параметры"
-#: ardour_ui.cc:227 ardour_ui.cc:234
+#: ardour_ui.cc:268 ardour_ui.cc:275
msgid "Add Tracks/Busses"
msgstr "Добавить дорожки/шины"
-#: ardour_ui.cc:228
+#: ardour_ui.cc:269
msgid "About"
msgstr "О программе"
-#: ardour_ui.cc:229 location_ui.cc:1141 session_option_editor.cc:189
+#: ardour_ui.cc:270 location_ui.cc:1141 session_option_editor.cc:189
#: session_option_editor.cc:195 session_option_editor.cc:202
msgid "Locations"
msgstr "Позиции"
-#: ardour_ui.cc:230 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:271 route_params_ui.cc:59 route_params_ui.cc:630
msgid "Tracks and Busses"
msgstr "Дорожки и шины"
-#: ardour_ui.cc:231 engine_dialog.cc:71
+#: ardour_ui.cc:272 engine_dialog.cc:74
msgid "Audio/MIDI Setup"
msgstr "Настройка звука и MIDI"
-#: ardour_ui.cc:232
+#: ardour_ui.cc:273
msgid "Video Export Dialog"
msgstr "Диалог экспорта видео"
-#: ardour_ui.cc:233
+#: ardour_ui.cc:274
msgid "Properties"
msgstr "Свойства"
-#: ardour_ui.cc:235 bundle_manager.cc:264
+#: ardour_ui.cc:276 bundle_manager.cc:264
msgid "Bundle Manager"
msgstr "Управление пакетами"
-#: ardour_ui.cc:236 big_clock_window.cc:37
+#: ardour_ui.cc:277 big_clock_window.cc:37
msgid "Big Clock"
msgstr "Большой счётчик"
-#: ardour_ui.cc:237
+#: ardour_ui.cc:278
msgid "Audio Connections"
msgstr "Звуковые соединения"
-#: ardour_ui.cc:238
+#: ardour_ui.cc:279
msgid "MIDI Connections"
msgstr "Соединения MIDI"
-#: ardour_ui.cc:247
+#: ardour_ui.cc:293
msgid "Your configuration files were copied. You can now restart %1."
msgstr "Ваши файлы с настройками скопированы. Можно перезапустить %1."
-#: ardour_ui.cc:486
+#: ardour_ui.cc:519
msgid ""
"The audio backend was shutdown because:\n"
"\n"
@@ -795,7 +799,7 @@ msgstr ""
"\n"
"%1"
-#: ardour_ui.cc:488
+#: ardour_ui.cc:521
msgid ""
"The audio backend has either been shutdown or it\n"
"disconnected %1 because %1\n"
@@ -807,7 +811,7 @@ msgstr ""
"работал недостаточно быстро. Попробуйте снова\n"
"запустить подсистему и сохранить сессию."
-#: ardour_ui.cc:512
+#: ardour_ui.cc:545
msgid ""
"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
"Please see the log window for further details."
@@ -815,39 +819,39 @@ msgstr ""
"Не удалось просканировать плагины Audio Unit. Автоматическое сканирование AU "
"выключено. Подробности указаны в окне журнала."
-#: ardour_ui.cc:513
+#: ardour_ui.cc:546
msgid "Audio Unit Plugin Scan Failed:"
msgstr "Не удалось просканировать плагины Audio Unit:"
-#: ardour_ui.cc:833
+#: ardour_ui.cc:877
msgid "NSM server did not announce itself"
msgstr "Сервер NSM не объявлял о себе"
-#: ardour_ui.cc:846
+#: ardour_ui.cc:890
msgid "NSM: no client ID provided"
msgstr "NSM: не предоставлен ни один ID-клиент"
-#: ardour_ui.cc:853
+#: ardour_ui.cc:897
msgid "NSM: no session created"
msgstr "NSM: нет созданной сессии"
-#: ardour_ui.cc:876
+#: ardour_ui.cc:920
msgid "NSM: initialization failed"
msgstr "NSM: сбой инициализации"
-#: ardour_ui.cc:906
+#: ardour_ui.cc:952
msgid "Free/Demo Version Warning"
msgstr "Предупреждение демоверсии"
-#: ardour_ui.cc:908
+#: ardour_ui.cc:954
msgid "Subscribe and support development of %1"
msgstr "Подписаться и поддержать разработку %1"
-#: ardour_ui.cc:909
+#: ardour_ui.cc:955
msgid "Don't warn me about this again"
msgstr "Больше не предупреждать"
-#: ardour_ui.cc:911
+#: ardour_ui.cc:957
msgid ""
"<span weight=\"bold\" size=\"large\">%1</span>\n"
"\n"
@@ -865,15 +869,15 @@ msgstr ""
"\n"
"%4"
-#: ardour_ui.cc:912
+#: ardour_ui.cc:958
msgid "This is a free/demo version of %1"
msgstr "Это демонстрационная версия %1"
-#: ardour_ui.cc:913
+#: ardour_ui.cc:959
msgid "It will not restore OR save any plugin settings"
msgstr "Она не сохраняет и не восстанавливает параметры плагинов."
-#: ardour_ui.cc:914
+#: ardour_ui.cc:960
msgid ""
"If you load an existing session with plugin settings\n"
"they will not be used and will be lost."
@@ -881,7 +885,7 @@ msgstr ""
"Если вы загрузите существующую сессию, все собственные \n"
"параметры плагинов будут сброшены и потеряны при сохранении."
-#: ardour_ui.cc:916 plugin_ui.cc:569
+#: ardour_ui.cc:962 plugin_ui.cc:579
msgid ""
"To get full access to updates without this limitation\n"
"consider becoming a subscriber for a low cost every month."
@@ -889,19 +893,19 @@ msgstr ""
"Чтобы получить полный доступ к обновлениям без ограничений,\n"
"необходима ежемесячная подписка по низкой цене."
-#: ardour_ui.cc:926
+#: ardour_ui.cc:972
msgid "Quit now"
msgstr "Выйти"
-#: ardour_ui.cc:927
+#: ardour_ui.cc:973
msgid "Continue using %1"
msgstr "Продолжить работу"
-#: ardour_ui.cc:960 startup.cc:345
+#: ardour_ui.cc:1006 startup.cc:346
msgid "%1 is ready for use"
msgstr "%1 готов к работе"
-#: ardour_ui.cc:1002
+#: ardour_ui.cc:1048
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"
@@ -916,23 +920,23 @@ msgstr ""
"Вы можете узнать установленный предел при помощи команды 'ulimit -l'. Обычно "
"это контролируется в %2."
-#: ardour_ui.cc:1019
+#: ardour_ui.cc:1065
msgid "Do not show this window again"
msgstr "Больше не показывать это окно"
-#: ardour_ui.cc:1063
+#: ardour_ui.cc:1109
msgid "Don't quit"
msgstr "Не выходить"
-#: ardour_ui.cc:1064
+#: ardour_ui.cc:1110
msgid "Just quit"
msgstr "Просто выйти"
-#: ardour_ui.cc:1065 ardour_ui.cc:4727
+#: ardour_ui.cc:1111 ardour_ui.cc:4903
msgid "Save and quit"
msgstr "Сохранить и выйти"
-#: ardour_ui.cc:1075
+#: ardour_ui.cc:1121
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -947,11 +951,11 @@ msgstr ""
"\n"
"«Просто выйти»."
-#: ardour_ui.cc:1125
+#: ardour_ui.cc:1171
msgid "Unsaved Session"
msgstr "Сессия не сохранена"
-#: ardour_ui.cc:1146
+#: ardour_ui.cc:1192
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -969,7 +973,7 @@ msgstr ""
"\n"
"Что вы хотите сделать?"
-#: ardour_ui.cc:1149
+#: ardour_ui.cc:1195
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -987,74 +991,93 @@ msgstr ""
"\n"
"Что вы хотите сделать?"
-#: ardour_ui.cc:1163
+#: ardour_ui.cc:1209
msgid "Prompter"
msgstr "Суфлер"
-#: ardour_ui.cc:1275 ardour_ui.cc:1283
+#: ardour_ui.cc:1322 ardour_ui.cc:1330
msgid "Audio: <span foreground=\"red\">none</span>"
msgstr "Звук: <span foreground=\"red\">нет</span>"
-#: ardour_ui.cc:1287
+#: ardour_ui.cc:1334
#, c-format
msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
msgstr "Звук: <span foreground=\"green\">%.1f КГц / %4.1f мс</span>"
-#: ardour_ui.cc:1291
+#: ardour_ui.cc:1338
#, c-format
msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
msgstr "Звук: <span foreground=\"green\">%<PRId64> КГц / %4.1f мс</span>"
-#: ardour_ui.cc:1309 export_video_dialog.cc:80
+#: ardour_ui.cc:1356 export_video_dialog.cc:76
msgid "File:"
msgstr "Файл:"
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1360
msgid "BWF"
msgstr "BWF"
-#: ardour_ui.cc:1316
+#: ardour_ui.cc:1363
msgid "WAV"
msgstr "WAV"
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1366
msgid "WAV64"
msgstr "WAV64"
-#: ardour_ui.cc:1322 session_option_editor.cc:185
+#: ardour_ui.cc:1369 session_option_editor.cc:185
msgid "CAF"
msgstr "CAF"
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1372
msgid "AIFF"
msgstr "AIFF"
-#: ardour_ui.cc:1328
+#: ardour_ui.cc:1375
msgid "iXML"
msgstr "iXML"
-#: ardour_ui.cc:1331
+#: ardour_ui.cc:1378
msgid "RF64"
msgstr "RF64"
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1386
msgid "32-float"
msgstr "32-float"
-#: ardour_ui.cc:1342
+#: ardour_ui.cc:1389
msgid "24-int"
msgstr "24-int"
-#: ardour_ui.cc:1345
+#: ardour_ui.cc:1392
msgid "16-int"
msgstr "16-int"
-#: ardour_ui.cc:1364
+#: ardour_ui.cc:1413
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1415
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1418
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1421
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1434
#, c-format
msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
msgstr "ЦП: <span foreground=\"%s\">%5.1f%%</span>"
-#: ardour_ui.cc:1383
+#: ardour_ui.cc:1453
#, c-format
msgid ""
"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -1065,34 +1088,34 @@ msgstr ""
"%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s\">"
"%<PRIu32>%%</span>"
-#: ardour_ui.cc:1424
+#: ardour_ui.cc:1494
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr "На диске: <span foreground=\"green\">неизвестно</span>"
-#: ardour_ui.cc:1426
+#: ardour_ui.cc:1496
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
msgstr "На диске: <span foreground=\"green\">24ч+</span>"
-#: ardour_ui.cc:1444
+#: ardour_ui.cc:1514
msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
msgstr "На диске: <span foreground=\"green\">>24ч</span>"
-#: ardour_ui.cc:1455
+#: ardour_ui.cc:1525
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
msgstr "На диске: <span foreground=\"%s\">%02dч:%02dм:%02dс</span>"
-#: ardour_ui.cc:1481
+#: ardour_ui.cc:1551
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
msgstr "ТК: <span foreground=\"%s\">%s</span>"
-#: ardour_ui.cc:1602 ardour_ui.cc:1611 session_dialog.cc:318
+#: ardour_ui.cc:1672 ardour_ui.cc:1681 session_dialog.cc:318
#: session_dialog.cc:323
msgid "Recent Sessions"
msgstr "Недавние сессии"
-#: ardour_ui.cc:1690
+#: ardour_ui.cc:1760
msgid ""
"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
@@ -1100,27 +1123,27 @@ msgstr ""
"%1 не соединен с какой-либо звуковой подсистемой.\n"
"Открытие и закрытие сессий невозможно."
-#: ardour_ui.cc:1714
+#: ardour_ui.cc:1784
msgid "Open Session"
msgstr "Открыть сессию"
-#: ardour_ui.cc:1739 session_dialog.cc:349 session_import_dialog.cc:170
+#: ardour_ui.cc:1809 session_dialog.cc:349 session_import_dialog.cc:170
#: session_metadata_dialog.cc:858
msgid "%1 sessions"
msgstr "Cеансы %1"
-#: ardour_ui.cc:1776
+#: ardour_ui.cc:1846
msgid "You cannot add a track without a session already loaded."
msgstr "Вы не можете добавить дорожку без загруженной сессии."
-#: ardour_ui.cc:1784
+#: ardour_ui.cc:1854
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
msgstr[0] "Не удалось создать %1 новую смешанную дорожку"
msgstr[1] "Не удалось создать %1 новых смешанных дорожки"
msgstr[2] "Не удалось создать %1 новых смешанных дорожек"
-#: ardour_ui.cc:1790 ardour_ui.cc:1851
+#: ardour_ui.cc:1860 ardour_ui.cc:1921
msgid ""
"There are insufficient ports available\n"
"to create a new track or bus.\n"
@@ -1131,25 +1154,25 @@ msgstr ""
"Вам необходимо сохранить %1 и \n"
"перезапустить программу с большим количеством портов."
-#: ardour_ui.cc:1825
+#: ardour_ui.cc:1895
msgid "You cannot add a track or bus without a session already loaded."
msgstr "Вы не можете добавить дорожку или шину без открытой сессии."
-#: ardour_ui.cc:1834
+#: ardour_ui.cc:1904
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] "Не удалось создать %1 новую звуковую дорожку"
msgstr[1] "Не удалось создать %2 новых звуковых дорожки"
msgstr[2] "Не удалось создать %2 новых звуковых дорожек"
-#: ardour_ui.cc:1843
+#: ardour_ui.cc:1913
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
msgstr[0] "Не удалось создать %1 новую звуковую шину"
msgstr[1] "Не удалось создать %1 новых звуковых шины"
msgstr[2] "Не удалось создать %1 новых звуковых шин"
-#: ardour_ui.cc:1996
+#: ardour_ui.cc:2066
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."
@@ -1158,23 +1181,36 @@ msgstr ""
"как пытаться что-либо записать.\n"
"Используйте меню «Сессия > Добавить дорожку/шину»."
-#: ardour_ui.cc:2382
+#: ardour_ui.cc:2444
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
+msgstr "Скопировано %<PRId64> из %<PRId64>"
+
+#: ardour_ui.cc:2498 save_as_dialog.cc:33
+msgid "Save As"
+msgstr "Сохранить как"
+
+#: ardour_ui.cc:2526
+msgid "Save As failed: %1"
+msgstr "Не удалось сохранить под другим именем: %1"
+
+#: ardour_ui.cc:2548
msgid "Save as..."
msgstr "Сохранить как..."
-#: ardour_ui.cc:2383 ardour_ui.cc:2462
+#: ardour_ui.cc:2549 ardour_ui.cc:2628
msgid "New session name"
msgstr "Новое название сессии"
-#: ardour_ui.cc:2385
+#: ardour_ui.cc:2551
msgid "Take Snapshot"
msgstr "Создать снимок"
-#: ardour_ui.cc:2386
+#: ardour_ui.cc:2552
msgid "Name of new snapshot"
msgstr "Название нового снимка"
-#: ardour_ui.cc:2411
+#: ardour_ui.cc:2577
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
@@ -1182,23 +1218,23 @@ msgstr ""
"Для обеспечения совместимости с различными системами\n"
"названия снимков не могут содержать символ '%1'."
-#: ardour_ui.cc:2423
+#: ardour_ui.cc:2589
msgid "Confirm Snapshot Overwrite"
msgstr "Подтвердите перезапись снимка"
-#: ardour_ui.cc:2424
+#: ardour_ui.cc:2590
msgid "A snapshot already exists with that name. Do you want to overwrite it?"
msgstr "Снимок с таким названием уже есть. Перезаписать его?"
-#: ardour_ui.cc:2427 utils_videotl.cc:74
+#: ardour_ui.cc:2593 utils_videotl.cc:74
msgid "Overwrite"
msgstr "Перезаписать"
-#: ardour_ui.cc:2461
+#: ardour_ui.cc:2627
msgid "Rename Session"
msgstr "Переименовать сессию"
-#: ardour_ui.cc:2476 ardour_ui.cc:2890 ardour_ui.cc:2928
+#: ardour_ui.cc:2642 ardour_ui.cc:3056 ardour_ui.cc:3094
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
@@ -1206,12 +1242,12 @@ msgstr ""
"Для обеспечения совместимости с различными системами\n"
"названия сессий не могут содержать символ '%1'."
-#: ardour_ui.cc:2484
+#: ardour_ui.cc:2650
msgid ""
"That name is already in use by another directory/folder. Please try again."
msgstr "Папка с таким названием уже есть. Укажите другое."
-#: ardour_ui.cc:2493
+#: ardour_ui.cc:2659
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
@@ -1219,19 +1255,19 @@ msgstr ""
"Не удалось переименовать эту сессию.\n"
"Всё может быть очень, очень плохо."
-#: ardour_ui.cc:2608
+#: ardour_ui.cc:2774
msgid "Save Template"
msgstr "Сохранить шаблон"
-#: ardour_ui.cc:2609
+#: ardour_ui.cc:2775
msgid "Name for template:"
msgstr "Название шаблона:"
-#: ardour_ui.cc:2610
+#: ardour_ui.cc:2776
msgid "-template"
msgstr "-шаблон"
-#: ardour_ui.cc:2647
+#: ardour_ui.cc:2813
msgid ""
"This session\n"
"%1\n"
@@ -1241,35 +1277,35 @@ msgstr ""
"%1\n"
"уже существует. Открыть её?"
-#: ardour_ui.cc:2657
+#: ardour_ui.cc:2823
msgid "Open Existing Session"
msgstr "Открыть существующую сессю"
-#: ardour_ui.cc:2918
+#: ardour_ui.cc:3084
msgid "There is no existing session at \"%1\""
msgstr "По адресу \"%1\" не существующей сессии"
-#: ardour_ui.cc:3010
+#: ardour_ui.cc:3176
msgid "Please wait while %1 loads your session"
msgstr "Дождитесь завершения загрузки сессии в %1"
-#: ardour_ui.cc:3025
+#: ardour_ui.cc:3191
msgid "Port Registration Error"
msgstr "Ошибка регистрации порта"
-#: ardour_ui.cc:3026
+#: ardour_ui.cc:3192
msgid "Click the Close button to try again."
msgstr "Щелкните кнопку «Закрыть» для возврата к предыдущему диалогу."
-#: ardour_ui.cc:3047
+#: ardour_ui.cc:3213
msgid "Session \"%1 (snapshot %2)\" did not load successfully"
msgstr "Не удалось загрузить сессию \"%1 (снимок %2)\""
-#: ardour_ui.cc:3053
+#: ardour_ui.cc:3219
msgid "Loading Error"
msgstr "Ошибка при загрузке"
-#: ardour_ui.cc:3072
+#: ardour_ui.cc:3241
msgid ""
"This session has been opened in read-only mode.\n"
"\n"
@@ -1279,24 +1315,24 @@ msgstr ""
"\n"
"Вы не сможете записывать или сохранять."
-#: ardour_ui.cc:3077
+#: ardour_ui.cc:3246
msgid "Read-only Session"
msgstr "Сессия в режиме чтения"
-#: ardour_ui.cc:3143
+#: ardour_ui.cc:3312
msgid "Could not create session in \"%1\""
msgstr "Не удалось создать сессию «%1»"
-#: ardour_ui.cc:3292
+#: ardour_ui.cc:3461
msgid "No files were ready for clean-up"
msgstr "Нет готовых к удалению звуковых файлов"
-#: ardour_ui.cc:3296 ardour_ui.cc:3306 ardour_ui.cc:3439 ardour_ui.cc:3446
+#: ardour_ui.cc:3465 ardour_ui.cc:3475 ardour_ui.cc:3608 ardour_ui.cc:3615
#: ardour_ui_ed.cc:103
msgid "Clean-up"
msgstr "Очистить"
-#: ardour_ui.cc:3297
+#: ardour_ui.cc:3466
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1308,19 +1344,19 @@ msgstr ""
"Они могут включать области, которым\n"
"нужны неиспользуемые файлы."
-#: ardour_ui.cc:3356
+#: ardour_ui.cc:3525
msgid "kilo"
msgstr "Кило"
-#: ardour_ui.cc:3359
+#: ardour_ui.cc:3528
msgid "mega"
msgstr "Мега"
-#: ardour_ui.cc:3362
+#: ardour_ui.cc:3531
msgid "giga"
msgstr "Гига"
-#: ardour_ui.cc:3367
+#: ardour_ui.cc:3536
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1340,7 +1376,7 @@ msgstr[2] ""
"освободив при этом %3 %4байт\n"
"дискового пространства."
-#: ardour_ui.cc:3374
+#: ardour_ui.cc:3543
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1387,11 +1423,11 @@ msgstr[2] ""
"\n"
"дополнительно освободит %3 %4байт дискового пространства.\n"
-#: ardour_ui.cc:3434
+#: ardour_ui.cc:3603
msgid "Are you sure you want to clean-up?"
msgstr "Вы уверены, что хотите выполнить очистку?"
-#: ardour_ui.cc:3441
+#: ardour_ui.cc:3610
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
@@ -1402,39 +1438,39 @@ msgstr ""
"неиспользуемые звуковые файлы\n"
"будут перемещены в «мертвую» зону."
-#: ardour_ui.cc:3449
+#: ardour_ui.cc:3618
msgid "CleanupDialog"
msgstr "Очистка"
-#: ardour_ui.cc:3479
+#: ardour_ui.cc:3648
msgid "Cleaned Files"
msgstr "Очищенные файлы"
-#: ardour_ui.cc:3496
+#: ardour_ui.cc:3665
msgid "deleted file"
msgstr "Удалён файл"
-#: ardour_ui.cc:3634
+#: ardour_ui.cc:3803
msgid "Video-Server was not launched by %1. The request to stop it is ignored."
msgstr "Видеосервер не был запущен %1. Запрос его остановки игнорируется."
-#: ardour_ui.cc:3638
+#: ardour_ui.cc:3807
msgid "Stop Video-Server"
msgstr "Остановить видеосервер"
-#: ardour_ui.cc:3639
+#: ardour_ui.cc:3808
msgid "Do you really want to stop the Video Server?"
msgstr "Вы действительно хотите остановить видеосервер?"
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:3811
msgid "Yes, Stop It"
msgstr "Да, остановить"
-#: ardour_ui.cc:3668
+#: ardour_ui.cc:3837
msgid "The Video Server is already started."
msgstr "Видеосервер уже запущен."
-#: ardour_ui.cc:3670
+#: ardour_ui.cc:3839
msgid ""
"An external Video Server is configured and can be reached. Not starting a "
"new instance."
@@ -1442,7 +1478,7 @@ msgstr ""
"Внешний видеосервер настроен и может быть доступен, не начиная новый "
"экземпляр."
-#: ardour_ui.cc:3678 ardour_ui.cc:3783
+#: ardour_ui.cc:3847 ardour_ui.cc:3952
msgid ""
"Could not connect to the Video Server. Start it or configure its access URL "
"in Preferences."
@@ -1450,35 +1486,39 @@ msgstr ""
"Не удалось соединиться с видеосервером. Запустите его, либо укажите URL "
"доступа к нему в диалоге параметров программы."
-#: ardour_ui.cc:3708
+#: ardour_ui.cc:3877
msgid "Specified docroot is not an existing directory."
msgstr "Указан DOC-корень не существующего каталога."
-#: ardour_ui.cc:3714 ardour_ui.cc:3720
+#: ardour_ui.cc:3883 ardour_ui.cc:3889
msgid "Given Video Server is not an executable file."
msgstr "Данный видеосервер не является исполняемым файлом."
-#: ardour_ui.cc:3754
+#: ardour_ui.cc:3923
msgid "Cannot launch the video-server"
msgstr "Не удалось запустить видеосервер"
-#: ardour_ui.cc:3764
+#: ardour_ui.cc:3933
msgid "Video-server was started but does not respond to requests..."
msgstr "Видеосервер запущен, но не откликается."
-#: ardour_ui.cc:3809 editor_audio_import.cc:641
+#: ardour_ui.cc:3978 editor_audio_import.cc:644
msgid "could not open %1"
msgstr "Не удалось открыть %1"
-#: ardour_ui.cc:3813
+#: ardour_ui.cc:3982
msgid "no video-file selected"
msgstr "Не выбран видеофайл"
-#: ardour_ui.cc:4011
+#: ardour_ui.cc:4174
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4183
msgid "Recording was stopped because your system could not keep up."
msgstr "Запись остановлена из-за недостаточного быстродействия системы"
-#: ardour_ui.cc:4040
+#: ardour_ui.cc:4212
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1492,23 +1532,23 @@ msgstr ""
"В частности ей не удалось записать данные на диск\n"
"достаточно быстро для фиксации захваченных данных.\n"
-#: ardour_ui.cc:4110
+#: ardour_ui.cc:4285
msgid "Scanning for plugins"
msgstr "Сканирование плагинов"
-#: ardour_ui.cc:4112
+#: ardour_ui.cc:4287
msgid "Cancel plugin scan"
msgstr "Отменить сканирование плагинов"
-#: ardour_ui.cc:4121
+#: ardour_ui.cc:4296
msgid "Stop Timeout"
msgstr "Тайм-аут остановки"
-#: ardour_ui.cc:4128
+#: ardour_ui.cc:4303
msgid "Scan Timeout"
msgstr "Тайм-аут сканирования"
-#: ardour_ui.cc:4171
+#: ardour_ui.cc:4347
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1522,11 +1562,11 @@ msgstr ""
"В частности ей не удалось прочитать данные\n"
"с диска достаточно быстро для воспроизведения.\n"
-#: ardour_ui.cc:4211
+#: ardour_ui.cc:4387
msgid "Crash Recovery"
msgstr "Восстановление данных"
-#: ardour_ui.cc:4212
+#: ardour_ui.cc:4388
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1542,19 +1582,19 @@ msgstr ""
"%1 может восстановить записанные данные,\n"
"либо проигнорировать их. Примите решение.\n"
-#: ardour_ui.cc:4224
+#: ardour_ui.cc:4400
msgid "Ignore crash data"
msgstr "Проигнорировать"
-#: ardour_ui.cc:4225
+#: ardour_ui.cc:4401
msgid "Recover from crash"
msgstr "Восстановить данные"
-#: ardour_ui.cc:4245
+#: ardour_ui.cc:4421
msgid "Sample Rate Mismatch"
msgstr "Несовпадение частот сэмплирования"
-#: ardour_ui.cc:4246
+#: ardour_ui.cc:4422
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"
@@ -1566,23 +1606,23 @@ msgstr ""
"Если вы загрузите эту сессию, звуковые данные могут быть\n"
"воспроизведены с некорректной частотой сэмплирования.\n"
-#: ardour_ui.cc:4255
+#: ardour_ui.cc:4431
msgid "Do not load session"
msgstr "Не загружать сессию"
-#: ardour_ui.cc:4256
+#: ardour_ui.cc:4432
msgid "Load session anyway"
msgstr "Все равно загрузить"
-#: ardour_ui.cc:4283
+#: ardour_ui.cc:4459
msgid "Could not disconnect from Audio/MIDI engine"
msgstr "Не удалось отсоединиться от аудио/MIDI-подсистемы."
-#: ardour_ui.cc:4300 ardour_ui.cc:4303
+#: ardour_ui.cc:4476 ardour_ui.cc:4479
msgid "Could not reconnect to the Audio/MIDI engine"
msgstr "Не удалось повторно соединиться с аудио/MIDI-подсистемой."
-#: ardour_ui.cc:4587
+#: ardour_ui.cc:4763
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1608,38 +1648,38 @@ msgstr ""
"\n"
"Отныне, используйте 2-х версии со старыми сессиями %3"
-#: ardour_ui.cc:4696
+#: ardour_ui.cc:4872
msgid "This is a free/demo copy of %1. It has just switched to silent mode."
msgstr ""
"Демонстрационная версия %1 только что переключилась в беззвучный режим."
-#: ardour_ui.cc:4702
+#: ardour_ui.cc:4878
msgid "%1 is now silent"
msgstr "%1 переключился в беззвучный режим"
-#: ardour_ui.cc:4704
+#: ardour_ui.cc:4880
msgid ""
"Please consider paying for a copy of %1 - you can pay whatever you want."
msgstr ""
"Возможно, вы хотите заплатить за копию %1 — цену вы можете установить сами."
-#: ardour_ui.cc:4705
+#: ardour_ui.cc:4881
msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
msgstr "Вы также можете выбрать подписку (от US$1 в месяц)."
-#: ardour_ui.cc:4706
+#: ardour_ui.cc:4882
msgid "Pay for a copy (via the web)"
msgstr "Заплатить один раз"
-#: ardour_ui.cc:4707
+#: ardour_ui.cc:4883
msgid "Become a subscriber (via the web)"
msgstr "Стать подписчиком"
-#: ardour_ui.cc:4726
+#: ardour_ui.cc:4902
msgid "Remain silent"
msgstr "Оставить беззвучным"
-#: ardour_ui.cc:4728
+#: ardour_ui.cc:4904
msgid "Give me more time"
msgstr "Дайте ещё поработать"
@@ -1707,7 +1747,7 @@ msgstr "Будьте разумны насчёт входного монитор
msgid "Enable/Disable audio click"
msgstr "Включить или выключить метроном"
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:140 monitor_section.cc:117
msgid ""
"When active, something is soloed.\n"
"Click to de-solo everything"
@@ -1773,24 +1813,24 @@ msgstr "[ПРЕДУПРЕЖДЕНИЕ]:"
msgid "[INFO]: "
msgstr "[СПРАВКА]:"
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:255 ardour_ui_ed.cc:408
msgid "Auto Return"
msgstr "Автовозврат"
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:257 ardour_ui_ed.cc:411
msgid "Follow Edits"
msgstr "Следовать правкам"
-#: ardour_ui2.cc:728 rc_option_editor.cc:2292
+#: ardour_ui2.cc:716 rc_option_editor.cc:2786
msgid "GUI"
msgstr "Интерфейс"
-#: ardour_ui2.cc:745 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
+#: ardour_ui2.cc:733 rc_option_editor.cc:1778 rc_option_editor.cc:1796
+#: rc_option_editor.cc:1799 rc_option_editor.cc:1801 rc_option_editor.cc:1803
+#: rc_option_editor.cc:1811 rc_option_editor.cc:1819 rc_option_editor.cc:1821
+#: rc_option_editor.cc:1829 rc_option_editor.cc:1836 rc_option_editor.cc:1845
+#: rc_option_editor.cc:1847 rc_option_editor.cc:1849 rc_option_editor.cc:1857
+#: rc_option_editor.cc:1859 rc_option_editor.cc:1868
#: session_option_editor.cc:321 session_option_editor.cc:323
#: session_option_editor.cc:344 session_option_editor.cc:346
#: session_option_editor.cc:348 session_option_editor.cc:355
@@ -1863,15 +1903,15 @@ msgstr "Тип файла"
msgid "Sample Format"
msgstr "Формат сэмпла"
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2237 rc_option_editor.cc:2249
+#: ardour_ui_ed.cc:113 rc_option_editor.cc:2719 rc_option_editor.cc:2731
msgid "Control Surfaces"
msgstr "Устройства управления"
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1913 rc_option_editor.cc:2256
+#: ardour_ui_ed.cc:114 rc_option_editor.cc:2395 rc_option_editor.cc:2738
msgid "Plugins"
msgstr "Плагины"
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2343
+#: ardour_ui_ed.cc:115 rc_option_editor.cc:2853
msgid "Metering"
msgstr "Индикаторы"
@@ -1887,7 +1927,7 @@ msgstr "Время задержки"
msgid "Denormal Handling"
msgstr "Обработка отклонений"
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:122 route_time_axis.cc:1689
msgid "New..."
msgstr "Создать..."
@@ -1920,284 +1960,294 @@ msgid "Export To Video File"
msgstr "Видеофайл"
#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "Создать снимок..."
+msgid "Snapshot (& keep working on current version) ..."
+msgstr "Сделать снимок и работать с текущей версией..."
#: ardour_ui_ed.cc:148
+msgid "Snapshot (& switch to new version) ..."
+msgstr "Сделать снимок и перейти к новой версии..."
+
+#: ardour_ui_ed.cc:152
msgid "Save As..."
msgstr "Сохранить как..."
-#: ardour_ui_ed.cc:152 editor_actions.cc:1769 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1521 route_time_axis.cc:1669
+#: ardour_ui_ed.cc:156 editor_actions.cc:1783 editor_markers.cc:896
+#: editor_snapshots.cc:124 mixer_strip.cc:1564 route_time_axis.cc:1685
msgid "Rename..."
msgstr "Переименовать..."
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:160
msgid "Save Template..."
msgstr "Сохранить шаблон..."
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:163
msgid "Metadata"
msgstr "Метаданные"
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:166
msgid "Edit Metadata..."
msgstr "Изменить метаданные..."
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:169
msgid "Import Metadata..."
msgstr "Импортировать метаданные..."
-#: ardour_ui_ed.cc:168
+#: ardour_ui_ed.cc:172
msgid "Export To Audio File(s)..."
msgstr "В звуковые файлы..."
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:175
msgid "Stem export..."
msgstr "Каждую дорожку в свой файл..."
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65
-#: export_channel_selector.cc:182 export_channel_selector.cc:564
-#: export_dialog.cc:129 export_video_dialog.cc:84
+#: ardour_ui_ed.cc:178 editor_export_audio.cc:65
+#: export_channel_selector.cc:190 export_channel_selector.cc:576
+#: export_dialog.cc:129 export_video_dialog.cc:80
msgid "Export"
msgstr "Экспортировать"
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:181
msgid "Clean-up Unused Sources..."
msgstr "Очистить неиспользуемые источники..."
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:185
msgid "Flush Wastebasket"
msgstr "Очистить корзину"
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:192
msgid "Quit"
msgstr "Выход"
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:193 automation_time_axis.cc:543 editor_actions.cc:654
+#: editor_markers.cc:895 location_ui.cc:57 plugin_selector.cc:86
+#: route_time_axis.cc:865
+msgid "Hide"
+msgstr "Скрыть"
+
+#: ardour_ui_ed.cc:197
msgid "Maximise Editor Space"
msgstr "Редактор на полный экран"
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:198
msgid "Maximise Mixer Space"
msgstr "Развернуть окно микшера"
-#: ardour_ui_ed.cc:194
+#: ardour_ui_ed.cc:199
msgid "Show Toolbars"
msgstr "Показывать панели"
-#: ardour_ui_ed.cc:198
+#: ardour_ui_ed.cc:203
msgid "Show more UI preferences"
msgstr "Показать больше предустановок UI"
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1925 mixer_ui.cc:1931
+#: ardour_ui_ed.cc:205 mixer_ui.cc:1945 mixer_ui.cc:1951
msgid "Window|Mixer"
msgstr "Микшер"
-#: ardour_ui_ed.cc:201
+#: ardour_ui_ed.cc:206
msgid "Toggle Editor+Mixer"
msgstr "Редактор или микшер на переднем плане"
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:207 meterbridge.cc:217 meterbridge.cc:223
msgid "Window|Meterbridge"
msgstr "Панель индикаторов"
-#: ardour_ui_ed.cc:204
+#: ardour_ui_ed.cc:209
msgid "Reattach All Tearoffs"
msgstr "Заново прикрепить разрывы"
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:211 midi_tracer.cc:45
msgid "MIDI Tracer"
msgstr "Журнал MIDI-событий"
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:213
msgid "Chat"
msgstr "Пообщаться"
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:215
msgid "Help|Manual"
msgstr "Справка"
-#: ardour_ui_ed.cc:211
+#: ardour_ui_ed.cc:216
msgid "Reference"
msgstr "Справка в Интернете"
-#: ardour_ui_ed.cc:212
+#: ardour_ui_ed.cc:217
msgid "Report A Bug"
msgstr "Сообщить об ошибке"
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:218
msgid "Cheat Sheet"
msgstr "Шпаргалка"
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:219
msgid "Ardour Website"
msgstr "Сайт Ardour"
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:220
msgid "Ardour Development"
msgstr "Разработка Ardour"
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:221
msgid "User Forums"
msgstr "Форумы для пользователей"
-#: ardour_ui_ed.cc:217
+#: ardour_ui_ed.cc:222
msgid "How to report a bug"
msgstr "Как сообщить об ошибке"
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:224 plugin_ui.cc:419
msgid "Save"
msgstr "Сохранить"
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:232 rc_option_editor.cc:1879 rc_option_editor.cc:1890
+#: rc_option_editor.cc:1901 rc_option_editor.cc:1912 rc_option_editor.cc:1921
+#: rc_option_editor.cc:1934 rc_option_editor.cc:1947 rc_option_editor.cc:1956
+#: rc_option_editor.cc:1966 rc_option_editor.cc:1968 rc_option_editor.cc:1977
+#: rc_option_editor.cc:1993 rc_option_editor.cc:2014 rc_option_editor.cc:2032
+#: rc_option_editor.cc:2034 rc_option_editor.cc:2050 rc_option_editor.cc:2053
+#: rc_option_editor.cc:2055 rc_option_editor.cc:2072 rc_option_editor.cc:2083
msgid "Transport"
msgstr "Транспорт"
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:238
msgid "Stop"
msgstr "Стоп"
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:241
msgid "Roll"
msgstr "Перевернуть"
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:245 ardour_ui_ed.cc:248
msgid "Start/Stop"
msgstr "Старт/Стоп"
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:251
msgid "Start/Continue/Stop"
msgstr "Старт/Продолжить/Стоп"
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:254
msgid "Stop and Forget Capture"
msgstr "Остановиться и забыть захват"
-#: ardour_ui_ed.cc:259
+#: ardour_ui_ed.cc:264
msgid "Transition To Roll"
msgstr "В обычном направлении"
-#: ardour_ui_ed.cc:263
+#: ardour_ui_ed.cc:268
msgid "Transition To Reverse"
msgstr "В обратном направлении"
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:272
msgid "Play Loop Range"
msgstr "Воспроизвести петлю"
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:275
msgid "Play Selection"
msgstr "Воспроизводить выделение"
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:278
msgid "Play Selection w/Preroll"
msgstr "Играть выбранный w/Preroll"
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:282
msgid "Enable Record"
msgstr "Разрешить запись"
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:285 ardour_ui_ed.cc:289
msgid "Start Recording"
msgstr "Начать запись"
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:293
msgid "Rewind"
msgstr "Перемотать назад"
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:296
msgid "Rewind (Slow)"
msgstr "Перемотать назад (медленно)"
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:299
msgid "Rewind (Fast)"
msgstr "Перемотать назад (быстро)"
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:302
msgid "Forward"
msgstr "Перемотать вперёд"
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:305
msgid "Forward (Slow)"
msgstr "Перемотать вперёд (медленно)"
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:308
msgid "Forward (Fast)"
msgstr "Перемотать вперёд (быстро)"
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:311
msgid "Go to Zero"
msgstr "К нулевой отметке"
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:314 ardour_ui_ed.cc:317
msgid "Go to Start"
msgstr "К началу"
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:320
msgid "Go to End"
msgstr "В конец"
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:323
msgid "Go to Wall Clock"
msgstr "К текущему времени"
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:328 ardour_ui_ed.cc:331
msgid "Numpad Decimal"
msgstr "Десятичный разделитель на цифровой клавиатуре"
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:334
msgid "Numpad 0"
msgstr "Numpad 0"
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:337
msgid "Numpad 1"
msgstr "Numpad 1"
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:340
msgid "Numpad 2"
msgstr "Numpad 2"
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:343
msgid "Numpad 3"
msgstr "Numpad 3"
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:346
msgid "Numpad 4"
msgstr "Numpad 3"
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:349
msgid "Numpad 5"
msgstr "Numpad 5"
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:352
msgid "Numpad 6"
msgstr "Numpad 6"
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:355
msgid "Numpad 7"
msgstr "Numpad 7"
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:358
msgid "Numpad 8"
msgstr "Numpad 8"
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:361
msgid "Numpad 9"
msgstr "Numpad 9"
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:365
msgid "Focus On Clock"
msgstr "Изменить время вручную"
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2109 editor.cc:258
-#: editor_actions.cc:567 editor_actions.cc:576 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:369 ardour_ui_ed.cc:378 audio_clock.cc:2114 editor.cc:259
+#: editor_actions.cc:578 editor_actions.cc:587 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
#: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2205,121 +2255,129 @@ msgstr "Изменить время вручную"
msgid "Timecode"
msgstr "Тайм-код"
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:565
+#: ardour_ui_ed.cc:371 ardour_ui_ed.cc:380 editor_actions.cc:576
msgid "Bars & Beats"
msgstr "Такты и доли"
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:373 ardour_ui_ed.cc:382
msgid "Minutes & Seconds"
msgstr "Минуты и секунды"
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2113 editor.cc:259
-#: editor_actions.cc:566
+#: ardour_ui_ed.cc:375 ardour_ui_ed.cc:384 audio_clock.cc:2118 editor.cc:260
+#: editor_actions.cc:577
msgid "Samples"
msgstr "Сэмплы"
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:387
msgid "Punch In"
msgstr "Начало врезки"
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1838 mixer_strip.cc:2026 route_ui.cc:165
+#: ardour_ui_ed.cc:388 mixer_strip.cc:1881 mixer_strip.cc:2069 route_ui.cc:164
#: time_info_box.cc:116
msgid "In"
msgstr "Вход"
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:391
msgid "Punch Out"
msgstr "Конец врезки"
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1850 time_info_box.cc:117
+#: ardour_ui_ed.cc:392 mixer_strip.cc:1893 time_info_box.cc:117
msgid "Out"
msgstr "Выход"
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:395
msgid "Punch In/Out"
msgstr "Врезка"
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:396
msgid "In/Out"
msgstr "Вх/Вых"
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:399 rc_option_editor.cc:1845
msgid "Click"
msgstr "Метроном"
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:402
msgid "Auto Input"
msgstr "Автовход"
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:405
msgid "Auto Play"
msgstr "Автовоспр."
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:416
msgid "Sync Startup to Video"
msgstr "Синхронизировать начало с видео"
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:418
msgid "Time Master"
msgstr "Ведущий времени"
#: ardour_ui_ed.cc:420
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:425
msgid "Toggle Record Enable Track %1"
msgstr "Переключить записываемость дорожки %1"
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:432
msgid "Percentage"
msgstr "Проценты"
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:433 shuttle_control.cc:187
msgid "Semitones"
msgstr "Полутона"
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:437
msgid "Send MTC"
msgstr "Передавать MTC"
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:439
msgid "Send MMC"
msgstr "Передавать MMC"
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:441
msgid "Use MMC"
msgstr "Использовать MMC"
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2089
+#: ardour_ui_ed.cc:443 rc_option_editor.cc:2571
msgid "Send MIDI Clock"
msgstr "Отправлять MIDI Clock"
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:445
msgid "Send MIDI Feedback"
msgstr "Отправлять MIDI Feedback"
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:451
msgid "Panic"
msgstr "Паника"
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:542
msgid "Wall Clock"
msgstr "Текущее время"
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:544
msgid "Disk Space"
msgstr "Диск. пространство"
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:545
msgid "DSP"
msgstr "DSP"
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:546
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:547
msgid "Buffers"
msgstr "Буферы"
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:549
msgid "Timecode Format"
msgstr "Формат тайм-кода"
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:550
msgid "File Format"
msgstr "Формат файлов"
@@ -2335,69 +2393,69 @@ msgstr ""
msgid "Internal"
msgstr "Внутр. синхронизация"
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:503
msgid "Enable/Disable external positional sync"
msgstr "Включить или выключить внешнюю синхронизацию позиционирования"
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:505
msgid "Sync to JACK is not possible: video pull up/down is set"
msgstr ""
"Синхронизация с JACK не возможна: установлена растяжка видео вверх/вниз"
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1052 audio_clock.cc:1071
msgid "--pending--"
msgstr "--в ожидании--"
-#: audio_clock.cc:1118
+#: audio_clock.cc:1123
msgid "SR"
msgstr "SR"
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1129 audio_clock.cc:1133
msgid "Pull"
msgstr "Подтягивание"
-#: audio_clock.cc:1126
+#: audio_clock.cc:1131
#, c-format
msgid "%+.4f%%"
msgstr "%+.4f%%"
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:559
+#: audio_clock.cc:1287 editor.cc:261 editor_actions.cc:139
+#: editor_actions.cc:570
msgid "Tempo"
msgstr "Темп"
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:560
+#: audio_clock.cc:1291 editor.cc:262 editor_actions.cc:571
msgid "Meter"
msgstr "Размер"
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1087
+#: audio_clock.cc:1869 audio_streamview.cc:116 editor_actions.cc:1101
#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
#: streamview.cc:470
msgid "programming error: %1"
msgstr "Ошибка в программе: %1"
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2002 audio_clock.cc:2030
msgid "programming error: %1 %2"
msgstr "Ошибка в программе: %1 %2"
-#: audio_clock.cc:2111 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2116 editor.cc:258 export_timespan_selector.cc:98
msgid "Bars:Beats"
msgstr "Такты : Доли"
-#: audio_clock.cc:2112 export_timespan_selector.cc:93
+#: audio_clock.cc:2117 export_timespan_selector.cc:93
msgid "Minutes:Seconds"
msgstr "Минуты : Секунды"
-#: audio_clock.cc:2117
+#: audio_clock.cc:2122
msgid "Set From Playhead"
msgstr "По указателю воспроизведения"
-#: audio_clock.cc:2118
+#: audio_clock.cc:2123
msgid "Locate to This Time"
msgstr "Перейти к этой позиции"
-#: audio_clock.cc:2121
+#: audio_clock.cc:2126
msgid "Copy to clipboard"
msgstr "Скопировать в буфер обмена"
@@ -2422,7 +2480,7 @@ msgstr "Пиковая амплитуда:"
msgid "Calculating..."
msgstr "Производится вычисление..."
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1254
msgid "add gain control point"
msgstr "Добавление точки контроля усиления"
@@ -2445,23 +2503,19 @@ msgstr[0] "Сделать равным %1 удару"
msgstr[1] "Сделать равным %1 ударам"
msgstr[2] "Сделать равным %1 ударам"
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:287 editor_drag.cc:4129
msgid "automation event move"
msgstr "Смещение события автоматизации"
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr "Смещение выделения автоматизации"
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:884 region_gain_line.cc:75
msgid "remove control point"
msgstr "Удаление контрольной точки"
-#: automation_line.cc:1003
+#: automation_line.cc:1008
msgid "Ignoring illegal points on AutomationLine \"%1\""
msgstr "Игнорирование некорреткных точек на линии автоматизации \"%1\""
-#: automation_region_view.cc:190 automation_time_axis.cc:645
+#: automation_region_view.cc:190 automation_time_axis.cc:644
msgid "add automation event"
msgstr "Новое событие автоматизации"
@@ -2469,71 +2523,66 @@ msgstr "Новое событие автоматизации"
msgid "unable to display automation region for control without list"
msgstr "без списка невозможно показать область автоматизации для управления"
-#: automation_time_axis.cc:164
+#: automation_time_axis.cc:163
msgid "automation state"
msgstr "Состояние автоматизации"
-#: automation_time_axis.cc:165
+#: automation_time_axis.cc:164
msgid "hide track"
msgstr "Скрыть дорожку"
-#: automation_time_axis.cc:309 automation_time_axis.cc:361
-#: automation_time_axis.cc:555 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:308 automation_time_axis.cc:360
+#: automation_time_axis.cc:554 gain_meter.cc:222 generic_pluginui.cc:524
+#: generic_pluginui.cc:818 panner_ui.cc:149
msgid "Automation|Manual"
msgstr "Вручную"
-#: automation_time_axis.cc:311 automation_time_axis.cc:372
-#: automation_time_axis.cc:560 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1918 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
-#: panner_ui.cc:154
+#: automation_time_axis.cc:310 automation_time_axis.cc:371
+#: automation_time_axis.cc:559 editor.cc:1916 editor.cc:1994
+#: editor_actions.cc:122 editor_actions.cc:1932 gain_meter.cc:225
+#: generic_pluginui.cc:100 generic_pluginui.cc:527 generic_pluginui.cc:820
+#: midi_time_axis.cc:1607 midi_time_axis.cc:1610 midi_time_axis.cc:1613
+#: panner_ui.cc:152
msgid "Play"
msgstr "Проигрывание"
-#: automation_time_axis.cc:313 automation_time_axis.cc:383
-#: automation_time_axis.cc:565 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:312 automation_time_axis.cc:382
+#: automation_time_axis.cc:564 gain_meter.cc:228 generic_pluginui.cc:102
+#: generic_pluginui.cc:530 generic_pluginui.cc:822 panner_ui.cc:155
msgid "Write"
msgstr "Запись"
-#: automation_time_axis.cc:315 automation_time_axis.cc:394
-#: automation_time_axis.cc:570 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:314 automation_time_axis.cc:393
+#: automation_time_axis.cc:569 gain_meter.cc:231 generic_pluginui.cc:104
+#: generic_pluginui.cc:533 generic_pluginui.cc:824 panner_ui.cc:158
msgid "Touch"
msgstr "Касание"
-#: automation_time_axis.cc:405 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:404 generic_pluginui.cc:536 meter_patterns.cc:116
msgid "???"
msgstr "???"
-#: automation_time_axis.cc:446
+#: automation_time_axis.cc:445
msgid "clear automation"
msgstr "Очистить автоматизацию"
-#: automation_time_axis.cc:544 editor_actions.cc:643 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Скрыть"
-
-#: automation_time_axis.cc:546
+#: automation_time_axis.cc:545
msgid "Clear"
msgstr "Очистить"
-#: automation_time_axis.cc:577
+#: automation_time_axis.cc:576
msgid "State"
msgstr "Состояние"
-#: automation_time_axis.cc:593
+#: automation_time_axis.cc:592
msgid "Discrete"
msgstr "Дискретный"
-#: automation_time_axis.cc:599 export_format_dialog.cc:485
+#: automation_time_axis.cc:598 export_format_dialog.cc:489
msgid "Linear"
msgstr "Линейная"
-#: automation_time_axis.cc:605 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:206
msgid "Mode"
msgstr "Режим"
@@ -2549,30 +2598,31 @@ msgstr "Изменение пакета"
msgid "Direction:"
msgstr "Направление:"
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:686
-#: mixer_strip.cc:164 mixer_strip.cc:369 mixer_strip.cc:2259
-#: rc_option_editor.cc:2318
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:881
+#: mixer_strip.cc:165 mixer_strip.cc:379 mixer_strip.cc:2302
+#: rc_option_editor.cc:2828
msgid "Input"
msgstr "Вход"
#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:688 mixer_strip.cc:168 mixer_strip.cc:373
-#: mixer_strip.cc:2262 rc_option_editor.cc:2322
+#: engine_dialog.cc:883 mixer_strip.cc:169 mixer_strip.cc:383
+#: mixer_strip.cc:2305 monitor_section.cc:329 monitor_section.cc:333
+#: rc_option_editor.cc:2832
msgid "Output"
msgstr "Выход"
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:1958 editor_actions.cc:94
+#: editor_actions.cc:104 rc_option_editor.cc:1539 rc_option_editor.cc:1546
msgid "Edit"
msgstr "Правка"
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 plugin_ui.cc:420 processor_box.cc:2460
+#: bundle_manager.cc:266 editor.cc:5921 editor.cc:5949 editor_actions.cc:345
+#: editor_actions.cc:346 plugin_ui.cc:420 processor_box.cc:2525
msgid "Delete"
msgstr "Удалить"
#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: editor_routes.cc:207 midi_list_editor.cc:107 session_metadata_dialog.cc:646
msgid "Name"
msgstr "Имя"
@@ -2655,578 +2705,582 @@ msgstr "Длительность"
msgid "edit note"
msgstr "Правка ноты"
-#: editor.cc:147
+#: editor.cc:148
msgid "CD Frames"
msgstr "Выборки CD"
-#: editor.cc:148
+#: editor.cc:149
msgid "TC Frames"
msgstr "TC кадры"
-#: editor.cc:149
+#: editor.cc:150
msgid "TC Seconds"
msgstr "TC секунды"
-#: editor.cc:150
+#: editor.cc:151
msgid "TC Minutes"
msgstr "TC минуты"
-#: editor.cc:151
+#: editor.cc:152
msgid "Seconds"
msgstr "Секунды"
-#: editor.cc:152
+#: editor.cc:153
msgid "Minutes"
msgstr "Минуты"
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:154 quantize_dialog.cc:37 quantize_dialog.cc:141
msgid "Beats/128"
msgstr "Доли/128"
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:155 quantize_dialog.cc:38 quantize_dialog.cc:143
msgid "Beats/64"
msgstr "Доли/64"
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:156 quantize_dialog.cc:39 quantize_dialog.cc:145
msgid "Beats/32"
msgstr "Доли/32"
-#: editor.cc:156
+#: editor.cc:157
msgid "Beats/28"
msgstr "Доли/28"
-#: editor.cc:157
+#: editor.cc:158
msgid "Beats/24"
msgstr "Доли/24"
-#: editor.cc:158
+#: editor.cc:159
msgid "Beats/20"
msgstr "Доли/20"
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:160 quantize_dialog.cc:40 quantize_dialog.cc:147
msgid "Beats/16"
msgstr "Доли/16"
-#: editor.cc:160
+#: editor.cc:161
msgid "Beats/14"
msgstr "Доли/14"
-#: editor.cc:161
+#: editor.cc:162
msgid "Beats/12"
msgstr "Доли/12"
-#: editor.cc:162
+#: editor.cc:163
msgid "Beats/10"
msgstr "Доли/10"
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:164 quantize_dialog.cc:41 quantize_dialog.cc:149
msgid "Beats/8"
msgstr "Доли/8"
-#: editor.cc:164
+#: editor.cc:165
msgid "Beats/7"
msgstr "Доли/7"
-#: editor.cc:165
+#: editor.cc:166
msgid "Beats/6"
msgstr "Доли/6"
-#: editor.cc:166
+#: editor.cc:167
msgid "Beats/5"
msgstr "Доли/5"
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:168 quantize_dialog.cc:42 quantize_dialog.cc:151
msgid "Beats/4"
msgstr "Доли/4"
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:169 quantize_dialog.cc:43 quantize_dialog.cc:153
msgid "Beats/3"
msgstr "Доли/3"
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:170 quantize_dialog.cc:44 quantize_dialog.cc:155
msgid "Beats/2"
msgstr "Доли/2"
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:171 quantize_dialog.cc:45 quantize_dialog.cc:157
msgid "Beats"
msgstr "Доли"
-#: editor.cc:171
+#: editor.cc:172
msgid "Bars"
msgstr "Такты"
-#: editor.cc:172
+#: editor.cc:173
msgid "Marks"
msgstr "Маркеры"
-#: editor.cc:173
+#: editor.cc:174
msgid "Region starts"
msgstr "Начала областей"
-#: editor.cc:174
+#: editor.cc:175
msgid "Region ends"
msgstr "Концы областей"
-#: editor.cc:175
+#: editor.cc:176
msgid "Region syncs"
msgstr "Синхр. областей"
-#: editor.cc:176
+#: editor.cc:177
msgid "Region bounds"
msgstr "Границы областей"
-#: editor.cc:181 editor_actions.cc:508
+#: editor.cc:182 editor_actions.cc:519
msgid "No Grid"
msgstr "Без сетки"
-#: editor.cc:182 editor_actions.cc:509
+#: editor.cc:183 editor_actions.cc:520
msgid "Grid"
msgstr "По сетке"
-#: editor.cc:183 editor_actions.cc:510
+#: editor.cc:184 editor_actions.cc:521
msgid "Magnetic"
msgstr "Магнит"
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:491
+#: editor.cc:189 editor.cc:207 editor_actions.cc:121 editor_actions.cc:502
msgid "Playhead"
msgstr "Указатель воспроизведения"
-#: editor.cc:189 editor_actions.cc:493
+#: editor.cc:190 editor_actions.cc:504
msgid "Marker"
msgstr "Маркер"
-#: editor.cc:190 editor.cc:207 editor_actions.cc:492
+#: editor.cc:191 editor.cc:208 editor_actions.cc:503
msgid "Mouse"
msgstr "Мышь"
-#: editor.cc:195 editor_actions.cc:500
+#: editor.cc:196 editor_actions.cc:511
msgid "Slide"
msgstr "Слайд"
-#: editor.cc:196
+#: editor.cc:197
msgid "Splice"
msgstr "Стыковка"
-#: editor.cc:197 editor_actions.cc:499
+#: editor.cc:198 editor_actions.cc:510
msgid "Ripple"
msgstr "Рябь"
-#: editor.cc:198 editor_actions.cc:1787 editor_markers.cc:905
+#: editor.cc:199 editor_actions.cc:1801 editor_markers.cc:898
#: editor_rulers.cc:260 location_ui.cc:58
msgid "Lock"
msgstr "Блок"
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:204 mono_panner_editor.cc:42
msgid "Left"
msgstr "Влево"
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:205 mono_panner_editor.cc:47
msgid "Right"
msgstr "Вправо"
-#: editor.cc:205
+#: editor.cc:206
msgid "Center"
msgstr "По центру"
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:209 editor.cc:3248
msgid "Edit point"
msgstr "Курсор редактора"
-#: editor.cc:214
+#: editor.cc:215
msgid "Mushy"
msgstr "Мягкое"
-#: editor.cc:215
+#: editor.cc:216
msgid "Smooth"
msgstr "Сглаживание"
-#: editor.cc:216
+#: editor.cc:217
msgid "Balanced multitimbral mixture"
msgstr "Сбалансированный многотембральный микс"
-#: editor.cc:217
+#: editor.cc:218
msgid "Unpitched percussion with stable notes"
msgstr "Перкуссионное соло без коррекции высоты тона с выделяющимися нотами"
-#: editor.cc:218
+#: editor.cc:219
msgid "Crisp monophonic instrumental"
msgstr "Чистое монофоническое инструментальное соло"
-#: editor.cc:219
+#: editor.cc:220
msgid "Unpitched solo percussion"
msgstr "Перкуссионное соло без коррекции высоты тона"
-#: editor.cc:220
+#: editor.cc:221
msgid "Resample without preserving pitch"
msgstr "Ресэмплировать, не сохраняя высоту тона"
-#: editor.cc:256
+#: editor.cc:257
msgid "Mins:Secs"
msgstr "Минуты:Секунды"
-#: editor.cc:262
+#: editor.cc:263
msgid "Location Markers"
msgstr "Маркеры позиций"
-#: editor.cc:263
+#: editor.cc:264
msgid "Range Markers"
msgstr "Маркеры выделений"
-#: editor.cc:264
+#: editor.cc:265
msgid "Loop/Punch Ranges"
msgstr "Диапазоны петель/врезок"
-#: editor.cc:265 editor_actions.cc:563
+#: editor.cc:266 editor_actions.cc:574
msgid "CD Markers"
msgstr "Маркеры CD"
-#: editor.cc:266
+#: editor.cc:267
msgid "Video Timeline"
msgstr "Видеолинейка"
-#: editor.cc:283
+#: editor.cc:284
msgid "mode"
msgstr "Режим"
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:562
+#: editor.cc:462 editor_actions.cc:114 editor_actions.cc:573
msgid "Markers"
msgstr "Маркеры"
-#: editor.cc:577 rc_option_editor.cc:1931
+#: editor.cc:580 rc_option_editor.cc:2413
msgid "Regions"
msgstr "Области"
-#: editor.cc:578
+#: editor.cc:581
msgid "Tracks & Busses"
msgstr "Дорожки и шины"
-#: editor.cc:579
+#: editor.cc:582
msgid "Snapshots"
msgstr "Снимки"
-#: editor.cc:580
+#: editor.cc:583
msgid "Track & Bus Groups"
msgstr "Группы дорожек и шин"
-#: editor.cc:581
+#: editor.cc:584
msgid "Ranges & Marks"
msgstr "Области и маркеры"
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1764
-#: rc_option_editor.cc:1768 rc_option_editor.cc:1792
+#: editor.cc:731 editor.cc:5773 rc_option_editor.cc:2090
+#: rc_option_editor.cc:2098 rc_option_editor.cc:2106 rc_option_editor.cc:2114
+#: rc_option_editor.cc:2138 rc_option_editor.cc:2150 rc_option_editor.cc:2161
+#: rc_option_editor.cc:2163 rc_option_editor.cc:2171 rc_option_editor.cc:2179
+#: rc_option_editor.cc:2199 rc_option_editor.cc:2211 rc_option_editor.cc:2213
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2223 rc_option_editor.cc:2231
+#: rc_option_editor.cc:2246 rc_option_editor.cc:2250 rc_option_editor.cc:2274
msgid "Editor"
msgstr "Редактор"
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1863
+#: editor.cc:1335 editor.cc:4757 editor_actions.cc:134 editor_actions.cc:1877
msgid "Loop"
msgstr "Петля"
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1341 editor.cc:4784 editor_actions.cc:135 time_info_box.cc:68
msgid "Punch"
msgstr "Врезка"
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1453 rc_option_editor.cc:2132
msgid "Linear (for highly correlated material)"
msgstr "Линейно (для схожего материала)"
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1463 rc_option_editor.cc:2133
msgid "Constant power"
msgstr "С постоянной силой"
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1472 rc_option_editor.cc:2134
msgid "Symmetric"
msgstr "Симметрично"
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1482 rc_option_editor.cc:2135
msgid "Slow"
msgstr "Медленно"
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1491 rc_option_editor.cc:2136 sfdb_ui.cc:1770 sfdb_ui.cc:1880
msgid "Fast"
msgstr "Быстро"
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1513 editor.cc:1538
msgid "Deactivate"
msgstr "Деактивировать"
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1515 editor.cc:1540
msgid "Activate"
msgstr "Активировать"
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1641 editor.cc:1649 editor_ops.cc:3933
msgid "Freeze"
msgstr "Заморозить"
-#: editor.cc:1641
+#: editor.cc:1645
msgid "Unfreeze"
msgstr "Разморозить"
-#: editor.cc:1780
+#: editor.cc:1784
msgid "Selected Regions"
msgstr "Выделенные области"
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1828 editor_markers.cc:933
msgid "Play Range"
msgstr "Воспроизвести выделение"
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1829 editor_markers.cc:936
msgid "Loop Range"
msgstr "Создать петлю из выделения"
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1832 editor_markers.cc:943
msgid "Zoom to Range"
msgstr "Масштабировать в выделение"
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1841 editor_actions.cc:376
msgid "Move Range Start to Previous Region Boundary"
msgstr "Переместить начало выделения к границе предыдущей области"
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1848 editor_actions.cc:383
msgid "Move Range Start to Next Region Boundary"
msgstr "Переместить начало выделения к границе следующей области"
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1855 editor_actions.cc:390
msgid "Move Range End to Previous Region Boundary"
msgstr "Переместить конец выделения к границе предыдущей области"
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1862 editor_actions.cc:397
msgid "Move Range End to Next Region Boundary"
msgstr "Переместить конец выделения к границе следующей области"
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1868 editor_actions.cc:133 editor_actions.cc:332
msgid "Separate"
msgstr "Разделить"
-#: editor.cc:1857
+#: editor.cc:1869
msgid "Convert to Region in Region List"
msgstr "Преобразовать в область в списке областей"
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1872 editor_markers.cc:963
msgid "Select All in Range"
msgstr "Выбрать всё в выделении"
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1875 editor_actions.cc:304
msgid "Set Loop from Selection"
msgstr "Создать петлю из выделения"
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1876 editor_actions.cc:305
msgid "Set Punch from Selection"
msgstr "Создать врезку из выделения"
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1877 editor_actions.cc:306
msgid "Set Session Start/End from Selection"
msgstr "Задать начало и конец по выделению"
-#: editor.cc:1868
+#: editor.cc:1880
msgid "Add Range Markers"
msgstr "Добавить маркеры областей"
-#: editor.cc:1871
+#: editor.cc:1883
msgid "Crop Region to Range"
msgstr "Обрезать область по выделению"
-#: editor.cc:1872
+#: editor.cc:1884
msgid "Fill Range with Region"
msgstr "Заполнить диапазон областью"
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:1885 editor_actions.cc:318
msgid "Duplicate Range"
msgstr "Продублировать диапазон"
-#: editor.cc:1876
+#: editor.cc:1888
msgid "Consolidate Range"
msgstr "Объединить диапазон"
-#: editor.cc:1877
+#: editor.cc:1889
msgid "Consolidate Range With Processing"
msgstr "Объединить диапазон с обработкой"
-#: editor.cc:1878
+#: editor.cc:1890
msgid "Bounce Range to Region List"
msgstr "Свести диапазон в список областей"
-#: editor.cc:1879
+#: editor.cc:1891
msgid "Bounce Range to Region List With Processing"
msgstr "Свести выделение в список областей с обработкой"
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:1892 editor_markers.cc:946
msgid "Export Range..."
msgstr "Экспортировать выделение…"
-#: editor.cc:1882
+#: editor.cc:1894
msgid "Export Video Range..."
msgstr "Экспортировать фрагмент видео..."
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
+#: editor.cc:1910 editor.cc:1992 editor_actions.cc:310
msgid "Play From Edit Point"
msgstr "Воспроизвести от курсора редактора"
-#: editor.cc:1899 editor.cc:1980
+#: editor.cc:1911 editor.cc:1993
msgid "Play From Start"
msgstr "Воспроизвести с начала"
-#: editor.cc:1900
+#: editor.cc:1912
msgid "Play Region"
msgstr "Воспроизвести область"
-#: editor.cc:1902
+#: editor.cc:1914
msgid "Loop Region"
msgstr "Создать петлю из области"
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:1924 editor.cc:2002
msgid "Select All in Track"
msgstr "Выделить всё на дорожке"
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:1925 editor.cc:2003 editor_actions.cc:194
msgid "Select All Objects"
msgstr "Выделить все объекты"
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:1926 editor.cc:2004
msgid "Invert Selection in Track"
msgstr "Обратить выделение на дорожке"
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:1927 editor.cc:2005 editor_actions.cc:197
msgid "Invert Selection"
msgstr "Обратить выделение"
-#: editor.cc:1917
+#: editor.cc:1929
msgid "Set Range to Loop Range"
msgstr "Установить диапазон по диапазону петли"
-#: editor.cc:1918
+#: editor.cc:1930 editor_actions.cc:200
msgid "Set Range to Punch Range"
msgstr "Установить диапазон по диапазону врезки"
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:1931 editor_actions.cc:201
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:1933 editor.cc:2007 editor_actions.cc:203 editor_actions.cc:204
msgid "Select All After Edit Point"
msgstr "Выделить всё после курсора редактора"
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:1934 editor.cc:2008 editor_actions.cc:205 editor_actions.cc:206
msgid "Select All Before Edit Point"
msgstr "Выделить всё до курсора редактора"
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:1935 editor.cc:2009
msgid "Select All After Playhead"
msgstr "Выделить всё после указателя"
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:1936 editor.cc:2010
msgid "Select All Before Playhead"
msgstr "Выделить всё до указателя"
-#: editor.cc:1924
+#: editor.cc:1937
msgid "Select All Between Playhead and Edit Point"
msgstr "Выделить всё между указателем и курсором редактора"
-#: editor.cc:1925
+#: editor.cc:1938
msgid "Select All Within Playhead and Edit Point"
msgstr "Выделить всё между указателем и точкой редактирования"
-#: editor.cc:1926
+#: editor.cc:1939
msgid "Select Range Between Playhead and Edit Point"
msgstr "Создать выделение между указателем и курсором редактора"
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:1941 editor.cc:2012 editor_actions.cc:131 editor_actions.cc:132
msgid "Select"
msgstr "Выделить"
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2453
+#: editor.cc:1949 editor.cc:2020 editor_actions.cc:344 processor_box.cc:2518
msgid "Cut"
msgstr "Вырезать"
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2456
+#: editor.cc:1950 editor.cc:2021 editor_actions.cc:348 processor_box.cc:2521
msgid "Copy"
msgstr "Копировать"
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2464
+#: editor.cc:1951 editor.cc:2022 editor_actions.cc:349 processor_box.cc:2529
msgid "Paste"
msgstr "Вставить"
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:1955 editor_actions.cc:91
msgid "Align"
msgstr "Выровнять"
-#: editor.cc:1943
+#: editor.cc:1956
msgid "Align Relative"
msgstr "Выровнять относительно"
-#: editor.cc:1950
+#: editor.cc:1963
msgid "Insert Selected Region"
msgstr "Вставить выделенную область"
-#: editor.cc:1951
+#: editor.cc:1964
msgid "Insert Existing Media"
msgstr "Вставить существующие данные"
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:1973 editor.cc:2029
msgid "Nudge Entire Track Later"
msgstr "Толкнуть всю дорожку вперёд"
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:1974 editor.cc:2030
msgid "Nudge Track After Edit Point Later"
msgstr "Толкнуть дорожку вперёд после курсора редактора"
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:1975 editor.cc:2031
msgid "Nudge Entire Track Earlier"
msgstr "Толкнуть всю дорожку назад"
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:1976 editor.cc:2032
msgid "Nudge Track After Edit Point Earlier"
msgstr "Толкнуть дорожку назад после курсора редактора"
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:1978 editor.cc:2034
msgid "Nudge"
msgstr "Толкнуть"
-#: editor.cc:2235
+#: editor.cc:2249
msgid ""
"Playhead position stored with a negative value - ignored (use zero instead)"
msgstr ""
"Позиция указателя воспроизведения сохранена с негативным значением и будет "
"проигнорирована. Вместо неё будет использовано начало сеанса."
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3027 editor.cc:3724 editor.cc:3795 midi_channel_selector.cc:157
#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
msgid "All"
msgstr "Все"
-#: editor.cc:3210
+#: editor.cc:3227
msgid "Smart Mode (add Range functions to Grab mode)"
msgstr "Универсальный режим (захват + работа с диапазонами)"
-#: editor.cc:3211
+#: editor.cc:3228
msgid "Grab Mode (select/move objects)"
msgstr "Захват (выделение и перемещение объектов)"
-#: editor.cc:3212
+#: editor.cc:3229
msgid "Cut Mode (split regions)"
msgstr "Нарезка (разделение областей)"
-#: editor.cc:3213
+#: editor.cc:3230
msgid "Range Mode (select time ranges)"
msgstr "Диапазоны (выделение диапазонов времени)"
-#: editor.cc:3214
+#: editor.cc:3231
msgid "Draw Mode (draw and edit gain/notes/automation)"
msgstr "Рисование (рисование и правка усиления, нот и автоматизации)"
-#: editor.cc:3215
+#: editor.cc:3232
msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
msgstr "Растягивание (аудио и MIDI во времени с сохранением высоты тона)"
-#: editor.cc:3216
+#: editor.cc:3233
msgid "Audition Mode (listen to regions)"
msgstr "Прослушивание (областей)"
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
-msgstr "Правка внутри областей (нот и кривых усиления)"
+#: editor.cc:3234
+msgid "Internal Edit Mode (edit notes and automation points)"
+msgstr "Правка содержимого областей (правка нот и точек автоматизации)"
-#: editor.cc:3218
+#: editor.cc:3235
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
@@ -3234,59 +3288,59 @@ msgstr ""
"Группы: щёлкните для (де)активации\n"
"Щелчок другой клавишей вызывает контекстное меню"
-#: editor.cc:3219
+#: editor.cc:3236
msgid "Nudge Region/Selection Later"
msgstr "Толкнуть область или выделение вперёд"
-#: editor.cc:3220
+#: editor.cc:3237
msgid "Nudge Region/Selection Earlier"
msgstr "Толкнуть область или выделение назад"
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3238 editor_actions.cc:269
msgid "Zoom In"
msgstr "Увеличить"
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3239 editor_actions.cc:268
msgid "Zoom Out"
msgstr "Уменьшить"
-#: editor.cc:3223
+#: editor.cc:3240
msgid "Zoom to Time Scale"
msgstr "Увеличить до шкалы времени"
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3241 editor.cc:3746 editor_actions.cc:270
msgid "Zoom to Session"
msgstr "Показать всё"
-#: editor.cc:3225
+#: editor.cc:3242
msgid "Zoom focus"
msgstr "Фокус при масштабировании"
-#: editor.cc:3226
+#: editor.cc:3243
msgid "Expand Tracks"
msgstr "Увеличить дорожки по высоте"
-#: editor.cc:3227
+#: editor.cc:3244
msgid "Shrink Tracks"
msgstr "Уменьшить дорожки по высоте"
-#: editor.cc:3228
+#: editor.cc:3245
msgid "Number of visible tracks"
msgstr "Количество видимых дорожек"
-#: editor.cc:3229
+#: editor.cc:3246
msgid "Snap/Grid Units"
msgstr "Единица привязки/сетки"
-#: editor.cc:3230
+#: editor.cc:3247
msgid "Snap/Grid Mode"
msgstr "Режим привязки/сетки"
-#: editor.cc:3232
+#: editor.cc:3249
msgid "Edit Mode"
msgstr "Режим редактирования"
-#: editor.cc:3233
+#: editor.cc:3250
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
@@ -3294,124 +3348,124 @@ msgstr ""
"Сдвиг часов\n"
"(расстояние, на которое подтолкнуть области и выделения)"
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3518 editor_actions.cc:320
msgid "Command|Undo"
msgstr "Отменить"
-#: editor.cc:3503
+#: editor.cc:3520
msgid "Command|Undo (%1)"
msgstr "Отменить (%1)"
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3527 editor_actions.cc:322 editor_actions.cc:323
+#: editor_actions.cc:324
msgid "Redo"
msgstr "Вернуть"
-#: editor.cc:3512
+#: editor.cc:3529
msgid "Redo (%1)"
msgstr "Вернуть (%1)"
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1844
+#: editor.cc:3548 editor.cc:3572 editor_actions.cc:110 editor_actions.cc:1858
msgid "Duplicate"
msgstr "Продублировать"
-#: editor.cc:3532
+#: editor.cc:3549
msgid "Number of duplications:"
msgstr "Количество копий:"
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3723 route_group_dialog.cc:51 time_info_box.cc:67
msgid "Selection"
msgstr "Выделение"
-#: editor.cc:3709
+#: editor.cc:3726
msgid "Fit 1 track"
msgstr "Уместить 1 дорожку"
-#: editor.cc:3710
+#: editor.cc:3727
msgid "Fit 2 tracks"
msgstr "Уместить 2 дорожки"
-#: editor.cc:3711
+#: editor.cc:3728
msgid "Fit 4 tracks"
msgstr "Уместить 4 дорожки"
-#: editor.cc:3712
+#: editor.cc:3729
msgid "Fit 8 tracks"
msgstr "Уместить 8 дорожек"
-#: editor.cc:3713
+#: editor.cc:3730
msgid "Fit 16 tracks"
msgstr "Уместить 16 дорожек"
-#: editor.cc:3714
+#: editor.cc:3731
msgid "Fit 24 tracks"
msgstr "Уместить 24 дорожки"
-#: editor.cc:3715
+#: editor.cc:3732
msgid "Fit 32 tracks"
msgstr "Уместить 32 дорожки"
-#: editor.cc:3716
+#: editor.cc:3733
msgid "Fit 48 tracks"
msgstr "Уместить 48 дорожек"
-#: editor.cc:3717
+#: editor.cc:3734
msgid "Fit All tracks"
msgstr "Уместить все дорожки"
-#: editor.cc:3718
+#: editor.cc:3735
msgid "Fit Selection"
msgstr "Уместить выделение"
-#: editor.cc:3720
+#: editor.cc:3737
msgid "Zoom to 10 ms"
msgstr "Отмасштабировать до 10 мс"
-#: editor.cc:3721
+#: editor.cc:3738
msgid "Zoom to 100 ms"
msgstr "Отмасштабировать до 100 мс"
-#: editor.cc:3722
+#: editor.cc:3739
msgid "Zoom to 1 sec"
msgstr "Отмасштабировать до 1 сек"
-#: editor.cc:3723
+#: editor.cc:3740
msgid "Zoom to 10 sec"
msgstr "Отмасштабировать до 10 сек"
-#: editor.cc:3724
+#: editor.cc:3741
msgid "Zoom to 1 min"
msgstr "Отмасштабировать до 1 мин"
-#: editor.cc:3725
+#: editor.cc:3742
msgid "Zoom to 10 min"
msgstr "Отмасштабировать до 10 мин"
-#: editor.cc:3726
+#: editor.cc:3743
msgid "Zoom to 1 hour"
msgstr "Отмасштабировать до 1 часа"
-#: editor.cc:3727
+#: editor.cc:3744
msgid "Zoom to 8 hours"
msgstr "Отмасштабировать до 8 час"
-#: editor.cc:3728
+#: editor.cc:3745
msgid "Zoom to 24 hours"
msgstr "Отмасштабировать до 24 час"
-#: editor.cc:3730
+#: editor.cc:3747
msgid "Zoom to Range/Region Selection"
msgstr "Отмасштабировать до выбранного диапазона/области"
-#: editor.cc:3800
+#: editor.cc:3817
msgid "*"
msgstr "*"
-#: editor.cc:4120
+#: editor.cc:4137
msgid "Playlist Deletion"
msgstr "Удаление списка воспроизведения"
-#: editor.cc:4121
+#: editor.cc:4138
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
@@ -3421,54 +3475,54 @@ msgstr ""
"Если его оставить, связанные звуковые файлы не будут подчищены.\n"
"Если его удалить, будут подчищены и связанные звуковые файлы."
-#: editor.cc:4131
+#: editor.cc:4148
msgid "Delete Playlist"
msgstr "Удалить список"
-#: editor.cc:4132
+#: editor.cc:4149
msgid "Keep Playlist"
msgstr "Сохранить список"
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2107 sfdb_freesound_mootcher.cc:69 processor_box.cc:2221
-#: processor_box.cc:2246
+#: editor.cc:4150 editor_audio_import.cc:597 editor_ops.cc:6407
+#: engine_dialog.cc:2679 sfdb_freesound_mootcher.cc:69 processor_box.cc:2286
+#: processor_box.cc:2311
msgid "Cancel"
msgstr "Отмена"
-#: editor.cc:4275
+#: editor.cc:4292
msgid "new playlists"
msgstr "Создать списки воспроизведения"
-#: editor.cc:4291
+#: editor.cc:4308
msgid "copy playlists"
msgstr "Скопировать списки воспроизведения"
-#: editor.cc:4306
+#: editor.cc:4323
msgid "clear playlists"
msgstr "Очистить списки воспроизведения"
-#: editor.cc:5046
+#: editor.cc:5068
msgid "Please wait while %1 loads visual data."
msgstr "Дождитесь загрузки визуальных данных в %1."
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2484
+#: editor.cc:5920 editor.cc:5951 editor_markers.cc:978 panner_ui.cc:410
+#: processor_box.cc:2549
msgid "Edit..."
msgstr "Изменить"
-#: editor.cc:5934 editor_actions.cc:1939
+#: editor.cc:5953 editor_actions.cc:1953
msgid "Legatize"
msgstr "Добавить легато"
-#: editor.cc:5936 editor_actions.cc:1938
+#: editor.cc:5955 editor_actions.cc:1952
msgid "Quantize..."
msgstr "Квантование..."
-#: editor.cc:5938 editor_actions.cc:1941
+#: editor.cc:5957 editor_actions.cc:1955
msgid "Remove Overlap"
msgstr "Убрать перекрытие"
-#: editor.cc:5940 editor_actions.cc:1940
+#: editor.cc:5959 editor_actions.cc:1954
msgid "Transform..."
msgstr "Преобразовать..."
@@ -3516,8 +3570,8 @@ msgstr "Слои"
msgid "Position"
msgstr "Положение"
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:105 gain_meter.cc:158 gain_meter.cc:827 panner_ui.cc:176
+#: panner_ui.cc:635 route_time_axis.cc:528
msgid "Trim"
msgstr "Обрезать"
@@ -3525,11 +3579,11 @@ msgstr "Обрезать"
msgid "Gain"
msgstr "Усиление"
-#: editor_actions.cc:107 editor_actions.cc:561
+#: editor_actions.cc:107 editor_actions.cc:572
msgid "Ranges"
msgstr "Выделения"
-#: editor_actions.cc:108 editor_actions.cc:1840 session_option_editor.cc:135
+#: editor_actions.cc:108 editor_actions.cc:1854 session_option_editor.cc:135
#: session_option_editor.cc:144 session_option_editor.cc:151
msgid "Fades"
msgstr "Фейды"
@@ -3562,7 +3616,7 @@ msgstr "Параметры MIDI"
msgid "Misc Options"
msgstr "Прочие параметры"
-#: editor_actions.cc:119 rc_option_editor.cc:1801 route_group_dialog.cc:54
+#: editor_actions.cc:119 rc_option_editor.cc:2283 route_group_dialog.cc:54
#: session_option_editor.cc:243 session_option_editor.cc:250
msgid "Monitoring"
msgstr "Мониторинг"
@@ -3607,7 +3661,7 @@ msgstr "Подвыборки"
msgid "Timecode fps"
msgstr "Скорость (FPS) тайм-кода"
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:141 route_time_axis.cc:586
msgid "Height"
msgstr "Высота"
@@ -3739,978 +3793,998 @@ msgstr "К концу области"
msgid "Select All Tracks"
msgstr "Выбрать все дорожки"
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2470
+#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2535
msgid "Deselect All"
msgstr "Снять все выделения"
-#: editor_actions.cc:204
+#: editor_actions.cc:199
+msgid "Set Range in Loop Range"
+msgstr ""
+
+#: editor_actions.cc:208
msgid "Select All Overlapping Edit Range"
msgstr "Выделить всю пересекающуюся область правки"
-#: editor_actions.cc:205
+#: editor_actions.cc:209
msgid "Select All Inside Edit Range"
msgstr "Выделить всё внутри области правки"
-#: editor_actions.cc:207
+#: editor_actions.cc:211
msgid "Select Edit Range"
msgstr "Выделить область правки"
-#: editor_actions.cc:209
+#: editor_actions.cc:213
msgid "Select All in Punch Range"
msgstr "Выделить все в области врезки"
-#: editor_actions.cc:210
+#: editor_actions.cc:214
msgid "Select All in Loop Range"
msgstr "Выделить всё в закольцованной области"
-#: editor_actions.cc:212
+#: editor_actions.cc:216
msgid "Select Next Track or Bus"
msgstr "Выбрать следующую дорожку или шину"
-#: editor_actions.cc:213
+#: editor_actions.cc:217
msgid "Select Previous Track or Bus"
msgstr "Выбрать предыдущую дорожку или шину"
-#: editor_actions.cc:215
+#: editor_actions.cc:219
msgid "Toggle Record Enable"
msgstr "Переключить готовность к записи"
-#: editor_actions.cc:217
+#: editor_actions.cc:221
msgid "Toggle Solo"
msgstr "Переключить соло"
-#: editor_actions.cc:219
+#: editor_actions.cc:223
msgid "Toggle Mute"
msgstr "Переключить приглушение"
-#: editor_actions.cc:221
+#: editor_actions.cc:225
msgid "Toggle Solo Isolate"
msgstr "Переключить изолирование солирования"
-#: editor_actions.cc:226
+#: editor_actions.cc:230
msgid "Save View %1"
msgstr "Сохранить вид %1"
-#: editor_actions.cc:232
+#: editor_actions.cc:236
msgid "Go to View %1"
msgstr "Перейти к виду %1"
-#: editor_actions.cc:238
+#: editor_actions.cc:242
msgid "Locate to Mark %1"
msgstr "Перейти к маркеру %1"
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:246 editor_actions.cc:247
msgid "Jump to Next Mark"
msgstr "К следующему маркеру"
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:248 editor_actions.cc:249
msgid "Jump to Previous Mark"
msgstr "К предыдущему маркеру"
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:251
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:252
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:254 editor_actions.cc:255
msgid "Add Mark from Playhead"
msgstr "Добавить маркер по указателю"
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:257 editor_actions.cc:258
msgid "Remove Mark at Playhead"
msgstr "Удалить маркер воспроизведения"
-#: editor_actions.cc:253
+#: editor_actions.cc:260
msgid "Nudge Next Later"
msgstr "Сдвиг следующего позже"
-#: editor_actions.cc:254
+#: editor_actions.cc:261
msgid "Nudge Next Earlier"
msgstr "Сдвиг следующего раньше"
-#: editor_actions.cc:256
+#: editor_actions.cc:263
msgid "Nudge Playhead Forward"
msgstr "Толкнуть указатель вперёд"
-#: editor_actions.cc:257
+#: editor_actions.cc:264
msgid "Nudge Playhead Backward"
msgstr "Толкнуть указатель назад"
-#: editor_actions.cc:258
+#: editor_actions.cc:265
msgid "Playhead To Next Grid"
msgstr "К следующему делению сетки"
-#: editor_actions.cc:259
+#: editor_actions.cc:266
msgid "Playhead To Previous Grid"
msgstr "К предыдущему делению сетки"
-#: editor_actions.cc:264
+#: editor_actions.cc:271
msgid "Zoom to Selection"
msgstr "Масштабировать до выделения"
-#: editor_actions.cc:265
+#: editor_actions.cc:272
msgid "Toggle Zoom State"
msgstr "Переключить состояния масштаба"
-#: editor_actions.cc:267
+#: editor_actions.cc:274
msgid "Expand Track Height"
msgstr "Увеличить высоту дорожки"
-#: editor_actions.cc:268
+#: editor_actions.cc:275
msgid "Shrink Track Height"
msgstr "Уменьшить высоту дорожки"
-#: editor_actions.cc:270
+#: editor_actions.cc:277
msgid "Move Selected Tracks Up"
msgstr "Поднять выбранные дорожки"
-#: editor_actions.cc:272
+#: editor_actions.cc:279
msgid "Move Selected Tracks Down"
msgstr "Опустить выбранные дорожки"
-#: editor_actions.cc:275
+#: editor_actions.cc:282
msgid "Scroll Tracks Up"
msgstr "Прокрутить дорожки вверх"
-#: editor_actions.cc:277
+#: editor_actions.cc:284
msgid "Scroll Tracks Down"
msgstr "Прокрутить дорожки вниз"
-#: editor_actions.cc:279
+#: editor_actions.cc:286
msgid "Step Tracks Up"
msgstr "Перейти на дорожку выше"
-#: editor_actions.cc:281
+#: editor_actions.cc:288
msgid "Step Tracks Down"
msgstr "Перейти на дорожку ниже"
-#: editor_actions.cc:284
+#: editor_actions.cc:291
msgid "Scroll Backward"
msgstr "Прокрутить назад"
-#: editor_actions.cc:285
+#: editor_actions.cc:292
msgid "Scroll Forward"
msgstr "Прокрутить вперёд"
-#: editor_actions.cc:286
+#: editor_actions.cc:293
msgid "Center Playhead"
msgstr "Указатель по центру"
-#: editor_actions.cc:287
+#: editor_actions.cc:294
msgid "Center Edit Point"
msgstr "Центрировать точку редактирования"
-#: editor_actions.cc:289
+#: editor_actions.cc:296
msgid "Playhead Forward"
msgstr "Указатель вперёд"
-#: editor_actions.cc:290
+#: editor_actions.cc:297
msgid "Playhead Backward"
msgstr "Указатель назад"
-#: editor_actions.cc:292
+#: editor_actions.cc:299
msgid "Playhead to Active Mark"
msgstr "Указатель к активному маркеру"
-#: editor_actions.cc:293
+#: editor_actions.cc:300
msgid "Active Mark to Playhead"
msgstr "Активный маркер к указателю воспроизведения"
-#: editor_actions.cc:295
+#: editor_actions.cc:302
msgid "Use Skip Ranges"
msgstr "Исп. пропуск диапазонов"
-#: editor_actions.cc:302
+#: editor_actions.cc:309
msgid "Play Selected Regions"
msgstr "Воспроизвести выбранные области"
-#: editor_actions.cc:304
+#: editor_actions.cc:311
msgid "Play from Edit Point and Return"
msgstr "Воспроизвести от курсора редактора и вернуться"
-#: editor_actions.cc:306
+#: editor_actions.cc:313
msgid "Play Edit Range"
msgstr "Воспроизвести изменяемое выделение"
-#: editor_actions.cc:308
+#: editor_actions.cc:315
msgid "Playhead to Mouse"
msgstr "Указатель к курсору мыши"
-#: editor_actions.cc:309
+#: editor_actions.cc:316
msgid "Active Marker to Mouse"
msgstr "Активный маркер к указателю мыши"
-#: editor_actions.cc:319
+#: editor_actions.cc:326
msgid "Undo Selection Change"
msgstr "Отменить смену выделения"
-#: editor_actions.cc:320
+#: editor_actions.cc:327
msgid "Redo Selection Change"
msgstr "Повторить смену выделения"
-#: editor_actions.cc:322
+#: editor_actions.cc:329
msgid "Export Audio"
msgstr "Экспортировать звук"
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:330 export_dialog.cc:396
msgid "Export Range"
msgstr "Экспортировать область"
-#: editor_actions.cc:328
+#: editor_actions.cc:335
msgid "Separate Using Punch Range"
msgstr "Разделить по выделению врезки"
-#: editor_actions.cc:331
+#: editor_actions.cc:338
msgid "Separate Using Loop Range"
msgstr "Разделить по выделению петли"
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:341 editor_actions.cc:363
msgid "Crop"
msgstr "Обрезать"
-#: editor_actions.cc:344
+#: editor_actions.cc:351
msgid "Fade Range Selection"
msgstr "Диапазон появления"
-#: editor_actions.cc:346
+#: editor_actions.cc:353
msgid "Set Tempo from Edit Range = Bar"
msgstr "Установить темп, считая что диапазон редактирования = такт"
-#: editor_actions.cc:348
+#: editor_actions.cc:355
msgid "Log"
msgstr "Журнал"
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:358 editor_actions.cc:360
msgid "Move to Next Transient"
msgstr "Перейти к следующей переменной"
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:359 editor_actions.cc:361
msgid "Move to Previous Transient"
msgstr "Перейти к предыдущей переменной"
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:365 editor_actions.cc:368
msgid "Start Range"
msgstr "Начать выделение"
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:366 editor_actions.cc:369
msgid "Finish Range"
msgstr "Закончить выделение"
-#: editor_actions.cc:394
+#: editor_actions.cc:401
msgid "Follow Playhead"
msgstr "Следовать за указателем"
-#: editor_actions.cc:395
+#: editor_actions.cc:402
msgid "Remove Last Capture"
msgstr "Удалить последнюю запись"
-#: editor_actions.cc:397
+#: editor_actions.cc:404
msgid "Stationary Playhead"
msgstr "Неподвижный указатель"
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:406 insert_remove_time_dialog.cc:32
msgid "Insert Time"
msgstr "Вставить промежуток времени"
-#: editor_actions.cc:402
+#: editor_actions.cc:408 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:413
msgid "Toggle Active"
msgstr "Переключить активность"
-#: editor_actions.cc:404 editor_actions.cc:1766 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1560
-#: route_time_axis.cc:856
+#: editor_actions.cc:415 editor_actions.cc:1780 editor_markers.cc:914
+#: editor_markers.cc:979 editor_snapshots.cc:122 mixer_strip.cc:1603
+#: route_time_axis.cc:867
msgid "Remove"
msgstr "Удалить"
-#: editor_actions.cc:409
+#: editor_actions.cc:420
msgid "Fit Selection (Vertical)"
msgstr "Уместить выделение по вертикали"
-#: editor_actions.cc:411 time_axis_view.cc:1371
+#: editor_actions.cc:422 time_axis_view.cc:1382
msgid "Largest"
msgstr "Огромная"
-#: editor_actions.cc:414 time_axis_view.cc:1372
+#: editor_actions.cc:425 time_axis_view.cc:1383
msgid "Larger"
msgstr "Больше"
-#: editor_actions.cc:417 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:428 editor_rulers.cc:249 time_axis_view.cc:1384
msgid "Large"
msgstr "Большая"
-#: editor_actions.cc:423 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:434 editor_rulers.cc:253 time_axis_view.cc:1386
msgid "Small"
msgstr "Маленькая"
-#: editor_actions.cc:427
+#: editor_actions.cc:438
msgid "Sound Selected MIDI Notes"
msgstr "Воспроизводить выделяемые MIDI-ноты"
-#: editor_actions.cc:432
+#: editor_actions.cc:443
msgid "Zoom Focus Left"
msgstr "Влево"
-#: editor_actions.cc:433
+#: editor_actions.cc:444
msgid "Zoom Focus Right"
msgstr "Вправо"
-#: editor_actions.cc:434
+#: editor_actions.cc:445
msgid "Zoom Focus Center"
msgstr "По центру"
-#: editor_actions.cc:435
+#: editor_actions.cc:446
msgid "Zoom Focus Playhead"
msgstr "По указателю"
-#: editor_actions.cc:436
+#: editor_actions.cc:447
msgid "Zoom Focus Mouse"
msgstr "По курсору мыши"
-#: editor_actions.cc:437
+#: editor_actions.cc:448
msgid "Zoom Focus Edit Point"
msgstr "По точке редактирования"
-#: editor_actions.cc:439
+#: editor_actions.cc:450
msgid "Next Zoom Focus"
msgstr "Следующий вариант фокуса"
-#: editor_actions.cc:445
+#: editor_actions.cc:456
msgid "Smart Object Mode"
msgstr "Универсальный режим"
-#: editor_actions.cc:448
+#: editor_actions.cc:459
msgid "Smart"
msgstr "Универсальный"
-#: editor_actions.cc:451
+#: editor_actions.cc:462
msgid "Object Tool"
msgstr "Объект"
-#: editor_actions.cc:456
+#: editor_actions.cc:467
msgid "Range Tool"
msgstr "Выделение"
-#: editor_actions.cc:461
+#: editor_actions.cc:472
msgid "Note Drawing Tool"
msgstr "Инструмент рисования нот"
-#: editor_actions.cc:466
+#: editor_actions.cc:477
msgid "Audition Tool"
msgstr "Инструмент прослушивания"
-#: editor_actions.cc:471
+#: editor_actions.cc:482
msgid "Time FX Tool"
msgstr "Растяжение во времени"
-#: editor_actions.cc:476
+#: editor_actions.cc:487
msgid "Content Tool"
msgstr "Правка содержимого"
-#: editor_actions.cc:482
+#: editor_actions.cc:493
msgid "Cut Tool"
msgstr "Инструмент обрезки"
-#: editor_actions.cc:488
+#: editor_actions.cc:499
msgid "Step Mouse Mode"
msgstr "Режим шага мыши"
-#: editor_actions.cc:495
+#: editor_actions.cc:506
msgid "Change Edit Point"
msgstr "Изменить точку редактирования"
-#: editor_actions.cc:496
+#: editor_actions.cc:507
msgid "Change Edit Point Including Marker"
msgstr "Изменить точку редактирования, включая маркер"
-#: editor_actions.cc:501
+#: editor_actions.cc:512
msgid "EditMode|Lock"
msgstr "Блок"
-#: editor_actions.cc:502
+#: editor_actions.cc:513
msgid "Cycle Edit Mode"
msgstr "Циклически менять режим редактирования"
-#: editor_actions.cc:504
+#: editor_actions.cc:515
msgid "Snap to"
msgstr "Привязка"
-#: editor_actions.cc:505
+#: editor_actions.cc:516
msgid "Snap Mode"
msgstr "Режим привязки"
-#: editor_actions.cc:512
+#: editor_actions.cc:523
msgid "Next Snap Mode"
msgstr "Следующий режим привязки"
-#: editor_actions.cc:513
+#: editor_actions.cc:524
msgid "Next Snap Choice"
msgstr "Следующий выбор привязки"
-#: editor_actions.cc:514
+#: editor_actions.cc:525
msgid "Next Musical Snap Choice"
msgstr "Следующий вариант привязки (такты, доли)"
-#: editor_actions.cc:515
+#: editor_actions.cc:526
msgid "Previous Snap Choice"
msgstr "Предыдущий вариант привязки"
-#: editor_actions.cc:516
+#: editor_actions.cc:527
msgid "Previous Musical Snap Choice"
msgstr "Предыдущий вариант привязки (такты, доли)"
-#: editor_actions.cc:521
+#: editor_actions.cc:532
msgid "Snap to CD Frame"
msgstr "К выборкам CD"
-#: editor_actions.cc:522
+#: editor_actions.cc:533
msgid "Snap to Timecode Frame"
msgstr "К кадрам таймкода"
-#: editor_actions.cc:523
+#: editor_actions.cc:534
msgid "Snap to Timecode Seconds"
msgstr "К секундам таймкода"
-#: editor_actions.cc:524
+#: editor_actions.cc:535
msgid "Snap to Timecode Minutes"
msgstr "К минутам таймкода"
-#: editor_actions.cc:525
+#: editor_actions.cc:536
msgid "Snap to Seconds"
msgstr "К секундам"
-#: editor_actions.cc:526
+#: editor_actions.cc:537
msgid "Snap to Minutes"
msgstr "К минутам"
-#: editor_actions.cc:528
+#: editor_actions.cc:539
msgid "Snap to One Twenty Eighths"
msgstr "К 1/28"
-#: editor_actions.cc:529
+#: editor_actions.cc:540
msgid "Snap to Sixty Fourths"
msgstr "К 1/24"
-#: editor_actions.cc:530
+#: editor_actions.cc:541
msgid "Snap to Thirty Seconds"
msgstr "К 30 секундам"
-#: editor_actions.cc:531
+#: editor_actions.cc:542
msgid "Snap to Twenty Eighths"
msgstr "К 1/28"
-#: editor_actions.cc:532
+#: editor_actions.cc:543
msgid "Snap to Twenty Fourths"
msgstr "К 1/24"
-#: editor_actions.cc:533
+#: editor_actions.cc:544
msgid "Snap to Twentieths"
msgstr "К 1/20"
-#: editor_actions.cc:534
+#: editor_actions.cc:545
msgid "Snap to Sixteenths"
msgstr "К 1/16"
-#: editor_actions.cc:535
+#: editor_actions.cc:546
msgid "Snap to Fourteenths"
msgstr "К 1/14"
-#: editor_actions.cc:536
+#: editor_actions.cc:547
msgid "Snap to Twelfths"
msgstr "К 1/12"
-#: editor_actions.cc:537
+#: editor_actions.cc:548
msgid "Snap to Tenths"
msgstr "К 1/10"
-#: editor_actions.cc:538
+#: editor_actions.cc:549
msgid "Snap to Eighths"
msgstr "К 1/8"
-#: editor_actions.cc:539
+#: editor_actions.cc:550
msgid "Snap to Sevenths"
msgstr "К 1/7"
-#: editor_actions.cc:540
+#: editor_actions.cc:551
msgid "Snap to Sixths"
msgstr "К 1/6"
-#: editor_actions.cc:541
+#: editor_actions.cc:552
msgid "Snap to Fifths"
msgstr "К 1/5"
-#: editor_actions.cc:542
+#: editor_actions.cc:553
msgid "Snap to Quarters"
msgstr "К 1/4"
-#: editor_actions.cc:543
+#: editor_actions.cc:554
msgid "Snap to Thirds"
msgstr "К 1/3"
-#: editor_actions.cc:544
+#: editor_actions.cc:555
msgid "Snap to Halves"
msgstr "К 1/2"
-#: editor_actions.cc:546
+#: editor_actions.cc:557
msgid "Snap to Beat"
msgstr "К долям"
-#: editor_actions.cc:547
+#: editor_actions.cc:558
msgid "Snap to Bar"
msgstr "К тактам"
-#: editor_actions.cc:548
+#: editor_actions.cc:559
msgid "Snap to Mark"
msgstr "К маркерам"
-#: editor_actions.cc:549
+#: editor_actions.cc:560
msgid "Snap to Region Start"
msgstr "К началам областей"
-#: editor_actions.cc:550
+#: editor_actions.cc:561
msgid "Snap to Region End"
msgstr "К концам областей"
-#: editor_actions.cc:551
+#: editor_actions.cc:562
msgid "Snap to Region Sync"
msgstr "К синхронизаторам областей"
-#: editor_actions.cc:552
+#: editor_actions.cc:563
msgid "Snap to Region Boundary"
msgstr "К границам областей"
-#: editor_actions.cc:554
+#: editor_actions.cc:565
msgid "Show Marker Lines"
msgstr "Показывать линии маркеров"
-#: editor_actions.cc:564
+#: editor_actions.cc:575
msgid "Loop/Punch"
msgstr "Петли/Врезки"
-#: editor_actions.cc:568
+#: editor_actions.cc:579
msgid "Min:Sec"
msgstr "Мин:С"
-#: editor_actions.cc:570 editor_actions.cc:573 editor_rulers.cc:271
+#: editor_actions.cc:581 editor_actions.cc:584 editor_rulers.cc:271
msgid "Video Monitor"
msgstr "Видеомонитор"
-#: editor_actions.cc:572 rc_option_editor.cc:2252
+#: editor_actions.cc:583 rc_option_editor.cc:2734
msgid "Video"
msgstr "Видео"
-#: editor_actions.cc:575
+#: editor_actions.cc:586
msgid "Always on Top"
msgstr "Всегда сверху"
-#: editor_actions.cc:577
+#: editor_actions.cc:588
msgid "Frame number"
msgstr "Номер кадра"
-#: editor_actions.cc:578
+#: editor_actions.cc:589
msgid "Timecode Background"
msgstr "Фон тайм-кода"
-#: editor_actions.cc:579
+#: editor_actions.cc:590
msgid "Fullscreen"
msgstr "Во весь экран"
-#: editor_actions.cc:580
+#: editor_actions.cc:591
msgid "Letterbox"
msgstr "Уместить в окно"
-#: editor_actions.cc:581
+#: editor_actions.cc:592
msgid "Original Size"
msgstr "Исходный размер"
-#: editor_actions.cc:638
+#: editor_actions.cc:649
msgid "Sort"
msgstr "Сортировать"
-#: editor_actions.cc:649 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:660 editor_routes.cc:484 mixer_ui.cc:1212
msgid "Show All"
msgstr "Показать всё"
-#: editor_actions.cc:650
+#: editor_actions.cc:661
msgid "Show Automatic Regions"
msgstr "Показать автомат. области"
-#: editor_actions.cc:652
+#: editor_actions.cc:663
msgid "Ascending"
msgstr "По возрастанию"
-#: editor_actions.cc:654
+#: editor_actions.cc:665
msgid "Descending"
msgstr "По убыванию"
-#: editor_actions.cc:657
+#: editor_actions.cc:668
msgid "By Region Name"
msgstr "По имени области"
-#: editor_actions.cc:659
+#: editor_actions.cc:670
msgid "By Region Length"
msgstr "По длительности области"
-#: editor_actions.cc:661
+#: editor_actions.cc:672
msgid "By Region Position"
msgstr "По расположению области"
-#: editor_actions.cc:663
+#: editor_actions.cc:674
msgid "By Region Timestamp"
msgstr "По времени создания области"
-#: editor_actions.cc:665
+#: editor_actions.cc:676
msgid "By Region Start in File"
msgstr "По началу области в файле"
-#: editor_actions.cc:667
+#: editor_actions.cc:678
msgid "By Region End in File"
msgstr "По концу области в файле"
-#: editor_actions.cc:669
+#: editor_actions.cc:680
msgid "By Source File Name"
msgstr "По имени исходного файла"
-#: editor_actions.cc:671
+#: editor_actions.cc:682
msgid "By Source File Length"
msgstr "По длительности исходного файла"
-#: editor_actions.cc:673
+#: editor_actions.cc:684
msgid "By Source File Creation Date"
msgstr "По дате создания исходного файла"
-#: editor_actions.cc:675
+#: editor_actions.cc:686
msgid "By Source Filesystem"
msgstr "По исходной файловой системе"
-#: editor_actions.cc:678
+#: editor_actions.cc:689
msgid "Remove Unused"
msgstr "Удаление неиспользуемых"
-#: editor_actions.cc:682 editor_audio_import.cc:282
+#: editor_actions.cc:691
+msgid "Import PT session"
+msgstr "Импортировать сессию PT"
+
+#: editor_actions.cc:696 editor_audio_import.cc:282 editor_pt_import.cc:148
#: session_import_dialog.cc:75 session_import_dialog.cc:95
#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
msgid "Import"
msgstr "Импортировать"
-#: editor_actions.cc:685
+#: editor_actions.cc:699
msgid "Import to Region List..."
msgstr "Импортировать в список областей…"
-#: editor_actions.cc:688 session_import_dialog.cc:44
+#: editor_actions.cc:702 session_import_dialog.cc:44
msgid "Import From Session"
msgstr "Импортировать из сессии"
-#: editor_actions.cc:692
+#: editor_actions.cc:706
msgid "Bring all media into session folder"
msgstr "Занести все медиа в папку сессии"
-#: editor_actions.cc:695
+#: editor_actions.cc:709
msgid "Show Summary"
msgstr "Показывать сводку"
-#: editor_actions.cc:697
+#: editor_actions.cc:711
msgid "Show Group Tabs"
msgstr "Показывать вкладки групп"
-#: editor_actions.cc:699
+#: editor_actions.cc:713
msgid "Show Measure Lines"
msgstr "Показывать линии тактов и долей"
-#: editor_actions.cc:703
+#: editor_actions.cc:717
msgid "Show Logo"
msgstr "Показать логотип"
-#: editor_actions.cc:707
+#: editor_actions.cc:721
msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
msgstr "Переключить активный вход MIDI для редактора выбранных дорожек/шин"
-#: editor_actions.cc:730
+#: editor_actions.cc:744
msgid "Loaded editor bindings from %1"
msgstr "Загруженный редактор привязки от %1"
-#: editor_actions.cc:732
+#: editor_actions.cc:746
msgid "Could not find editor.bindings in search path %1"
msgstr "Не удалось найти редактор привязок в пути поиска %1"
-#: editor_actions.cc:1076 editor_actions.cc:1472 editor_actions.cc:1483
-#: editor_actions.cc:1536 editor_actions.cc:1547 editor_actions.cc:1594
-#: editor_actions.cc:1604 editor_regions.cc:1563
+#: editor_actions.cc:1090 editor_actions.cc:1486 editor_actions.cc:1497
+#: editor_actions.cc:1550 editor_actions.cc:1561 editor_actions.cc:1608
+#: editor_actions.cc:1618 editor_regions.cc:1571
msgid "programming error: %1: %2"
msgstr "Ошибка в программе: %1: %2"
-#: editor_actions.cc:1772
+#: editor_actions.cc:1786
msgid "Raise"
msgstr "Поднять"
-#: editor_actions.cc:1775
+#: editor_actions.cc:1789
msgid "Raise to Top"
msgstr "На самый верх"
-#: editor_actions.cc:1778
+#: editor_actions.cc:1792
msgid "Lower"
msgstr "Опустить"
-#: editor_actions.cc:1781
+#: editor_actions.cc:1795
msgid "Lower to Bottom"
msgstr "В самый низ"
-#: editor_actions.cc:1784
+#: editor_actions.cc:1798
msgid "Move to Original Position"
msgstr "К исходной позиции"
-#: editor_actions.cc:1789
+#: editor_actions.cc:1803
msgid "Lock to Video"
msgstr "Прикрепить к видео"
-#: editor_actions.cc:1794 editor_markers.cc:912
+#: editor_actions.cc:1808 editor_markers.cc:905
msgid "Glue to Bars and Beats"
msgstr "Прикрепить к тактам и долям"
-#: editor_actions.cc:1799
+#: editor_actions.cc:1813
msgid "Remove Sync"
msgstr "Удалить синхронизатор"
-#: editor_actions.cc:1802 mixer_strip.cc:2025 monitor_section.cc:272
-#: monitor_section.cc:349 route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1816 mixer_strip.cc:2068 monitor_section.cc:278
+#: monitor_section.cc:368 route_time_axis.cc:255 route_time_axis.cc:537
msgid "Mute"
msgstr "Молча"
-#: editor_actions.cc:1805
+#: editor_actions.cc:1819
msgid "Normalize..."
msgstr "Нормировать сигнал..."
-#: editor_actions.cc:1808
+#: editor_actions.cc:1822
msgid "Reverse"
msgstr "Развернуть"
-#: editor_actions.cc:1811
+#: editor_actions.cc:1825
msgid "Make Mono Regions"
msgstr "Создать моно-области"
-#: editor_actions.cc:1814
+#: editor_actions.cc:1828
msgid "Boost Gain"
msgstr "Повысить громкость области"
-#: editor_actions.cc:1817
+#: editor_actions.cc:1831
msgid "Cut Gain"
msgstr "Понизить громкость области"
-#: editor_actions.cc:1820
+#: editor_actions.cc:1834
msgid "Pitch Shift..."
msgstr "Сменить высоту тона…"
-#: editor_actions.cc:1823
+#: editor_actions.cc:1837
msgid "Transpose..."
msgstr "Транспозиция…"
-#: editor_actions.cc:1826
+#: editor_actions.cc:1840
msgid "Opaque"
msgstr "Непрозрачно"
-#: editor_actions.cc:1830 editor_regions.cc:117
+#: editor_actions.cc:1844 editor_regions.cc:117
msgid "Fade In"
msgstr "Нарастание"
-#: editor_actions.cc:1835 editor_regions.cc:118
+#: editor_actions.cc:1849 editor_regions.cc:118
msgid "Fade Out"
msgstr "Затухание"
-#: editor_actions.cc:1850
+#: editor_actions.cc:1864
msgid "Multi-Duplicate..."
msgstr "Продублировать многократно..."
-#: editor_actions.cc:1855
+#: editor_actions.cc:1869
msgid "Fill Track"
msgstr "Заполнить дорожку"
-#: editor_actions.cc:1859 editor_markers.cc:1000
+#: editor_actions.cc:1873 editor_markers.cc:993
msgid "Set Loop Range"
msgstr "Установить область петли"
-#: editor_actions.cc:1866
+#: editor_actions.cc:1880
msgid "Set Punch"
msgstr "Установить врезку"
-#: editor_actions.cc:1870
+#: editor_actions.cc:1884
msgid "Add Single Range Marker"
msgstr "Добавить маркер текущей области"
-#: editor_actions.cc:1875
+#: editor_actions.cc:1889
msgid "Add Range Marker Per Region"
msgstr "Добавить по маркеру на каждую область"
-#: editor_actions.cc:1879
+#: editor_actions.cc:1893
msgid "Snap Position To Grid"
msgstr "Привязать позицию к сетке"
-#: editor_actions.cc:1882
+#: editor_actions.cc:1896
msgid "Close Gaps"
msgstr "Закрыть интервалы"
-#: editor_actions.cc:1885
+#: editor_actions.cc:1899
msgid "Rhythm Ferret..."
msgstr "Ритмический хорёк..."
-#: editor_actions.cc:1888
+#: editor_actions.cc:1902
msgid "Export..."
msgstr "Экспортировать..."
-#: editor_actions.cc:1894
+#: editor_actions.cc:1908
msgid "Separate Under"
msgstr "Разделить под"
-#: editor_actions.cc:1898 editor_actions.cc:1899
+#: editor_actions.cc:1912 editor_actions.cc:1913
msgid "Set Fade In Length"
msgstr "Установить длительность нарастания"
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1914 editor_actions.cc:1915
msgid "Set Fade Out Length"
msgstr "Установить длительность затухания"
-#: editor_actions.cc:1903
+#: editor_actions.cc:1917
msgid "Set Tempo from Region = Bar"
msgstr "Установить темп, считая что область = такт"
-#: editor_actions.cc:1908
+#: editor_actions.cc:1922
msgid "Split at Percussion Onsets"
msgstr "Разделить по атакам перкуссии"
-#: editor_actions.cc:1913
+#: editor_actions.cc:1927
msgid "List Editor..."
msgstr "Редактор списка событий"
-#: editor_actions.cc:1916
+#: editor_actions.cc:1930
msgid "Properties..."
msgstr "Свойства..."
-#: editor_actions.cc:1920
+#: editor_actions.cc:1934
msgid "Bounce (with processing)"
msgstr "Свести (с обработкой)"
-#: editor_actions.cc:1921
+#: editor_actions.cc:1935
msgid "Bounce (without processing)"
msgstr "Свести (без обработки)"
-#: editor_actions.cc:1922
+#: editor_actions.cc:1936
msgid "Combine"
msgstr "Объединить"
-#: editor_actions.cc:1923
+#: editor_actions.cc:1937
msgid "Uncombine"
msgstr "Снять объединение"
-#: editor_actions.cc:1925
+#: editor_actions.cc:1939
msgid "Spectral Analysis..."
msgstr "Спектральный анализ..."
-#: editor_actions.cc:1927
+#: editor_actions.cc:1941
msgid "Reset Envelope"
msgstr "Сбросить огибающую"
-#: editor_actions.cc:1929
+#: editor_actions.cc:1943
msgid "Reset Gain"
msgstr "Сбросить усиление"
-#: editor_actions.cc:1934
+#: editor_actions.cc:1948
msgid "Envelope Active"
msgstr "Огибающая активна"
-#: editor_actions.cc:1942 editor_actions.cc:1943
+#: editor_actions.cc:1956 editor_actions.cc:1957
msgid "Insert Patch Change..."
msgstr "Вставить смену программы..."
-#: editor_actions.cc:1944
+#: editor_actions.cc:1958
msgid "Unlink from other copies"
msgstr "Отсоединить от других копий"
-#: editor_actions.cc:1945
+#: editor_actions.cc:1959
msgid "Strip Silence..."
msgstr "Вырезать тишину..."
-#: editor_actions.cc:1946
+#: editor_actions.cc:1960
msgid "Set Range Selection"
msgstr "Создать выделение из области"
-#: editor_actions.cc:1948 editor_actions.cc:1949
+#: editor_actions.cc:1962 editor_actions.cc:1963
msgid "Nudge Later"
msgstr "Толкнуть вперёд"
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1964 editor_actions.cc:1965
msgid "Nudge Earlier"
msgstr "Толкнуть назад"
-#: editor_actions.cc:1953
+#: editor_actions.cc:1967
msgid "Sequence Regions"
msgstr "Выстроить области встык"
-#: editor_actions.cc:1958
+#: editor_actions.cc:1972
msgid "Nudge Later by Capture Offset"
msgstr "Толкнуть вперёд на смещение захвата"
-#: editor_actions.cc:1965
+#: editor_actions.cc:1979
msgid "Nudge Earlier by Capture Offset"
msgstr "Толкнуть назад на смещение захвата"
-#: editor_actions.cc:1969
+#: editor_actions.cc:1983
msgid "Trim to Loop"
msgstr "В петлю"
-#: editor_actions.cc:1970
+#: editor_actions.cc:1984
msgid "Trim to Punch"
msgstr "Во врезку"
-#: editor_actions.cc:1972
+#: editor_actions.cc:1986
msgid "Trim to Previous"
msgstr "До предыдущей области"
-#: editor_actions.cc:1973
+#: editor_actions.cc:1987
msgid "Trim to Next"
msgstr "До следующей области"
-#: editor_actions.cc:1980
+#: editor_actions.cc:1994
msgid "Insert Region From Region List"
msgstr "Вставить область из списка областей"
-#: editor_actions.cc:1986
+#: editor_actions.cc:2000
msgid "Set Sync Position"
msgstr "Установить синхронизатор области"
-#: editor_actions.cc:1987
+#: editor_actions.cc:2001
msgid "Place Transient"
msgstr "Место переходных"
-#: editor_actions.cc:1988
+#: editor_actions.cc:2002
msgid "Split/Separate"
msgstr "Разбить"
-#: editor_actions.cc:1989
+#: editor_actions.cc:2003
msgid "Trim Start at Edit Point"
msgstr "Начало по курсору редактора"
-#: editor_actions.cc:1990
+#: editor_actions.cc:2004
msgid "Trim End at Edit Point"
msgstr "Конец по курсору редактора"
-#: editor_actions.cc:1995
+#: editor_actions.cc:2009
msgid "Align Start"
msgstr "Выровнять начала областей"
-#: editor_actions.cc:2002
+#: editor_actions.cc:2016
msgid "Align Start Relative"
msgstr "Выровнять относительно начал областей"
-#: editor_actions.cc:2006
+#: editor_actions.cc:2020
msgid "Align End"
msgstr "Выровнять концы областей"
-#: editor_actions.cc:2011
+#: editor_actions.cc:2025
msgid "Align End Relative"
msgstr "Выровнять относительно концов областей"
-#: editor_actions.cc:2018
+#: editor_actions.cc:2032
msgid "Align Sync"
msgstr "Выровнять по синхронизаторам областей"
-#: editor_actions.cc:2025
+#: editor_actions.cc:2039
msgid "Align Sync Relative"
msgstr "Выровнять относительно синхронизаторов областей"
-#: editor_actions.cc:2029 editor_actions.cc:2032
+#: editor_actions.cc:2043 editor_actions.cc:2046
msgid "Choose Top..."
msgstr "Выбрать верхнюю область..."
@@ -4738,32 +4812,33 @@ msgstr ""
"В этой сессии уже есть исходный файл с именем %1. Вы хотите импортировать %2 "
"как новый источник или пропустить его?"
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:148
+#: editor_videotimeline.cc:91
msgid "Cancel Import"
msgstr "Отменить импорт"
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:562
msgid "Editor: cannot open file \"%1\", (%2)"
msgstr "Редактор: не удаётся открыть файл \"%1\", (%2)"
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:570
msgid "Cancel entire import"
msgstr "Отменить весь импорт"
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:571
msgid "Don't embed it"
msgstr "Не встраивать"
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:572
msgid "Embed all without questions"
msgstr "Встроить без лишних вопросов"
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
+#: editor_audio_import.cc:575 editor_audio_import.cc:601
#: export_format_dialog.cc:60
msgid "Sample rate"
msgstr "Частота сэмплирования"
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:576 editor_audio_import.cc:602
msgid ""
"%1\n"
"This audiofile's sample rate doesn't match the session sample rate!"
@@ -4772,96 +4847,134 @@ msgstr ""
"Выбранный звуковой файл имеет частоту сэмплирования,\n"
"отличную от частоты активной сессии!"
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:598
msgid "Embed it anyway"
msgstr "Всё равно встроить"
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr "Импортировать сессию PT"
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:131
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:135
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+"Сессия PT v%1 @ %2Hz\n"
+"\n"
+"Звуковых файлов: %3\n"
+"Областей: %4\n"
+"Активных областей: %5\n"
+"\n"
+"Продолжить..."
+
+#: editor_canvas_events.cc:1311 editor_drag.cc:1402
msgid "Could not create new track after region placed in the drop zone"
msgstr ""
"Не удалось создать новую дорожку после области, помещённой в рабочую зону"
-#: editor_drag.cc:1266
+#: editor_drag.cc:1294
msgid "fixed time region drag"
msgstr "Фиксированная временная область перетаскивания"
-#: editor_drag.cc:2214
+#: editor_drag.cc:2228
msgid "Ripple drag"
msgstr "Перетаскивание ряби"
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2389 midi_region_view.cc:2850
msgid "resize notes"
msgstr "Смена размера ноты"
-#: editor_drag.cc:2517
+#: editor_drag.cc:2584
msgid "Video Start:"
msgstr "Начало видеофайла"
-#: editor_drag.cc:2519
+#: editor_drag.cc:2586
msgid "Diff:"
msgstr "Разница:"
-#: editor_drag.cc:2538
+#: editor_drag.cc:2605
msgid "Move Video"
msgstr "Переместить видео"
-#: editor_drag.cc:3046
+#: editor_drag.cc:3113
msgid "copy meter mark"
msgstr "Скопировать маркер счетчика"
-#: editor_drag.cc:3054
+#: editor_drag.cc:3121
msgid "move meter mark"
msgstr "Переместить маркер счетчика"
-#: editor_drag.cc:3177
+#: editor_drag.cc:3244
msgid "copy tempo mark"
msgstr "Скопировать маркер темпа"
-#: editor_drag.cc:3185
+#: editor_drag.cc:3252
msgid "move tempo mark"
msgstr "Переместить маркер темпа"
-#: editor_drag.cc:3412
+#: editor_drag.cc:3504
msgid "change fade in length"
msgstr "Смена длительности фейда нарастания"
-#: editor_drag.cc:3526
+#: editor_drag.cc:3629
msgid "change fade out length"
msgstr "Смена длительности фейда затухания"
-#: editor_drag.cc:3880
+#: editor_drag.cc:3991
msgid "move marker"
msgstr "Смещение маркера"
-#: editor_drag.cc:4490
+#: editor_drag.cc:4239 editor_drag.cc:5622
+msgid "automation range move"
+msgstr "Смещение выделения автоматизации"
+
+#: editor_drag.cc:4596
msgid "An error occurred while executing time stretch operation"
msgstr "Произошла ошибка при выполнении операции растяжения времени"
-#: editor_drag.cc:4947
+#: editor_drag.cc:5057
msgid "programming_error: %1"
msgstr "Ошибка в программе: %1"
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5126 editor_drag.cc:5136
msgid "new skip marker"
msgstr "Новый маркер пропуска"
-#: editor_drag.cc:5017
+#: editor_drag.cc:5127
msgid "skip"
msgstr "Пропустить"
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5131 location_ui.cc:56
msgid "CD"
msgstr "CD"
-#: editor_drag.cc:5022
+#: editor_drag.cc:5132
msgid "new CD marker"
msgstr "Новый CD маркер"
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5137 editor_route_groups.cc:437 mixer_ui.cc:1513
msgid "unnamed"
msgstr "Безымянный"
-#: editor_drag.cc:5309
+#: editor_drag.cc:5443
msgid "Automation range drag created for invalid region type"
msgstr ""
"Перетаскивание области автоматизации предпринято для неправильного типа "
@@ -4879,7 +4992,7 @@ msgstr "Цвет вкладки группы"
msgid "Name of Group"
msgstr "Название группы"
-#: editor_route_groups.cc:98 editor_routes.cc:207
+#: editor_route_groups.cc:98 editor_routes.cc:208
msgid "Visible|V"
msgstr "В"
@@ -4911,9 +5024,9 @@ msgstr "Отн."
msgid "Relative Gain Changes?"
msgstr "Относительны ли изменения в усилении"
-#: editor_route_groups.cc:102 editor_regions.cc:121 editor_routes.cc:211
-#: mixer_strip.cc:2051 meter_strip.cc:363 route_time_axis.cc:2709
-#: time_axis_view.cc:1190
+#: editor_route_groups.cc:102 editor_regions.cc:121 editor_routes.cc:212
+#: mixer_strip.cc:2094 meter_strip.cc:367 route_time_axis.cc:2741
+#: time_axis_view.cc:1201
msgid "Mute|M"
msgstr "М"
@@ -4921,8 +5034,8 @@ msgstr "М"
msgid "Sharing Mute?"
msgstr "Разделяется ли приглушение"
-#: editor_route_groups.cc:103 editor_routes.cc:212 mixer_strip.cc:2061
-#: meter_strip.cc:371 route_time_axis.cc:2706
+#: editor_route_groups.cc:103 editor_routes.cc:213 mixer_strip.cc:2104
+#: meter_strip.cc:375 route_time_axis.cc:2738
msgid "Solo|S"
msgstr "С"
@@ -4930,8 +5043,8 @@ msgstr "С"
msgid "Sharing Solo?"
msgstr "Разделяется ли солирование"
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:104 midi_time_axis.cc:1623 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1629
msgid "Rec"
msgstr "Зап"
@@ -4955,7 +5068,7 @@ msgstr "Выд."
msgid "Sharing Selected/Editing Status?"
msgstr "Разделять статус выделенности"
-#: editor_route_groups.cc:107 editor_routes.cc:208
+#: editor_route_groups.cc:107 editor_routes.cc:209
msgid "Active|A"
msgstr "А"
@@ -4963,13 +5076,13 @@ msgstr "А"
msgid "Sharing Active Status?"
msgstr "Разделяется ли активный статус"
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:92 editor_markers.cc:733 editor_markers.cc:820
+#: editor_markers.cc:1005 editor_markers.cc:1023 editor_markers.cc:1041
+#: editor_markers.cc:1060 editor_markers.cc:1079 editor_markers.cc:1109
+#: editor_markers.cc:1140 editor_markers.cc:1170 editor_markers.cc:1198
+#: editor_markers.cc:1229 editor_markers.cc:1254 editor_markers.cc:1305
+#: editor_markers.cc:1349 editor_markers.cc:1375 editor_markers.cc:1569
+#: editor_mouse.cc:2140
msgid "programming error: marker canvas item has no marker object pointer!"
msgstr "Ошибка в программе: marker canvas item has no marker object pointer!"
@@ -4993,105 +5106,109 @@ msgstr "Начало"
msgid "end"
msgstr "Конец"
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2100 editor_ops.cc:2122
+#: editor_ops.cc:2238 editor_ops.cc:2275 location_ui.cc:1023
msgid "add marker"
msgstr "Добавка маркера"
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1449
msgid "set loop range"
msgstr "Создать петлю из области"
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1455
msgid "set punch range"
msgstr "Создание выделения врезки"
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4169
msgid "range"
msgstr "диапазон"
-#: editor_markers.cc:725
+#: editor_markers.cc:718
msgid "new range marker"
msgstr "Новый маркер диапазона"
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2206 location_ui.cc:859
msgid "remove marker"
msgstr "Удаление маркера"
-#: editor_markers.cc:894
+#: editor_markers.cc:887
msgid "Locate to Here"
msgstr "Переместить сюда указатель"
-#: editor_markers.cc:895
+#: editor_markers.cc:888
msgid "Play from Here"
msgstr "Воспроизвести отсюда"
-#: editor_markers.cc:896
+#: editor_markers.cc:889
msgid "Move Mark to Playhead"
msgstr "Маркер к указателю воспроизведения"
-#: editor_markers.cc:900
+#: editor_markers.cc:893
msgid "Create Range to Next Marker"
msgstr "Создать выделение до след. маркера"
-#: editor_markers.cc:941
+#: editor_markers.cc:934
msgid "Locate to Marker"
msgstr "Перейти к маркеру"
-#: editor_markers.cc:942
+#: editor_markers.cc:935
msgid "Play from Marker"
msgstr "Воспроизвести от маркера"
-#: editor_markers.cc:945
+#: editor_markers.cc:938
msgid "Set Marker from Playhead"
msgstr "Установить маркер по указателю"
-#: editor_markers.cc:947
+#: editor_markers.cc:940
msgid "Set Range from Selection"
msgstr "Установить диапазон по выделению"
-#: editor_markers.cc:957
+#: editor_markers.cc:950
msgid "Hide Range"
msgstr "Скрыть выделение"
-#: editor_markers.cc:958
+#: editor_markers.cc:951
msgid "Rename Range..."
msgstr "Переименовать область…"
-#: editor_markers.cc:962
+#: editor_markers.cc:955
msgid "Remove Range"
msgstr "Удалить выделение"
-#: editor_markers.cc:969
+#: editor_markers.cc:962
msgid "Separate Regions in Range"
msgstr "Разделить области в выделении"
-#: editor_markers.cc:972
+#: editor_markers.cc:965
msgid "Select Range"
msgstr "Выбрать выделение"
-#: editor_markers.cc:1001
+#: editor_markers.cc:994
msgid "Set Punch Range"
msgstr "Установить область врезки"
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1400 editor_ops.cc:2055
msgid "New Name:"
msgstr "Новое название:"
-#: editor_markers.cc:1410
+#: editor_markers.cc:1403
msgid "Rename Mark"
msgstr "Переименовать маркер"
-#: editor_markers.cc:1412
+#: editor_markers.cc:1405
msgid "Rename Range"
msgstr "Переименовать выделение"
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1996
-#: processor_box.cc:2466 route_time_axis.cc:1096 route_ui.cc:1571
+#: editor_markers.cc:1412 editor_mouse.cc:2157 processor_box.cc:2060
+#: processor_box.cc:2531 route_time_axis.cc:1107 route_ui.cc:1574
msgid "Rename"
msgstr "Переименовать"
-#: editor_markers.cc:1432
+#: editor_markers.cc:1425
msgid "rename marker"
msgstr "Переименование маркера"
@@ -5099,21 +5216,21 @@ msgstr "Переименование маркера"
msgid "This screen is not tall enough to display the editor mixer"
msgstr "Экран недостаточно высок, чтобы показать окно редактора"
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1235 editor_mouse.cc:1253 editor_tempodisplay.cc:270
msgid ""
"programming error: tempo marker canvas item has no marker object pointer!"
msgstr ""
"Ошибка в программе: tempo marker canvas item has no marker object pointer!"
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1240 editor_tempodisplay.cc:275
msgid "programming error: marker for tempo is not a tempo marker!"
msgstr "Ошибка в программе: marker for tempo is not a tempo marker!"
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1258 editor_tempodisplay.cc:375
msgid "programming error: marker for meter is not a meter marker!"
msgstr "Ошибка в программе: маркер размера таковым не является!"
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:1905 editor_mouse.cc:1930 editor_mouse.cc:1943
msgid ""
"programming error: control point canvas item has no control point object "
"pointer!"
@@ -5121,15 +5238,15 @@ msgstr ""
"ошибка в программе: у контр. точки пункта события нет управления точкой "
"объектауказатель!"
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2078
msgid "start point trim"
msgstr "Обрезка начальной точки"
-#: editor_mouse.cc:2083
+#: editor_mouse.cc:2103
msgid "End point trim"
msgstr "Конечная точка отделки"
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2155
msgid "Name for region:"
msgstr "Название области: "
@@ -5145,151 +5262,155 @@ msgstr "Изменение выделения"
msgid "nudge regions forward"
msgstr "Толчок областей вперед"
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:435 editor_ops.cc:526
msgid "nudge location forward"
msgstr "Толчок позиции вперед"
-#: editor_ops.cc:462
+#: editor_ops.cc:466
msgid "nudge regions backward"
msgstr "Толчок областей назад"
-#: editor_ops.cc:551
+#: editor_ops.cc:558
msgid "nudge forward"
msgstr "Толчок вперед"
-#: editor_ops.cc:575
+#: editor_ops.cc:582
msgid "nudge backward"
msgstr "Толчок назад"
-#: editor_ops.cc:618
+#: editor_ops.cc:647
msgid "sequence regions"
msgstr "выстраивание областей встык"
-#: editor_ops.cc:694
+#: editor_ops.cc:709
msgid "build_region_boundary_cache called with snap_type = %1"
msgstr "Функция build_region_boundary_cache вызвана с snap_type = %1"
-#: editor_ops.cc:2042
+#: editor_ops.cc:2057
msgid "New Location Marker"
msgstr "Новый маркер позиции"
-#: editor_ops.cc:2164
+#: editor_ops.cc:2148 editor_ops.cc:2172
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2238
msgid "add markers"
msgstr "Добавка маркера"
-#: editor_ops.cc:2274
+#: editor_ops.cc:2334
msgid "clear markers"
msgstr "Очистка маркеров"
-#: editor_ops.cc:2289
+#: editor_ops.cc:2349
msgid "clear ranges"
msgstr "Очистка диапазонов"
-#: editor_ops.cc:2305
+#: editor_ops.cc:2365
msgid "clear locations"
msgstr "Очистка позиций"
-#: editor_ops.cc:2368
+#: editor_ops.cc:2428
msgid "insert region"
msgstr "Вставка области"
-#: editor_ops.cc:2559
+#: editor_ops.cc:2619
msgid "raise regions"
msgstr "Поднятие областей"
-#: editor_ops.cc:2561
+#: editor_ops.cc:2621
msgid "raise region"
msgstr "Поднятие области"
-#: editor_ops.cc:2567
+#: editor_ops.cc:2627
msgid "raise regions to top"
msgstr "Поднятие областей наверх"
-#: editor_ops.cc:2569
+#: editor_ops.cc:2629
msgid "raise region to top"
msgstr "Поднятие области наверх"
-#: editor_ops.cc:2575
+#: editor_ops.cc:2635
msgid "lower regions"
msgstr "Опускание областей"
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2637 editor_ops.cc:2645
msgid "lower region"
msgstr "Опускание области"
-#: editor_ops.cc:2583
+#: editor_ops.cc:2643
msgid "lower regions to bottom"
msgstr "Опускание областей вниз"
-#: editor_ops.cc:2668
+#: editor_ops.cc:2728
msgid "Rename Region"
msgstr "Переименовать область..."
-#: editor_ops.cc:2670 processor_box.cc:1994 route_ui.cc:1569
+#: editor_ops.cc:2730 processor_box.cc:2058 route_ui.cc:1572
msgid "New name:"
msgstr "Новое название:"
-#: editor_ops.cc:2987
+#: editor_ops.cc:3047
msgid "separate"
msgstr "разделение"
-#: editor_ops.cc:3099
+#: editor_ops.cc:3159
msgid "separate region under"
msgstr "разделение области под курсором"
-#: editor_ops.cc:3220
+#: editor_ops.cc:3305
msgid "trim to selection"
msgstr "Обрезание по выделению"
-#: editor_ops.cc:3356
+#: editor_ops.cc:3454
msgid "set sync point"
msgstr "Установка точки синхронизации"
-#: editor_ops.cc:3380
+#: editor_ops.cc:3478
msgid "remove region sync"
msgstr "Удаление синхронизатора области"
-#: editor_ops.cc:3402
+#: editor_ops.cc:3500
msgid "move regions to original position"
msgstr "Перемещение областей в исходную позицию"
-#: editor_ops.cc:3404
+#: editor_ops.cc:3502
msgid "move region to original position"
msgstr "Перемещение области в исходную позицию"
-#: editor_ops.cc:3425
+#: editor_ops.cc:3523
msgid "align selection"
msgstr "Выравнивание выделения"
-#: editor_ops.cc:3499
+#: editor_ops.cc:3597
msgid "align selection (relative)"
msgstr "Выравнивание выделения (относительное)"
-#: editor_ops.cc:3533
+#: editor_ops.cc:3631
msgid "align region"
msgstr "Выравнивание области"
-#: editor_ops.cc:3584
+#: editor_ops.cc:3682
msgid "trim front"
msgstr "Обрезка впереди"
-#: editor_ops.cc:3584
+#: editor_ops.cc:3682
msgid "trim back"
msgstr "Обрезка сзади"
-#: editor_ops.cc:3614
+#: editor_ops.cc:3712
msgid "trim to loop"
msgstr "Обрезка в петлю"
-#: editor_ops.cc:3624
+#: editor_ops.cc:3722
msgid "trim to punch"
msgstr "Обрезка во врезку"
-#: editor_ops.cc:3686
+#: editor_ops.cc:3844
msgid "trim to region"
msgstr "Обрезка в область"
-#: editor_ops.cc:3794
+#: editor_ops.cc:3903
msgid ""
"This track/bus cannot be frozen because the signal adds or loses channels "
"before reaching the outputs.\n"
@@ -5301,11 +5422,11 @@ msgstr ""
"Это, как правило, вызвано плагинами, которые генерируют выходной "
"стереосигнал из моновхода или наоборот."
-#: editor_ops.cc:3797
+#: editor_ops.cc:3906
msgid "Cannot freeze"
msgstr "Невозможно заморозить"
-#: editor_ops.cc:3803
+#: editor_ops.cc:3912
msgid ""
"<b>%1</b>\n"
"\n"
@@ -5321,23 +5442,23 @@ msgstr ""
"Замораживание будет только обрабатывать сигнал как первый посыл/вставку/"
"возврат."
-#: editor_ops.cc:3807
+#: editor_ops.cc:3916
msgid "Freeze anyway"
msgstr "Всё равно заморозить"
-#: editor_ops.cc:3808
+#: editor_ops.cc:3917
msgid "Don't freeze"
msgstr "Не замораживать"
-#: editor_ops.cc:3809
+#: editor_ops.cc:3918
msgid "Freeze Limits"
msgstr "Пределы заморозки"
-#: editor_ops.cc:3824
+#: editor_ops.cc:3933
msgid "Cancel Freeze"
msgstr "Отменить замораживание"
-#: editor_ops.cc:3854
+#: editor_ops.cc:3963
msgid ""
"You can't perform this operation because the processing of the signal will "
"cause one or more of the tracks to end up with a region with more channels "
@@ -5351,47 +5472,47 @@ msgstr ""
"\n"
"Вы можете сделать это без обработки, и это уже другая операция."
-#: editor_ops.cc:3858
+#: editor_ops.cc:3967
msgid "Cannot bounce"
msgstr "Невозможно выполнить сведение"
-#: editor_ops.cc:3869
+#: editor_ops.cc:4018
msgid "bounce range"
msgstr "Сведение области"
-#: editor_ops.cc:3971
+#: editor_ops.cc:4085
msgid "delete"
msgstr "Удаление"
-#: editor_ops.cc:3974
+#: editor_ops.cc:4088
msgid "cut"
msgstr "Вырезать"
-#: editor_ops.cc:3977
+#: editor_ops.cc:4091
msgid "copy"
msgstr "Копировать"
-#: editor_ops.cc:3980
+#: editor_ops.cc:4094
msgid "clear"
msgstr "Очистить"
-#: editor_ops.cc:4028
+#: editor_ops.cc:4142
msgid "objects"
msgstr "объекты"
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4352 editor_ops.cc:4437
msgid "remove region"
msgstr "Удаление области"
-#: editor_ops.cc:4719
+#: editor_ops.cc:4862
msgid "duplicate selection"
msgstr "Дублирование выделения"
-#: editor_ops.cc:4803
+#: editor_ops.cc:4948
msgid "nudge track"
msgstr "Смещение дорожки"
-#: editor_ops.cc:4840
+#: editor_ops.cc:4975
msgid ""
"Do you really want to destroy the last capture?\n"
"(This is destructive and cannot be undone)"
@@ -5399,136 +5520,140 @@ msgstr ""
"Последнюю запись будет удалена. Вы уверены?\n"
"(отмена операции невозможна)"
-#: editor_ops.cc:4843 editor_ops.cc:6845 editor_regions.cc:462
+#: editor_ops.cc:4978 editor_ops.cc:7078 editor_regions.cc:462
#: editor_snapshots.cc:159
msgid "No, do nothing."
msgstr "Нет"
-#: editor_ops.cc:4844
+#: editor_ops.cc:4979
msgid "Yes, destroy it."
msgstr "Да"
-#: editor_ops.cc:4846
+#: editor_ops.cc:4981
msgid "Destroy last capture"
msgstr "Уничтожение последней записи"
-#: editor_ops.cc:4906
+#: editor_ops.cc:5057
msgid "normalize"
msgstr "Нормализация"
-#: editor_ops.cc:5000
+#: editor_ops.cc:5155
msgid "reverse regions"
msgstr "Разворот областей"
-#: editor_ops.cc:5034
+#: editor_ops.cc:5189
msgid "strip silence"
msgstr "Удаление тишины"
-#: editor_ops.cc:5091
+#: editor_ops.cc:5270
msgid "Fork Region(s)"
msgstr "Ответвление областей"
-#: editor_ops.cc:5112
+#: editor_ops.cc:5277
msgid "Could not unlink %1"
msgstr "Не удалось отсоединить %1"
-#: editor_ops.cc:5326
+#: editor_ops.cc:5517
msgid "reset region gain"
msgstr "Сброс усиления области"
-#: editor_ops.cc:5379
+#: editor_ops.cc:5575
msgid "region gain envelope active"
msgstr "Огибающая области активна"
-#: editor_ops.cc:5406
+#: editor_ops.cc:5600
msgid "toggle region lock"
msgstr "Переключение блокировки области"
-#: editor_ops.cc:5430
+#: editor_ops.cc:5624
msgid "Toggle Video Lock"
msgstr "Переключить видеоблокировку"
-#: editor_ops.cc:5454
+#: editor_ops.cc:5648
msgid "region lock style"
msgstr "Способ блокировки области"
-#: editor_ops.cc:5479
+#: editor_ops.cc:5673
msgid "change region opacity"
msgstr "Смена прозрачности области"
-#: editor_ops.cc:5572
+#: editor_ops.cc:5766
msgid "fade range"
msgstr "Диапазон фейда"
-#: editor_ops.cc:5610
+#: editor_ops.cc:5804
msgid "set fade in length"
msgstr "Установка длины фейда нарастания"
-#: editor_ops.cc:5617
+#: editor_ops.cc:5811
msgid "set fade out length"
msgstr "Установка длины фейда затухания"
-#: editor_ops.cc:5662
+#: editor_ops.cc:5876
msgid "set fade in shape"
msgstr "Установка формы фейда нарастания"
-#: editor_ops.cc:5693
+#: editor_ops.cc:5911
msgid "set fade out shape"
msgstr "Установка формы фейда затухания"
-#: editor_ops.cc:5723
+#: editor_ops.cc:5947
msgid "set fade in active"
msgstr "Установка активности фейда нарастания"
-#: editor_ops.cc:5752
+#: editor_ops.cc:5981
msgid "set fade out active"
msgstr "Установка активности фейда затухания"
-#: editor_ops.cc:5994
+#: editor_ops.cc:6041
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6227
msgid "set loop range from selection"
msgstr "Установка петли из выделения"
-#: editor_ops.cc:6008
+#: editor_ops.cc:6241
msgid "set loop range from region"
msgstr "Установка петли из области"
-#: editor_ops.cc:6027
+#: editor_ops.cc:6260
msgid "set punch range from selection"
msgstr "Установка врезки из выделения"
-#: editor_ops.cc:6041
+#: editor_ops.cc:6284
msgid "set session start/end from selection"
msgstr "Установка начала/конца сессии из выделения"
-#: editor_ops.cc:6066
+#: editor_ops.cc:6299
msgid "set punch range from region"
msgstr "Установка врезки из области"
-#: editor_ops.cc:6175
+#: editor_ops.cc:6408
msgid "Add new marker"
msgstr "Создать маркер"
-#: editor_ops.cc:6176
+#: editor_ops.cc:6409
msgid "Set global tempo"
msgstr "Установить общий темп"
-#: editor_ops.cc:6179
+#: editor_ops.cc:6412
msgid "Define one bar"
msgstr "Определение такта"
-#: editor_ops.cc:6180
+#: editor_ops.cc:6413
msgid "Do you want to set the global tempo or add a new tempo marker?"
msgstr "Вы хотите установить общий темп или добавить новый маркер темпа?"
-#: editor_ops.cc:6206
+#: editor_ops.cc:6439
msgid "set tempo from region"
msgstr "Установка темпа из области"
-#: editor_ops.cc:6236
+#: editor_ops.cc:6469
msgid "split regions"
msgstr "Разделение выделений"
-#: editor_ops.cc:6278
+#: editor_ops.cc:6511
msgid ""
"You are about to split\n"
"%1\n"
@@ -5540,11 +5665,11 @@ msgstr ""
"на %2 частей.\n"
"Это может занять много времени."
-#: editor_ops.cc:6285
+#: editor_ops.cc:6518
msgid "Call for the Ferret!"
msgstr "(?)Призвать Ферре!"
-#: editor_ops.cc:6286
+#: editor_ops.cc:6519
msgid ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialog to tune the analysis"
@@ -5552,52 +5677,52 @@ msgstr ""
"Нажмите OK для выполнения разделения\n"
"или попросите Хорька скорректировать анализ."
-#: editor_ops.cc:6288
+#: editor_ops.cc:6521
msgid "Press OK to continue with this split operation"
msgstr "Нажмите OK для выполнения разделения"
-#: editor_ops.cc:6291
+#: editor_ops.cc:6524
msgid "Excessive split?"
msgstr "Массовое разделение?"
-#: editor_ops.cc:6443
+#: editor_ops.cc:6676
msgid "place transient"
msgstr "Разместить переходные"
-#: editor_ops.cc:6478
+#: editor_ops.cc:6711
msgid "snap regions to grid"
msgstr "привязка областей к сетке"
-#: editor_ops.cc:6517
+#: editor_ops.cc:6750
msgid "Close Region Gaps"
msgstr "Закрытие интервалов между областями"
-#: editor_ops.cc:6522
+#: editor_ops.cc:6755
msgid "Crossfade length"
msgstr "Длительность кроссфейда"
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
+#: editor_ops.cc:6764 editor_ops.cc:6775 rhythm_ferret.cc:119
#: session_option_editor.cc:141
msgid "ms"
msgstr "мс"
-#: editor_ops.cc:6533
+#: editor_ops.cc:6766
msgid "Pull-back length"
msgstr "Растяжка длины назад"
-#: editor_ops.cc:6546
+#: editor_ops.cc:6779
msgid "Ok"
msgstr "ОК"
-#: editor_ops.cc:6561
+#: editor_ops.cc:6794
msgid "close region gaps"
msgstr "устранение пробелов области"
-#: editor_ops.cc:6803
+#: editor_ops.cc:7036
msgid "That would be bad news ...."
msgstr "Это было бы плохой новостью..."
-#: editor_ops.cc:6808
+#: editor_ops.cc:7041
msgid ""
"Removing the master or monitor bus is such a bad idea\n"
"that %1 is not going to allow it.\n"
@@ -5613,21 +5738,21 @@ msgstr ""
"подобные вещи, в файле ardour.rc измените значение параметра\n"
"\"allow-special-bus-removal\" на \"yes\""
-#: editor_ops.cc:6824 route_ui.cc:1935
+#: editor_ops.cc:7057 route_ui.cc:1938
msgid "track"
msgid_plural "tracks"
msgstr[0] "дорожка"
msgstr[1] "дорожки"
msgstr[2] "дорожек"
-#: editor_ops.cc:6825 route_ui.cc:1935
+#: editor_ops.cc:7058 route_ui.cc:1938
msgid "bus"
msgid_plural "busses"
msgstr[0] "шина"
msgstr[1] "шины"
msgstr[2] "шин"
-#: editor_ops.cc:6829
+#: editor_ops.cc:7062
msgid ""
"Do you really want to remove %1 %2 and %3 %4?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5639,7 +5764,7 @@ msgstr ""
"\n"
"Это действие невозможно отменить, файл сессии будет перезаписан."
-#: editor_ops.cc:6834
+#: editor_ops.cc:7067
msgid ""
"Do you really want to remove %1 %2?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5651,7 +5776,7 @@ msgstr ""
"\n"
"Это действие невозможно отменить, файл сессии будет перезаписан."
-#: editor_ops.cc:6840
+#: editor_ops.cc:7073
msgid ""
"Do you really want to remove %1 %2?\n"
"\n"
@@ -5661,60 +5786,72 @@ msgstr ""
"\n"
"Это действие не может быть отменено и файл сессии будут перезаписан"
-#: editor_ops.cc:6847
+#: editor_ops.cc:7080
msgid "Yes, remove them."
msgstr "Да, удалить их."
-#: editor_ops.cc:6849 editor_snapshots.cc:160
+#: editor_ops.cc:7082 editor_snapshots.cc:160
msgid "Yes, remove it."
msgstr "Да, удалить"
-#: editor_ops.cc:6854 editor_ops.cc:6856
+#: editor_ops.cc:7087 editor_ops.cc:7089
msgid "Remove %1"
msgstr "Удалить %1"
-#: editor_ops.cc:6919
+#: editor_ops.cc:7191 editor_ops.cc:7205 editor_ops.cc:7245 editor_ops.cc:7255
msgid "insert time"
msgstr "Вставка времени"
-#: editor_ops.cc:7083
+#: editor_ops.cc:7308
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7328 editor_ops.cc:7340 editor_ops.cc:7413
+msgid "cut time"
+msgstr ""
+
+#: editor_ops.cc:7426
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7500
msgid "There are too many tracks to fit in the current window"
msgstr "Такое количество дорожек в окне не поместится"
-#: editor_ops.cc:7144
+#: editor_ops.cc:7561
msgid "Sel"
msgstr "Выб."
-#: editor_ops.cc:7183
+#: editor_ops.cc:7600
#, c-format
msgid "Saved view %u"
msgstr "Сохраненный вид %u"
-#: editor_ops.cc:7208
+#: editor_ops.cc:7625
msgid "mute regions"
msgstr "Приглушение областей"
-#: editor_ops.cc:7210
+#: editor_ops.cc:7627
msgid "mute region"
msgstr "Приглушение области"
-#: editor_ops.cc:7247
+#: editor_ops.cc:7664
msgid "combine regions"
msgstr "Объединение областей"
-#: editor_ops.cc:7285
+#: editor_ops.cc:7702
msgid "uncombine regions"
msgstr "Разъединение областей"
-#: editor_ops.cc:7322
+#: editor_ops.cc:7739
msgid "%1: Locked"
msgstr "%1: заблокировано"
-#: editor_ops.cc:7329
+#: editor_ops.cc:7746
msgid "Click to unlock"
msgstr "Снять замок"
-#: editor_ops.cc:7383
+#: editor_ops.cc:7793
msgid "Moving embedded files into session folder"
msgstr "Перемещение встроенных файлов в папке сессии"
@@ -5726,7 +5863,7 @@ msgstr "Название региона с числом каналов в []'с"
msgid "Position of start of region"
msgstr "Положение начала области"
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:114 editor_regions.cc:859 time_info_box.cc:101
msgid "End"
msgstr "Конец"
@@ -5802,107 +5939,111 @@ msgstr "Да, удалить"
msgid "Remove unused regions"
msgstr "Удалить неиспользуемые области"
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:694
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:824 editor_regions.cc:840 editor_regions.cc:854
msgid "Mult."
msgstr "Неск."
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:857 midi_list_editor.cc:104 time_info_box.cc:94
msgid "Start"
msgstr "Начало"
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:875 editor_regions.cc:891
msgid "Multiple"
msgstr "Несколько"
-#: editor_regions.cc:952
+#: editor_regions.cc:960
msgid "MISSING "
msgstr "(ОТСУТСТВУЕТ) "
-#: editor_routes.cc:182
+#: editor_routes.cc:183
msgid "SS"
msgstr "СС"
-#: editor_routes.cc:206
+#: editor_routes.cc:207
msgid "Track/Bus Name"
msgstr "Название дорожи/шины"
-#: editor_routes.cc:207
+#: editor_routes.cc:208
msgid "Track/Bus visible ?"
msgstr "Дорожка или шина видима?"
-#: editor_routes.cc:208
+#: editor_routes.cc:209
msgid "Track/Bus active ?"
msgstr "Дорожка или шина активна?"
-#: editor_routes.cc:209
+#: editor_routes.cc:210
msgid "MidiInput|I"
msgstr "Вх"
-#: editor_routes.cc:209
+#: editor_routes.cc:210
msgid "MIDI input enabled"
msgstr "Вход MIDI включен"
-#: editor_routes.cc:210
+#: editor_routes.cc:211
msgid "Rec|R"
msgstr "З"
-#: editor_routes.cc:210
+#: editor_routes.cc:211
msgid "Record enabled"
msgstr "Готовность к записи"
-#: editor_routes.cc:211
+#: editor_routes.cc:212
msgid "Muted"
msgstr "Пригл."
-#: editor_routes.cc:212
+#: editor_routes.cc:213
msgid "Soloed"
msgstr "Солир."
-#: editor_routes.cc:213
+#: editor_routes.cc:214
msgid "SoloIso|SI"
msgstr "ИС"
-#: editor_routes.cc:213
+#: editor_routes.cc:214
msgid "Solo Isolated"
msgstr "Изолирование соло"
-#: editor_routes.cc:214
+#: editor_routes.cc:215
msgid "SoloLock|SS"
msgstr "БС"
-#: editor_routes.cc:214
+#: editor_routes.cc:215
msgid "Solo Safe (Locked)"
msgstr "Сохр. соло (закрыт)"
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:485 mixer_ui.cc:1213
msgid "Hide All"
msgstr "Скрыть всё"
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:486 mixer_ui.cc:1214
msgid "Show All Audio Tracks"
msgstr "Показать все звуковые дорожки"
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:487 mixer_ui.cc:1215
msgid "Hide All Audio Tracks"
msgstr "Скрыть все звуковые дорожки"
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:488 mixer_ui.cc:1216
msgid "Show All Audio Busses"
msgstr "Показать все звуковые шины"
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:489 mixer_ui.cc:1217
msgid "Hide All Audio Busses"
msgstr "Скрыть все звуковые шины"
-#: editor_routes.cc:482
+#: editor_routes.cc:490 mixer_ui.cc:1218
msgid "Show All Midi Tracks"
msgstr "Показать все MIDI-дорожки"
-#: editor_routes.cc:483
+#: editor_routes.cc:491 mixer_ui.cc:1219
msgid "Hide All Midi Tracks"
msgstr "Скрыть все MIDI-дорожки"
-#: editor_routes.cc:484
+#: editor_routes.cc:492
msgid "Show Tracks With Regions Under Playhead"
msgstr "Показывать дорожки с областями под указателем воспроизведения"
@@ -5931,12 +6072,12 @@ msgid "Unhide ranges"
msgstr "Раскрыть маркеры выделения"
#: editor_rulers.cc:224
-msgid "Make Loop range"
-msgstr "Создать область петли"
+msgid "New Loop range"
+msgstr "Создать новую петлю"
#: editor_rulers.cc:225
-msgid "Make Punch range"
-msgstr "Создать область врезки"
+msgid "New Punch range"
+msgstr "Создать новую врезку"
#: editor_rulers.cc:230
msgid "New CD track marker"
@@ -5946,7 +6087,7 @@ msgstr "Создать маркер дорожки CD"
msgid "New Tempo"
msgstr "Вставить новый темп"
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:239 tempo_dialog.cc:315
msgid "New Meter"
msgstr "Вставить новый размер"
@@ -6004,43 +6145,47 @@ msgstr ""
msgid "stretch/shrink"
msgstr "Растянуть или сжать"
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
msgid "pitch shift"
msgstr "Смена высоты тона"
-#: editor_timefx.cc:301
+#: editor_timefx.cc:304
msgid "timefx cannot be started - thread creation error"
msgstr "Timefx не может быть запущен, ошибка при создании потока"
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
msgid "Device Control Panel"
msgstr "Панель управления устройством"
-#: engine_dialog.cc:85
+#: engine_dialog.cc:88
msgid "Midi Device Setup"
msgstr "Настройка MIDI-устройства"
-#: engine_dialog.cc:86 engine_dialog.cc:2121
+#: engine_dialog.cc:89
+msgid "Stop (Reconfigure)"
+msgstr "Остановить (для настройки)"
+
+#: engine_dialog.cc:90 engine_dialog.cc:2693
msgid "Measure"
msgstr "Измерить"
-#: engine_dialog.cc:87
+#: engine_dialog.cc:91
msgid "Use results"
msgstr "Использовать результаты"
-#: engine_dialog.cc:88
+#: engine_dialog.cc:92
msgid "Back to settings ... (ignore results)"
msgstr "Закрыть и не использовать"
-#: engine_dialog.cc:89
+#: engine_dialog.cc:93
msgid "Calibrate Audio"
msgstr "Калибровка аудио"
-#: engine_dialog.cc:93
+#: engine_dialog.cc:97
msgid "Back to settings"
msgstr "Возврат к настройкам"
-#: engine_dialog.cc:112
+#: engine_dialog.cc:117
msgid ""
"No audio/MIDI backends detected. %1 cannot run\n"
"\n"
@@ -6050,11 +6195,11 @@ msgstr ""
"\n"
"(Это ошибка сборки/упаковки/системы, она никогда не должна происходить.)"
-#: engine_dialog.cc:138
+#: engine_dialog.cc:142
msgid "Latency Measurement Tool"
msgstr "Тестирование задержки отклика"
-#: engine_dialog.cc:150
+#: engine_dialog.cc:154
msgid ""
"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
"low level.</span>"
@@ -6062,89 +6207,94 @@ msgstr ""
"<span weight=\"bold\">Уберите громкость выхода вашей звуковой карты до "
"минимума </span>"
-#: engine_dialog.cc:159
+#: engine_dialog.cc:163
msgid "Select two channels below and connect them using a cable."
msgstr "Выберите два канала ниже и соединить их с помощью кабеля"
-#: engine_dialog.cc:164
+#: engine_dialog.cc:168
msgid "Output channel"
msgstr "Канал выхода"
-#: engine_dialog.cc:172
+#: engine_dialog.cc:176
msgid "Input channel"
msgstr "Канал входа"
-#: engine_dialog.cc:207
+#: engine_dialog.cc:209
msgid "Once the channels are connected, click the \"Measure\" button."
msgstr "Соединив каналы, нажмите кнопку «Измерить»."
-#: engine_dialog.cc:214
+#: engine_dialog.cc:216
msgid "When satisfied with the results, click the \"Use results\" button."
msgstr ""
"Если результат вас устраивает, нажмите кнопку «Использовать результаты»."
-#: engine_dialog.cc:229 engine_dialog.cc:2241 engine_dialog.cc:2251
+#: engine_dialog.cc:231 engine_dialog.cc:2813 engine_dialog.cc:2823
msgid "No measurement results yet"
msgstr "Пока нет результатов измерения"
-#: engine_dialog.cc:239 route_params_ui.cc:106
+#: engine_dialog.cc:241 route_params_ui.cc:106
msgid "Latency"
msgstr "Задержка отклика"
-#: engine_dialog.cc:396
+#: engine_dialog.cc:465
msgid "Audio System:"
msgstr "Звуковая подсистема:"
-#: engine_dialog.cc:433
+#: engine_dialog.cc:507
msgid "Driver:"
msgstr "Драйвер:"
-#: engine_dialog.cc:439
+#: engine_dialog.cc:514
+msgid "Input Device:"
+msgstr "Устройство записи:"
+
+#: engine_dialog.cc:518
+msgid "Output Device:"
+msgstr "Устройство вывода:"
+
+#: engine_dialog.cc:525
msgid "Device:"
msgstr "Устройство:"
-#: engine_dialog.cc:444 engine_dialog.cc:543 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:534 engine_dialog.cc:639 sfdb_ui.cc:152 sfdb_ui.cc:347
+#: sfdb_ui.cc:352
msgid "Sample rate:"
msgstr "Частота сэмплирования:"
-#: engine_dialog.cc:450 engine_dialog.cc:550
+#: engine_dialog.cc:540 engine_dialog.cc:646
msgid "Buffer size:"
msgstr "Размер буфера:"
-#: engine_dialog.cc:468
+#: engine_dialog.cc:558
msgid "Input Channels:"
msgstr "Каналов входа:"
-#: engine_dialog.cc:481
+#: engine_dialog.cc:571
msgid "Output Channels:"
msgstr "Каналов выхода:"
-#: engine_dialog.cc:493
+#: engine_dialog.cc:583
msgid "Hardware input latency:"
msgstr "Задержка аппаратных входов:"
-#: engine_dialog.cc:496 engine_dialog.cc:509
+#: engine_dialog.cc:586 engine_dialog.cc:599
msgid "samples"
msgstr "сэмплов"
-#: engine_dialog.cc:506
+#: engine_dialog.cc:596
msgid "Hardware output latency:"
msgstr "Задержка аппаратных выходов:"
-#: engine_dialog.cc:517
+#: engine_dialog.cc:607
msgid "MIDI System:"
msgstr "Подсистема MIDI:"
-#: engine_dialog.cc:535
+#: engine_dialog.cc:631
msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
msgstr ""
-"Звуковая подсистема %1 была настроена и запущена извне.\n"
-"Вы не сможете полностью контролировать её."
-#: engine_dialog.cc:588
+#: engine_dialog.cc:684
msgid ""
"Failed to start or connect to audio-engine.\n"
"\n"
@@ -6154,7 +6304,7 @@ msgstr ""
"\n"
"Калибровка задержки требует рабочий аудиоинтерфейс."
-#: engine_dialog.cc:594
+#: engine_dialog.cc:690
msgid ""
"Your selected audio configuration is playback- or capture-only.\n"
"\n"
@@ -6164,169 +6314,184 @@ msgstr ""
"\n"
"Калибровка задержки требует воспроизведение и захват"
-#: engine_dialog.cc:675
+#: engine_dialog.cc:870
msgid "MIDI Devices"
msgstr "MIDI устройства"
-#: engine_dialog.cc:681
+#: engine_dialog.cc:876
msgid "Device"
msgstr "Устройство"
-#: engine_dialog.cc:683
+#: engine_dialog.cc:878
msgid "Hardware Latencies"
msgstr "Аппаратные задержки"
-#: engine_dialog.cc:724
+#: engine_dialog.cc:919
msgid "Calibrate"
msgstr "Калибровка"
-#: engine_dialog.cc:824
+#: engine_dialog.cc:1008
msgid "all available channels"
msgstr "Все доступные каналы"
-#: engine_dialog.cc:1063 latency_gui.cc:39
+#: engine_dialog.cc:1441 latency_gui.cc:39
msgid "sample"
msgid_plural "samples"
msgstr[0] "сэмпл"
msgstr[1] "сэмпла"
msgstr[2] "сэмплов"
-#: engine_dialog.cc:1114
+#: engine_dialog.cc:1494
#, c-format
msgid "(%.1f ms)"
msgstr "(%.1f мс)"
-#: engine_dialog.cc:1617
+#: engine_dialog.cc:2161
msgid "Could not start backend engine %1"
msgstr "Не удалось запустить движок бекенда %1"
-#: engine_dialog.cc:1668
+#: engine_dialog.cc:2212
msgid "Cannot set driver to %1"
msgstr "Невозможно использовать %1 в качестве драйвера."
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2217
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2221
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2226
msgid "Cannot set device name to %1"
msgstr "Невозможно %1 в имени устройства."
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2231
msgid "Cannot set sample rate to %1"
msgstr "Невозможно использовать %1 в частоты сэмплирования."
-#: engine_dialog.cc:1680
+#: engine_dialog.cc:2235
msgid "Cannot set buffer size to %1"
msgstr "Невозможно использовать %1 в размера буфера."
-#: engine_dialog.cc:1686
+#: engine_dialog.cc:2241
msgid "Cannot set input channels to %1"
msgstr "Не удается установить входные каналы в %1"
-#: engine_dialog.cc:1690
+#: engine_dialog.cc:2245
msgid "Cannot set output channels to %1"
msgstr "Не удается установить выходные каналы в %1"
-#: engine_dialog.cc:1696
+#: engine_dialog.cc:2251
msgid "Cannot set input latency to %1"
msgstr "Не удается установить задержку входа в %1"
-#: engine_dialog.cc:1700
+#: engine_dialog.cc:2255
msgid "Cannot set output latency to %1"
msgstr "Не удается установить задержку выхода в %1"
-#: engine_dialog.cc:1979 engine_dialog.cc:2038
+#: engine_dialog.cc:2551 engine_dialog.cc:2610
msgid "No signal detected "
msgstr "Сигнал не обнаружен"
-#: engine_dialog.cc:1992 engine_dialog.cc:2046 port_insert_ui.cc:70
+#: engine_dialog.cc:2564 engine_dialog.cc:2618 port_insert_ui.cc:70
#: port_insert_ui.cc:98
msgid "Disconnected from audio engine"
msgstr "Выполнено отсоединение от звукового движка"
-#: engine_dialog.cc:2001 engine_dialog.cc:2054
+#: engine_dialog.cc:2573 engine_dialog.cc:2626
msgid "Detected roundtrip latency: "
msgstr "Определены следующие задержки:"
-#: engine_dialog.cc:2003 engine_dialog.cc:2056
+#: engine_dialog.cc:2575 engine_dialog.cc:2628
msgid "Systemic latency: "
msgstr "Системная задержка:"
-#: engine_dialog.cc:2010
+#: engine_dialog.cc:2582
msgid "(signal detection error)"
msgstr "(ошибка обнаружения сигнала)"
-#: engine_dialog.cc:2016
+#: engine_dialog.cc:2588
msgid "(inverted - bad wiring)"
msgstr "(инвертировано - плохая проводка)"
-#: engine_dialog.cc:2063
+#: engine_dialog.cc:2635
msgid "(averaging)"
msgstr "(усреднение)"
-#: engine_dialog.cc:2069
+#: engine_dialog.cc:2641
msgid "(too large jitter)"
msgstr "(слишком большое дрожание)"
-#: engine_dialog.cc:2073
+#: engine_dialog.cc:2645
msgid "(large jitter)"
msgstr "(большое дрожание)"
-#: engine_dialog.cc:2085
+#: engine_dialog.cc:2657
msgid "Timeout - large MIDI jitter."
msgstr "Тайм-аут - большой MIDI джиттер."
-#: engine_dialog.cc:2101 port_insert_ui.cc:134
+#: engine_dialog.cc:2673 port_insert_ui.cc:134
msgid "Detecting ..."
msgstr "Выполняется определение..."
-#: engine_dialog.cc:2195
+#: engine_dialog.cc:2764
msgid "Disconnect from %1"
msgstr "Отсоединить от %1"
-#: engine_dialog.cc:2199 mixer_strip.cc:1525 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Активно"
+#: engine_dialog.cc:2769
+msgid "Running"
+msgstr ""
-#: engine_dialog.cc:2209
+#: engine_dialog.cc:2771
+msgid "Connected"
+msgstr ""
+
+#: engine_dialog.cc:2782
msgid "Connect to %1"
msgstr "Соединить с %1"
-#: engine_dialog.cc:2214
-msgid "Inactive"
-msgstr "Неактивно"
-
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:51 sfdb_ui.cc:150
msgid "Channels:"
msgstr "Каналов:"
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:52
msgid "Split to mono files"
msgstr "Разделить на монофонические файлы"
-#: export_channel_selector.cc:189
+#: export_channel_selector.cc:197
msgid "Bus or Track"
msgstr "Шина или дорожка"
-#: export_channel_selector.cc:465
+#: export_channel_selector.cc:473
msgid "Region contents without fades nor region gain (channels: %1)"
msgstr "Содержание области без фейдов и усиления области (каналов: %1)"
-#: export_channel_selector.cc:469
+#: export_channel_selector.cc:477
msgid "Region contents with fades and region gain (channels: %1)"
msgstr "Содержание области с фейдами и усилением области (каналов: %1)"
-#: export_channel_selector.cc:473
+#: export_channel_selector.cc:481
msgid "Track output (channels: %1)"
msgstr "Выход дорожки (каналов: %1)"
-#: export_channel_selector.cc:542
-msgid "Export region contents"
-msgstr "Экспортировать содержимое области"
+#: export_channel_selector.cc:550
+msgid "Apply track/bus processing"
+msgstr "Применить обработку в дорожках и шинах"
+
+#: export_channel_selector.cc:551
+msgid "Select all tracks"
+msgstr "Выбрать все дорожки"
+
+#: export_channel_selector.cc:552
+msgid "Select all busses"
+msgstr "Выбрать все шины"
-#: export_channel_selector.cc:543
-msgid "Export track output"
-msgstr "Экспортировать выходы дорожки"
+#: export_channel_selector.cc:553
+msgid "Deselect all"
+msgstr "Снять выделение"
-#: export_channel_selector.cc:575
+#: export_channel_selector.cc:587
msgid "Track name"
msgstr "Название дорожки"
@@ -6461,8 +6626,8 @@ msgstr "Папка:"
#: export_filename_selector.cc:37 session_import_dialog.cc:45
#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
msgid "Browse"
msgstr "Указать"
@@ -6557,39 +6722,43 @@ msgstr "Записать файл CUE для создания CD/DVD"
msgid "Create TOC file for disk-at-once CD/DVD creation"
msgstr "Записать файл TOC для создания CD/DVD"
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:72
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:74
msgid "Tag file with session's metadata"
msgstr "Добавить в файла метаданные сессии"
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:474
msgid "Best (sinc)"
msgstr "Наилучшее (sinc)"
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:479
msgid "Medium (sinc)"
msgstr "Среднее (sinc)"
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:484
msgid "Fast (sinc)"
msgstr "Быстро (sinc)"
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:494
msgid "Zero order hold"
msgstr "Нулевой порядок удержания"
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:904
msgid "Linear encoding options"
msgstr "Параметры линейного кодирования"
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:920
msgid "Ogg Vorbis options"
msgstr "Параметры Ogg Vorbis"
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:931
msgid "FLAC options"
msgstr "Параметры FLAC"
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:948
msgid "Broadcast Wave options"
msgstr "Параметры Broadcast Wave"
@@ -6617,7 +6786,7 @@ msgstr "Вы действительно хотите удалить этот п
msgid "Show Times as:"
msgstr "Показать время как:"
-#: export_timespan_selector.cc:53 processor_box.cc:2468
+#: export_timespan_selector.cc:53 processor_box.cc:2533
msgid "Select All"
msgstr "Выделить всё"
@@ -6641,39 +6810,39 @@ msgstr "getSoundResourceFile: Нет правильного корня в фай
msgid "getSoundResourceFile: root = %1, != response"
msgstr "getSoundResourceFile: корень = %1, != ответ"
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1816
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2298
msgid "%1"
msgstr "%1"
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:134 gain_meter.cc:402 gain_meter.cc:507 gain_meter.cc:898
msgid "-inf"
msgstr "-inf"
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:149 gain_meter.cc:962
msgid "Fader automation mode"
msgstr "Режим автоматизации фейдера"
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:150 gain_meter.cc:963
msgid "Fader automation type"
msgstr "Тип автоматизации фейдера"
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:159 gain_meter.cc:831 panner_ui.cc:177 panner_ui.cc:639
msgid "Abs"
msgstr "Абс"
-#: gain_meter.cc:793
+#: gain_meter.cc:795
msgid "M"
msgstr "М"
-#: gain_meter.cc:796
+#: gain_meter.cc:798
msgid "P"
msgstr "Сп"
-#: gain_meter.cc:799
+#: gain_meter.cc:801
msgid "T"
msgstr "К"
-#: gain_meter.cc:802
+#: gain_meter.cc:804
msgid "W"
msgstr "З"
@@ -6681,44 +6850,44 @@ msgstr "З"
msgid "<span size=\"large\">Presets</span>"
msgstr "<span size=\"large\">Профили</span>"
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98
msgid "Manual"
msgstr "Вручную"
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
msgid "All Automation"
msgstr "Вся автоматизация"
-#: generic_pluginui.cc:250
+#: generic_pluginui.cc:251
msgid "Switches"
msgstr "Переключатели"
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2442
+#: generic_pluginui.cc:261 generic_pluginui.cc:437 processor_box.cc:2507
msgid "Controls"
msgstr "Управление"
-#: generic_pluginui.cc:293
+#: generic_pluginui.cc:294
msgid "Plugin Editor: could not build control element for port %1"
msgstr "Редактор плагинов: невозможно создать управляющий элемент для порта %1"
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:319
msgid "Plugin Editor: no control for property %1"
msgstr "Редактор плагинов: нет регулятора для свойства %1"
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:325
msgid "Plugin Editor: could not build control element for property %1"
msgstr ""
"Редаткор плагина: не удалось создать контрольный элемент для свойства %1"
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:469
msgid "Meters"
msgstr "Индикаторы уровня"
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:491
msgid "Automation control"
msgstr "Контроль автоматизации"
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:498
msgid "Mgnual"
msgstr "Mgnual"
@@ -6730,12 +6899,12 @@ msgstr "Управление звуковыми соединениями"
msgid "MIDI Connection Manager"
msgstr "Управление MIDI-соединениями"
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:796
-#: mixer_strip.cc:897
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:826
+#: mixer_strip.cc:927 monitor_section.cc:1279 monitor_selector.cc:189
msgid "Disconnect"
msgstr "Отсоединить"
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
msgid "port"
msgstr "порт"
@@ -6795,47 +6964,51 @@ msgstr "Включить все группы"
msgid "Disable All Groups"
msgstr "Отключить все группы"
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
msgid "Time to insert:"
msgstr "Вставляемый промежуток времени:"
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
msgid "Intersected regions should:"
msgstr "Выделенные области должны:"
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
msgid "stay in position"
msgstr "Остаться на месте"
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
msgid "move"
msgstr "Переместиться"
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
msgid "be split"
msgstr "Разделиться"
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
-msgstr "Вставить во все списки воспроизведения дорожки"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
+msgstr ""
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
msgid "Move glued regions"
msgstr "Переместить приклеенные области"
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
msgid "Move markers"
msgstr "Переместить маркеры"
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
msgid "Move glued markers"
msgstr "Переместить приклеенные маркеры"
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
msgid "Move locked markers"
msgstr "Переместить заблокированные маркеры"
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
msgid ""
"Move tempo and meter changes\n"
"<i>(may cause oddities in the tempo map)</i>"
@@ -6843,7 +7016,11 @@ msgstr ""
"Переместить изменения темпа и размера такта\n"
"<i>(может привести к странностям в карте темпа)</i>"
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
msgid "Insert time"
msgstr "Вставить"
@@ -6859,24 +7036,24 @@ msgstr "Импортируется файл: %1 из %2"
msgid "I/O selector"
msgstr "Выбор входов и выходов"
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
msgid "%1 input"
msgstr "%1 вход"
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
msgid "%1 output"
msgstr "%1 выход"
-#: keyboard.cc:70
+#: keyboard.cc:78
msgid "your own"
msgstr "Ваш собс."
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:141 keyboard.cc:165
msgid "Default keybindings not found - %1 will be hard to use!"
msgstr ""
"Конфигурация комбинаций клавиш недоступна - работать с %1 будет непросто!"
-#: keyboard.cc:136
+#: keyboard.cc:144
msgid "Key bindings file \"%1\" not found. Default bindings used instead"
msgstr "Файл привязки клавиш \"%1\" не найден. Исп. привязки по умолчанию"
@@ -6935,11 +7112,11 @@ msgstr[0] "%1 сэмпл"
msgstr[1] "%1 сэмпла"
msgstr[2] "%1 сэмплов"
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:409 plugin_ui.cc:421
msgid "Reset"
msgstr "Сбросить"
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1911
msgid "programming error: %1 (%2)"
msgstr "Ошибка в программе: %1 (%2)"
@@ -7027,11 +7204,11 @@ msgstr "Добавка маркера выделения"
msgid "%1 could not connect to the audio backend."
msgstr "%1 не удалось соединиться со звуковой подсистемой."
-#: main.cc:107 main.cc:123
+#: main.cc:129 main.cc:145
msgid "The audio backend (%1) has failed, or terminated"
msgstr "Ошибка аудиодвижка (%1), либо он был остановлен"
-#: main.cc:110
+#: main.cc:132
msgid ""
"%2 exited unexpectedly, and without notifying %1.\n"
"\n"
@@ -7046,11 +7223,11 @@ msgstr ""
"\n"
"Нажмите OK, чтобы выйти из %1."
-#: main.cc:124
+#: main.cc:146
msgid "%2 exited unexpectedly, and without notifying %1."
msgstr "%2 вышел неожиданно и без уведомления %1."
-#: main.cc:219
+#: main.cc:241
msgid ""
"\n"
" %1 could not understand your command line "
@@ -7058,23 +7235,23 @@ msgstr ""
"\n"
" %1 не удалось разобрать переданные вами аргументы командной строки "
-#: main.cc:221
+#: main.cc:243
msgid "An error was encountered while launching %1"
msgstr "Произошла ошибка при запуске %1"
-#: main.cc:310
+#: main.cc:332
msgid " (built using "
msgstr " (собран, используя "
-#: main.cc:313
+#: main.cc:335
msgid " and GCC version "
msgstr ", при помощи GCC версии "
-#: main.cc:323
+#: main.cc:345
msgid "Copyright (C) 1999-2015 Paul Davis"
msgstr "Авторские права (C) 1999-2015 Paul Davis"
-#: main.cc:324
+#: main.cc:346
msgid ""
"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
@@ -7082,45 +7259,65 @@ msgstr ""
"Частичные авторские права © Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
-#: main.cc:326
+#: main.cc:348
msgid "%1 comes with ABSOLUTELY NO WARRANTY"
msgstr "%1 распространяется БЕЗО ВСЯКИХ ГАРАНТИЙ"
-#: main.cc:327
+#: main.cc:349
msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
msgstr "Даже не для КОММЕРЦИИ или ПРИГОДНОСТИ К КОНКРЕТНЫМ ЦЕЛЯМ."
-#: main.cc:328
+#: main.cc:350
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Это свободное программное обеспечение, Вы можете распространять его"
-#: main.cc:329
+#: main.cc:351
msgid "under certain conditions; see the source for copying conditions."
msgstr "На определённых условиях; подробнее об этом читайте в файле COPYING."
-#: main.cc:334
+#: main.cc:356
msgid "could not initialize %1."
msgstr "Не удалось инициализировать %1."
-#: main.cc:344
+#: main.cc:366
msgid "Cannot xinstall SIGPIPE error handler"
msgstr "Сбой установки обработчика ошибок SIGPIPE"
-#: main.cc:351
+#: main.cc:373
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:380
msgid "could not create %1 GUI"
msgstr "Не удалось создать графический интерфейс для %1"
-#: main_clock.cc:52
+#: main_clock.cc:50
msgid "Display delta to edit cursor"
msgstr "Показывать разницу с курсором редактора"
-#: marker.cc:273
+#: main_clock.cc:65 tempo_dialog.cc:54
+msgid "Edit Tempo"
+msgstr "Изменить темп"
+
+#: main_clock.cc:66 tempo_dialog.cc:326
+msgid "Edit Meter"
+msgstr "Изменить размер"
+
+#: main_clock.cc:67
+msgid "Insert Tempo Change"
+msgstr "Вставить новый темп"
+
+#: main_clock.cc:68
+msgid "Insert Meter Change"
+msgstr "Вставить новый размер"
+
+#: marker.cc:276
msgid "MarkerText"
-msgstr "Маркер Текст"
+msgstr ""
#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2195 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2044
+#: rc_option_editor.cc:2677 sfdb_ui.cc:664
msgid "None"
msgstr "Нет"
@@ -7309,83 +7506,83 @@ msgstr "Название порта:"
msgid "MidiPortDialog"
msgstr "MidiPortDialog"
-#: midi_region_view.cc:859
+#: midi_region_view.cc:863
msgid "channel edit"
msgstr "Правка канала"
-#: midi_region_view.cc:895
+#: midi_region_view.cc:899
msgid "velocity edit"
msgstr "Правка силы нажатия"
-#: midi_region_view.cc:954
+#: midi_region_view.cc:958
msgid "add note"
msgstr "Добавка ноты"
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1890
msgid "step add"
msgstr "Добавить шаг"
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1984 midi_region_view.cc:2007
msgid "alter patch change"
msgstr "Смена изменения патча"
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2043
msgid "add patch change"
msgstr "Добавка смены программы"
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2065 midi_region_view.cc:2066
msgid "move patch change"
msgstr "Перемещение смены программы"
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2078 midi_region_view.cc:2079
msgid "delete patch change"
msgstr "Удаление смены программы"
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2117
msgid "delete selection"
msgstr "Удаление выделения"
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2133
msgid "delete note"
msgstr "Удаление ноты"
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2592
msgid "move notes"
msgstr "Перемещение ноты"
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3123
msgid "change velocities"
msgstr "Смена силы нажатия"
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3189
msgid "transpose"
msgstr "Транспозиция"
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3217
msgid "change note lengths"
msgstr "Смена длительности нот"
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3293
msgid "nudge"
msgstr "Толчок"
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3308
msgid "change channel"
msgstr "Смена канала"
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3348
msgid "Bank "
msgstr "Банк"
-#: midi_region_view.cc:3296
+#: midi_region_view.cc:3349
msgid "Program "
msgstr "Программа"
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3350
msgid "Channel "
msgstr "Канал"
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3537
msgid "paste"
msgstr "Вставка"
@@ -7497,12 +7694,12 @@ msgstr "Цвета канала"
msgid "Track Color"
msgstr "Цвет дорожки"
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1607 midi_time_axis.cc:1613 midi_time_axis.cc:1623
+#: midi_time_axis.cc:1629
msgid "all"
msgstr "Все"
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1626
msgid "some"
msgstr "Не все"
@@ -7518,7 +7715,7 @@ msgstr "Автопрокрутка"
msgid "Decimal"
msgstr "Десятичный"
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1191
msgid "Enabled"
msgstr "Включено"
@@ -7666,20 +7863,20 @@ msgstr "Загруженные привязки микшера от %1"
msgid "Could not find mixer.bindings in search path %1"
msgstr "Не удалось найти привязки микшера в пути поиска %1"
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:97 mixer_strip.cc:127
msgid "pre"
msgstr "До"
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:374 mixer_strip.cc:1413
-#: rc_option_editor.cc:2323
+#: mixer_strip.cc:99 mixer_strip.cc:129 mixer_strip.cc:384 mixer_strip.cc:1456
+#: rc_option_editor.cc:2833
msgid "Comments"
msgstr "Комментарии"
-#: mixer_strip.cc:149
+#: mixer_strip.cc:152
msgid "Click to toggle the width of this mixer strip."
msgstr "Щёлкните для переключения ширины полоски микшера"
-#: mixer_strip.cc:151
+#: mixer_strip.cc:154
msgid ""
"\n"
"%1-%2-click to toggle the width of all strips."
@@ -7687,325 +7884,341 @@ msgstr ""
"\n"
"%1-%2-щелчок для изменения ширины всех полос."
-#: mixer_strip.cc:160
+#: mixer_strip.cc:161
msgid "Hide this mixer strip"
msgstr "Скрыть полоску микшера"
-#: mixer_strip.cc:171
+#: mixer_strip.cc:172
msgid "Click to select metering point"
msgstr "Щёлкните для выбора точки замера"
-#: mixer_strip.cc:187
+#: mixer_strip.cc:188
msgid "Isolate Solo"
msgstr "Изолировать соло"
-#: mixer_strip.cc:195
+#: mixer_strip.cc:196
msgid "Lock Solo Status"
msgstr "Статус блокировки солирования"
-#: mixer_strip.cc:197 mixer_strip.cc:2047
+#: mixer_strip.cc:198 mixer_strip.cc:2090
msgid "SoloLock|Lock"
msgstr "Блок"
-#: mixer_strip.cc:198 mixer_strip.cc:2046
+#: mixer_strip.cc:199 mixer_strip.cc:2089
msgid "Iso"
msgstr "Изо."
-#: mixer_strip.cc:252
+#: mixer_strip.cc:253
msgid "Mix group"
msgstr "Группа микса"
-#: mixer_strip.cc:370 rc_option_editor.cc:2319
+#: mixer_strip.cc:263
+msgid "Trim: "
+msgstr "Усиление: "
+
+#: mixer_strip.cc:380 rc_option_editor.cc:2829
msgid "Phase Invert"
msgstr "Инверсия фазы"
-#: mixer_strip.cc:371 rc_option_editor.cc:2320
+#: mixer_strip.cc:381 rc_option_editor.cc:2830
msgid "Record & Monitor"
msgstr "Запись и монитор"
-#: mixer_strip.cc:372 rc_option_editor.cc:2321
+#: mixer_strip.cc:382 rc_option_editor.cc:2831
msgid "Solo Iso / Lock"
msgstr "Соло Iso / Блок"
-#: mixer_strip.cc:527
+#: mixer_strip.cc:546
msgid "Enable/Disable MIDI input"
msgstr "Включить или выключить MIDI-вход"
-#: mixer_strip.cc:691
+#: mixer_strip.cc:712
msgid "Aux"
msgstr "Вых"
-#: mixer_strip.cc:713
+#: mixer_strip.cc:738
msgid "Snd"
msgstr "Псл"
-#: mixer_strip.cc:779 mixer_strip.cc:882 processor_box.cc:2384
+#: mixer_strip.cc:809 mixer_strip.cc:912 processor_box.cc:2449
msgid "Not connected to audio engine - no I/O changes are possible"
msgstr ""
"Нет соединения со звуковой подсистемой, любые изменения входа-выхода "
"невозможны."
-#: mixer_strip.cc:836 mixer_strip.cc:938
+#: mixer_strip.cc:866 mixer_strip.cc:968
msgid "Add %1 port"
msgstr "Добавить %1-порт"
-#: mixer_strip.cc:843 mixer_strip.cc:945
+#: mixer_strip.cc:873 mixer_strip.cc:975 monitor_section.cc:1315
msgid "Routing Grid"
msgstr "Матрица маршрутизации"
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1204
+msgid "MIDI "
+msgstr "MIDI "
+
+#: mixer_strip.cc:1209
msgid "<b>INPUT</b> to %1"
msgstr "<b>ВХОД</b> в %1"
-#: mixer_strip.cc:1177
+#: mixer_strip.cc:1212 monitor_section.cc:1366
msgid "<b>OUTPUT</b> from %1"
msgstr "<b>ВЫХОД</b> из %1"
-#: mixer_strip.cc:1290
+#: mixer_strip.cc:1330 monitor_section.cc:1453
msgid "Disconnected"
msgstr "Нет соединения"
-#: mixer_strip.cc:1416
+#: mixer_strip.cc:1459
msgid "*Comments*"
msgstr "*Кмт*"
-#: mixer_strip.cc:1423
+#: mixer_strip.cc:1466
msgid "Cmt"
msgstr "Кмт"
-#: mixer_strip.cc:1426
+#: mixer_strip.cc:1469
msgid "*Cmt*"
msgstr "*Кмт*"
-#: mixer_strip.cc:1432
+#: mixer_strip.cc:1475
msgid "Click to Add/Edit Comments"
msgstr "Нажмите для добавления/правки комментариев"
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1519
msgid "Grp"
msgstr "Грп"
-#: mixer_strip.cc:1479
+#: mixer_strip.cc:1522
msgid "~G"
msgstr "нГр"
-#: mixer_strip.cc:1508 route_time_axis.cc:561
+#: mixer_strip.cc:1551 route_time_axis.cc:572
msgid "Color..."
msgstr "Цвет..."
-#: mixer_strip.cc:1510 route_time_axis.cc:563
+#: mixer_strip.cc:1553 route_time_axis.cc:574
msgid "Comments..."
msgstr "Комментарии..."
-#: mixer_strip.cc:1512 route_time_axis.cc:565
+#: mixer_strip.cc:1555 route_time_axis.cc:576
msgid "Inputs..."
msgstr "Входы..."
-#: mixer_strip.cc:1514 route_time_axis.cc:567
+#: mixer_strip.cc:1557 route_time_axis.cc:578
msgid "Outputs..."
msgstr "Выходы..."
-#: mixer_strip.cc:1519
+#: mixer_strip.cc:1562
msgid "Save As Template..."
msgstr "Сохранить как шаблон..."
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1568 route_group_dialog.cc:45 route_time_axis.cc:852
+msgid "Active"
+msgstr "Активно"
+
+#: mixer_strip.cc:1576
msgid "Adjust Latency..."
msgstr "Скорректировать задержку..."
-#: mixer_strip.cc:1536
+#: mixer_strip.cc:1579
msgid "Protect Against Denormals"
msgstr "Защищать от отклонений"
-#: mixer_strip.cc:1542 route_time_axis.cc:580
+#: mixer_strip.cc:1585 route_time_axis.cc:591
msgid "Remote Control ID..."
msgstr "ID для удалённого управления..."
-#: mixer_strip.cc:1842
+#: mixer_strip.cc:1885
msgid "Pre"
msgstr "До"
-#: mixer_strip.cc:1846
+#: mixer_strip.cc:1889
msgid "Post"
msgstr "После"
-#: mixer_strip.cc:1862
+#: mixer_strip.cc:1905
msgid "Meter|In"
msgstr "Вх"
-#: mixer_strip.cc:1866
+#: mixer_strip.cc:1909
msgid "Meter|Pr"
msgstr "Прд"
-#: mixer_strip.cc:1870
+#: mixer_strip.cc:1913
msgid "Meter|Po"
msgstr "Псл"
-#: mixer_strip.cc:1874
+#: mixer_strip.cc:1917
msgid "Meter|O"
msgstr "Вых"
-#: mixer_strip.cc:1879
+#: mixer_strip.cc:1922
msgid "Meter|C"
msgstr "З"
-#: mixer_strip.cc:2027 route_ui.cc:171
+#: mixer_strip.cc:2070 route_ui.cc:170
msgid "Disk"
msgstr "Диск"
-#: mixer_strip.cc:2039 monitor_section.cc:70
+#: mixer_strip.cc:2082 monitor_section.cc:76
msgid "AFL"
msgstr "AFL"
-#: mixer_strip.cc:2042 monitor_section.cc:71
+#: mixer_strip.cc:2085 monitor_section.cc:77
msgid "PFL"
msgstr "PFL"
-#: mixer_strip.cc:2052 meter_strip.cc:383
+#: mixer_strip.cc:2095 meter_strip.cc:387
msgid "MonitorInput|I"
msgstr "Вх"
-#: mixer_strip.cc:2053 meter_strip.cc:384
+#: mixer_strip.cc:2096 meter_strip.cc:388
msgid "MonitorDisk|D"
msgstr "Д"
-#: mixer_strip.cc:2065 meter_strip.cc:375 route_time_axis.cc:2697
+#: mixer_strip.cc:2108 meter_strip.cc:379 route_time_axis.cc:2729
msgid "AfterFader|A"
msgstr "П"
-#: mixer_strip.cc:2068
+#: mixer_strip.cc:2111
msgid "Prefader|P"
msgstr "Д"
-#: mixer_strip.cc:2073
+#: mixer_strip.cc:2116
msgid "SoloIso|I"
msgstr "И"
-#: mixer_strip.cc:2074
+#: mixer_strip.cc:2117
msgid "SoloLock|L"
msgstr "Б"
-#: mixer_strip.cc:2260
+#: mixer_strip.cc:2303
msgid "Pre Fader"
msgstr "Предфейдер"
-#: mixer_strip.cc:2261
+#: mixer_strip.cc:2304
msgid "Post Fader"
msgstr "Послефейдер"
-#: mixer_strip.cc:2305 meter_strip.cc:851
+#: mixer_strip.cc:2349 meter_strip.cc:860
msgid "Change all in Group to %1"
msgstr "Поменять все в группе на %1"
-#: mixer_strip.cc:2307 meter_strip.cc:853
+#: mixer_strip.cc:2351 meter_strip.cc:862
msgid "Change all to %1"
msgstr "Поменять все на %1"
-#: mixer_strip.cc:2309 meter_strip.cc:855
+#: mixer_strip.cc:2353 meter_strip.cc:864
msgid "Change same track-type to %1"
msgstr "Поменять дорожки одного типа на %1"
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:130 route_time_axis.cc:829
msgid "Group"
msgstr "Группа"
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:1242
msgid "track display list item for renamed strip not found!"
msgstr "Элемент списка для переименованного канала микшера не найден!"
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1336
msgid "-all-"
msgstr "-все-"
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:1873
msgid "Strips"
msgstr "Каналы"
-#: meter_strip.cc:157
+#: meter_strip.cc:161
msgid "Reset Peak"
msgstr "Сброс пик"
-#: meter_strip.cc:378 route_time_axis.cc:2701
+#: meter_strip.cc:382 route_time_axis.cc:2733
msgid "PreFader|P"
msgstr "Д"
-#: meter_strip.cc:887
+#: meter_strip.cc:896
msgid "Variable height"
msgstr "Переменная высота"
-#: meter_strip.cc:888
+#: meter_strip.cc:897
msgid "Short"
msgstr "Короткий"
-#: meter_strip.cc:889
+#: meter_strip.cc:898
msgid "Tall"
msgstr "Высокий"
-#: meter_strip.cc:890
+#: meter_strip.cc:899
msgid "Grande"
msgstr "Grande"
-#: meter_strip.cc:891
+#: meter_strip.cc:900
msgid "Venti"
msgstr "Venti"
#: meter_patterns.cc:82
-msgid "Peak"
-msgstr "Пиковое значение"
+msgid "Peak (+6dBFS)"
+msgstr ""
#: meter_patterns.cc:85
+msgid "Peak (0dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:88
msgid "RMS + Peak"
msgstr "Среднеквадратичное + пиковое значение"
-#: meter_patterns.cc:88
+#: meter_patterns.cc:91
msgid "IEC1/DIN"
msgstr "IEC1/DIN"
-#: meter_patterns.cc:91
+#: meter_patterns.cc:94
msgid "IEC1/Nordic"
msgstr "IEC1/Nordic"
-#: meter_patterns.cc:94
+#: meter_patterns.cc:97
msgid "IEC2/BBC"
msgstr "IEC2/BBC"
-#: meter_patterns.cc:97
+#: meter_patterns.cc:100
msgid "IEC2/EBU"
msgstr "IEC2/EBU"
-#: meter_patterns.cc:100
-msgid "K20"
-msgstr "K20"
-
#: meter_patterns.cc:103
-msgid "K14"
-msgstr "K14"
+msgid "K20/RMS"
+msgstr "K20/RMS"
#: meter_patterns.cc:106
-msgid "K12"
-msgstr "К12"
+msgid "K14/RMS"
+msgstr "K14/RMS"
#: meter_patterns.cc:109
+msgid "K12/RMS"
+msgstr "K12/RMS"
+
+#: meter_patterns.cc:112
msgid "VU"
msgstr "VU"
-#: monitor_section.cc:69
+#: monitor_section.cc:75
msgid "SiP"
msgstr "SiP"
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:102 route_group_dialog.cc:49
msgid "Soloing"
msgstr "Солирование"
-#: monitor_section.cc:100
+#: monitor_section.cc:106
msgid "Isolated"
msgstr "Изолировано"
-#: monitor_section.cc:104
+#: monitor_section.cc:110
msgid "Auditioning"
msgstr "Прослушивание"
-#: monitor_section.cc:114
+#: monitor_section.cc:120
msgid ""
"When active, something is solo-isolated.\n"
"Click to de-isolate everything"
@@ -8013,7 +8226,7 @@ msgstr ""
"Если активно, то что-то будет соло-изолировано.\n"
"Нажмите, чтобы де-изолировать все"
-#: monitor_section.cc:117
+#: monitor_section.cc:123
msgid ""
"When active, auditioning is active.\n"
"Click to stop the audition"
@@ -8021,44 +8234,44 @@ msgstr ""
"Если включено, выполняется прослушивание.\n"
"Щёлкните, чтобы прекратить его."
-#: monitor_section.cc:134
+#: monitor_section.cc:140
msgid "Solo controls affect solo-in-place"
msgstr "Управление солированием затрагивает солирование на месте"
-#: monitor_section.cc:140
+#: monitor_section.cc:146
msgid "Solo controls toggle after-fader-listen"
msgstr "Управление солированием переключает послефейдерное прослушивание"
-#: monitor_section.cc:146
+#: monitor_section.cc:152
msgid "Solo controls toggle pre-fader-listen"
msgstr "Управление солированием переключает предфейдерное прослушивание"
-#: monitor_section.cc:156
+#: monitor_section.cc:162
msgid "Gain increase for soloed signals (0dB is normal)"
msgstr "Усиление солируемого сигнала (0dB является нормой)"
-#: monitor_section.cc:161 monitor_section.cc:190 monitor_section.cc:216
-#: monitor_section.cc:316
+#: monitor_section.cc:167 monitor_section.cc:196 monitor_section.cc:222
+#: monitor_section.cc:322
msgid "0 dB"
msgstr "0 Дб"
-#: monitor_section.cc:162
+#: monitor_section.cc:168
msgid "3 dB"
msgstr "3 Дб"
-#: monitor_section.cc:163
+#: monitor_section.cc:169
msgid "6 dB"
msgstr "6 Дб"
-#: monitor_section.cc:164
+#: monitor_section.cc:170
msgid "10 dB"
msgstr "10 Дб"
-#: monitor_section.cc:170
+#: monitor_section.cc:176
msgid "Solo Boost"
msgstr "Усиление соло"
-#: monitor_section.cc:185
+#: monitor_section.cc:191
msgid ""
"Gain reduction non-soloed signals\n"
"A value above -inf dB causes \"solo-in-front\""
@@ -8066,51 +8279,51 @@ msgstr ""
"Снижение усиления не-солированных сигналов \n"
"Значение выше -инф дБ вызывает \"solo-in-front\""
-#: monitor_section.cc:191 monitor_section.cc:218 monitor_section.cc:318
+#: monitor_section.cc:197 monitor_section.cc:224 monitor_section.cc:324
msgid "-6 dB"
msgstr "-6 Дб"
-#: monitor_section.cc:192 monitor_section.cc:219 monitor_section.cc:319
+#: monitor_section.cc:198 monitor_section.cc:225 monitor_section.cc:325
msgid "-12 dB"
msgstr "-12 Дб"
-#: monitor_section.cc:193 monitor_section.cc:220 monitor_section.cc:320
+#: monitor_section.cc:199 monitor_section.cc:226 monitor_section.cc:326
msgid "-20 dB"
msgstr "-20 Дб"
-#: monitor_section.cc:194
+#: monitor_section.cc:200
msgid "OFF"
msgstr "ВЫКЛ"
-#: monitor_section.cc:196
+#: monitor_section.cc:202
msgid "SiP Cut"
msgstr "SiP Обр."
-#: monitor_section.cc:211
+#: monitor_section.cc:217
msgid "Gain reduction to use when dimming monitor outputs"
msgstr "Снижение усиленеия для исп. при затемнении мониторов выходов"
-#: monitor_section.cc:217 monitor_section.cc:317
+#: monitor_section.cc:223 monitor_section.cc:323
msgid "-3 dB"
msgstr "-3 Дб"
-#: monitor_section.cc:225 monitor_section.cc:283 monitor_section.cc:353
+#: monitor_section.cc:231 monitor_section.cc:289 monitor_section.cc:372
msgid "Dim"
msgstr "Тише"
-#: monitor_section.cc:235
+#: monitor_section.cc:241
msgid "Excl. Solo"
msgstr "Экскл. соло"
-#: monitor_section.cc:237
+#: monitor_section.cc:243
msgid "Exclusive solo means that only 1 solo is active at a time"
msgstr "Одновременно может быть активным только одно соло"
-#: monitor_section.cc:244
+#: monitor_section.cc:250
msgid "Solo » Mute"
msgstr "Соло » Выкл"
-#: monitor_section.cc:246
+#: monitor_section.cc:252
msgid ""
"If enabled, solo will override mute\n"
"(a soloed & muted track or bus will be audible)"
@@ -8118,81 +8331,89 @@ msgstr ""
"Если включено, то соло заменит приглушение\n"
"(соло и приглушенная дорожка/шина будут слышны)"
-#: monitor_section.cc:321
+#: monitor_section.cc:327
msgid "-30 dB"
msgstr "-30 Дб"
-#: monitor_section.cc:323
+#: monitor_section.cc:341
msgid "Monitor"
msgstr "Монитор"
-#: monitor_section.cc:361
+#: monitor_section.cc:380
msgid "Inv"
msgstr "Инв."
-#: monitor_section.cc:744
+#: monitor_section.cc:784
msgid "Switch monitor to mono"
msgstr "Переключить мониторинг в монофонический режим"
-#: monitor_section.cc:747
+#: monitor_section.cc:787
msgid "Cut monitor"
msgstr "Выключить мониторинг"
-#: monitor_section.cc:750
+#: monitor_section.cc:790
msgid "Dim monitor"
msgstr "Приглушить мониторинг"
-#: monitor_section.cc:753
+#: monitor_section.cc:793
msgid "Toggle exclusive solo mode"
msgstr "Переключить эксклюзивное солирование"
-#: monitor_section.cc:759
+#: monitor_section.cc:799
msgid "Toggle mute overrides solo mode"
msgstr "Переключение глушения перекрывает соло-режим"
-#: monitor_section.cc:771
+#: monitor_section.cc:811
msgid "Cut monitor channel %1"
msgstr "Вырезать канал %1 мониторинга"
-#: monitor_section.cc:776
+#: monitor_section.cc:816
msgid "Dim monitor channel %1"
msgstr "Приглушить канал %1 мониторинга"
-#: monitor_section.cc:781
+#: monitor_section.cc:821
msgid "Solo monitor channel %1"
msgstr "Солировать каналом %1 мониторинга"
-#: monitor_section.cc:786
+#: monitor_section.cc:826
msgid "Invert monitor channel %1"
msgstr "Инвертировать канал %1 мониторинга"
-#: monitor_section.cc:796
+#: monitor_section.cc:836
msgid "In-place solo"
msgstr "На месте соло"
-#: monitor_section.cc:798
+#: monitor_section.cc:838
msgid "After Fade Listen (AFL) solo"
msgstr "Прослушивание солирования после фейдера (AFL)"
-#: monitor_section.cc:800
+#: monitor_section.cc:840
msgid "Pre Fade Listen (PFL) solo"
msgstr "Прослушивание солирования до фейдера (PFL)"
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:1262
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:104 stereo_panner.cc:114
msgid "bypassed"
msgstr "Обойдено"
-#: mono_panner.cc:123
+#: mono_panner.cc:118
#, c-format
msgid "L:%3d R:%3d"
msgstr "Левый: %3d, Правый: %3d"
-#: mono_panner.cc:203 panner2d.cc:240 stereo_panner.cc:251
+#: mono_panner.cc:202 panner2d.cc:277 stereo_panner.cc:251
#: stereo_panner.cc:274
msgid "Panner|L"
msgstr "Л"
-#: mono_panner.cc:220 panner2d.cc:241 stereo_panner.cc:249
+#: mono_panner.cc:219 panner2d.cc:278 stereo_panner.cc:249
#: stereo_panner.cc:276
msgid "Panner|R"
msgstr "П"
@@ -8419,30 +8640,26 @@ msgid " -C, --curvetest filename Curve algorithm debugger\n"
msgstr " -C, --curvetest имя_файла Отладчик алгоритма кривых\n"
#: opts.cc:77
-msgid ""
-" -k, --keybindings filename Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+msgid " -k, --keybindings filename Name of key bindings to load\n"
msgstr ""
-" -k, --keybindings имя-файла Имя собственного файла с комбинациями "
-"клавиш (по умолчанию это ~/.ardour3/ardour.bindings)\n"
-#: panner2d.cc:854
+#: panner2d.cc:897
msgid "Panner (2D)"
msgstr "Панорамирование (2D)"
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:899 panner_ui.cc:400 plugin_ui.cc:458
msgid "Bypass"
msgstr "Обход"
-#: panner2d.cc:862
+#: panner2d.cc:905
msgid "Panner"
msgstr "Панорамирование"
-#: panner_ui.cc:72
+#: panner_ui.cc:70
msgid "Pan automation mode"
msgstr "Режим автоматизации панорамы"
-#: panner_ui.cc:73
+#: panner_ui.cc:71
msgid "Pan automation type"
msgstr "Тип автоматизации панорамы"
@@ -8494,31 +8711,31 @@ msgstr "Масштаб в Дб"
msgid "Show phase"
msgstr "Показывать фазу"
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_selector.cc:53 plugin_selector.cc:225
msgid "Name contains"
msgstr "Название содержит"
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:54 plugin_selector.cc:229
msgid "Type contains"
msgstr "Тип содержит"
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:55 plugin_selector.cc:227
msgid "Category contains"
msgstr "Название категории содержит"
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:56 plugin_selector.cc:249
msgid "Author contains"
msgstr "Имя автора содержит"
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:57 plugin_selector.cc:251
msgid "Library contains"
msgstr "Библиотека содержит"
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:58 plugin_selector.cc:215 plugin_selector.cc:527
msgid "Favorites only"
msgstr "Только любимые"
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:219 plugin_selector.cc:527
msgid "Hidden only"
msgstr "Только скрытые"
@@ -8574,20 +8791,16 @@ msgstr "Добавить плагин в список эффектов"
msgid "Remove a plugin from the effect list"
msgstr "Удалить плагин из списка эффектов"
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Обновить список доступных плагинов"
-
-#: plugin_selector.cc:172
+#: plugin_selector.cc:169
msgid "Insert Plugin(s)"
msgstr "Вставить плагины"
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:333 plugin_selector.cc:334 plugin_selector.cc:335
+#: plugin_selector.cc:336
msgid "variable"
msgstr "Переменная"
-#: plugin_selector.cc:496
+#: plugin_selector.cc:486
msgid ""
"The plugin \"%1\" could not be loaded\n"
"\n"
@@ -8597,19 +8810,19 @@ msgstr ""
"\n"
"Смотреть окно отчёта для большей информации (возможно)"
-#: plugin_selector.cc:644
+#: plugin_selector.cc:634
msgid "Favorites"
msgstr "Избранные"
-#: plugin_selector.cc:646
+#: plugin_selector.cc:636
msgid "Plugin Manager..."
msgstr "Управление плагинами..."
-#: plugin_selector.cc:650
+#: plugin_selector.cc:640
msgid "By Creator"
msgstr "По создателю"
-#: plugin_selector.cc:653
+#: plugin_selector.cc:643
msgid "By Category"
msgstr "По категории"
@@ -8644,15 +8857,15 @@ msgstr "Редактор создания lv2, называемый не-LV2 п
msgid "Add"
msgstr "Добавить"
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
msgid "Description"
msgstr "Описание"
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
msgid "Plugin analysis"
msgstr "Частотный анализ плагина"
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
msgid ""
"Presets (if any) for this plugin\n"
"(Both factory and user-created)"
@@ -8660,23 +8873,28 @@ msgstr ""
"Все доступные профили этого плагина,\n"
"как «заводские», так и собственные"
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
msgid "Save a new preset"
msgstr "Сохранить новый профиль"
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
msgid "Save the current preset"
msgstr "Сохранить текущий профиль"
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
msgid "Delete the current preset"
msgstr "Удалить текущий профиль"
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
msgid "Disable signal processing by the plugin"
msgstr "Выключить обработку сигнала этим плагином"
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:685
msgid ""
"Click to allow the plugin to receive keyboard events that %1 would normally "
"use as a shortcut"
@@ -8684,26 +8902,26 @@ msgstr ""
"Щёлкните, чтобы разрешить этому плагину получать клавиатурные события, "
"которые %1 обычно использует как горячие клавиши"
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
msgid "Click to enable/disable this plugin"
msgstr "Щелкните, чтобы включить или отключить этот плагин"
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
msgid "latency (%1 sample)"
msgid_plural "latency (%1 samples)"
msgstr[0] "Задержка (%1 сэмпл)"
msgstr[1] "Задержка (%1 сэмпла)"
msgstr[2] "Задержка (%1 сэмплов)"
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
msgid "latency (%1 ms)"
msgstr "Задержка (%1 мс)"
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
msgid "Edit Latency"
msgstr "Изменить задержку"
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
@@ -8711,7 +8929,7 @@ msgstr ""
"Пресеты плагинов не поддерживаются в этой сборке %1. Рассмотрите оплату за "
"полную версию"
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
msgid ""
"Plugin presets are not supported in this build, see the Log window for more "
"information."
@@ -8719,12 +8937,12 @@ msgstr ""
"В этой сборке нет поддержки предустановок плагинов. См. подробнее в окне "
"журнала."
-#: plugin_ui.cc:670
+#: plugin_ui.cc:692
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr ""
"Щёлкните, чтобы переключиться на обычное использование горячих клавиш %1"
-#: plugin_ui.cc:767
+#: plugin_ui.cc:789
msgid "(none)"
msgstr "(нет)"
@@ -8958,15 +9176,15 @@ msgstr "Скрыть все регуляторы"
msgid "Link panner controls"
msgstr "Связать регуляторы панорамирования"
-#: processor_box.cc:575
+#: processor_box.cc:573
msgid "on"
msgstr "Вкл"
-#: processor_box.cc:575 rc_option_editor.cc:2352 rc_option_editor.cc:2366
+#: processor_box.cc:573 rc_option_editor.cc:2862 rc_option_editor.cc:2876
msgid "off"
msgstr "Выкл"
-#: processor_box.cc:957
+#: processor_box.cc:1021
msgid ""
"Right-click to add/remove/edit\n"
"plugins,inserts,sends and more"
@@ -8974,15 +9192,15 @@ msgstr ""
"Щелчком правой клавишей мыши можно добавлять, \n"
"изменять и удалять плагины, посылы, возвраты и пр."
-#: processor_box.cc:1431 processor_box.cc:1806
+#: processor_box.cc:1495 processor_box.cc:1870
msgid "Plugin Incompatibility"
msgstr "Несовместимость плагинов"
-#: processor_box.cc:1434
+#: processor_box.cc:1498
msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
msgstr "Вы пытались добавить плагин \"%1\" в слот %2.\n"
-#: processor_box.cc:1440
+#: processor_box.cc:1504
msgid ""
"\n"
"This plugin has:\n"
@@ -8990,21 +9208,21 @@ msgstr ""
"\n"
"У этого плагина:\n"
-#: processor_box.cc:1443
+#: processor_box.cc:1507
msgid "\t%1 MIDI input\n"
msgid_plural "\t%1 MIDI inputs\n"
msgstr[0] "\t%1 MIDI-вход\n"
msgstr[1] "\t%1 MIDI-входа\n"
msgstr[2] "\t%1 MIDI-входов\n"
-#: processor_box.cc:1447
+#: processor_box.cc:1511
msgid "\t%1 audio input\n"
msgid_plural "\t%1 audio inputs\n"
msgstr[0] "\t%1 звуковой вход\n"
msgstr[1] "\t%1 звуковых входа\n"
msgstr[2] "\t%1 звуковых входов\n"
-#: processor_box.cc:1450
+#: processor_box.cc:1514
msgid ""
"\n"
"but at the insertion point, there are:\n"
@@ -9012,21 +9230,21 @@ msgstr ""
"\n"
"но в точке вставки сейчас:\n"
-#: processor_box.cc:1453
+#: processor_box.cc:1517
msgid "\t%1 MIDI channel\n"
msgid_plural "\t%1 MIDI channels\n"
msgstr[0] "\t%1 MIDI-канал\n"
msgstr[1] "\t%1 MIDI-канала\n"
msgstr[2] "\t%1 MIDI-каналов\n"
-#: processor_box.cc:1457
+#: processor_box.cc:1521
msgid "\t%1 audio channel\n"
msgid_plural "\t%1 audio channels\n"
msgstr[0] "\t%1 звуковой канал\n"
msgstr[1] "\t%1 звуковых канала\n"
msgstr[2] "\t%1 звуковых каналов\n"
-#: processor_box.cc:1460
+#: processor_box.cc:1524
msgid ""
"\n"
"%1 is unable to insert this plugin here.\n"
@@ -9034,11 +9252,11 @@ msgstr ""
"\n"
"%1 не может вставить сюда этот плагин.\n"
-#: processor_box.cc:1497
+#: processor_box.cc:1561
msgid "Cannot set up new send: %1"
msgstr "Невозможно настроить новый посыл: %1"
-#: processor_box.cc:1809
+#: processor_box.cc:1873
msgid ""
"You cannot reorder these plugins/sends/inserts\n"
"in that way because the inputs and\n"
@@ -9048,20 +9266,20 @@ msgstr ""
"посылы и возвраты подобным образом, поскольку \n"
"входы и выходы перестанут корректно работать."
-#: processor_box.cc:1993
+#: processor_box.cc:2057
msgid "Rename Processor"
msgstr "Переименовать обработчик"
-#: processor_box.cc:2024
+#: processor_box.cc:2088
msgid "At least 100 IO objects exist with a name like %1 - name not changed"
msgstr ""
"Существует по крайней мере 100 объектов IO с именем, как %1 - имя не изменено"
-#: processor_box.cc:2161
+#: processor_box.cc:2226
msgid "plugin insert constructor failed"
msgstr "Сбой конструктора вставки плагина"
-#: processor_box.cc:2172
+#: processor_box.cc:2237
msgid ""
"Copying the set of processors on the clipboard failed,\n"
"probably because the I/O configuration of the plugins\n"
@@ -9071,7 +9289,7 @@ msgstr ""
"буфер обмена. Вероятно, конфигурация входа и выхода\n"
"плагинов не совпала с конфигурацией этой дорожки."
-#: processor_box.cc:2218
+#: processor_box.cc:2283
msgid ""
"Do you really want to remove all processors from %1?\n"
"(this cannot be undone)"
@@ -9080,15 +9298,15 @@ msgstr ""
"обработчики из \"%1\" ?\n"
"(отмена невозможна)"
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:2287 processor_box.cc:2312
msgid "Yes, remove them all"
msgstr "Да, удалить их все"
-#: processor_box.cc:2224 processor_box.cc:2249
+#: processor_box.cc:2289 processor_box.cc:2314
msgid "Remove processors"
msgstr "Удалить обработчики"
-#: processor_box.cc:2239
+#: processor_box.cc:2304
msgid ""
"Do you really want to remove all pre-fader processors from %1?\n"
"(this cannot be undone)"
@@ -9097,7 +9315,7 @@ msgstr ""
"предфейдерные обработчики из \"%1\" ?\n"
"(отмена невозможна)"
-#: processor_box.cc:2242
+#: processor_box.cc:2307
msgid ""
"Do you really want to remove all post-fader processors from %1?\n"
"(this cannot be undone)"
@@ -9106,59 +9324,59 @@ msgstr ""
"послефейдерные обработчики из \"%1\" ?\n"
"(отмена невозможна)"
-#: processor_box.cc:2430
+#: processor_box.cc:2495
msgid "New Plugin"
msgstr "Добавить плагин"
-#: processor_box.cc:2433
+#: processor_box.cc:2498
msgid "New Insert"
msgstr "Добавить возврат"
-#: processor_box.cc:2436
+#: processor_box.cc:2501
msgid "New External Send ..."
msgstr "Добавить внешний посыл с портом JACK..."
-#: processor_box.cc:2440
+#: processor_box.cc:2505
msgid "New Aux Send ..."
msgstr "Добавить внешний посыл без порта JACK..."
-#: processor_box.cc:2443
+#: processor_box.cc:2508
msgid "Send Options"
msgstr "Параметры отправки"
-#: processor_box.cc:2445
+#: processor_box.cc:2510
msgid "Clear (all)"
msgstr "Очистить (всё)"
-#: processor_box.cc:2447
+#: processor_box.cc:2512
msgid "Clear (pre-fader)"
msgstr "Очистить (до фейдера)"
-#: processor_box.cc:2449
+#: processor_box.cc:2514
msgid "Clear (post-fader)"
msgstr "Очистить (после фейдера)"
-#: processor_box.cc:2475
+#: processor_box.cc:2540
msgid "Activate All"
msgstr "Активировать все"
-#: processor_box.cc:2477
+#: processor_box.cc:2542
msgid "Deactivate All"
msgstr "Деактивировать все"
-#: processor_box.cc:2479
+#: processor_box.cc:2544
msgid "A/B Plugins"
msgstr "Отключить все"
-#: processor_box.cc:2488
+#: processor_box.cc:2553
msgid "Edit with generic controls..."
msgstr "Изменить с интерфейсом хоста..."
-#: processor_box.cc:2791
+#: processor_box.cc:2856
msgid "%1: %2 (by %3)"
msgstr "%1: %2 (автор — %3)"
-#: processor_box.cc:2793
+#: processor_box.cc:2858
msgid "%1 (by %2)"
msgstr "%1 (на %2)"
@@ -9210,109 +9428,193 @@ msgstr "Начало привязки ноты"
msgid "Snap note end"
msgstr "Конец привязки ноты"
-#: rc_option_editor.cc:77
+#: rc_option_editor.cc:80
msgid "Click audio file:"
msgstr "Файл щелчка доли:"
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
+#: rc_option_editor.cc:83 rc_option_editor.cc:90
msgid "Browse..."
msgstr "Просмотр..."
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:87
msgid "Click emphasis audio file:"
msgstr "Файл щелчка сильной доли:"
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:119
msgid "Choose Click"
msgstr "Выберите щелчок метронома"
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:142
msgid "Choose Click Emphasis"
msgstr "Выберите акцентирующий щелчок метронома"
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:173
msgid "Limit undo history to"
msgstr "Ограничивать историю действий"
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:174
msgid "Save undo history of"
msgstr "Ограничивать сохранение истории действий"
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:183 rc_option_editor.cc:190
msgid "commands"
msgstr "командами"
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:333
+msgid "Select Keyboard layout:"
+msgstr "Раскладка клавиатуры:"
+
+#: rc_option_editor.cc:352
+msgid "When Clicking:"
+msgstr "При щелчке:"
+
+#: rc_option_editor.cc:359
msgid "Edit using:"
msgstr "Редактировать с:"
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:365 rc_option_editor.cc:394 rc_option_editor.cc:423
msgid "+ button"
msgstr "+ клавиша"
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:388
msgid "Delete using:"
msgstr "Удалять с:"
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:417
msgid "Insert note using:"
msgstr "Вставлять ноты с:"
-#: rc_option_editor.cc:405
+#: rc_option_editor.cc:435
+msgid "When Beginning a Drag:"
+msgstr "В начале перетаскивания:"
+
+#: rc_option_editor.cc:453
+msgid "Copy items using:"
+msgstr "Копировать объекты с:"
+
+#: rc_option_editor.cc:473
+msgid "Constrain drag using:"
+msgstr "Ограничить перемещение с:"
+
+#: rc_option_editor.cc:481
+msgid "When Beginning a Trim:"
+msgstr ""
+
+#: rc_option_editor.cc:499
+msgid "Trim contents using:"
+msgstr ""
+
+#: rc_option_editor.cc:519
+msgid "Anchored trim using:"
+msgstr ""
+
+#: rc_option_editor.cc:562
+msgid "Resize notes relatively using:"
+msgstr ""
+
+#: rc_option_editor.cc:571
+msgid "While Dragging:"
+msgstr "При перетаскивании:"
+
+#: rc_option_editor.cc:589
msgid "Ignore snap using:"
msgstr "Игнорировать привязку с:"
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "Раскладка клавиатуры:"
+#: rc_option_editor.cc:609
+msgid "Snap relatively using:"
+msgstr ""
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "Масштаб шрифта:"
+#: rc_option_editor.cc:617
+msgid "While Trimming:"
+msgstr ""
+
+#: rc_option_editor.cc:635
+msgid "Resize overlaped regions using:"
+msgstr ""
+
+#: rc_option_editor.cc:643
+msgid "While Dragging Control Points:"
+msgstr "При перетаскивании контрольных точек:"
+
+#: rc_option_editor.cc:661
+msgid "Fine adjust using:"
+msgstr ""
+
+#: rc_option_editor.cc:681
+msgid "Push points using:"
+msgstr ""
-#: rc_option_editor.cc:547
+#: rc_option_editor.cc:922
+msgid "GUI and Font scaling:"
+msgstr "Масштаб интерфейса и шрифта:"
+
+#: rc_option_editor.cc:925
msgid "Default"
msgstr "По умолчанию"
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
-msgstr "Существенное изменение масштаба требует перезапуска программы"
+#: rc_option_editor.cc:951
+msgid "Adjusting the scale require an application restart to re-layout."
+msgstr "После коррекции масштаба необходимо перезапустить приложение"
-#: rc_option_editor.cc:614
+#: rc_option_editor.cc:992
msgid "Waveform Clip Level (dBFS):"
msgstr "Уровень обрезки волновой формы (dBFS):"
-#: rc_option_editor.cc:666
+#: rc_option_editor.cc:1046
+msgid "Small sessions (4-16 tracks)"
+msgstr "Небольшие сессии (4—16 дорожек)"
+
+#: rc_option_editor.cc:1047
+msgid "Medium sessions (16-64 tracks)"
+msgstr "Средние сессии (16—64 дорожек)"
+
+#: rc_option_editor.cc:1048
+msgid "Large sessions (64+ tracks)"
+msgstr "Большие сессии (от 64 дорожек и больше)"
+
+#: rc_option_editor.cc:1049
+msgid "Custom (set by sliders below)"
+msgstr ""
+
+#: rc_option_editor.cc:1053 export_video_dialog.cc:168
+msgid "Preset:"
+msgstr "Профиль:"
+
+#: rc_option_editor.cc:1065
msgid "Playback (seconds of buffering):"
msgstr "Воспроизведение (в секундах буферизации):"
-#: rc_option_editor.cc:679
+#: rc_option_editor.cc:1078
msgid "Recording (seconds of buffering):"
msgstr "Запись (в секундах буферизации):"
-#: rc_option_editor.cc:737
+#: rc_option_editor.cc:1156
+msgid "programming error: unknown buffering preset string, index = %1"
+msgstr ""
+
+#: rc_option_editor.cc:1188
msgid "Control Surface Protocol"
msgstr "Устройства управления"
-#: rc_option_editor.cc:746
+#: rc_option_editor.cc:1197
msgid "Double-click on a name to edit settings for an enabled protocol"
msgstr ""
"Двойной щелчок по названию открывает редактор параметров включённого "
"протокола"
-#: rc_option_editor.cc:903
+#: rc_option_editor.cc:1354
msgid "Show Video Export Info before export"
msgstr "Показывать диалог со справкой об экспорте видео"
-#: rc_option_editor.cc:904
+#: rc_option_editor.cc:1355
msgid "Show Video Server Startup Dialog"
msgstr "Показывать диалог с параметрами видеосервера"
-#: rc_option_editor.cc:905
+#: rc_option_editor.cc:1356
msgid "Advanced Setup (remote video server)"
msgstr "Дополнительные параметры удалённого видеосервера"
-#: rc_option_editor.cc:913
+#: rc_option_editor.cc:1364
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."
@@ -9321,11 +9623,11 @@ msgstr ""
"корневой каталог данных. Не используйте эту функцию, если точно не знаете, "
"что делаете."
-#: rc_option_editor.cc:915
+#: rc_option_editor.cc:1366
msgid "Video Server URL:"
msgstr "URL видеосервера:"
-#: rc_option_editor.cc:920
+#: rc_option_editor.cc:1371
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 "
@@ -9335,11 +9637,11 @@ msgstr ""
"example.org: 1554/' и по умолчанию 'http://localhost:1554/', когда "
"видеосервер работает локально"
-#: rc_option_editor.cc:922
+#: rc_option_editor.cc:1373
msgid "Video Folder:"
msgstr "Папка с видео:"
-#: rc_option_editor.cc:927
+#: rc_option_editor.cc:1378
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 "
@@ -9354,7 +9656,7 @@ msgstr ""
"используется для местного видео - просмотра и выбора файлов при открытии/"
"добавлении видеофайла."
-#: rc_option_editor.cc:934
+#: rc_option_editor.cc:1385
msgid ""
"<b>When enabled</b> an information window with details is displayed before "
"the video-export dialog."
@@ -9362,7 +9664,7 @@ msgstr ""
"<b>Когда включено,</b> перед экспортом видео показывается окно со справочной "
"информацией"
-#: rc_option_editor.cc:939
+#: rc_option_editor.cc:1390
msgid ""
"<b>When enabled</b> the video server is never launched automatically without "
"confirmation"
@@ -9370,27 +9672,31 @@ msgstr ""
"<b>Если включено,</b> видеосервер никогда автоматически не запускается без "
"подтверждения"
-#: rc_option_editor.cc:1022
+#: rc_option_editor.cc:1473
msgid "Always Display Plugin Scan Progress"
msgstr "Всегда показывать прогресс сканирования плагинов"
-#: rc_option_editor.cc:1023
+#: rc_option_editor.cc:1474
msgid "Scan for [new] VST Plugins on Application Start"
msgstr "Искать новые плагины VST при запуске приложения"
-#: rc_option_editor.cc:1024
+#: rc_option_editor.cc:1475
msgid "Scan for AudioUnit Plugins on Application Start"
msgstr "Искать новые плагины AudioUnit при запуске приложения"
-#: rc_option_editor.cc:1035
+#: rc_option_editor.cc:1476
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:1487
msgid "General"
msgstr "Главное"
-#: rc_option_editor.cc:1041
+#: rc_option_editor.cc:1493 startup.cc:349
msgid "Scan for Plugins"
msgstr "Просканировать плагины"
-#: rc_option_editor.cc:1048
+#: rc_option_editor.cc:1500
msgid ""
"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
"for indexing (cache load) and discovery (detect new plugins)"
@@ -9398,7 +9704,7 @@ msgstr ""
"<b>Когда включено,</b> всплывающее окно показывает прогресс поиска и "
"индексации звуковых плагинов в системе"
-#: rc_option_editor.cc:1055
+#: rc_option_editor.cc:1507
msgid ""
"Specify the default timeout for plugin instantiation in 1/10 seconds. "
"Plugins that require more time to load will be blacklisted. A value of 0 "
@@ -9408,23 +9714,23 @@ msgstr ""
"десятых долях секунды. Плагины, требующие больше времени для загрузки, будут "
"блокироваться. Если значение равно нулю, тайм-аут отключается."
-#: rc_option_editor.cc:1057
+#: rc_option_editor.cc:1509
msgid "Scan Time Out [deciseconds]"
msgstr "Тайм-аут сканирования [децисек.]"
-#: rc_option_editor.cc:1065
+#: rc_option_editor.cc:1517
msgid "VST"
msgstr "VST"
-#: rc_option_editor.cc:1071
+#: rc_option_editor.cc:1523
msgid "Clear VST Cache"
msgstr "Очистить кэш VST"
-#: rc_option_editor.cc:1075
+#: rc_option_editor.cc:1527
msgid "Clear VST Blacklist"
msgstr "Очистить чёрный список VST"
-#: rc_option_editor.cc:1083
+#: rc_option_editor.cc:1535
msgid ""
"<b>When enabled</b> new VST plugins are searched, tested and added to the "
"cache index on application start. When disabled new plugins will only be "
@@ -9434,19 +9740,25 @@ msgstr ""
"тестирование и добавление новых плагинов VST в индекс кэша. Когда отключено, "
"новые плагины становятся доступными лишь после запуска сканирования вручную."
-#: rc_option_editor.cc:1086
+#: rc_option_editor.cc:1538
msgid "Linux VST Path:"
msgstr "Размещение Linux VST:"
-#: rc_option_editor.cc:1093
+#: rc_option_editor.cc:1545
msgid "Windows VST Path:"
msgstr "Размещение Windows VST:"
-#: rc_option_editor.cc:1102
+#: rc_option_editor.cc:1554
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:1560
msgid "Audio Unit"
msgstr "Audio Unit"
-#: rc_option_editor.cc:1111
+#: rc_option_editor.cc:1569
msgid ""
"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
"When disabled AU plugins will only be available after triggering a 'Scan' "
@@ -9459,103 +9771,107 @@ msgstr ""
"включено автоматическое сканирование плагинов AU. При любом падении "
"программы во время сканирования автоматическое сканирование будет отключено."
-#: rc_option_editor.cc:1114
+#: rc_option_editor.cc:1572
msgid "Clear AU Cache"
msgstr "Очистить кэш AU"
-#: rc_option_editor.cc:1118
+#: rc_option_editor.cc:1576
msgid "Clear AU Blacklist"
msgstr "Очистить чёрный список AU"
-#: rc_option_editor.cc:1201
+#: rc_option_editor.cc:1670
msgid "Set Windows VST Search Path"
msgstr "Установка пути поиска Windows VST"
-#: rc_option_editor.cc:1216
+#: rc_option_editor.cc:1685
msgid "Set Linux VST Search Path"
msgstr "Установка пути поиска Linux VST"
-#: rc_option_editor.cc:1297
+#: rc_option_editor.cc:1766
msgid "%1 Preferences"
msgstr "Параметры %1"
-#: rc_option_editor.cc:1309
+#: rc_option_editor.cc:1778
msgid "DSP CPU Utilization"
msgstr "Использование ЦП"
-#: rc_option_editor.cc:1313
+#: rc_option_editor.cc:1782
msgid "Signal processing uses"
msgstr "При обработке используются"
-#: rc_option_editor.cc:1318
+#: rc_option_editor.cc:1787
msgid "all but one processor"
msgstr "Все процессоры кроме одного"
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1788
msgid "all available processors"
msgstr "Все доступные процессоры"
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1791
msgid "%1 processors"
msgstr "%1 процессора"
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1794
msgid "This setting will only take effect when %1 is restarted."
msgstr "Это изменение вступит в силу при следующем запуске %1."
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1799
msgid "Options|Undo"
msgstr "История действий"
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1806
msgid "Verify removal of last capture"
msgstr "Проверять удаление последней записи"
-#: rc_option_editor.cc:1345
+#: rc_option_editor.cc:1814
msgid "Make periodic backups of the session file"
msgstr "Периодически создавать резервные копии файла сессии"
-#: rc_option_editor.cc:1350
+#: rc_option_editor.cc:1819
msgid "Session Management"
msgstr "Управление сессиями"
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1824
msgid "Always copy imported files"
msgstr "Всегда копировать импортируемые файлы"
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1831
msgid "Default folder for new sessions:"
msgstr "Папка для новых сессий по умолчанию:"
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1839
msgid "Maximum number of recent sessions"
msgstr "Максимальное число недавних сессий"
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1852
msgid "Click gain level"
msgstr "Уровень щелчка метронома"
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1857 route_time_axis.cc:268 route_time_axis.cc:832
msgid "Automation"
msgstr "Автоматизация"
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1862
msgid "Thinning factor (larger value => less data)"
msgstr "Фактор разведения (большее значение => меньше данных)"
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1871
msgid "Automation sampling interval (milliseconds)"
msgstr "Интервал сэмплирования для автоматизации (мс)"
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1879
+msgid "Transport Options"
+msgstr "Параметры транспорта"
+
+#: rc_option_editor.cc:1885
msgid "Keep record-enable engaged on stop"
msgstr "Готовность к записи сохраняется после остановки"
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1894
msgid "Play loop is a transport mode"
msgstr "Петля воспроизведения как режим транспорта"
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1899
msgid ""
"<b>When enabled</b> the loop button does not start playback but forces "
"playback to always play the loop\n"
@@ -9569,11 +9885,11 @@ msgstr ""
"<b>Когда выключено,</b> кнопка петли запускает воспроизведение, но при "
"остановке режим циклического воспроизведения отключается."
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:1905
msgid "Stop recording when an xrun occurs"
msgstr "Останавливать запись при рассинхронизации"
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:1910
msgid ""
"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
"detected by the audio engine"
@@ -9581,15 +9897,15 @@ msgstr ""
"<b>Когда включено,</b> %1 остановит запись, если звуковым движком обнаружено "
"переполнение или опустошение буфера"
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:1916
msgid "Create markers where xruns occur"
msgstr "Создавать маркеры в точках рассинхронизации"
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:1925
msgid "Stop at the end of the session"
msgstr "Останавливаться в конце сессии"
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:1930
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"
@@ -9602,13 +9918,13 @@ msgstr ""
"\n"
"<b>Когда выключено</b>, %1 будет воспроизводить дальше маркера конца сессии."
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:1938
msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
msgstr ""
"Бесшовное циклическое воспроизведение (невозможно, когда Ardour ведом по "
"MTC, LTC и т.д.)"
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:1943
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 "
@@ -9625,11 +9941,11 @@ msgstr ""
"обратно в начало цикла, когда %1 достигает конца, что будет часто приводить "
"к небольшим щелчкам или задержке."
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:1951
msgid "Disable per-track record disarm while rolling"
msgstr "Сделать невозможным отключение готовности к записи при захвате"
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:1955
msgid ""
"<b>When enabled</b> this will prevent you from accidentally stopping "
"specific tracks recording during a take"
@@ -9637,11 +9953,11 @@ msgstr ""
"<b>Если включено</b>, вы не сможете нечаянно выключить готовность к записи "
"во время захвата сигнала"
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:1960
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr "Приглушение громкости на 12Дб при перемотке"
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:1964
msgid ""
"This will reduce the unpleasant increase in perceived volume that occurs "
"when fast-forwarding or rewinding through some kinds of audio"
@@ -9649,19 +9965,19 @@ msgstr ""
"При перемотке воспринимаемое на слух резкое увеличение громкости будет "
"нивелировано"
-#: rc_option_editor.cc:1497
+#: rc_option_editor.cc:1968
msgid "Sync/Slave"
msgstr "Синхронизация и ведомый режим"
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:1972
msgid "External timecode source"
msgstr "Внешний источник синхросигнала"
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:1981
msgid "Match session video frame rate to external timecode"
msgstr "Адаптировать частоту кадров видео в сессии к внешнему тайм-коду"
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:1987
msgid ""
"This option controls the value of the video frame rate <i>while chasing</i> "
"an external timecode source.\n"
@@ -9684,11 +10000,11 @@ msgstr ""
"этого индикатор частоты кадров в основном счётчике будет мерцать красным, а "
"%1 будет конвертировать внешний тайм-код в тайм-код сессии."
-#: rc_option_editor.cc:1526
+#: rc_option_editor.cc:1997
msgid "Sync-lock timecode to clock (disable drift compensation)"
msgstr "Привязать тайм-код к часам (отключить компенсацию смещения)"
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2003
msgid ""
"<b>When enabled</b> %1 will never varispeed when slaved to external "
"timecode. Sync Lock indicates that the selected external timecode source "
@@ -9709,11 +10025,11 @@ msgstr ""
"<b>Когда выключено,</b> %1 компенсирует потенциальное смещение вне "
"зависимости от того, разделяет ли источник тайм-кода синхронизацию часов."
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2018
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr "Принудительно использовать 29,9700 к/с вместо 30000/1001"
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2024
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
"instead of 30000/1001.\n"
@@ -9736,27 +10052,27 @@ msgstr ""
"несмотря на её противоречие спецификации, потому что использование именно "
"29,97 кадров в секунду имеет нулевое смещение тайм-кода.\n"
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2034
msgid "LTC Reader"
msgstr "Чтение LTC"
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2038
msgid "LTC incoming port"
msgstr "Порт чтения LTC"
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2053
msgid "LTC Generator"
msgstr "Генератор LTC"
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2058
msgid "Enable LTC generator"
msgstr "Включить генератор LTC"
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2065
msgid "Send LTC while stopped"
msgstr "Отправлять LTC в остановленном состоянии"
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2071
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
@@ -9764,11 +10080,11 @@ msgstr ""
"<b>Когда включено,</b> %1 продолжит передавать LTC даже когда транспорт "
"(воспроизведение) не движется"
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2077
msgid "LTC generator level"
msgstr "Уровень генератора LTC"
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2081
msgid ""
"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
"is 0dBu ^= -18dbFS in an EBU calibrated system"
@@ -9776,99 +10092,111 @@ msgstr ""
"Укажите пиковую громкость генерируемого сигнала LTC в dbFS. Хорошее качество "
"это 0dBu ^ =-18dbFS в выщеуказанной EBU калиброванной системе"
-#: rc_option_editor.cc:1622
+#: rc_option_editor.cc:2093
msgid "Allow dragging of playhead"
msgstr "Разрешить перетаскивание указателя воспроизведения"
-#: rc_option_editor.cc:1630
+#: rc_option_editor.cc:2101
msgid "Move relevant automation when audio regions are moved"
msgstr "Перемещать автоматизацию вместе с областями"
-#: rc_option_editor.cc:1638
+#: rc_option_editor.cc:2109
msgid "Show meters on tracks in the editor"
msgstr "Показывать индикаторы громкости в дорожках"
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2117
msgid "Display master-meter in the toolbar"
msgstr "Показывать индикатор громкости мастер-шины в панели"
-#: rc_option_editor.cc:1653
+#: rc_option_editor.cc:2124
msgid "Default fade shape"
msgstr "Форма фейда по умолчанию"
-#: rc_option_editor.cc:1672
+#: rc_option_editor.cc:2143
msgid "Regions in active edit groups are edited together"
msgstr "Области в активных редактируемых группах меняются вместе"
-#: rc_option_editor.cc:1673
+#: rc_option_editor.cc:2144
msgid "whenever they overlap in time"
msgstr "Когда пересекаются по времени"
-#: rc_option_editor.cc:1674
+#: rc_option_editor.cc:2145
msgid "only if they have identical length, position and origin"
msgstr "При одинаковой длительности, позиции и происхождении"
-#: rc_option_editor.cc:1684
+#: rc_option_editor.cc:2154
+msgid "Layering model"
+msgstr "Способ наслоения"
+
+#: rc_option_editor.cc:2159
+msgid "later is higher"
+msgstr "Более поздние — сверху"
+
+#: rc_option_editor.cc:2160
+msgid "manual layering"
+msgstr "Наслаивание вручную"
+
+#: rc_option_editor.cc:2166
msgid "Make rubberband selection rectangle snap to the grid"
msgstr "Прямоугольное выделение привязывается к сетке"
-#: rc_option_editor.cc:1692
+#: rc_option_editor.cc:2174
msgid "Show waveforms in regions"
msgstr "Показывать форму волны в областях"
-#: rc_option_editor.cc:1700
+#: rc_option_editor.cc:2182
msgid "Show gain envelopes in audio regions"
msgstr "Показывать огибающие усиления"
-#: rc_option_editor.cc:1701
+#: rc_option_editor.cc:2183
msgid "in all modes"
msgstr "Во всех режимах"
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
-msgstr "Только в режиме правки огибающей"
+#: rc_option_editor.cc:2184
+msgid "only in Draw and Internal Edit modes"
+msgstr "Только в режимах рисования и правки содержимого"
-#: rc_option_editor.cc:1709
+#: rc_option_editor.cc:2191
msgid "Waveform scale"
msgstr "Масштаб сигнала"
-#: rc_option_editor.cc:1714
+#: rc_option_editor.cc:2196
msgid "linear"
msgstr "Линейный"
-#: rc_option_editor.cc:1715
+#: rc_option_editor.cc:2197
msgid "logarithmic"
msgstr "Логарифмический"
-#: rc_option_editor.cc:1721
+#: rc_option_editor.cc:2203
msgid "Waveform shape"
msgstr "Форма сигнала"
-#: rc_option_editor.cc:1726
+#: rc_option_editor.cc:2208
msgid "traditional"
msgstr "Обычная"
-#: rc_option_editor.cc:1727
+#: rc_option_editor.cc:2209
msgid "rectified"
msgstr "От низа"
-#: rc_option_editor.cc:1736
+#: rc_option_editor.cc:2218
msgid "Show waveforms for audio while it is being recorded"
msgstr "Показывать форму сигнала при записи"
-#: rc_option_editor.cc:1744
+#: rc_option_editor.cc:2226
msgid "Show zoom toolbar"
msgstr "Показывать панель для управления масштабом"
-#: rc_option_editor.cc:1752
+#: rc_option_editor.cc:2234
msgid "Update editor window during drags of the summary"
msgstr "Обновлять окно редактора при изменениях в панели сводки"
-#: rc_option_editor.cc:1759
+#: rc_option_editor.cc:2241
msgid "Name new markers"
msgstr "Спрашивать об имени каждого нового маркера"
-#: rc_option_editor.cc:1765
+#: rc_option_editor.cc:2247
msgid ""
"If enabled, popup a dialog when a new marker is created to allow its name to "
"be set as it is created.\n"
@@ -9881,277 +10209,277 @@ msgstr ""
"Вы всегда можете позднее переименовать маркеры, щелкнув по ним правой "
"кнопкой мыши."
-#: rc_option_editor.cc:1771
+#: rc_option_editor.cc:2253
msgid "Auto-scroll editor window when dragging near its edges"
msgstr ""
"Автоматически прокручивать окно редактора при перетаскивании близко к краям"
-#: rc_option_editor.cc:1778
+#: rc_option_editor.cc:2260
msgid "After splitting selected regions, select"
msgstr "После разделения выбранных областей выбирать"
-#: rc_option_editor.cc:1783
+#: rc_option_editor.cc:2265
msgid "no regions"
msgstr "Не выбирать области"
-#: rc_option_editor.cc:1786
+#: rc_option_editor.cc:2268
msgid "newly-created regions"
msgstr "Только что созданные области"
-#: rc_option_editor.cc:1790
+#: rc_option_editor.cc:2272
msgid "existing selection and newly-created regions"
msgstr "Как выбранные ранее, так и только что созданные области"
-#: rc_option_editor.cc:1797
+#: rc_option_editor.cc:2279
msgid "Buffering"
msgstr "Буферизация"
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2287
msgid "Record monitoring handled by"
msgstr "Мониторинг записи выполняется"
-#: rc_option_editor.cc:1811
+#: rc_option_editor.cc:2293
msgid "via Audio Driver"
msgstr "Через аудиодрайвер"
-#: rc_option_editor.cc:1817
+#: rc_option_editor.cc:2299
msgid "audio hardware"
msgstr "Аппаратным обеспечением"
-#: rc_option_editor.cc:1824
+#: rc_option_editor.cc:2306
msgid "Tape machine mode"
msgstr "Режим плёночного магнитофона"
-#: rc_option_editor.cc:1829
+#: rc_option_editor.cc:2311
msgid "Connection of tracks and busses"
msgstr "Соединение дорожек и шин"
-#: rc_option_editor.cc:1834
+#: rc_option_editor.cc:2316
msgid "Auto-connect master/monitor busses"
msgstr "Автоматически соединять шины master/monitor"
-#: rc_option_editor.cc:1841
+#: rc_option_editor.cc:2323
msgid "Connect track inputs"
msgstr "Соединять входы дорожек"
-#: rc_option_editor.cc:1846
+#: rc_option_editor.cc:2328
msgid "automatically to physical inputs"
msgstr "Автоматически с физическими входами"
-#: rc_option_editor.cc:1847 rc_option_editor.cc:1860
+#: rc_option_editor.cc:2329 rc_option_editor.cc:2342
msgid "manually"
msgstr "Вручную"
-#: rc_option_editor.cc:1853
+#: rc_option_editor.cc:2335
msgid "Connect track and bus outputs"
msgstr "Соединять выходы дорожек и шин"
-#: rc_option_editor.cc:1858
+#: rc_option_editor.cc:2340
msgid "automatically to physical outputs"
msgstr "Автоматически с физическими выходами"
-#: rc_option_editor.cc:1859
+#: rc_option_editor.cc:2341
msgid "automatically to master bus"
msgstr "Автоматически с общей шиной"
-#: rc_option_editor.cc:1864
+#: rc_option_editor.cc:2346
msgid "Denormals"
msgstr "Отклонения сигнала"
-#: rc_option_editor.cc:1869
+#: rc_option_editor.cc:2351
msgid "Use DC bias to protect against denormals"
msgstr "Использовать смещение для защиты от денормализации"
-#: rc_option_editor.cc:1876
+#: rc_option_editor.cc:2358
msgid "Processor handling"
msgstr "Что делать с обработчиками"
-#: rc_option_editor.cc:1882
+#: rc_option_editor.cc:2364
msgid "no processor handling"
msgstr "Ничего не делать"
-#: rc_option_editor.cc:1888
+#: rc_option_editor.cc:2370
msgid "use FlushToZero"
msgstr "Использовать FlushToZero"
-#: rc_option_editor.cc:1895
+#: rc_option_editor.cc:2377
msgid "use DenormalsAreZero"
msgstr "Использовать DenormalsAreZero"
-#: rc_option_editor.cc:1902
+#: rc_option_editor.cc:2384
msgid "use FlushToZero and DenormalsAreZero"
msgstr "Использовать FlushToZero и DenormalsAreZero"
-#: rc_option_editor.cc:1918
+#: rc_option_editor.cc:2400
msgid "Silence plugins when the transport is stopped"
msgstr "Приглушать плагины при остановке транспорта"
-#: rc_option_editor.cc:1926
+#: rc_option_editor.cc:2408
msgid "Make new plugins active"
msgstr "Делать новые плагины активными"
-#: rc_option_editor.cc:1936
+#: rc_option_editor.cc:2418
msgid "Enable automatic analysis of audio"
msgstr "Включить автоматический анализ звука"
-#: rc_option_editor.cc:1944
+#: rc_option_editor.cc:2426
msgid "Replicate missing region channels"
msgstr "Воссоздавать отсутствующие каналы области"
-#: rc_option_editor.cc:1951 rc_option_editor.cc:1953 rc_option_editor.cc:1968
-#: rc_option_editor.cc:1980 rc_option_editor.cc:1992 rc_option_editor.cc:2004
-#: rc_option_editor.cc:2008 rc_option_editor.cc:2016 rc_option_editor.cc:2024
-#: rc_option_editor.cc:2032 rc_option_editor.cc:2034 rc_option_editor.cc:2042
-#: rc_option_editor.cc:2050 rc_option_editor.cc:2058 rc_option_editor.cc:2066
-#: rc_option_editor.cc:2068
+#: rc_option_editor.cc:2433 rc_option_editor.cc:2435 rc_option_editor.cc:2450
+#: rc_option_editor.cc:2462 rc_option_editor.cc:2474 rc_option_editor.cc:2486
+#: rc_option_editor.cc:2490 rc_option_editor.cc:2498 rc_option_editor.cc:2506
+#: rc_option_editor.cc:2514 rc_option_editor.cc:2516 rc_option_editor.cc:2524
+#: rc_option_editor.cc:2532 rc_option_editor.cc:2540 rc_option_editor.cc:2548
+#: rc_option_editor.cc:2550
msgid "Solo / mute"
msgstr "Соло/Приглушение"
-#: rc_option_editor.cc:1956
+#: rc_option_editor.cc:2438
msgid "Solo-in-place mute cut (dB)"
msgstr "Приглушение сигнала при солировании (dB)"
-#: rc_option_editor.cc:1963
+#: rc_option_editor.cc:2445
msgid "Solo controls are Listen controls"
msgstr "Управление солированием работает как управление прослушиванием"
-#: rc_option_editor.cc:1972
+#: rc_option_editor.cc:2454
msgid "Listen Position"
msgstr "Положение прослушивания"
-#: rc_option_editor.cc:1977
+#: rc_option_editor.cc:2459
msgid "after-fader (AFL)"
msgstr "После фейдера (AFL)"
-#: rc_option_editor.cc:1978
+#: rc_option_editor.cc:2460
msgid "pre-fader (PFL)"
msgstr "До фейдера (PFL)"
-#: rc_option_editor.cc:1984
+#: rc_option_editor.cc:2466
msgid "PFL signals come from"
msgstr "Источник сигнала PFL"
-#: rc_option_editor.cc:1989
+#: rc_option_editor.cc:2471
msgid "before pre-fader processors"
msgstr "До послефейдерных обработчиков"
-#: rc_option_editor.cc:1990
+#: rc_option_editor.cc:2472
msgid "pre-fader but after pre-fader processors"
msgstr "До фейдера, но после предфейдерных обработчиков"
-#: rc_option_editor.cc:1996
+#: rc_option_editor.cc:2478
msgid "AFL signals come from"
msgstr "Источник сигнала AFL"
-#: rc_option_editor.cc:2001
+#: rc_option_editor.cc:2483
msgid "immediately post-fader"
msgstr "Сразу после фейдера"
-#: rc_option_editor.cc:2002
+#: rc_option_editor.cc:2484
msgid "after post-fader processors (before pan)"
msgstr "За послефейдерными обработчиками и до панорамирования"
-#: rc_option_editor.cc:2011
+#: rc_option_editor.cc:2493
msgid "Exclusive solo"
msgstr "Эксклюзивное солирование"
-#: rc_option_editor.cc:2019
+#: rc_option_editor.cc:2501
msgid "Show solo muting"
msgstr "Показывать приглушение при солировании"
-#: rc_option_editor.cc:2027
+#: rc_option_editor.cc:2509
msgid "Soloing overrides muting"
msgstr "Солирование приоритетнее приглушения"
-#: rc_option_editor.cc:2032
+#: rc_option_editor.cc:2514
msgid "Default track / bus muting options"
msgstr "Приглушение дорожек и шин по умолчанию затрагивает"
-#: rc_option_editor.cc:2037
+#: rc_option_editor.cc:2519
msgid "Mute affects pre-fader sends"
msgstr "Предфейдерные посылы"
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2527
msgid "Mute affects post-fader sends"
msgstr "Послефейдерные посылы"
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2535
msgid "Mute affects control outputs"
msgstr "Выходы мониторинга"
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2543
msgid "Mute affects main outputs"
msgstr "Основные выходы"
-#: rc_option_editor.cc:2066
+#: rc_option_editor.cc:2548
msgid "Send Routing"
msgstr "Маршрутизация посылов"
-#: rc_option_editor.cc:2071
+#: rc_option_editor.cc:2553
msgid "Link panners of Aux and External Sends with main panner by default"
msgstr "По умолчанию связывать внешние посылы с основным регулятором панорамы"
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2561
msgid "MIDI read-ahead time (seconds)"
msgstr "Чтение MIDI с упреждением (в секундах)"
-#: rc_option_editor.cc:2097
+#: rc_option_editor.cc:2579
msgid "Send MIDI Time Code"
msgstr "Передавать MIDI Time Code"
-#: rc_option_editor.cc:2105
+#: rc_option_editor.cc:2587
msgid "Percentage either side of normal transport speed to transmit MTC"
msgstr "Процент по обе стороны от нормальной трансп. скорости для передачи MTC"
-#: rc_option_editor.cc:2114
+#: rc_option_editor.cc:2596
msgid "Obey MIDI Machine Control commands"
msgstr "Выполнять команды MIDI Machine Control"
-#: rc_option_editor.cc:2122
+#: rc_option_editor.cc:2604
msgid "Send MIDI Machine Control commands"
msgstr "Отправлять команды MIDI Machine Control"
-#: rc_option_editor.cc:2130
+#: rc_option_editor.cc:2612
msgid "Send MIDI control feedback"
msgstr "Отправлять отклик на контрольные события MIDI"
-#: rc_option_editor.cc:2138
+#: rc_option_editor.cc:2620
msgid "Inbound MMC device ID"
msgstr "Идентификатор входящего устройства MMC"
-#: rc_option_editor.cc:2147
+#: rc_option_editor.cc:2629
msgid "Outbound MMC device ID"
msgstr "Идентификатор выходящего устройства MMC"
-#: rc_option_editor.cc:2156
+#: rc_option_editor.cc:2638
msgid "Initial program change"
msgstr "Исходная смена программы"
-#: rc_option_editor.cc:2165
+#: rc_option_editor.cc:2647
msgid "Display first MIDI bank/program as 0"
msgstr "Показывать первый банк/программу MIDI как 0"
-#: rc_option_editor.cc:2173
+#: rc_option_editor.cc:2655
msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
msgstr "Никогда не показывать периодические сообщения MIDI (MTC, MIDI Clock)"
-#: rc_option_editor.cc:2181
+#: rc_option_editor.cc:2663
msgid "Sound MIDI notes as they are selected"
msgstr "Воспроизводить ноты MIDI при их выделении"
-#: rc_option_editor.cc:2186
+#: rc_option_editor.cc:2668
msgid "Midi Audition"
msgstr "Прослушивание MIDI"
-#: rc_option_editor.cc:2190
+#: rc_option_editor.cc:2672
msgid "Midi Audition Synth (LV2)"
msgstr "Инструмент для прослушивания MIDI (LV2)"
-#: rc_option_editor.cc:2221 rc_option_editor.cc:2231 rc_option_editor.cc:2233
+#: rc_option_editor.cc:2703 rc_option_editor.cc:2713 rc_option_editor.cc:2715
msgid "User interaction"
msgstr "Взаимодействие с пользователем"
-#: rc_option_editor.cc:2224
+#: rc_option_editor.cc:2706
msgid ""
"Use translations of %1 messages\n"
" <i>(requires a restart of %1 to take effect)</i>\n"
@@ -10161,141 +10489,152 @@ msgstr ""
" <i>(вступает в силу после перезапуска %1)</i>\n"
" <i>(если локализация для вашего языка доступна)</i>"
-#: rc_option_editor.cc:2231
+#: rc_option_editor.cc:2713
msgid "Keyboard"
msgstr "Клавиатура"
-#: rc_option_editor.cc:2241
+#: rc_option_editor.cc:2723
msgid "Control surface remote ID"
msgstr "ID для удалённого управления"
-#: rc_option_editor.cc:2246
+#: rc_option_editor.cc:2728
msgid "assigned by user"
msgstr "Назначенные пользователем"
-#: rc_option_editor.cc:2247
+#: rc_option_editor.cc:2729
msgid "follows order of mixer"
msgstr "Следуют порядку микшера"
-#: rc_option_editor.cc:2261 rc_option_editor.cc:2270 rc_option_editor.cc:2279
-#: rc_option_editor.cc:2289 rc_option_editor.cc:2313 rc_option_editor.cc:2326
-#: rc_option_editor.cc:2335
+#: rc_option_editor.cc:2746
+msgid "Possibly improve slow graphical performance"
+msgstr ""
+
+#: rc_option_editor.cc:2751
+msgid "This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:2752 rc_option_editor.cc:2755 rc_option_editor.cc:2764
+#: rc_option_editor.cc:2773 rc_option_editor.cc:2783 rc_option_editor.cc:2808
+#: rc_option_editor.cc:2823 rc_option_editor.cc:2836 rc_option_editor.cc:2845
msgid "Preferences|GUI"
msgstr "Интерфейс"
-#: rc_option_editor.cc:2264
+#: rc_option_editor.cc:2758
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr "Подсвечивать элементы интерфейса под указателем мыши"
-#: rc_option_editor.cc:2273
+#: rc_option_editor.cc:2767
msgid "Show tooltips if mouse hovers over a control"
msgstr "Показывать всплывающие подсказки к элементам интерфейса"
-#: rc_option_editor.cc:2282
+#: rc_option_editor.cc:2776
msgid "Use name highlight bars in region displays (requires a restart)"
msgstr "Подсвечивать названия областей (требует перезапуска)"
-#: rc_option_editor.cc:2295
+#: rc_option_editor.cc:2789
msgid "update transport clock display at FPS instead of every 100ms"
msgstr "Обновлять часы транспорта по FPS, а не каждые 100 мс"
-#: rc_option_editor.cc:2304
+#: rc_option_editor.cc:2799
+msgid "Waveform image cache size (megabytes)"
+msgstr "Размер кэша для графики волновой формы (МБ)"
+
+#: rc_option_editor.cc:2807
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:2814
msgid "Lock timeout (seconds)"
msgstr "Тайм-аут блокировки (секунды)"
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:2822
msgid "Lock GUI after this many idle seconds (zero to never lock)"
msgstr ""
"Блокировка GUI после этого количества секунд простоя\n"
"(0 - никогда не блокировать)"
-#: rc_option_editor.cc:2328
+#: rc_option_editor.cc:2838
msgid "Mixer Strip"
msgstr "Полоса микшера"
-#: rc_option_editor.cc:2338
+#: rc_option_editor.cc:2848
msgid "Use narrow strips in the mixer by default"
msgstr "Использовать тонкие полоски в микшере по умолчанию"
-#: rc_option_editor.cc:2343 rc_option_editor.cc:2357 rc_option_editor.cc:2376
-#: rc_option_editor.cc:2392 rc_option_editor.cc:2408 rc_option_editor.cc:2422
-#: rc_option_editor.cc:2436 rc_option_editor.cc:2438
+#: rc_option_editor.cc:2853 rc_option_editor.cc:2867 rc_option_editor.cc:2884
+#: rc_option_editor.cc:2900 rc_option_editor.cc:2916 rc_option_editor.cc:2930
+#: rc_option_editor.cc:2956 rc_option_editor.cc:2974 rc_option_editor.cc:2985
+#: rc_option_editor.cc:2992 rc_option_editor.cc:2994
msgid "Preferences|Metering"
msgstr "Замер"
-#: rc_option_editor.cc:2347
+#: rc_option_editor.cc:2857
msgid "Peak hold time"
msgstr "Удерживание пика"
-#: rc_option_editor.cc:2353
+#: rc_option_editor.cc:2863
msgid "short"
msgstr "Короткое"
-#: rc_option_editor.cc:2354
+#: rc_option_editor.cc:2864
msgid "medium"
msgstr "Среднее"
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:2865
msgid "long"
msgstr "Долгое"
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:2871
msgid "DPM fall-off"
msgstr "Скорость спадания"
-#: rc_option_editor.cc:2367
+#: rc_option_editor.cc:2877
msgid "slowest [6.6dB/sec]"
msgstr "Самое медленное [6,6 Дб/с]"
-#: rc_option_editor.cc:2368
+#: rc_option_editor.cc:2878
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr "Медленное [8,6 Дб/с] (BBC PPM, EBU PPM)"
-#: rc_option_editor.cc:2369
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr "Неторопливое [12 Дб/с] (DIN)"
-
-#: rc_option_editor.cc:2370
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr "Умеренное [13,3 Дб/с] (EBU Digi PPM, IRT Digi PPM)"
-
-#: rc_option_editor.cc:2371
-msgid "medium [20dB/sec]"
-msgstr "Среднее [20 Дб/с]"
+#: rc_option_editor.cc:2879
+msgid "moderate [12.0dB/sec] (DIN)"
+msgstr "Умеренное [12 Дб/с] (DIN)"
-#: rc_option_editor.cc:2372
-msgid "fast [32dB/sec]"
-msgstr "Быстрое [32 Дб/с]"
+#: rc_option_editor.cc:2880
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+msgstr "Среднее [13,3 Дб/с] (EBU Digi PPM, IRT Digi PPM)"
-#: rc_option_editor.cc:2373
-msgid "faster [46dB/sec]"
-msgstr "Ещё быстрее [46 Дб/с]"
+#: rc_option_editor.cc:2881
+msgid "fast [20dB/sec]"
+msgstr "Быстрое [20 Дб/с]"
-#: rc_option_editor.cc:2374
-msgid "fastest [70dB/sec]"
-msgstr "Самое быстрое [70 Дб/с]"
+#: rc_option_editor.cc:2882
+msgid "very fast [32dB/sec]"
+msgstr "Очень быстрое [32 Дб/с]"
-#: rc_option_editor.cc:2380
+#: rc_option_editor.cc:2888
msgid "Meter line-up level; 0dBu"
msgstr "Точка выравнивания индикатора; 0dBu"
-#: rc_option_editor.cc:2385 rc_option_editor.cc:2401
+#: rc_option_editor.cc:2893 rc_option_editor.cc:2909
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
-#: rc_option_editor.cc:2386 rc_option_editor.cc:2402
+#: rc_option_editor.cc:2894 rc_option_editor.cc:2910
msgid "-20dBFS (SMPTE RP.0155)"
msgstr "-20dBFS (SMPTE RP.0155)"
-#: rc_option_editor.cc:2387 rc_option_editor.cc:2403
+#: rc_option_editor.cc:2895 rc_option_editor.cc:2911
msgid "-18dBFS (EBU, BBC)"
msgstr "-18dBFS (EBU, BBC)"
-#: rc_option_editor.cc:2388 rc_option_editor.cc:2404
+#: rc_option_editor.cc:2896 rc_option_editor.cc:2912
msgid "-15dBFS (DIN)"
msgstr "-15dBFS (DIN)"
-#: rc_option_editor.cc:2390
+#: rc_option_editor.cc:2898
msgid ""
"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
"level for IEC1/Nordic, IEC2 PPM and VU meter."
@@ -10303,39 +10642,51 @@ msgstr ""
"Настройка измер. маркеров и цвета точки узла для dBFS масштабирования шкалы "
"DPM, установка эталонного уровня для IEC1/Nordic, PPM и VU-метра."
-#: rc_option_editor.cc:2396
+#: rc_option_editor.cc:2904
msgid "IEC1/DIN Meter line-up level; 0dBu"
msgstr "Точка выравнивания индикатора IEC1/DIN; 0dBu"
-#: rc_option_editor.cc:2406
+#: rc_option_editor.cc:2914
msgid "Reference level for IEC1/DIN meter."
msgstr "Референсный уровень индикатора IEC1/DIN"
-#: rc_option_editor.cc:2412
+#: rc_option_editor.cc:2920
msgid "VU Meter standard"
msgstr "Стандарт индикатора VU"
-#: rc_option_editor.cc:2417
+#: rc_option_editor.cc:2925
msgid "0VU = -2dBu (France)"
msgstr "0VU = -2dBu (Франция)"
-#: rc_option_editor.cc:2418
+#: rc_option_editor.cc:2926
msgid "0VU = 0dBu (North America, Australia)"
msgstr "0VU = 0dBu (Северная Америка, Австралия)"
-#: rc_option_editor.cc:2419
+#: rc_option_editor.cc:2927
msgid "0VU = +4dBu (standard)"
msgstr "0VU = +4dBu (стандарт)"
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:2928
msgid "0VU = +8dBu"
msgstr "0VU = +8dBu"
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:2934
msgid "Peak threshold [dBFS]"
msgstr "Порог пика (dbFS)"
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:2943
+msgid "Default Meter Type for Master Bus"
+msgstr "Тип индикатора по умолчанию для мастер-шины"
+
+#: rc_option_editor.cc:2961
+msgid "Default Meter Type for Busses"
+msgstr "Тип индикатора по умолчанию для шин"
+
+#: rc_option_editor.cc:2978
+msgid "Default Meter Type for Tracks"
+msgstr "Тип индикатора по умолчанию для дорожек"
+
+#: rc_option_editor.cc:2990
msgid ""
"Specify the audio signal level in dbFS at and above which the meter-peak "
"indicator will flash red."
@@ -10343,11 +10694,11 @@ msgstr ""
"Укажите в dbFS номинальный уровень звукового сигнала и пикового, когда "
"индикатор мигает красным цветом."
-#: rc_option_editor.cc:2441
+#: rc_option_editor.cc:2997
msgid "LED meter style"
msgstr "Индикатор в стиле LED"
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3005
msgid "Theme"
msgstr "Тема"
@@ -10363,7 +10714,7 @@ msgstr "Позиция:"
msgid "End:"
msgstr "Конец:"
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:92 sfdb_ui.cc:144
msgid "Length:"
msgstr "Длительность:"
@@ -10391,19 +10742,19 @@ msgstr "Источник:"
msgid "Region '%1'"
msgstr "Область %1"
-#: region_editor.cc:273
+#: region_editor.cc:277
msgid "change region start position"
msgstr "Смена позиции начала области"
-#: region_editor.cc:289
+#: region_editor.cc:297
msgid "change region end position"
msgstr "Смена позиции конца области"
-#: region_editor.cc:309
+#: region_editor.cc:320
msgid "change region length"
msgstr "Смена длительности области"
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:414 region_editor.cc:426
msgid "change region sync point"
msgstr "Смена синхронизатора областей"
@@ -10570,7 +10921,7 @@ msgstr "Готовность к записи"
msgid "Active state"
msgstr "Активное состояние"
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
+#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:92
msgid "Color"
msgstr "Цвет"
@@ -10619,184 +10970,184 @@ msgstr "НЕТ ДОРОЖЕК"
msgid "No Track or Bus Selected"
msgstr "Нет выбранных дорожек или шин"
-#: route_time_axis.cc:103
+#: route_time_axis.cc:104
msgid "RTAV|G"
msgstr "Г"
-#: route_time_axis.cc:104
+#: route_time_axis.cc:105
msgid "RTAV|P"
msgstr "П"
-#: route_time_axis.cc:105
+#: route_time_axis.cc:106
msgid "RTAV|A"
msgstr "А"
-#: route_time_axis.cc:181
+#: route_time_axis.cc:183
msgid "Record (Right-click for Step Edit)"
msgstr "Запись (правая клавиша мыши активирует пошаговый ввод)"
-#: route_time_axis.cc:184
+#: route_time_axis.cc:186
msgid "Record"
msgstr "Запись"
-#: route_time_axis.cc:254
+#: route_time_axis.cc:256
msgid "Route Group"
msgstr "Группа маршрутизации"
-#: route_time_axis.cc:264
+#: route_time_axis.cc:266
msgid "MIDI Controllers and Automation"
msgstr "MIDI-контроллеры и автоматизация"
-#: route_time_axis.cc:495
+#: route_time_axis.cc:497
msgid "Show All Automation"
msgstr "Показать всю автоматизацию"
-#: route_time_axis.cc:498
+#: route_time_axis.cc:500
msgid "Show Existing Automation"
msgstr "Показать существующую автоматизацию"
-#: route_time_axis.cc:501
+#: route_time_axis.cc:503
msgid "Hide All Automation"
msgstr "Скрыть всю автоматизацию"
-#: route_time_axis.cc:510
+#: route_time_axis.cc:512
msgid "Processor automation"
msgstr "Автоматизация обработчика"
-#: route_time_axis.cc:517
+#: route_time_axis.cc:519
msgid "Fader"
msgstr "Фейдер"
-#: route_time_axis.cc:535
+#: route_time_axis.cc:546
msgid "Pan"
msgstr "Панорама"
-#: route_time_axis.cc:626
+#: route_time_axis.cc:637
msgid "Overlaid"
msgstr "Перекрывают друг друга"
-#: route_time_axis.cc:632
+#: route_time_axis.cc:643
msgid "Stacked"
msgstr "В стопке"
-#: route_time_axis.cc:640
+#: route_time_axis.cc:651
msgid "Layers"
msgstr "Слои"
-#: route_time_axis.cc:709
+#: route_time_axis.cc:720
msgid "Automatic (based on I/O connections)"
msgstr "Автоматическое (по соединениям входа-выхода)"
-#: route_time_axis.cc:718
+#: route_time_axis.cc:729
msgid "(Currently: Existing Material)"
msgstr "(Сейчас: с записанным материалом)"
-#: route_time_axis.cc:721
+#: route_time_axis.cc:732
msgid "(Currently: Capture Time)"
msgstr "(Сейчас: по времени захвата)"
-#: route_time_axis.cc:729
+#: route_time_axis.cc:740
msgid "Align With Existing Material"
msgstr "С записанным материалом"
-#: route_time_axis.cc:734
+#: route_time_axis.cc:745
msgid "Align With Capture Time"
msgstr "По времени захвата"
-#: route_time_axis.cc:739
+#: route_time_axis.cc:750
msgid "Alignment"
msgstr "Выравнивание"
-#: route_time_axis.cc:774
+#: route_time_axis.cc:785
msgid "Normal Mode"
msgstr "Обычный режим"
-#: route_time_axis.cc:780
+#: route_time_axis.cc:791
msgid "Tape Mode"
msgstr "Плёночный режим"
-#: route_time_axis.cc:786
+#: route_time_axis.cc:797
msgid "Non-Layered Mode"
msgstr "Бесслойный режим"
-#: route_time_axis.cc:792
+#: route_time_axis.cc:803
msgid "Record Mode"
msgstr "Режим записи"
-#: route_time_axis.cc:799 route_time_axis.cc:1785
+#: route_time_axis.cc:810 route_time_axis.cc:1801
msgid "Playlist"
msgstr "Список"
-#: route_time_axis.cc:1093
+#: route_time_axis.cc:1104
msgid "Rename Playlist"
msgstr "Переименовать список воспроизведения"
-#: route_time_axis.cc:1094
+#: route_time_axis.cc:1105
msgid "New name for playlist:"
msgstr "Новое название списка воспроизведения:"
-#: route_time_axis.cc:1179
+#: route_time_axis.cc:1190
msgid "New Copy Playlist"
msgstr "Новая копия списка воспроизведения"
-#: route_time_axis.cc:1180 route_time_axis.cc:1233
+#: route_time_axis.cc:1191 route_time_axis.cc:1244
msgid "Name for new playlist:"
msgstr "Название нового списка воспроизведения:"
-#: route_time_axis.cc:1232
+#: route_time_axis.cc:1243
msgid "New Playlist"
msgstr "Новый список воспроизведения"
-#: route_time_axis.cc:1432
+#: route_time_axis.cc:1447
msgid "You cannot create a track with that name as it is reserved for %1"
msgstr ""
"Вы не можете добавить дорожку с названием, которое зарезервировано для %1"
-#: route_time_axis.cc:1674
+#: route_time_axis.cc:1690
msgid "New Copy..."
msgstr "Создать копию..."
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1694
msgid "New Take"
msgstr "Новый дубль"
-#: route_time_axis.cc:1679
+#: route_time_axis.cc:1695
msgid "Copy Take"
msgstr "Скопировать дубль"
-#: route_time_axis.cc:1684
+#: route_time_axis.cc:1700
msgid "Clear Current"
msgstr "Очистить текущий"
-#: route_time_axis.cc:1687
+#: route_time_axis.cc:1703
msgid "Select From All..."
msgstr "Выбрать из всех..."
-#: route_time_axis.cc:1775
+#: route_time_axis.cc:1791
msgid "Take: %1.%2"
msgstr "Дубль: %1.%2"
-#: route_time_axis.cc:2165 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2197 selection.cc:1007 selection.cc:1061
msgid "programming error: "
msgstr "Ошибка в программе: "
-#: route_time_axis.cc:2581
+#: route_time_axis.cc:2613
msgid "Underlays"
msgstr "Подслойка"
-#: route_time_axis.cc:2584
+#: route_time_axis.cc:2616
msgid "Remove \"%1\""
msgstr "Удалить «%1»"
-#: route_time_axis.cc:2634 route_time_axis.cc:2671
+#: route_time_axis.cc:2666 route_time_axis.cc:2703
msgid "programming error: underlay reference pointer pairs are inconsistent!"
msgstr "Ошибка в программе: пары подложка и указатель ссылки несовместимы!"
-#: route_time_axis.cc:2698
+#: route_time_axis.cc:2730
msgid "After-fade listen (AFL)"
msgstr "Прослушивание после фейдера (AFL)"
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2734
msgid "Pre-fade listen (PFL)"
msgstr "Прослушивание до фейдера (PFL)"
@@ -10808,103 +11159,103 @@ msgstr "Приглушить эту дорожку"
msgid "Mute other (non-soloed) tracks"
msgstr "Приглушить другие (не солирующие) дорожки"
-#: route_ui.cc:153
+#: route_ui.cc:152
msgid "Enable recording on this track"
msgstr "Включить готовность к записи этой дорожки"
-#: route_ui.cc:161
+#: route_ui.cc:160
msgid "make mixer strips show sends to this bus"
msgstr "Показывать в полосках микшера посылы к этой шине"
-#: route_ui.cc:166
+#: route_ui.cc:165
msgid "Monitor input"
msgstr "Мониторинг входа"
-#: route_ui.cc:172
+#: route_ui.cc:171
msgid "Monitor playback"
msgstr "Мониторинг воспроизведения"
-#: route_ui.cc:679
+#: route_ui.cc:678
msgid "Not connected to AudioEngine - cannot engage record"
msgstr "Не подключено к AudioEngine. Нельзя записывать."
-#: route_ui.cc:878
+#: route_ui.cc:877
msgid "Step Entry"
msgstr "Пошаговый ввод"
-#: route_ui.cc:951
+#: route_ui.cc:950
msgid "Assign all tracks (prefader)"
msgstr "Назначить всем дорожкам (до фейдера)"
-#: route_ui.cc:955
+#: route_ui.cc:954
msgid "Assign all tracks and buses (prefader)"
msgstr "Назначить всем дорожкам и шинам (до фейдера)"
-#: route_ui.cc:959
+#: route_ui.cc:958
msgid "Assign all tracks (postfader)"
msgstr "Назначить всем дорожкам (после фейдера)"
-#: route_ui.cc:963
+#: route_ui.cc:962
msgid "Assign all tracks and buses (postfader)"
msgstr "Назначить всем дорожкам и шинам (после фейдера)"
-#: route_ui.cc:967
+#: route_ui.cc:966
msgid "Assign selected tracks (prefader)"
msgstr "Назначить выбранным дорожкам (до фейдера)"
-#: route_ui.cc:971
+#: route_ui.cc:970
msgid "Assign selected tracks and buses (prefader)"
msgstr "Назначить выбранным дорожкам и шинам (до фейдера)"
-#: route_ui.cc:974
+#: route_ui.cc:973
msgid "Assign selected tracks (postfader)"
msgstr "Назначить выбранным дорожкам (после фейдера)"
-#: route_ui.cc:978
+#: route_ui.cc:977
msgid "Assign selected tracks and buses (postfader)"
msgstr "Назначить выбранным дорожкам и шинам (после фейдера)"
-#: route_ui.cc:981
+#: route_ui.cc:980
msgid "Copy track/bus gains to sends"
msgstr "Скопировать фейдеры дорожки/шины в посылы"
-#: route_ui.cc:982
+#: route_ui.cc:981
msgid "Set sends gain to -inf"
msgstr "Установка посылает усиление на -inf"
-#: route_ui.cc:983
+#: route_ui.cc:982
msgid "Set sends gain to 0dB"
msgstr "Установка посылает усиление на 0dB"
-#: route_ui.cc:1303
+#: route_ui.cc:1301
msgid "Solo Isolate"
msgstr "Изолировать соло"
-#: route_ui.cc:1310
+#: route_ui.cc:1308
msgid "Solo Safe"
msgstr "Блокировка солирования"
-#: route_ui.cc:1332
+#: route_ui.cc:1330
msgid "Pre Fader Sends"
msgstr "Посылки префейдера"
-#: route_ui.cc:1338
+#: route_ui.cc:1336
msgid "Post Fader Sends"
msgstr "Посылки постфейдера"
-#: route_ui.cc:1344
+#: route_ui.cc:1342
msgid "Control Outs"
msgstr "Контрольные выходы"
-#: route_ui.cc:1350
+#: route_ui.cc:1348
msgid "Main Outs"
msgstr "Главные выходы"
-#: route_ui.cc:1482
+#: route_ui.cc:1485
msgid "Color Selection"
msgstr "Выбор цвета"
-#: route_ui.cc:1547
+#: route_ui.cc:1550
msgid ""
"The use of colons (':') is discouraged in track and bus names.\n"
"Do you want to use this new name?"
@@ -10912,51 +11263,51 @@ msgstr ""
"Использование двоеточия в названиях дорожек и шин не поощряется.\n"
"Вы точно хотите оставить двоеточие?"
-#: route_ui.cc:1551
+#: route_ui.cc:1554
msgid "Use the new name"
msgstr "Использовать новое имя"
-#: route_ui.cc:1552
+#: route_ui.cc:1555
msgid "Re-edit the name"
msgstr "Повторно изменить название"
-#: route_ui.cc:1565
+#: route_ui.cc:1568
msgid "Rename Track"
msgstr "Переименование дорожки"
-#: route_ui.cc:1567
+#: route_ui.cc:1570
msgid "Rename Bus"
msgstr "Переименование шины"
-#: route_ui.cc:1635
+#: route_ui.cc:1638
msgid ": comment editor"
msgstr ": Редактор комментариев"
-#: route_ui.cc:1801
+#: route_ui.cc:1804
msgid " latency"
msgstr " задержка"
-#: route_ui.cc:1814
+#: route_ui.cc:1817
msgid "Cannot create route template directory %1"
msgstr "Не удалось создать папку с шаблонами маршрутизации %1"
-#: route_ui.cc:1820
+#: route_ui.cc:1823
msgid "Save As Template"
msgstr "Сохранить как шаблон"
-#: route_ui.cc:1821
+#: route_ui.cc:1824
msgid "Template name:"
msgstr "Название шаблона:"
-#: route_ui.cc:1902
+#: route_ui.cc:1905
msgid "Remote Control ID"
msgstr "ID для удалённого управления"
-#: route_ui.cc:1912
+#: route_ui.cc:1915
msgid "Remote control ID:"
msgstr "ID для удалённого управления:"
-#: route_ui.cc:1926
+#: route_ui.cc:1929
msgid ""
"The remote control ID of %1 is: %2\n"
"\n"
@@ -10968,15 +11319,15 @@ msgstr ""
"\n"
"%3 не может получить другой ID."
-#: route_ui.cc:1930
+#: route_ui.cc:1933
msgid "the master bus"
msgstr "Мастер-шина"
-#: route_ui.cc:1930
+#: route_ui.cc:1933
msgid "the monitor bus"
msgstr "Шина мониторинга"
-#: route_ui.cc:1932
+#: route_ui.cc:1935
msgid ""
"The remote control ID of %5 is: %2\n"
"\n"
@@ -10995,7 +11346,7 @@ msgstr ""
"%3Используйте вкладку пользовательской интеракции окна Установки, если вы "
"хотите изменить это %4"
-#: route_ui.cc:1989
+#: route_ui.cc:1992
msgid ""
"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
"to show menu."
@@ -11003,10 +11354,34 @@ msgstr ""
"Щелчком левой клавиши мыши инвертируется (инверсия фазы) \n"
"канал %1 этой дорожки. По правой клавише вызывается меню."
-#: route_ui.cc:1991
+#: route_ui.cc:1994
msgid "Click to show a menu of channels for inversion (phase reverse)"
msgstr "Кликните для проказа меню каналов для инверсии (реверс фазы)"
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
+msgstr "Переключиться на только что созданную версию"
+
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
+msgstr "Скопировать данные в новую сессию"
+
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
+msgstr "Скопировать внешние данные в новую сессию"
+
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
+msgstr "Свежесозданная сессия должна быть пустой"
+
+#: save_as_dialog.cc:48
+msgid "Save as session name"
+msgstr "Новое название сессии"
+
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
+msgstr "Куда сохранить каталог сеанса"
+
#: search_path_option.cc:35
msgid "Select folder to search for media"
msgstr "Выберите папку для поиска звуковых данных"
@@ -11715,243 +12090,243 @@ msgstr "По умолчанию"
msgid "Use these settings as defaults"
msgstr "Используйте эти настройки, как по умолчанию"
-#: sfdb_ui.cc:90 sfdb_ui.cc:110 sfdb_ui.cc:119
+#: sfdb_ui.cc:89 sfdb_ui.cc:109 sfdb_ui.cc:118
msgid "as new tracks"
msgstr "как новые дорожки"
-#: sfdb_ui.cc:92 sfdb_ui.cc:112
+#: sfdb_ui.cc:91 sfdb_ui.cc:111
msgid "to selected tracks"
msgstr "в выделенные дорожки"
-#: sfdb_ui.cc:94 sfdb_ui.cc:114
+#: sfdb_ui.cc:93 sfdb_ui.cc:113
msgid "to region list"
msgstr "в список областей"
-#: sfdb_ui.cc:96 sfdb_ui.cc:116
+#: sfdb_ui.cc:95 sfdb_ui.cc:115
msgid "as new tape tracks"
msgstr "как новые плёночные дорожки"
-#: sfdb_ui.cc:100
+#: sfdb_ui.cc:99
msgid "programming error: unknown import mode string %1"
msgstr "Ошибка в программе: неизвестная строка режима импорта %1"
-#: sfdb_ui.cc:127
+#: sfdb_ui.cc:126
msgid "Auto-play"
msgstr "Автовоспр."
-#: sfdb_ui.cc:135 sfdb_ui.cc:324
+#: sfdb_ui.cc:134 sfdb_ui.cc:323
msgid "<b>Sound File Information</b>"
msgstr "<b>Информация о файле</b>"
-#: sfdb_ui.cc:147
+#: sfdb_ui.cc:146
msgid "Timestamp:"
msgstr "Отметка времени:"
-#: sfdb_ui.cc:149
+#: sfdb_ui.cc:148
msgid "Format:"
msgstr "Формат:"
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:187 sfdb_ui.cc:652
msgid "Tags:"
msgstr "Метки:"
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
+#: sfdb_ui.cc:292 sfdb_ui.cc:408
msgid "Could not read file: %1 (%2)."
msgstr "Не удалось прочитать файл: %1 (%2)"
-#: sfdb_ui.cc:297
+#: sfdb_ui.cc:296
msgid "<b>Midi File Information</b>"
msgstr "<b>Сведения о MIDI файле<b>"
-#: sfdb_ui.cc:458
+#: sfdb_ui.cc:457
msgid "Could not access soundfile: "
msgstr "Файл недоступен: "
-#: sfdb_ui.cc:530
+#: sfdb_ui.cc:529
msgid "SoundFileBox: Could not tokenize string: "
msgstr "SoundFileBox: Не удалось разметить строку: "
-#: sfdb_ui.cc:550 sfdb_ui.cc:552
+#: sfdb_ui.cc:549 sfdb_ui.cc:551
msgid "Search"
msgstr "Искать"
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:575
msgid "Audio and MIDI files"
msgstr "Звуковые и MIDI-файлы"
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:578
msgid "Audio files"
msgstr "Звуковые файлы"
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:581
msgid "MIDI files"
msgstr "Файлы MIDI"
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:584 add_video_dialog.cc:123
msgid "All files"
msgstr "Все файлы"
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:603 add_video_dialog.cc:246
msgid "Browse Files"
msgstr "Обзор файлов"
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:632
msgid "Paths"
msgstr "Расположения"
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:641
msgid "Search Tags"
msgstr "Поиск по меткам"
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:657
msgid "Sort:"
msgstr "Критерий сортировки:"
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:665
msgid "Longest"
msgstr "Более длинные"
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:666
msgid "Shortest"
msgstr "Более короткие"
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:667
msgid "Newest"
msgstr "Более новые"
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:668
msgid "Oldest"
msgstr "Более старые"
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:669
msgid "Most downloaded"
msgstr "Чаще скачиваемые"
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:670
msgid "Least downloaded"
msgstr "Реже скачиваемые"
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:671
msgid "Highest rated"
msgstr "Выше оценённые"
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:672
msgid "Lowest rated"
msgstr "Ниже оценённые"
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:677
msgid "More"
msgstr "Ещё"
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:681
msgid "Similar"
msgstr "Дубликат"
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:693
msgid "ID"
msgstr "ID"
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:694 add_video_dialog.cc:83
msgid "Filename"
msgstr "Имя файла"
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:696
msgid "Duration"
msgstr "Длительность"
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:697
msgid "Size"
msgstr "Размер"
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:698
msgid "Samplerate"
msgstr "Частота сэмплирования"
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:699
msgid "License"
msgstr "Лицензия"
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:717
msgid "Search Freesound"
msgstr "Поиск по Freesound"
-#: sfdb_ui.cc:738
+#: sfdb_ui.cc:737
msgid "Press to import selected files and close this window"
msgstr "Нажмите, чтобы импортировать выбранные файлы и закрыть это окно"
-#: sfdb_ui.cc:739
+#: sfdb_ui.cc:738
msgid "Press to import selected files and leave this window open"
msgstr ""
"Нажмите, чтобы импортировать выбранные файлы и оставить это окно открытым"
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:739
msgid "Press to close this window without importing any files"
msgstr "Нажмите, чтобы закрыть это окно, ничего не импортируя"
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:935
msgid "SoundFileBrowser: Could not tokenize string: "
msgstr "SoundFileBrowser: Не удалось разметить строку:"
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1135
msgid "%1 more page of 100 results available"
msgid_plural "%1 more pages of 100 results available"
msgstr[0] "Ещё %1 страница из 100 доступных"
msgstr[1] "Ещё %1 страницы из 100 доступных"
msgstr[2] "Ещё %1 страниц из 100 доступных"
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1140
msgid "No more results available"
msgstr "Больше результатов нет"
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1204
msgid "B"
msgstr "Б"
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1206
msgid "kB"
msgstr "КБ"
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1208 sfdb_ui.cc:1210
msgid "MB"
msgstr "МБ"
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1212
msgid "GB"
msgstr "ГБ"
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1424 sfdb_ui.cc:1737 sfdb_ui.cc:1800 sfdb_ui.cc:1818
msgid "one track per file"
msgstr "Одна дорожка на файл"
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1427 sfdb_ui.cc:1801 sfdb_ui.cc:1819
msgid "one track per channel"
msgstr "Одна дорожка на канал"
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1435 sfdb_ui.cc:1803 sfdb_ui.cc:1820
msgid "sequence files"
msgstr "Файлы последовательности"
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1438 sfdb_ui.cc:1808
msgid "all files in one track"
msgstr "Все файлы в одну дорожку"
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1439 sfdb_ui.cc:1802
msgid "merge files"
msgstr "Объединить файлы"
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1805
msgid "one region per file"
msgstr "Одна область на файл"
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1448 sfdb_ui.cc:1806
msgid "one region per channel"
msgstr "Одна область на канал"
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1453 sfdb_ui.cc:1807 sfdb_ui.cc:1821
msgid "all files in one region"
msgstr "Все файлы в одной области"
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1520
msgid ""
"One or more of the selected files\n"
"cannot be used by %1"
@@ -11959,59 +12334,59 @@ msgstr ""
"Один или более выбранных файлов\n"
"не могут быть использованы в %1"
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1664
msgid "Copy files to session"
msgstr "Скопировать файлы в сессию"
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1681 sfdb_ui.cc:1858
msgid "file timestamp"
msgstr "По отметке времени файла"
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1682 sfdb_ui.cc:1860
msgid "edit point"
msgstr "По курсору редактора"
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1683 sfdb_ui.cc:1862
msgid "playhead"
msgstr "По указателю воспр."
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1684
msgid "session start"
msgstr "В начало сессии"
-#: sfdb_ui.cc:1691
+#: sfdb_ui.cc:1690
msgid "<b>Add files as ...</b>"
msgstr "<b>Добавить файлы как...</b>"
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1712
msgid "<b>Insert at</b>"
msgstr "<b>Куда вставить</b>"
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1725
msgid "<b>Mapping</b>"
msgstr "<b>Способ вставки</b>"
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1743
msgid "<b>Conversion quality</b>"
msgstr "<b>Качество преобразования:</b>"
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1755
msgid "<b>Instrument</b>"
msgstr "<b>Инструмент</b>"
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1767 sfdb_ui.cc:1874
msgid "Best"
msgstr "Наилучшее"
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1768 sfdb_ui.cc:1876
msgid "Good"
msgstr "Хорошее"
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1769 sfdb_ui.cc:1878
msgid "Quick"
msgstr "Быстрое"
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1771
msgid "Fastest"
msgstr "Быстрее всего"
@@ -12019,41 +12394,41 @@ msgstr "Быстрее всего"
msgid "Shuttle speed control (Context-click for options)"
msgstr "Контроль скорости воспроизведения (параметры — в контекстном меню)"
-#: shuttle_control.cc:174
+#: shuttle_control.cc:183
msgid "Percent"
msgstr "Проценты"
-#: shuttle_control.cc:182
+#: shuttle_control.cc:191
msgid "Units"
msgstr "Единица измерения"
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:197 shuttle_control.cc:620
msgid "Sprung"
msgstr "Прыжок"
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:201 shuttle_control.cc:623
msgid "Wheel"
msgstr "Переход"
-#: shuttle_control.cc:226
+#: shuttle_control.cc:235
msgid "Maximum speed"
msgstr "Макс. скорость"
-#: shuttle_control.cc:568
+#: shuttle_control.cc:579
msgid "Playing"
msgstr "Воспроизведение"
-#: shuttle_control.cc:583
+#: shuttle_control.cc:594
#, c-format
msgid "<<< %+d semitones"
msgstr "<<< %+d полутон"
-#: shuttle_control.cc:585
+#: shuttle_control.cc:596
#, c-format
msgid ">>> %+d semitones"
msgstr ">>> %+d полутон"
-#: shuttle_control.cc:590
+#: shuttle_control.cc:601
msgid "Stopped"
msgstr "Остановлено"
@@ -12097,7 +12472,7 @@ msgstr "Удалить громкоговоритель"
msgid "Azimuth:"
msgstr "Азимут:"
-#: startup.cc:67
+#: startup.cc:68
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
@@ -12105,11 +12480,11 @@ msgstr ""
"Использовать внешний микшер или микшер звукового интерфейса.\n"
"%1 никак не будет участвовать в мониторинге."
-#: startup.cc:69
+#: startup.cc:70
msgid "Ask %1 to play back material as it is being recorded"
msgstr "Дать %1 воспроизводить материал при его записи"
-#: startup.cc:142
+#: startup.cc:143
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 "
@@ -12126,15 +12501,15 @@ msgstr ""
"\n"
"Перед началом работы с программой необходимо кое-что настроить.</span>"
-#: startup.cc:168
+#: startup.cc:169
msgid "Welcome to %1"
msgstr "Приветствуем вас в %1"
-#: startup.cc:191
+#: startup.cc:192
msgid "Default folder for %1 sessions"
msgstr "Папка для сессий %1 по умолчанию"
-#: startup.cc:197
+#: startup.cc:198
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"
@@ -12152,11 +12527,11 @@ msgstr ""
"<i>(Сохранять сессии можно будет где угодно, просто указанная\n"
"папка будет использоваться по умолчанию)</i>"
-#: startup.cc:220
+#: startup.cc:221
msgid "Default folder for new sessions"
msgstr "Папка для новых сессий по умолчанию"
-#: startup.cc:241
+#: startup.cc:242
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"
@@ -12181,15 +12556,15 @@ msgstr ""
"<i>Если вы не понимаете смысл этого параметра, просто используйте \n"
"предлагаемый по умолчанию вариант.</i>"
-#: startup.cc:262
+#: startup.cc:263
msgid "Monitoring Choices"
msgstr "Способ мониторинга"
-#: startup.cc:285
+#: startup.cc:286
msgid "Use a Master bus directly"
msgstr "Использовать мастер-шину напрямую"
-#: startup.cc:287
+#: startup.cc:288
msgid ""
"Connect the Master bus directly to your hardware outputs. This is preferable "
"for simple usage."
@@ -12197,11 +12572,11 @@ msgstr ""
"Соединить мастер-шину напрямую с выходами звукового интерфейса.\n"
"Предпочтительно для простого использования."
-#: startup.cc:296
+#: startup.cc:297
msgid "Use an additional Monitor bus"
msgstr "Использовать дополнительную шину мониторинга"
-#: startup.cc:299
+#: startup.cc:300
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
@@ -12209,7 +12584,7 @@ msgstr ""
"Использовать шину мониторинга между мастер-шиной и выходами \n"
"звукового интерфейса для полного контроля без вмешательства в микс."
-#: startup.cc:321
+#: startup.cc:322
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"
@@ -12222,7 +12597,7 @@ msgstr ""
"<i>Если вы не понимаете смысл этого параметра, просто используйте\n"
"предлагаемое по умолчанию.</i>"
-#: startup.cc:332
+#: startup.cc:333
msgid "Monitor Section"
msgstr "Секция монитора"
@@ -12610,7 +12985,7 @@ msgstr "Переключить ввод аккордов"
msgid "Sustain Selected Notes by Note Length"
msgstr "Выдерживать выбранные ноты по длине"
-#: stereo_panner.cc:133
+#: stereo_panner.cc:128
#, c-format
msgid "L:%3d R:%3d Width:%d%%"
msgstr "Левый:%3d, Правый:%3d, Ширина: %d%%"
@@ -12655,52 +13030,48 @@ msgstr "Пульсирующая нота"
msgid "Tap tempo"
msgstr "TAP время"
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr "Изменить темп"
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:343
+#: tempo_dialog.cc:344
msgid "whole"
msgstr "целая"
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:345
+#: tempo_dialog.cc:346
msgid "second"
msgstr "1/2"
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:347
+#: tempo_dialog.cc:348
msgid "third"
msgstr "1/3"
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:349
+#: tempo_dialog.cc:350
msgid "quarter"
msgstr "1/4"
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:351
+#: tempo_dialog.cc:352
msgid "eighth"
msgstr "1/8"
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:353
+#: tempo_dialog.cc:354
msgid "sixteenth"
msgstr "1/16"
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:355
+#: tempo_dialog.cc:356
msgid "thirty-second"
msgstr "1/32"
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:357
+#: tempo_dialog.cc:358
msgid "sixty-fourth"
msgstr "1/64"
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:359
+#: tempo_dialog.cc:360
msgid "one-hundred-twenty-eighth"
msgstr "1/128"
@@ -12712,95 +13083,91 @@ msgstr "Долей в минуту:"
msgid "Tempo begins at"
msgstr "Темп начинается"
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:254
msgid "incomprehensible pulse note type (%1)"
msgstr "непонятный тип пульсирующей ноты (%1)"
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
-msgstr "Изменить размер"
-
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:375
msgid "Note value:"
msgstr "Значение ноты: "
-#: tempo_dialog.cc:357
+#: tempo_dialog.cc:376
msgid "Beats per bar:"
msgstr "Долей на такт:"
-#: tempo_dialog.cc:371
+#: tempo_dialog.cc:390
msgid "Meter begins at bar:"
msgstr "Размер начинается в такте:"
-#: tempo_dialog.cc:484
+#: tempo_dialog.cc:503
msgid "incomprehensible meter note type (%1)"
msgstr "непонятный тип нотного ритма (%1)"
-#: theme_manager.cc:65
+#: theme_manager.cc:67
msgid "Dark Theme"
msgstr "Тёмная тема"
-#: theme_manager.cc:66
+#: theme_manager.cc:68
msgid "Light Theme"
msgstr "Светлая тема"
-#: theme_manager.cc:67
+#: theme_manager.cc:69
msgid "Restore Defaults"
msgstr "Восстановить исходные значения"
-#: theme_manager.cc:68
+#: theme_manager.cc:70
msgid "Draw \"flat\" buttons"
msgstr "Рисовать кнопки плоскими"
-#: theme_manager.cc:69
+#: theme_manager.cc:71
msgid "Blink Rec-Arm buttons"
msgstr "Мигать кнопками готовности к записи"
-#: theme_manager.cc:70
+#: theme_manager.cc:72
msgid "Color regions using their track's color"
msgstr "Раскрашивать области цветом дорожки"
-#: theme_manager.cc:71
+#: theme_manager.cc:73
msgid "Show waveform clipping"
msgstr "Показывать клиппинг волновой формы"
-#: theme_manager.cc:73
+#: theme_manager.cc:75
msgid "Waveforms color gradient depth"
msgstr "Глубина градиента волновой формы сигнала"
-#: theme_manager.cc:75
+#: theme_manager.cc:77
msgid "Timeline item gradient depth"
msgstr "Глубина градиента объектов на таймлайне"
-#: theme_manager.cc:76
+#: theme_manager.cc:78
msgid "All floating windows are dialogs"
msgstr "Все плавающие окна являются диалогами"
-#: theme_manager.cc:77
+#: theme_manager.cc:79
msgid "Transient windows follow front window."
msgstr "Временные окна следуют за получающим фокус основным окном"
-#: theme_manager.cc:78
+#: theme_manager.cc:80
msgid "Icon Set"
msgstr "Набор значков:"
-#: theme_manager.cc:87
+#: theme_manager.cc:89
msgid "Object"
msgstr "Объект"
-#: theme_manager.cc:163
+#: theme_manager.cc:165
msgid "Items"
msgstr "Элементы"
-#: theme_manager.cc:164
+#: theme_manager.cc:166
msgid "Palette"
msgstr "Палитра"
-#: theme_manager.cc:165
+#: theme_manager.cc:167
msgid "Transparency"
msgstr "Прозрачность"
-#: theme_manager.cc:195
+#: theme_manager.cc:197
msgid ""
"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
"\" for some.\n"
@@ -12811,7 +13178,7 @@ msgstr ""
"Это может помочь с некоторыми оконными менеджерами.\n"
"Изменения вступят в силу после перезапуска %1."
-#: theme_manager.cc:199
+#: theme_manager.cc:201
msgid ""
"Make transient windows follow the front window when toggling between the "
"editor and mixer.\n"
@@ -12821,15 +13188,15 @@ msgstr ""
"при переключении между редактором и микшером.\n"
"Это изменение вступит в силу после перезапуска %1."
-#: theme_manager.cc:620
+#: theme_manager.cc:635
msgid "Color Palette"
msgstr "Цветовая палитра"
-#: time_axis_view.cc:148
+#: time_axis_view.cc:150
msgid "Track/Bus name (double click to edit)"
msgstr "Имя дорожки/шины (двойной клик для редактирования)"
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:333
msgid "new duration %1 frame is out of bounds for %2"
msgid_plural "new duration of %1 frames is out of bounds for %2"
msgstr[0] "Новая длительность размером %1 кадр находится за пределами %2"
@@ -12968,67 +13335,67 @@ msgstr "Транспонировать MIDI"
msgid "Transpose"
msgstr "Транспонировать"
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:179 ui_config.cc:317
msgid "Loading default ui configuration file %1"
msgstr "Загрузка файла конфигурации UI по умолчанию %1"
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:182 ui_config.cc:320
msgid "cannot read default ui configuration file \"%1\""
msgstr "Невозможно прочитать основной файл конфигурации интерфейса \"%1\""
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:185 ui_config.cc:325
msgid "default ui configuration file \"%1\" not loaded successfully."
msgstr "Основной файл конфигурации интерфейса \"%1\" не был успешно загружен"
-#: ui_config.cc:177
+#: ui_config.cc:193
msgid "Could not find default UI configuration file %1"
msgstr "Не удалось найти конфигурационный файл %1 для интерфейса"
-#: ui_config.cc:219
+#: ui_config.cc:236
msgid "Loading color file %1"
msgstr "Загружается файл %1 с описанием цветовой схемы"
-#: ui_config.cc:222
+#: ui_config.cc:239
msgid "cannot read color file \"%1\""
msgstr "Невозможно прочитать файл %1 с описанием цветовой схемы"
-#: ui_config.cc:227
+#: ui_config.cc:244
msgid "color file \"%1\" not loaded successfully."
msgstr "Файл %1 с описанием цветовой схемы не был успешно загружен."
-#: ui_config.cc:233
+#: ui_config.cc:250
msgid "Color file %1 not found"
msgstr "Файл %1 с описанием цветовой схемы не найден"
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:299 ui_config.cc:378
msgid "Color file %1 not saved"
msgstr "Файл %1 с описанием цветовой схемы не сохранён"
-#: ui_config.cc:317
+#: ui_config.cc:334
msgid "Loading user ui configuration file %1"
msgstr "Загрузка файла пользовательской конфигурации UI %1"
-#: ui_config.cc:320
+#: ui_config.cc:337
msgid "cannot read ui configuration file \"%1\""
msgstr "Невозможно прочитать файл конфигурации UI \"%1\""
-#: ui_config.cc:325
+#: ui_config.cc:342
msgid "user ui configuration file \"%1\" not loaded successfully."
msgstr "Конфигурация UI интерфейса файлa \"%1\" не загружена успешно."
-#: ui_config.cc:333
+#: ui_config.cc:350
msgid "could not find any ui configuration file, canvas will look broken."
msgstr "Невозможно найти файл конфигурации UI, это будет выглядеть сломаным."
-#: ui_config.cc:351
+#: ui_config.cc:368
msgid "Config file %1 not saved"
msgstr "Конфигурационный файл %1 не сохранён"
-#: ui_config.cc:592
+#: ui_config.cc:609
msgid "Color %1 not found"
msgstr "Цвет %1 не обнаружен"
-#: ui_config.cc:662
+#: ui_config.cc:679
msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
msgstr ""
"Не удается найти файл стилей пользовательского интерфейса %1 в пути поиска "
@@ -13103,7 +13470,7 @@ msgstr "Индекс видеосервера"
msgid " %1 fps"
msgstr " %1 к/с"
-#: video_timeline.cc:468
+#: video_timeline.cc:472
msgid ""
"Parsing video file info failed. Is the Video Server running? Is the file "
"readable by the Video Server? Does the docroot match? Is it a video file?"
@@ -13111,7 +13478,7 @@ msgstr ""
"Разбор информация видеофайл не удался. Работает ли видеосервер? Доступен ли "
"файл для чтения с видеосервера? Совпадает ли docroot? Это видеофайл?"
-#: video_timeline.cc:506
+#: video_timeline.cc:510
msgid ""
"Failed to set session-framerate: '%1' does not have a corresponding option "
"setting in %2."
@@ -13119,7 +13486,7 @@ msgstr ""
"Не удалось установить чатоту кадров сессии: '%1' не имеет соответствующей "
"опции настройки в %2."
-#: video_timeline.cc:514
+#: video_timeline.cc:518
msgid ""
"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
"vs '%3'"
@@ -13127,7 +13494,7 @@ msgstr ""
"Частота кадров видеофайла не равна частоте кадров таймкода сессии %1: '%2' "
"против '%3'"
-#: video_timeline.cc:587
+#: video_timeline.cc:591
msgid ""
"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
"means that the video server was not started by %1 and uses a different "
@@ -13137,7 +13504,7 @@ msgstr ""
"видеосервер: '%3'. Как правило, это означает, что видеосервер не был запущен "
"от имени Ardour и используется другие различные корневые документы."
-#: video_timeline.cc:724
+#: video_timeline.cc:728
msgid ""
"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
"(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -13153,17 +13520,15 @@ msgstr ""
"\n"
"См. так же: http://manual.ardour.org/video-timeline/setup/"
-#: video_timeline.cc:739
+#: video_timeline.cc:743
msgid "Video-monitor 'xjadeo' cannot be launched."
msgstr "Видеомонитор 'xjadeo' не может быть запущен."
-#: video_timeline.cc:766
+#: video_timeline.cc:769
msgid ""
-"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
+"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.8.0 or "
"later. http://xjadeo.sf.net/"
msgstr ""
-"Видеомонитор 'xjadeo' слишком стар. Пожалуйста, установите xjadeo версию "
-"0.7.7 или более позднюю. http://xjadeo.sf.net/"
#: video_monitor.cc:285
msgid "Video Monitor: File Not Found."
@@ -13210,7 +13575,7 @@ msgstr "Импортировать/перекодировать видеофай
msgid "Output File:"
msgstr "Файл вывода:"
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
msgid "Abort"
msgstr "Прервать"
@@ -13222,7 +13587,7 @@ msgstr "Высота = "
msgid "Manual Override"
msgstr "Ручное управление"
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:70 export_video_dialog.cc:99
msgid "Debug Mode: Print ffmpeg command and output to stdout."
msgstr "Режим отладки: вывод команд ffmpeg в stdout"
@@ -13247,83 +13612,87 @@ msgstr ""
"ИнфоФайл не может быть прочитан. Скорее всего '%1' не является допустимым "
"видеофайлом, "
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
msgid "FPS:"
msgstr "ф/с:"
-#: transcode_video_dialog.cc:136
+#: transcode_video_dialog.cc:139
msgid "Duration:"
msgstr "Длительность:"
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
msgid "Codec:"
msgstr "Кодек:"
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
msgid "Geometry:"
msgstr "Геометрия:"
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
msgid "??"
msgstr "??"
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
msgid "<b>Import Settings</b>"
msgstr "<b>Параметры импорта</b>"
-#: transcode_video_dialog.cc:181
+#: transcode_video_dialog.cc:186
msgid "Reference From Current Location (Previously Transcoded Files Only)"
msgstr "Reference From Current Location (Только ранее перекодированные файлы)"
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:187
msgid "Import/Transcode Video to Session"
msgstr "Импортировать/перекодировать видео в сессию"
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:190 transcode_video_dialog.cc:200
msgid "Do Not Import Video (Audio Import Only)"
msgstr "Не импортировать видео (Только аудиоимпрт)"
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:210
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:226
msgid "Scale Video: Width = "
msgstr "Масштаб видео: Ширина = "
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:233
msgid "Original Width"
msgstr "Исходная ширина"
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:248
msgid "Bitrate (KBit/s):"
msgstr "Скорость потока (Кбит/с):"
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:253
msgid "Extract Audio:"
msgstr "Извлечь звук:"
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:258
msgid "No Audio Track Present"
msgstr "Нет звуковой дорожки"
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:261
msgid "Do Not Extract Audio"
msgstr "Не извлекать аудио"
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:376
msgid "Extracting Audio.."
msgstr "Извлекается звук..."
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:379
msgid "Audio Extraction Failed."
msgstr "Не удалось извлечь звуковую дорожку."
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:405
msgid "Transcoding Video.."
msgstr "Перекодирование видео..."
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:439
msgid "Transcoding Failed."
msgstr "Не удалось выполнить перекодирование."
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:529
msgid "Save Transcoded Video File"
msgstr "Сохранить перекодированный видеофайл"
@@ -13420,55 +13789,55 @@ msgstr "Снимок с таким названием уже есть. Пере
msgid "Cannot create video folder \"%1\" (%2)"
msgstr "Не удалось создать папку для видео: \"%1\" (%2)"
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
msgid "Export Video File "
msgstr "Экспортировать видеофайл"
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
msgid "Video:"
msgstr "Видео:"
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
msgid "Scale Video (W x H):"
msgstr "Масштабирование видео (В×Ш):"
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
msgid "Retain Aspect"
msgstr "Сохранить соотношение сторон"
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
msgid "Set Aspect Ratio:"
msgstr "Указать соотношение сторон:"
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
msgid "Normalize Audio"
msgstr "Нормировать звук"
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
msgid "2 Pass Encoding"
msgstr "Кодирование в два прохода"
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
msgid "Codec Optimizations:"
msgstr "Оптимизация кодека:"
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
msgid "Deinterlace"
msgstr "Деинтерлейсинг"
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
msgid "Use [2] B-frames (MPEG 2 or 4 only)"
msgstr "Использовать [2] B-кадры (только MPEG 2 или 4)"
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
msgid "Override FPS (Default is to retain FPS from the input video file):"
msgstr "Принудительно указать свою частоту кадров:"
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
msgid "Include Session Metadata"
msgstr "Включить метаданные сессии"
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
msgid ""
"No ffprobe or ffmpeg executables could be found on this system. Video Export "
"is not possible until you install those tools. See the Log window for more "
@@ -13478,97 +13847,93 @@ msgstr ""
"будет недоступен до тех пор, пока вы их не установите. См. подробнее в окне "
"журнала."
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
msgid "<b>Output:</b> (file extension defines format)"
msgstr "<b>Вывод:</b> (расширение файла определяет контейнер)"
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
msgid "<b>Input Video:</b>"
msgstr "<b>Видео на входе:</b>"
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
msgid "Audio:"
msgstr "Звук:"
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
msgid "Master Bus"
msgstr "Мастер-шина"
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:154
msgid "from the %1 session's start to the session's end"
msgstr "от начала до конца сессии %1"
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:157
msgid "<b>Settings:</b>"
msgstr "<b>Параметры:</b>"
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:165
msgid "Range:"
msgstr "Диапазон:"
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr "Профиль:"
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:171
msgid "Video Codec:"
msgstr "Видеокодек:"
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:174
msgid "Video KBit/s:"
msgstr "Скорость видеопотока (Кбит/с):"
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:177
msgid "Audio Codec:"
msgstr "Звуковой кодек:"
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:180
msgid "Audio KBit/s:"
msgstr "Скорость звукового потока (Кбит/с):"
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:183
msgid "Audio Samplerate:"
msgstr "Частота сэмплирования звука:"
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:814 export_video_dialog.cc:817
+#: export_video_dialog.cc:218 export_video_dialog.cc:227
+#: export_video_dialog.cc:810 export_video_dialog.cc:813
msgid "(default for format)"
msgstr "(по умолчанию для контейнера)"
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:821 export_video_dialog.cc:830
+#: export_video_dialog.cc:238 export_video_dialog.cc:251
+#: export_video_dialog.cc:817 export_video_dialog.cc:826
msgid "(default)"
msgstr "(по умолчанию)"
-#: export_video_dialog.cc:256 export_video_dialog.cc:824
+#: export_video_dialog.cc:252 export_video_dialog.cc:820
msgid "(retain)"
msgstr "(исходная)"
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:344
msgid "from 00:00:00:00 to the video's end"
msgstr "от 00:00:00:00 до конца видео"
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:346
msgid "from the video's start to the video's end"
msgstr "от начала до конца видео"
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:349
msgid "Selected range"
msgstr "Выбранный диапазон"
-#: export_video_dialog.cc:573
+#: export_video_dialog.cc:569
msgid "Normalizing audio"
msgstr "Выполняется нормировка звука"
-#: export_video_dialog.cc:577
+#: export_video_dialog.cc:573
msgid "Exporting audio"
msgstr "Экспорт звука"
-#: export_video_dialog.cc:632
+#: export_video_dialog.cc:628
msgid "Exporting Audio..."
msgstr "Экспортируется звук..."
-#: export_video_dialog.cc:689
+#: export_video_dialog.cc:685
msgid ""
"Export Video: Cannot query duration of video-file, using duration from "
"timeline instead."
@@ -13576,36 +13941,36 @@ msgstr ""
"Экспорт видео: невозможно запросить длительность видеофайла, вместо неё "
"используется длительность проекта."
-#: export_video_dialog.cc:719
+#: export_video_dialog.cc:715
msgid "Export Video: export-range does not include video."
msgstr "Экспорт видео: экспортный диапазон не содержит видео."
-#: export_video_dialog.cc:732
+#: export_video_dialog.cc:728
msgid "Export Video: No Master Out Ports to Connect for Audio Export"
msgstr ""
"Экспорт видео: нет соединяемых портов выхода мастер-шины для экспорта звука"
-#: export_video_dialog.cc:774
+#: export_video_dialog.cc:770
msgid "Encoding Video..."
msgstr "Кодируется видео..."
-#: export_video_dialog.cc:794
+#: export_video_dialog.cc:790
msgid "Export Video: Video input file cannot be read."
msgstr "Экспорт видео: не удалось прочитать используемый видеофайл"
-#: export_video_dialog.cc:900
+#: export_video_dialog.cc:896
msgid "Encoding Video.. Pass 1/2"
msgstr "Выполняется кодирование видео. Проход 1/2."
-#: export_video_dialog.cc:912
+#: export_video_dialog.cc:908
msgid "Encoding Video.. Pass 2/2"
msgstr "Выполняется кодирование видео. Проход 2/2."
-#: export_video_dialog.cc:1015
+#: export_video_dialog.cc:1011
msgid "Transcoding failed."
msgstr "Не удалось выполнить перекодировку."
-#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
+#: export_video_dialog.cc:1247 export_video_dialog.cc:1267
msgid "Save Exported Video File"
msgstr "Сохранить экспортированный видеофайл"
@@ -13636,6 +14001,97 @@ msgstr ""
"\n"
"Открыть руководство в браузере? "
+#~ msgid "Inactive"
+#~ msgstr "Неактивно"
+
+#~ msgid "Export region contents"
+#~ msgstr "Экспортировать содержимое области"
+
+#~ msgid "Export track output"
+#~ msgstr "Экспортировать выходы дорожки"
+
+#~ msgid "Peak"
+#~ msgstr "Пиковое значение"
+
+#~ msgid "K20"
+#~ msgstr "K20"
+
+#~ msgid "K14"
+#~ msgstr "K14"
+
+#~ msgid "K12"
+#~ msgstr "К12"
+
+#~ msgid ""
+#~ " -k, --keybindings filename Name of key bindings to load (default is ~/."
+#~ "ardour3/ardour.bindings)\n"
+#~ msgstr ""
+#~ " -k, --keybindings имя-файла Имя собственного файла с комбинациями "
+#~ "клавиш (по умолчанию это ~/.ardour3/ardour.bindings)\n"
+
+#~ msgid "Update available plugins"
+#~ msgstr "Обновить список доступных плагинов"
+
+#~ msgid "slowish [12.0dB/sec] (DIN)"
+#~ msgstr "Неторопливое [12 Дб/с] (DIN)"
+
+#~ msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+#~ msgstr "Умеренное [13,3 Дб/с] (EBU Digi PPM, IRT Digi PPM)"
+
+#~ msgid "medium [20dB/sec]"
+#~ msgstr "Среднее [20 Дб/с]"
+
+#~ msgid "fast [32dB/sec]"
+#~ msgstr "Быстрое [32 Дб/с]"
+
+#~ msgid "faster [46dB/sec]"
+#~ msgstr "Ещё быстрее [46 Дб/с]"
+
+#~ msgid "fastest [70dB/sec]"
+#~ msgstr "Самое быстрое [70 Дб/с]"
+
+#~ msgid "Snapshot..."
+#~ msgstr "Создать снимок..."
+
+#~ msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#~ msgstr "Правка внутри областей (нот и кривых усиления)"
+
+#~ msgid "Make Loop range"
+#~ msgstr "Создать область петли"
+
+#~ msgid "Make Punch range"
+#~ msgstr "Создать область врезки"
+
+#~ msgid ""
+#~ "The %1 audio backend was configured and started externally.\n"
+#~ "This limits your control over it."
+#~ msgstr ""
+#~ "Звуковая подсистема %1 была настроена и запущена извне.\n"
+#~ "Вы не сможете полностью контролировать её."
+
+#~ msgid "Insert time on all the track's playlists"
+#~ msgstr "Вставить во все списки воспроизведения дорожки"
+
+#~ msgid "Keyboard layout:"
+#~ msgstr "Раскладка клавиатуры:"
+
+#~ msgid "Font scaling:"
+#~ msgstr "Масштаб шрифта:"
+
+#~ msgid ""
+#~ "Major font-scale changes require an application restart to re-layout."
+#~ msgstr "Существенное изменение масштаба требует перезапуска программы"
+
+#~ msgid "only in region gain mode"
+#~ msgstr "Только в режиме правки огибающей"
+
+#~ msgid ""
+#~ "Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
+#~ "later. http://xjadeo.sf.net/"
+#~ msgstr ""
+#~ "Видеомонитор 'xjadeo' слишком стар. Пожалуйста, установите xjadeo версию "
+#~ "0.7.7 или более позднюю. http://xjadeo.sf.net/"
+
#~ msgid "After Editor Selection"
#~ msgstr "После выбранного в редакторе"
diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc
index 71435fe..5d21de2 100644
--- a/gtk2_ardour/processor_box.cc
+++ b/gtk2_ardour/processor_box.cc
@@ -568,18 +568,14 @@ ProcessorEntry::Control::set_tooltip ()
if (!c) {
return;
}
-
- stringstream s;
- s << _name << ": ";
+ char tmp[256];
if (c->toggled ()) {
- s << (c->get_value() > 0.5 ? _("on") : _("off"));
+ snprintf (tmp, sizeof(tmp), "%s: %s", _name.c_str(), c->get_value() > 0.5 ? _("on") : _("off"));
} else {
- s << setprecision(2) << fixed;
- s << c->internal_to_user (c->get_value ());
+ snprintf (tmp, sizeof(tmp), "%s: %.2f", _name.c_str(), c->internal_to_user (c->get_value ()));
}
- string sm = Glib::Markup::escape_text (s.str());
-
+ string sm = Glib::Markup::escape_text (tmp);
_slider_persistant_tooltip.set_tip (sm);
ARDOUR_UI::instance()->set_tip (_button, sm);
}
@@ -707,14 +703,13 @@ PluginInsertProcessorEntry::PluginInsertProcessorEntry (ProcessorBox* b, boost::
void
PluginInsertProcessorEntry::plugin_insert_splitting_changed ()
{
- _output_icon.set_ports(_plugin_insert->output_streams());
- _routing_icon.set_splitting(_plugin_insert->splitting ());
+ ChanCount in, out; // actual configured i/o
+ _plugin_insert->configured_io (in, out);
- ChanCount sources = _plugin_insert->input_streams();
+ /* get number of input ports */
ChanCount sinks = _plugin_insert->natural_input_streams();
-
- /* replicated instances */
if (!_plugin_insert->splitting () && _plugin_insert->get_count() > 1) {
+ /* replicated instances */
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
sinks.set(*t, sinks.get(*t) * _plugin_insert->get_count());
}
@@ -722,17 +717,50 @@ PluginInsertProcessorEntry::plugin_insert_splitting_changed ()
/* MIDI bypass */
if (_plugin_insert->natural_output_streams().n_midi() == 0 &&
_plugin_insert->output_streams().n_midi() == 1) {
+ in.set(DataType::MIDI, 1);
+ out.set(DataType::MIDI, 1);
sinks.set(DataType::MIDI, 1);
- sources.set(DataType::MIDI, 1);
}
+ /* the Input streams available (*valid* outputs from prev. plugin)
+ * this will be <= sinks. Some input-ports of this processor
+ * may be unconnected.
+ */
+ _routing_icon.set_sources(in);
+
+ /* the actual input ports of this processor */
_input_icon.set_ports(sinks);
_routing_icon.set_sinks(sinks);
- _routing_icon.set_sources(sources);
- if (_plugin_insert->splitting () ||
- _plugin_insert->input_streams().n_audio() < _plugin_insert->natural_input_streams().n_audio()
- )
+ /* set/override plugin-output ports to actual outputs-streams.
+ *
+ * This plugin may have unconnected output-ports (currently only in Mixbus,
+ * e.g channelstrip-EQ at the top of a MIDI-channel before the synth).
+ *
+ * The *next* processor below this one will only see the
+ * actual available streams (it cannot know the real outputs
+ * of this plugin).
+ *
+ * There is currently no API to query the ports of the previous (or next)
+ * processor.
+ *
+ * (normally - iff configuration succeeds - this is set during
+ * ProcessorEntry::processor_configuration_changed() and should
+ * equal _plugin_insert->output_streams())
+ */
+ _output_icon.set_ports(out);
+#ifndef NDEBUG
+ if (out != _plugin_insert->output_streams()) {
+ std::cerr << "Processor Wiring: " << processor()->name()
+ << " out-ports: " << _plugin_insert->output_streams() // NB. does not include midi-bypass
+ << " out-connections: " << out
+ << endmsg;
+ }
+#endif
+
+ _routing_icon.set_splitting(_plugin_insert->splitting ());
+
+ if (_plugin_insert->splitting () || in != sinks)
{
_routing_icon.set_size_request (-1, std::max (7.f, rintf(7.f * ARDOUR_UI::ui_scale)));
_routing_icon.set_visible(true);
@@ -847,10 +875,12 @@ ProcessorEntry::RoutingIcon::on_expose_event (GdkEventExpose* ev)
const uint32_t sources = _sources.n_total();
const uint32_t sinks = _sinks.n_total();
- /* MIDI */
const uint32_t midi_sources = _sources.n_midi();
const uint32_t midi_sinks = _sinks.n_midi();
+ const uint32_t audio_sources = _sources.n_audio();
+ const uint32_t audio_sinks = _sinks.n_audio();
+ /* MIDI */
cairo_set_source_rgb (cr,
UINT_RGBA_R_FLT(midi_port_color),
UINT_RGBA_G_FLT(midi_port_color),
@@ -875,11 +905,24 @@ ProcessorEntry::RoutingIcon::on_expose_event (GdkEventExpose* ev)
cairo_move_to (cr, si_x, height);
cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
cairo_stroke (cr);
+ } else if (midi_sources == 0 && midi_sinks == 1) {
+ const double dx = 1 + rint(max(2., 2. * ARDOUR_UI::ui_scale));
+ // draw "T"
+ // TODO connect back to track-input of last midi-out if any, otherwise draw "X"
+ const float si_x = rintf(width * .2f) + .5f;
+ cairo_move_to (cr, si_x, height);
+ cairo_line_to (cr, si_x, height * .66);
+ cairo_move_to (cr, si_x - dx, height * .66);
+ cairo_line_to (cr, si_x + dx, height * .66);
+ cairo_stroke (cr);
+#ifndef NDEBUG
+ } else if (midi_sources != 0 && midi_sinks != 0) {
+ PBD::warning << string_compose("Programming error: midi routing display: A %1 -> %2 | M %3 -> %4 | T %5 -> %6",
+ audio_sources, audio_sinks, midi_sources, midi_sinks, sources, sinks) << endmsg;
+#endif
}
/* AUDIO */
- const uint32_t audio_sources = _sources.n_audio();
- const uint32_t audio_sinks = _sinks.n_audio();
cairo_set_source_rgb (cr,
UINT_RGBA_R_FLT(audio_port_color),
UINT_RGBA_G_FLT(audio_port_color),
@@ -896,7 +939,7 @@ ProcessorEntry::RoutingIcon::on_expose_event (GdkEventExpose* ev)
cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
cairo_stroke (cr);
}
- } else if (audio_sources > 1) {
+ } else if (audio_sources > 1 && sinks > 1) {
for (uint32_t i = 0 ; i < audio_sources; ++i) {
const float si_x = rintf(width * (.2f + .6f * (i + midi_sinks) / (sinks - 1.f))) + .5f;
const float si_x0 = rintf(width * (.2f + .6f * (i + midi_sources) / (sources - 1.f))) + .5f;
@@ -904,11 +947,26 @@ ProcessorEntry::RoutingIcon::on_expose_event (GdkEventExpose* ev)
cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
cairo_stroke (cr);
}
- } else if (audio_sources == 1 && audio_sinks == 1) {
- const float si_x = rintf(width * .5f) + .5f;
+ } else if (audio_sources == 1 && audio_sinks > 0) {
+ float si_x, si_x0;
+ if (sinks == 1) {
+ si_x = rintf(width * .5f) + .5f;
+ } else {
+ si_x = rintf(width * (.2f + .6f * midi_sinks / (sinks - 1.f))) + .5f;
+ }
+ if (sources == 1) {
+ si_x0 = rintf(width * .5f) + .5f;
+ } else {
+ si_x0 = rintf(width * (.2f + .6f * midi_sources / (sources - 1.f))) + .5f;
+ }
cairo_move_to (cr, si_x, height);
- cairo_line_to (cr, si_x, 0);
+ cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
cairo_stroke (cr);
+#ifndef NDEBUG
+ } else if (audio_sources != 0 && audio_sinks != 0) {
+ PBD::warning << string_compose("Programming error: audio routing display: A %1 -> %2 | M %3 -> %4 | T %5 -> %6",
+ audio_sources, audio_sinks, midi_sources, midi_sinks, sources, sinks) << endmsg;
+#endif
}
cairo_destroy(cr);
return true;
@@ -2155,9 +2213,10 @@ ProcessorBox::paste_processor_state (const XMLNodeList& nlist, boost::shared_ptr
/* XXX its a bit limiting to assume that everything else
is a plugin.
*/
-
p.reset (new PluginInsert (*_session));
- p->set_state (**niter, Stateful::current_state_version);
+ PBD::ID id = p->id();
+ p->set_state (**niter, Stateful::current_state_version);
+ boost::dynamic_pointer_cast<PluginInsert>(p)->update_id (id);
}
copies.push_back (p);
diff --git a/gtk2_ardour/processor_box.h b/gtk2_ardour/processor_box.h
index 28c9af7..0776feb 100644
--- a/gtk2_ardour/processor_box.h
+++ b/gtk2_ardour/processor_box.h
@@ -231,8 +231,9 @@ private:
void set_splitting(const bool splitting) { _splitting = splitting; }
private:
bool on_expose_event (GdkEventExpose *);
- ARDOUR::ChanCount _sources; // signals available to feed into the processor(s)
- ARDOUR::ChanCount _sinks; // combined number of outputs of the processor
+ /* the wire icon sits on top of every processor if needed */
+ ARDOUR::ChanCount _sources; // signals available (valid outputs from prev. processor)
+ ARDOUR::ChanCount _sinks; // actual inputs of this processor
bool _splitting;
};
diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h
index 951c3e9..63778df 100644
--- a/gtk2_ardour/public_editor.h
+++ b/gtk2_ardour/public_editor.h
@@ -40,6 +40,8 @@
#include "pbd/statefuldestructible.h"
#include "canvas/fwd.h"
+
+#include "gtkmm2ext/actions.h"
#include "gtkmm2ext/visibility_tracker.h"
#include "editing.h"
@@ -69,7 +71,7 @@ class AutomationTimeAxisView;
class ControlPoint;
class DragManager;
class Editor;
-class Marker;
+class ArdourMarker;
class MeterMarker;
class MouseCursors;
class PlaylistSelector;
@@ -344,7 +346,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
virtual bool canvas_region_view_name_event (GdkEvent* event, ArdourCanvas::Item*, RegionView*) = 0;
virtual bool canvas_feature_line_event (GdkEvent* event, ArdourCanvas::Item*, RegionView*) = 0;
virtual bool canvas_stream_view_event (GdkEvent* event, ArdourCanvas::Item*, RouteTimeAxisView*) = 0;
- virtual bool canvas_marker_event (GdkEvent* event, ArdourCanvas::Item*, Marker*) = 0;
+ virtual bool canvas_marker_event (GdkEvent* event, ArdourCanvas::Item*, ArdourMarker*) = 0;
virtual bool canvas_videotl_bar_event (GdkEvent* event, ArdourCanvas::Item*) = 0;
virtual bool canvas_tempo_marker_event (GdkEvent* event, ArdourCanvas::Item*, TempoMarker*) = 0;
virtual bool canvas_meter_marker_event (GdkEvent* event, ArdourCanvas::Item*, MeterMarker*) = 0;
@@ -410,8 +412,8 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
virtual void get_pointer_position (double &, double &) const = 0;
- virtual ARDOUR::Location* find_location_from_marker (Marker *, bool &) const = 0;
- virtual Marker* find_marker_from_location_id (PBD::ID const &, bool) const = 0;
+ virtual ARDOUR::Location* find_location_from_marker (ArdourMarker *, bool &) const = 0;
+ virtual ArdourMarker* find_marker_from_location_id (PBD::ID const &, bool) const = 0;
virtual void snap_to_with_modifier (framepos_t & first,
GdkEvent const * ev,
@@ -459,4 +461,19 @@ class DisplaySuspender {
}
};
+class MainMenuDisabler {
+public:
+ MainMenuDisabler () {
+ /* The global menu bar continues to be accessible to applications
+ with modal dialogs on mac, which means that we need to desensitize
+ all items in the menu bar.
+ */
+ ActionManager::disable_active_actions ();
+ }
+
+ ~MainMenuDisabler () {
+ ActionManager::enable_active_actions ();
+ }
+};
+
#endif // __gtk_ardour_public_editor_h__
diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc
index e12789e..f0cac85 100644
--- a/gtk2_ardour/rc_option_editor.cc
+++ b/gtk2_ardour/rc_option_editor.cc
@@ -50,6 +50,7 @@
#include "ardour_window.h"
#include "ardour_dialog.h"
#include "gui_thread.h"
+#include "meter_patterns.h"
#include "midi_tracer.h"
#include "rc_option_editor.h"
#include "utils.h"
@@ -631,7 +632,7 @@ public:
}
}
- l = manage (left_aligned_label (_("Resize overlaped regions using:")));
+ l = manage (left_aligned_label (_("Resize overlapped regions using:")));
l->set_name ("OptionsLabel");
t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
@@ -1038,13 +1039,34 @@ public:
, _playback_slider (_playback_adjustment)
, _capture_slider (_capture_adjustment)
{
+ vector<string> presets;
+
+ /* these must match the order of the enums for BufferingPreset */
+
+ presets.push_back (_("Small sessions (4-16 tracks)"));
+ presets.push_back (_("Medium sessions (16-64 tracks)"));
+ presets.push_back (_("Large sessions (64+ tracks)"));
+ presets.push_back (_("Custom (set by sliders below)"));
+
+ set_popdown_strings (_buffering_presets_combo, presets);
+
+ Label* l = manage (new Label (_("Preset:")));
+ l->set_name ("OptionsLabel");
+ HBox* h = manage (new HBox);
+ h->set_spacing (12);
+ h->pack_start (*l, false, false);
+ h->pack_start (_buffering_presets_combo, true, true);
+ _box->pack_start (*h, false, false);
+
+ _buffering_presets_combo.signal_changed().connect (sigc::mem_fun (*this, &BufferingOptions::preset_changed));
+
_playback_adjustment.set_value (_rc_config->get_audio_playback_buffer_seconds());
- Label* l = manage (new Label (_("Playback (seconds of buffering):")));
+ l = manage (new Label (_("Playback (seconds of buffering):")));
l->set_name ("OptionsLabel");
_playback_slider.set_update_policy (UPDATE_DISCONTINUOUS);
- HBox* h = manage (new HBox);
+ h = manage (new HBox);
h->set_spacing (4);
h->pack_start (*l, false, false);
h->pack_start (_playback_slider, true, true);
@@ -1070,6 +1092,31 @@ public:
void parameter_changed (string const & p)
{
+ if (p == "buffering-preset") {
+ switch (_rc_config->get_buffering_preset()) {
+ case Small:
+ _playback_slider.set_sensitive (false);
+ _capture_slider.set_sensitive (false);
+ _buffering_presets_combo.set_active (0);
+ break;
+ case Medium:
+ _playback_slider.set_sensitive (false);
+ _capture_slider.set_sensitive (false);
+ _buffering_presets_combo.set_active (1);
+ break;
+ case Large:
+ _playback_slider.set_sensitive (false);
+ _capture_slider.set_sensitive (false);
+ _buffering_presets_combo.set_active (2);
+ break;
+ case Custom:
+ _playback_slider.set_sensitive (true);
+ _capture_slider.set_sensitive (true);
+ _buffering_presets_combo.set_active (3);
+ break;
+ }
+ }
+
if (p == "playback-buffer-seconds") {
_playback_adjustment.set_value (_rc_config->get_audio_playback_buffer_seconds());
} else if (p == "capture-buffer-seconds") {
@@ -1079,12 +1126,38 @@ public:
void set_state_from_config ()
{
+ parameter_changed ("buffering-preset");
parameter_changed ("playback-buffer-seconds");
parameter_changed ("capture-buffer-seconds");
}
private:
+ void preset_changed ()
+ {
+ int index = _buffering_presets_combo.get_active_row_number ();
+ if (index < 0) {
+ return;
+ }
+ switch (index) {
+ case 0:
+ _rc_config->set_buffering_preset (Small);
+ break;
+ case 1:
+ _rc_config->set_buffering_preset (Medium);
+ break;
+ case 2:
+ _rc_config->set_buffering_preset (Large);
+ break;
+ case 3:
+ _rc_config->set_buffering_preset (Custom);
+ break;
+ default:
+ error << string_compose (_("programming error: unknown buffering preset string, index = %1"), index) << endmsg;
+ break;
+ }
+ }
+
void playback_changed ()
{
_rc_config->set_audio_playback_buffer_seconds ((long) _playback_adjustment.get_value());
@@ -1100,6 +1173,7 @@ private:
Adjustment _capture_adjustment;
HScale _playback_slider;
HScale _capture_slider;
+ ComboBoxText _buffering_presets_combo;
};
class ControlSurfacesOptions : public OptionEditorBox
@@ -1399,6 +1473,7 @@ public:
, _display_plugin_scan_progress (_("Always Display Plugin Scan Progress"))
, _discover_vst_on_start (_("Scan for [new] VST Plugins on Application Start"))
, _discover_au_on_start (_("Scan for AudioUnit Plugins on Application Start"))
+ , _verbose_plugin_scan (_("Verbose Plugin Scan"))
, _timeout_adjustment (0, 0, 3000, 50, 50)
, _timeout_slider (_timeout_adjustment)
{
@@ -1471,6 +1546,12 @@ public:
b = manage (new Button (_("Edit")));
b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::edit_vst_path_clicked));
t->attach (*b, 1, 2, n, n+1, FILL); ++n;
+
+ // currently verbose logging is only implemented for Windows VST.
+ t->attach (_verbose_plugin_scan, 0, 2, n, n+1); ++n;
+ _verbose_plugin_scan.signal_toggled().connect (sigc::mem_fun (*this, &PluginOptions::verbose_plugin_scan_toggled));
+ Gtkmm2ext::UI::instance()->set_tip (_verbose_plugin_scan,
+ _("<b>When enabled</b> additional information for every plugin is added to the Log Window."));
#endif
#endif // any VST
@@ -1518,6 +1599,10 @@ public:
bool const x = _rc_config->get_discover_audio_units();
_discover_au_on_start.set_active (x);
}
+ else if (p == "verbose-plugin-scan") {
+ bool const x = _rc_config->get_verbose_plugin_scan();
+ _verbose_plugin_scan.set_active (x);
+ }
}
void set_state_from_config () {
@@ -1525,6 +1610,7 @@ public:
parameter_changed ("discover-vst-on-start");
parameter_changed ("vst-scan-timeout");
parameter_changed ("discover-audio-units");
+ parameter_changed ("verbose-plugin-scan");
}
private:
@@ -1533,6 +1619,7 @@ private:
CheckButton _display_plugin_scan_progress;
CheckButton _discover_vst_on_start;
CheckButton _discover_au_on_start;
+ CheckButton _verbose_plugin_scan;
Adjustment _timeout_adjustment;
HScale _timeout_slider;
@@ -1551,6 +1638,11 @@ private:
_rc_config->set_discover_audio_units(x);
}
+ void verbose_plugin_scan_toggled () {
+ bool const x = _verbose_plugin_scan.get_active();
+ _rc_config->set_verbose_plugin_scan(x);
+ }
+
void timeout_changed () {
int x = floor(_timeout_adjustment.get_value());
_rc_config->set_vst_scan_timeout(x);
@@ -1784,6 +1876,8 @@ RCOptionEditor::RCOptionEditor ()
/* TRANSPORT */
+ add_option (_("Transport"), new OptionEditorHeading (S_("Transport Options")));
+
BoolOption* tsf;
tsf = new BoolOption (
@@ -2269,23 +2363,23 @@ RCOptionEditor::RCOptionEditor ()
int dmsize = 1;
dm->add (DenormalNone, _("no processor handling"));
- FPU fpu;
+ FPU* fpu = FPU::instance();
- if (fpu.has_flush_to_zero()) {
+ if (fpu->has_flush_to_zero()) {
++dmsize;
dm->add (DenormalFTZ, _("use FlushToZero"));
} else if (_rc_config->get_denormal_model() == DenormalFTZ) {
_rc_config->set_denormal_model(DenormalNone);
}
- if (fpu.has_denormals_are_zero()) {
+ if (fpu->has_denormals_are_zero()) {
++dmsize;
dm->add (DenormalDAZ, _("use DenormalsAreZero"));
} else if (_rc_config->get_denormal_model() == DenormalDAZ) {
_rc_config->set_denormal_model(DenormalNone);
}
- if (fpu.has_flush_to_zero() && fpu.has_denormals_are_zero()) {
+ if (fpu->has_flush_to_zero() && fpu->has_denormals_are_zero()) {
++dmsize;
dm->add (DenormalFTZDAZ, _("use FlushToZero and DenormalsAreZero"));
} else if (_rc_config->get_denormal_model() == DenormalFTZDAZ) {
@@ -2782,12 +2876,10 @@ RCOptionEditor::RCOptionEditor ()
mfo->add (METER_FALLOFF_OFF, _("off"));
mfo->add (METER_FALLOFF_SLOWEST, _("slowest [6.6dB/sec]"));
mfo->add (METER_FALLOFF_SLOW, _("slow [8.6dB/sec] (BBC PPM, EBU PPM)"));
- mfo->add (METER_FALLOFF_SLOWISH, _("slowish [12.0dB/sec] (DIN)"));
- mfo->add (METER_FALLOFF_MODERATE, _("moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"));
- mfo->add (METER_FALLOFF_MEDIUM, _("medium [20dB/sec]"));
- mfo->add (METER_FALLOFF_FAST, _("fast [32dB/sec]"));
- mfo->add (METER_FALLOFF_FASTER, _("faster [46dB/sec]"));
- mfo->add (METER_FALLOFF_FASTEST, _("fastest [70dB/sec]"));
+ mfo->add (METER_FALLOFF_SLOWISH, _("moderate [12.0dB/sec] (DIN)"));
+ mfo->add (METER_FALLOFF_MODERATE, _("medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"));
+ mfo->add (METER_FALLOFF_MEDIUM, _("fast [20dB/sec]"));
+ mfo->add (METER_FALLOFF_FAST, _("very fast [32dB/sec]"));
add_option (S_("Preferences|Metering"), mfo);
@@ -2845,6 +2937,54 @@ RCOptionEditor::RCOptionEditor ()
sigc::mem_fun (*_ui_config, &UIConfiguration::set_meter_peak)
);
+
+ ComboOption<MeterType>* mtm = new ComboOption<MeterType> (
+ "meter-type-master",
+ _("Default Meter Type for Master Bus"),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_type_master),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_type_master)
+ );
+ mtm->add (MeterPeak, ArdourMeter::meter_type_string(MeterPeak));
+ mtm->add (MeterK20, ArdourMeter::meter_type_string(MeterK20));
+ mtm->add (MeterK14, ArdourMeter::meter_type_string(MeterK14));
+ mtm->add (MeterK12, ArdourMeter::meter_type_string(MeterK12));
+ mtm->add (MeterIEC1DIN, ArdourMeter::meter_type_string(MeterIEC1DIN));
+ mtm->add (MeterIEC1NOR, ArdourMeter::meter_type_string(MeterIEC1NOR));
+ mtm->add (MeterIEC2BBC, ArdourMeter::meter_type_string(MeterIEC2BBC));
+ mtm->add (MeterIEC2EBU, ArdourMeter::meter_type_string(MeterIEC2EBU));
+
+ add_option (S_("Preferences|Metering"), mtm);
+
+
+ ComboOption<MeterType>* mtb = new ComboOption<MeterType> (
+ "meter-type-bus",
+ _("Default Meter Type for Busses"),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_type_bus),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_type_bus)
+ );
+ mtb->add (MeterPeak, ArdourMeter::meter_type_string(MeterPeak));
+ mtb->add (MeterK20, ArdourMeter::meter_type_string(MeterK20));
+ mtb->add (MeterK14, ArdourMeter::meter_type_string(MeterK14));
+ mtb->add (MeterK12, ArdourMeter::meter_type_string(MeterK12));
+ mtb->add (MeterIEC1DIN, ArdourMeter::meter_type_string(MeterIEC1DIN));
+ mtb->add (MeterIEC1NOR, ArdourMeter::meter_type_string(MeterIEC1NOR));
+ mtb->add (MeterIEC2BBC, ArdourMeter::meter_type_string(MeterIEC2BBC));
+ mtb->add (MeterIEC2EBU, ArdourMeter::meter_type_string(MeterIEC2EBU));
+
+ add_option (S_("Preferences|Metering"), mtb);
+
+ ComboOption<MeterType>* mtt = new ComboOption<MeterType> (
+ "meter-type-track",
+ _("Default Meter Type for Tracks"),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_type_track),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_type_track)
+ );
+ mtt->add (MeterPeak, ArdourMeter::meter_type_string(MeterPeak));
+ mtt->add (MeterPeak0dB, ArdourMeter::meter_type_string(MeterPeak0dB));
+
+ add_option (S_("Preferences|Metering"), mtt);
+
+
Gtkmm2ext::UI::instance()->set_tip
(mpks->tip_widget(),
_("Specify the audio signal level in dbFS at and above which the meter-peak indicator will flash red."));
diff --git a/gtk2_ardour/region_editor.cc b/gtk2_ardour/region_editor.cc
index 16888fb..e41e012 100644
--- a/gtk2_ardour/region_editor.cc
+++ b/gtk2_ardour/region_editor.cc
@@ -270,33 +270,41 @@ RegionEditor::connect_editor_events ()
void
RegionEditor::position_clock_changed ()
{
- PublicEditor::instance().begin_reversible_command (_("change region start position"));
-
+ bool in_command = false;
boost::shared_ptr<Playlist> pl = _region->playlist();
if (pl) {
+ PublicEditor::instance().begin_reversible_command (_("change region start position"));
+ in_command = true;
+
_region->clear_changes ();
_region->set_position (position_clock.current_time());
_session->add_command(new StatefulDiffCommand (_region));
}
- PublicEditor::instance().commit_reversible_command ();
+ if (in_command) {
+ PublicEditor::instance().commit_reversible_command ();
+ }
}
void
RegionEditor::end_clock_changed ()
{
- PublicEditor::instance().begin_reversible_command (_("change region end position"));
-
+ bool in_command = false;
boost::shared_ptr<Playlist> pl = _region->playlist();
if (pl) {
+ PublicEditor::instance().begin_reversible_command (_("change region end position"));
+ in_command = true;
+
_region->clear_changes ();
_region->trim_end (end_clock.current_time());
_session->add_command(new StatefulDiffCommand (_region));
}
- PublicEditor::instance().commit_reversible_command ();
+ if (in_command) {
+ PublicEditor::instance().commit_reversible_command ();
+ }
end_clock.set (_region->position() + _region->length() - 1, true);
}
@@ -305,18 +313,21 @@ void
RegionEditor::length_clock_changed ()
{
framecnt_t frames = length_clock.current_time();
-
- PublicEditor::instance().begin_reversible_command (_("change region length"));
-
+ bool in_command = false;
boost::shared_ptr<Playlist> pl = _region->playlist();
if (pl) {
- _region->clear_changes ();
+ PublicEditor::instance().begin_reversible_command (_("change region length"));
+ in_command = true;
+
+ _region->clear_changes ();
_region->trim_end (_region->position() + frames - 1);
_session->add_command(new StatefulDiffCommand (_region));
}
- PublicEditor::instance().commit_reversible_command ();
+ if (in_command) {
+ PublicEditor::instance().commit_reversible_command ();
+ }
length_clock.set (_region->length());
}
diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc
index 7f112b9..94ed2a8 100644
--- a/gtk2_ardour/route_time_axis.cc
+++ b/gtk2_ardour/route_time_axis.cc
@@ -59,6 +59,7 @@
#include "ardour_ui.h"
#include "ardour_button.h"
+#include "audio_streamview.h"
#include "debug.h"
#include "global_signals.h"
#include "route_time_axis.h"
@@ -1342,6 +1343,10 @@ RouteTimeAxisView::set_selected_points (PointSelection& points)
for (Children::iterator i = children.begin(); i != children.end(); ++i) {
(*i)->set_selected_points (points);
}
+ AudioStreamView* asv = dynamic_cast<AudioStreamView*>(_view);
+ if (asv) {
+ asv->set_selected_points (points);
+ }
}
void
diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc
index 854f6e0..8f99874 100644
--- a/gtk2_ardour/route_ui.cc
+++ b/gtk2_ardour/route_ui.cc
@@ -1425,9 +1425,14 @@ RouteUI::solo_isolate_button_release (GdkEventButton* ev)
/* disable isolate for all routes */
DisplaySuspender ds;
_session->set_solo_isolated (_session->get_routes(), false, Session::rt_cleanup, true);
+ } else {
+ /* enable isolate for all routes */
+ DisplaySuspender ds;
+ _session->set_solo_isolated (_session->get_routes(), true, Session::rt_cleanup, true);
}
} else {
+
if (model == view) {
/* flip just this route */
diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc
index 0118c1c..784f646 100644
--- a/gtk2_ardour/selection.cc
+++ b/gtk2_ardour/selection.cc
@@ -61,8 +61,8 @@ Selection::Selection (const PublicEditor* e)
void (Selection::*track_remove)(TimeAxisView*) = &Selection::remove;
TimeAxisView::CatchDeletion.connect (*this, MISSING_INVALIDATOR, boost::bind (track_remove, this, _1), gui_context());
- void (Selection::*marker_remove)(Marker*) = &Selection::remove;
- Marker::CatchDeletion.connect (*this, MISSING_INVALIDATOR, boost::bind (marker_remove, this, _1), gui_context());
+ void (Selection::*marker_remove)(ArdourMarker*) = &Selection::remove;
+ ArdourMarker::CatchDeletion.connect (*this, MISSING_INVALIDATOR, boost::bind (marker_remove, this, _1), gui_context());
void (Selection::*point_remove)(ControlPoint*) = &Selection::remove;
ControlPoint::CatchDeletion.connect (*this, MISSING_INVALIDATOR, boost::bind (point_remove, this, _1), gui_context());
@@ -911,7 +911,7 @@ Selection::set (boost::shared_ptr<Evoral::ControlList> ac)
}
bool
-Selection::selected (Marker* m)
+Selection::selected (ArdourMarker* m)
{
return find (markers.begin(), markers.end(), m) != markers.end();
}
@@ -1126,7 +1126,7 @@ Selection::set (ControlPoint* cp)
}
void
-Selection::set (Marker* m)
+Selection::set (ArdourMarker* m)
{
clear_time (); //enforce region/object exclusivity
clear_tracks(); //enforce object/track exclusivity
@@ -1136,7 +1136,7 @@ Selection::set (Marker* m)
}
void
-Selection::toggle (Marker* m)
+Selection::toggle (ArdourMarker* m)
{
MarkerSelection::iterator i;
@@ -1148,7 +1148,7 @@ Selection::toggle (Marker* m)
}
void
-Selection::remove (Marker* m)
+Selection::remove (ArdourMarker* m)
{
MarkerSelection::iterator i;
@@ -1159,7 +1159,7 @@ Selection::remove (Marker* m)
}
void
-Selection::add (Marker* m)
+Selection::add (ArdourMarker* m)
{
clear_time (); //enforce region/object exclusivity
clear_tracks(); //enforce object/track exclusivity
@@ -1171,7 +1171,7 @@ Selection::add (Marker* m)
}
void
-Selection::add (const list<Marker*>& m)
+Selection::add (const list<ArdourMarker*>& m)
{
clear_time (); //enforce region/object exclusivity
clear_tracks(); //enforce object/track exclusivity
@@ -1486,7 +1486,7 @@ Selection::set_state (XMLNode const & node, int)
assert (prop_start);
PBD::ID id (prop_id->value ());
- Marker* m = editor->find_marker_from_location_id (id, string_is_affirmative (prop_start->value ()));
+ ArdourMarker* m = editor->find_marker_from_location_id (id, string_is_affirmative (prop_start->value ()));
if (m) {
add (m);
}
diff --git a/gtk2_ardour/selection.h b/gtk2_ardour/selection.h
index 7585c0a..c28b42a 100644
--- a/gtk2_ardour/selection.h
+++ b/gtk2_ardour/selection.h
@@ -113,7 +113,7 @@ class Selection : public sigc::trackable, public PBD::ScopedConnectionList
bool selected (TimeAxisView*);
bool selected (RegionView*);
- bool selected (Marker*);
+ bool selected (ArdourMarker*);
bool selected (ControlPoint*);
void set (std::list<Selectable*> const &);
@@ -132,7 +132,7 @@ class Selection : public sigc::trackable, public PBD::ScopedConnectionList
void set (boost::shared_ptr<ARDOUR::Playlist>);
void set (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&);
void set (ControlPoint *);
- void set (Marker*);
+ void set (ArdourMarker*);
void set (const RegionSelection&);
void toggle (TimeAxisView*);
@@ -148,7 +148,7 @@ class Selection : public sigc::trackable, public PBD::ScopedConnectionList
void toggle (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&);
void toggle (ControlPoint *);
void toggle (std::vector<ControlPoint*> const &);
- void toggle (Marker*);
+ void toggle (ArdourMarker*);
void add (TimeAxisView*);
void add (const TrackViewList&);
@@ -163,8 +163,8 @@ class Selection : public sigc::trackable, public PBD::ScopedConnectionList
void add (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&);
void add (ControlPoint *);
void add (std::vector<ControlPoint*> const &);
- void add (Marker*);
- void add (const std::list<Marker*>&);
+ void add (ArdourMarker*);
+ void add (const std::list<ArdourMarker*>&);
void add (const RegionSelection&);
void add (const PointSelection&);
void remove (TimeAxisView*);
@@ -179,7 +179,7 @@ class Selection : public sigc::trackable, public PBD::ScopedConnectionList
void remove (boost::shared_ptr<ARDOUR::Playlist>);
void remove (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&);
void remove (const std::list<Selectable*>&);
- void remove (Marker*);
+ void remove (ArdourMarker*);
void remove (ControlPoint *);
void remove_regions (TimeAxisView *);
diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc
index 6996273..1ab1faa 100644
--- a/gtk2_ardour/sfdb_ui.cc
+++ b/gtk2_ardour/sfdb_ui.cc
@@ -29,7 +29,6 @@
#include <unistd.h>
#include <limits.h>
-#include <sys/stat.h>
#include <gtkmm/box.h>
#include <gtkmm/stock.h>
@@ -1255,8 +1254,8 @@ SoundFileBrowser::get_paths ()
vector<string>::iterator i;
for (i = filenames.begin(); i != filenames.end(); ++i) {
- struct stat buf;
- if ((!stat((*i).c_str(), &buf)) && S_ISREG(buf.st_mode)) {
+ GStatBuf buf;
+ if ((!g_stat((*i).c_str(), &buf)) && S_ISREG(buf.st_mode)) {
results.push_back (*i);
}
}
@@ -1590,7 +1589,7 @@ SoundFileOmega::check_link_status (const Session* s, const vector<string>& paths
std::string tmpdir(Glib::build_filename (s->session_directory().sound_path(), "linktest"));
bool ret = false;
- if (mkdir (tmpdir.c_str(), 0744)) {
+ if (g_mkdir (tmpdir.c_str(), 0744)) {
if (errno != EEXIST) {
return false;
}
@@ -1614,7 +1613,7 @@ SoundFileOmega::check_link_status (const Session* s, const vector<string>& paths
ret = true;
out:
- rmdir (tmpdir.c_str());
+ g_rmdir (tmpdir.c_str());
return ret;
#endif
}
diff --git a/gtk2_ardour/shuttle_control.cc b/gtk2_ardour/shuttle_control.cc
index 440b62a..aeaf7d6 100644
--- a/gtk2_ardour/shuttle_control.cc
+++ b/gtk2_ardour/shuttle_control.cc
@@ -73,6 +73,15 @@ ShuttleControl::ShuttleControl ()
set_size_request (85, 20);
set_name (X_("ShuttleControl"));
+ shuttle_max_speed = Config->get_shuttle_max_speed();
+
+ if (shuttle_max_speed >= 8.f) { shuttle_max_speed = 8.0f; }
+ else if (shuttle_max_speed >= 6.f) { shuttle_max_speed = 6.0f; }
+ else if (shuttle_max_speed >= 4.f) { shuttle_max_speed = 4.0f; }
+ else if (shuttle_max_speed >= 3.f) { shuttle_max_speed = 3.0f; }
+ else if (shuttle_max_speed >= 2.f) { shuttle_max_speed = 2.0f; }
+ else { shuttle_max_speed = 1.5f; }
+
Config->ParameterChanged.connect (parameter_connection, MISSING_INVALIDATOR, boost::bind (&ShuttleControl::parameter_changed, this, _1), gui_context());
/* gtkmm 2.4: the C++ wrapper doesn't work */
@@ -240,6 +249,7 @@ ShuttleControl::show_shuttle_context_menu ()
void
ShuttleControl::set_shuttle_max_speed (float speed)
{
+ Config->set_shuttle_max_speed (speed);
shuttle_max_speed = speed;
last_speed_displayed = -99999999;
}
diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc
index d4c8686..719e94f 100644
--- a/gtk2_ardour/startup.cc
+++ b/gtk2_ardour/startup.cc
@@ -37,11 +37,12 @@
#include "ardour/audioengine.h"
#include "ardour/filesystem_paths.h"
+#include "ardour/filename_extensions.h"
+#include "ardour/plugin_manager.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 "startup.h"
@@ -343,13 +344,30 @@ void
ArdourStartup::setup_final_page ()
{
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);
- set_page_header_image (final_page, icon_pixbuf);
- set_page_type (final_page, ASSISTANT_PAGE_CONFIRM);
+
+ plugin_disco_button.signal_clicked().connect (sigc::mem_fun(*this, &ArdourStartup::discover_plugins));
+ plugin_disco_button.set_label (_("Scan for Plugins"));
+ plugin_disco_button.show ();
+
+ Gtk::Label* final_label = manage (new Label);
+ final_label->set_markup (string_compose ("<span weight=\"bold\" size=\"large\">%1</span>", msg));
+ final_label->show ();
+
+ VBox* vbox = manage (new VBox);
+ vbox->pack_start (*final_label, true, true);
+ vbox->pack_start (plugin_disco_button, true, false);
+ vbox->show ();
+
+ final_page_index = append_page (*vbox);
+ set_page_complete (*vbox, true);
+ set_page_header_image (*vbox, icon_pixbuf);
+ set_page_type (*vbox, ASSISTANT_PAGE_CONFIRM);
+}
+
+void
+ArdourStartup::discover_plugins () {
+ plugin_disco_button.set_sensitive (false);
+ PluginManager::instance().refresh();
}
void
diff --git a/gtk2_ardour/startup.h b/gtk2_ardour/startup.h
index a93a29e..74e0aee 100644
--- a/gtk2_ardour/startup.h
+++ b/gtk2_ardour/startup.h
@@ -63,6 +63,7 @@ class ArdourStartup : public Gtk::Assistant {
void on_apply ();
void on_cancel ();
bool on_delete_event (GdkEventAny*);
+ void discover_plugins ();
static ArdourStartup *the_startup;
@@ -101,7 +102,7 @@ class ArdourStartup : public Gtk::Assistant {
/* final page */
void setup_final_page ();
- Gtk::Label final_page;
+ Gtk::Button plugin_disco_button;
/* always there */
diff --git a/gtk2_ardour/step_editor.cc b/gtk2_ardour/step_editor.cc
index 63d7066..a1beefb 100644
--- a/gtk2_ardour/step_editor.cc
+++ b/gtk2_ardour/step_editor.cc
@@ -226,6 +226,9 @@ StepEditor::step_edit_sustain (Evoral::Beats beats)
void
StepEditor::move_step_edit_beat_pos (Evoral::Beats beats)
{
+ if (!step_edit_region_view) {
+ return;
+ }
if (beats > 0.0) {
step_edit_beat_pos = min (step_edit_beat_pos + beats,
step_edit_region_view->region_frames_to_region_beats (step_edit_region->length()));
@@ -356,8 +359,10 @@ StepEditor::step_edit_toggle_chord ()
{
if (_step_edit_within_chord) {
_step_edit_within_chord = false;
- step_edit_beat_pos += _step_edit_chord_duration;
- step_edit_region_view->move_step_edit_cursor (step_edit_beat_pos);
+ if (step_edit_region_view) {
+ step_edit_beat_pos += _step_edit_chord_duration;
+ step_edit_region_view->move_step_edit_cursor (step_edit_beat_pos);
+ }
} else {
_step_edit_triplet_countdown = 0;
_step_edit_within_chord = true;
@@ -375,7 +380,7 @@ StepEditor::step_edit_rest (Evoral::Beats beats)
success = true;
}
- if (success) {
+ if (success && step_edit_region_view) {
step_edit_beat_pos += beats;
step_edit_region_view->move_step_edit_cursor (step_edit_beat_pos);
}
@@ -385,7 +390,9 @@ void
StepEditor::step_edit_beat_sync ()
{
step_edit_beat_pos = step_edit_beat_pos.round_up_to_beat();
- step_edit_region_view->move_step_edit_cursor (step_edit_beat_pos);
+ if (step_edit_region_view) {
+ step_edit_region_view->move_step_edit_cursor (step_edit_beat_pos);
+ }
}
void
diff --git a/gtk2_ardour/transcode_ffmpeg.cc b/gtk2_ardour/transcode_ffmpeg.cc
index 7ecdc36..efe4e44 100644
--- a/gtk2_ardour/transcode_ffmpeg.cc
+++ b/gtk2_ardour/transcode_ffmpeg.cc
@@ -172,8 +172,8 @@ TranscodeFfmpeg::probe ()
} else if (key == X_("time_base")) {
PARSE_FRACTIONAL_FPS(timebase)
} else if (key == X_("timecode") && m_duration == 0) {
- int h,m,s; char f[7];
- if (sscanf(i->at(16).c_str(), "%d:%d:%d:%s",&h,&m,&s,f) == 4) {
+ int h,m,s; char f[32];
+ if (sscanf(i->at(16).c_str(), "%d:%d:%d:%32s",&h,&m,&s,f) == 4) {
m_duration = (ARDOUR::framecnt_t) floor(m_fps * (
h * 3600.0
+ m * 60.0
@@ -298,7 +298,15 @@ TranscodeFfmpeg::format_metadata (std::string key, std::string value)
size_t len = key.length() + v1.length() + 4;
char *mds = (char*) calloc(len, sizeof(char));
+#ifdef PLATFORM_WINDOWS
+ /* SystemExec::make_wargs() adds quotes around the complete argument
+ * windows uses CreateProcess() with a parameter string
+ * (and not an array list of separate arguments)
+ */
+ snprintf(mds, len, "%s=%s", key.c_str(), v1.c_str());
+#else
snprintf(mds, len, "%s=\"%s\"", key.c_str(), v1.c_str());
+#endif
return mds;
}
diff --git a/gtk2_ardour/transcode_video_dialog.cc b/gtk2_ardour/transcode_video_dialog.cc
index 16bfc36..04c21b6 100644
--- a/gtk2_ardour/transcode_video_dialog.cc
+++ b/gtk2_ardour/transcode_video_dialog.cc
@@ -122,12 +122,15 @@ TranscodeVideoDialog::TranscodeVideoDialog (Session* s, std::string infile)
aspect_checkbox.set_sensitive(false);
bitrate_checkbox.set_sensitive(false);
} else {
- ffok = true;
w = transcoder->get_width();
h = transcoder->get_height();
as = transcoder->get_audio();
m_aspect = transcoder->get_aspect();
+ if (w > 0 && h > 0 && transcoder->get_fps() > 0 && transcoder->get_duration() > 0) {
+ ffok = true;
+ }
+
Table* t = manage (new Table (4, 2));
t->set_spacings (4);
options_box->pack_start (*t, true, true, 4);
@@ -178,17 +181,40 @@ TranscodeVideoDialog::TranscodeVideoDialog (Session* s, std::string infile)
options_box->pack_start (*l, false, true, 4);
video_combo.set_name ("PaddedButton");
- video_combo.append_text(_("Reference From Current Location (Previously Transcoded Files Only)"));
- if (ffok) {
+
+ if (ffok) {
+ video_combo.append_text(_("Reference From Current Location (Previously Transcoded Files Only)"));
video_combo.append_text(_("Import/Transcode Video to Session"));
video_combo.set_active(1);
+ if (as.size() > 0) {
+ video_combo.append_text(_("Do Not Import Video (Audio Import Only)"));
+ audio_combo.set_sensitive(true);
+ } else {
+ audio_combo.set_sensitive(false);
+ }
+ video_combo.set_sensitive(true);
+ transcode_button.set_sensitive(true);
+ path_entry.set_sensitive (true);
+ browse_button.set_sensitive (true);
+ } else if (as.size() > 0) {
+ video_combo.append_text(_("Do Not Import Video (Audio Import Only)"));
+ video_combo.set_active(0);
+ path_entry.set_text ("");
+
+ video_combo.set_sensitive(false);
+ audio_combo.set_sensitive(true);
+ transcode_button.set_sensitive(true);
+ path_entry.set_sensitive (false);
+ browse_button.set_sensitive (false);
} else {
+ video_combo.append_text(_("Do Not Import Video"));
video_combo.set_active(0);
+ path_entry.set_text ("");
video_combo.set_sensitive(false);
audio_combo.set_sensitive(false);
- }
- if (as.size() > 0) {
- video_combo.append_text(_("Do Not Import Video (Audio Import Only)"));
+ transcode_button.set_sensitive(false);
+ path_entry.set_sensitive (false);
+ browse_button.set_sensitive (false);
}
options_box->pack_start (video_combo, false, false, 4);
diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc
index c903e59..fcfdbe6 100644
--- a/gtk2_ardour/utils.cc
+++ b/gtk2_ardour/utils.cc
@@ -921,3 +921,40 @@ ARDOUR_UI_UTILS::rate_as_string (float r)
}
return buf;
}
+
+bool
+ARDOUR_UI_UTILS::windows_overlap (Gtk::Window *a, Gtk::Window *b)
+{
+
+ if (!a || !b) {
+ return false;
+ }
+ if (a->get_screen() == b->get_screen()) {
+ gint ex, ey, ew, eh;
+ gint mx, my, mw, mh;
+
+ a->get_position (ex, ey);
+ a->get_size (ew, eh);
+ b->get_position (mx, my);
+ b->get_size (mw, mh);
+
+ GdkRectangle e;
+ GdkRectangle m;
+ GdkRectangle r;
+
+ e.x = ex;
+ e.y = ey;
+ e.width = ew;
+ e.height = eh;
+
+ m.x = mx;
+ m.y = my;
+ m.width = mw;
+ m.height = mh;
+
+ if (gdk_rectangle_intersect (&e, &m, &r)) {
+ return true;
+ }
+ }
+ return false;
+}
diff --git a/gtk2_ardour/utils.h b/gtk2_ardour/utils.h
index fe8a0f5..df97da6 100644
--- a/gtk2_ardour/utils.h
+++ b/gtk2_ardour/utils.h
@@ -94,5 +94,7 @@ Gdk::Color unique_random_color (std::list<Gdk::Color> &);
std::string rate_as_string (float r);
+bool windows_overlap (Gtk::Window *a, Gtk::Window *b);
+
} // namespace
#endif /* __ardour_gtk_utils_h__ */
diff --git a/gtk2_ardour/utils_videotl.cc b/gtk2_ardour/utils_videotl.cc
index cdc27ae..51cbe1a 100644
--- a/gtk2_ardour/utils_videotl.cc
+++ b/gtk2_ardour/utils_videotl.cc
@@ -118,7 +118,7 @@ VideoUtils::video_get_server_url (ARDOUR::RCConfiguration* config)
if (config->get_video_advanced_setup()) {
return config->get_video_server_url();
}
- return X_("http://localhost:1554");
+ return X_("http://127.0.0.1:1554");
}
diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript
index 60d99a6..d579d5b 100644
--- a/gtk2_ardour/wscript
+++ b/gtk2_ardour/wscript
@@ -61,6 +61,7 @@ gtk2_ardour_sources = [
'editor.cc',
'editor_actions.cc',
'editor_audio_import.cc',
+ 'editor_pt_import.cc',
'editor_audiotrack.cc',
'editor_canvas.cc',
'editor_canvas_events.cc',
@@ -200,7 +201,7 @@ gtk2_ardour_sources = [
'route_time_axis.cc',
'route_ui.cc',
'ruler_dialog.cc',
- 'save_as_dialog.cc',
+ 'save_as_dialog.cc',
'search_path_option.cc',
'selection.cc',
'selection_memento.cc',
@@ -269,6 +270,12 @@ def enoify (major, minor):
return "\\n\\\"Taking Tiger Mountain\\\""
elif minor == 3:
return "\\n\\\"Lady June's Linguistic Leprosy\\\""
+ elif minor == 4:
+ return "\\n\\\"Discreet Music\\\""
+ elif minor == 5:
+ return "\\n\\\"Another Green World\\\""
+ elif minor == 6:
+ return "\\n\\\"Evening Star\\\""
return "\\\"\\\""
def options(opt):
@@ -397,6 +404,7 @@ def build(bld):
'libgtk2_ardour',
'libgtkmm2ext',
'libcanvas',
+ 'libptformat',
]
obj.target = 'ardour-' + str (bld.env['VERSION']) + '-vst.exe.so'
obj.includes = [ '../libs/fst', '.' ]
@@ -412,6 +420,7 @@ def build(bld):
obj.includes = [ '../libs/fst', '.' ]
obj.name = 'libgtk2_ardour'
obj.target = 'gtk2_ardour'
+
else:
# just the normal executable version of the GTK GUI
if bld.env['build_target'] == 'mingw':
@@ -437,6 +446,7 @@ def build(bld):
'libmidipp',
'libgtkmm2ext',
'libcanvas',
+ 'libptformat',
]
obj.defines = [
@@ -463,6 +473,8 @@ def build(bld):
obj.includes += ['../libs']
+ obj.use += 'libptformat'
+
if bld.env['build_target'] == 'mingw':
obj.linkflags = ['-mwindows']
@@ -505,7 +517,7 @@ def build(bld):
'DATADIR' : os.path.normpath(bld.env['DATADIR']),
'CONFDIR' : os.path.normpath(bld.env['CONFDIR']),
'LIBS' : 'build/libs',
- 'VERSION' : bld.env['VERSION'],
+ 'VERSION' : str (bld.env['VERSION']),
'EXECUTABLE' : 'build/gtk2_ardour/ardour-' + str (bld.env['VERSION'])
}
@@ -633,6 +645,9 @@ def build(bld):
else:
menus_argv = [ '-E', '-P' ]
+ if bld.is_defined('PTFORMAT'):
+ menus_argv += [ '-DPTFORMAT' ]
+
# always build all versions of the menu definitions
# so that we can try them out with different program builds.
for program in [ 'ardour', 'trx' ]:
@@ -641,7 +656,7 @@ def build(bld):
obj.command_is_external = True
obj.no_inputs = True
obj.argv = menus_argv
- obj.dep_vars = ['GTKOSX', 'WINDOWS']
+ obj.dep_vars = ['PTFORMAT', 'GTKOSX', 'WINDOWS']
obj.stdin = program + '.menus.in'
obj.stdout = program + '.menus'
bld.install_files (bld.env['CONFDIR'], program + '.menus')
@@ -692,21 +707,21 @@ def build(bld):
mo)
def i18n(bld):
- I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
- autowaf.build_i18n(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
- 'Paul Davis')
-
+ I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
+ autowaf.build_i18n(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
+ 'Paul Davis')
+
def i18n_pot(bld):
- I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
- autowaf.build_i18n_pot(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
- 'Paul Davis')
+ I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
+ autowaf.build_i18n_pot(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
+ 'Paul Davis')
def i18n_po(bld):
- I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
- autowaf.build_i18n_po(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
- 'Paul Davis')
-
+ I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
+ autowaf.build_i18n_po(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
+ 'Paul Davis')
+
def i18n_mo(bld):
- I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
- autowaf.build_i18n_mo(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
- 'Paul Davis')
+ I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
+ autowaf.build_i18n_mo(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
+ 'Paul Davis')
diff --git a/libs/ardour/MSVClibardour/ardour.vcproj b/libs/ardour/MSVClibardour/ardour.vcproj
index 25b6d76..697bc9d 100644
--- a/libs/ardour/MSVClibardour/ardour.vcproj
+++ b/libs/ardour/MSVClibardour/ardour.vcproj
@@ -1164,6 +1164,10 @@
>
</File>
<File
+ RelativePath="..\sha1.c"
+ >
+ </File>
+ <File
RelativePath="..\slave.cc"
>
</File>
diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h
index 8ce99c4..ba8e244 100644
--- a/libs/ardour/ardour/audio_backend.h
+++ b/libs/ardour/ardour/audio_backend.h
@@ -191,6 +191,20 @@ class LIBARDOUR_API AudioBackend : public PortEngine {
*/
virtual std::vector<float> available_sample_rates (const std::string& device) const = 0;
+ /* backends that support separate input and output devices should
+ * implement this function and return an intersection (not union) of available
+ * sample rates valid for the given input + output device combination.
+ */
+ virtual std::vector<float> available_sample_rates2 (const std::string& input_device, const std::string& output_device) const {
+ std::vector<float> input_sizes = available_sample_rates (input_device);
+ std::vector<float> output_sizes = available_sample_rates (output_device);
+ std::vector<float> rv;
+ std::set_union (input_sizes.begin (), input_sizes.end (),
+ output_sizes.begin (), output_sizes.end (),
+ std::back_inserter (rv));
+ return rv;
+ }
+
/* Returns the default sample rate that will be shown to the user when
* configuration options are first presented. If the derived class
* needs or wants to override this, it can. It also MUST override this
@@ -210,6 +224,19 @@ class LIBARDOUR_API AudioBackend : public PortEngine {
*/
virtual std::vector<uint32_t> available_buffer_sizes (const std::string& device) const = 0;
+ /* backends that support separate input and output devices should
+ * implement this function and return an intersection (not union) of available
+ * buffer sizes valid for the given input + output device combination.
+ */
+ virtual std::vector<uint32_t> available_buffer_sizes2 (const std::string& input_device, const std::string& output_device) const {
+ std::vector<uint32_t> input_rates = available_buffer_sizes (input_device);
+ std::vector<uint32_t> output_rates = available_buffer_sizes (output_device);
+ std::vector<uint32_t> rv;
+ std::set_union (input_rates.begin (), input_rates.end (),
+ output_rates.begin (), output_rates.end (),
+ std::back_inserter (rv));
+ return rv;
+ }
/* Returns the default buffer size that will be shown to the user when
* configuration options are first presented. If the derived class
* needs or wants to override this, it can. It also MUST override this
diff --git a/libs/ardour/ardour/audio_diskstream.h b/libs/ardour/ardour/audio_diskstream.h
index f48204d..33126b5 100644
--- a/libs/ardour/ardour/audio_diskstream.h
+++ b/libs/ardour/ardour/audio_diskstream.h
@@ -209,9 +209,8 @@ class LIBARDOUR_API AudioDiskstream : public Diskstream
/* The two central butler operations */
int do_flush (RunContext context, bool force = false);
- int do_refill () { return _do_refill(_mixdown_buffer, _gain_buffer); }
+ int do_refill () { return _do_refill(_mixdown_buffer, _gain_buffer, 0); }
- int do_refill_with_alloc ();
int read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
framepos_t& start, framecnt_t cnt,
@@ -250,7 +249,6 @@ class LIBARDOUR_API AudioDiskstream : public Diskstream
static void allocate_working_buffers();
static void free_working_buffers();
- static size_t _working_buffers_size;
static Sample* _mixdown_buffer;
static gain_t* _gain_buffer;
@@ -258,9 +256,12 @@ class LIBARDOUR_API AudioDiskstream : public Diskstream
SerializedRCUManager<ChannelList> channels;
+ protected:
+ int _do_refill_with_alloc (bool one_chunk_only);
+
/* really */
private:
- int _do_refill (Sample *mixdown_buffer, float *gain_buffer);
+ int _do_refill (Sample *mixdown_buffer, float *gain_buffer, framecnt_t fill_level);
int add_channel_to (boost::shared_ptr<ChannelList>, uint32_t how_many);
int remove_channel_from (boost::shared_ptr<ChannelList>, uint32_t how_many);
diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h
index 13b1682..8fcdcf7 100644
--- a/libs/ardour/ardour/audio_unit.h
+++ b/libs/ardour/ardour/audio_unit.h
@@ -241,7 +241,7 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo {
bool reconfigurable_io() const { return true; }
- static PluginInfoList* discover ();
+ static PluginInfoList* discover (bool scan_only);
static bool au_get_crashlog (std::string &msg);
static void get_names (CAComponentDescription&, std::string& name, std::string& maker);
static std::string stringify_descriptor (const CAComponentDescription&);
@@ -252,6 +252,7 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo {
boost::shared_ptr<CAComponentDescription> descriptor;
UInt32 version;
static FILE * _crashlog_fd;
+ static bool _scan_only;
static void au_start_crashlog (void);
static void au_remove_crashlog (void);
@@ -267,7 +268,7 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo {
typedef std::map<std::string,AUPluginCachedInfo> CachedInfoMap;
static CachedInfoMap cached_info;
- static bool cached_io_configuration (const std::string&, UInt32, CAComponent&, AUPluginCachedInfo&, const std::string& name);
+ static int cached_io_configuration (const std::string&, UInt32, CAComponent&, AUPluginCachedInfo&, const std::string& name);
static void add_cached_info (const std::string&, AUPluginCachedInfo&);
static void save_cached_info ();
};
diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h
index 330de4e..d1e3f8a 100644
--- a/libs/ardour/ardour/audioengine.h
+++ b/libs/ardour/ardour/audioengine.h
@@ -209,6 +209,9 @@ class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager
void latency_callback (bool for_playback);
void halted_callback (const char* reason);
+ /* checks if current thread is properly set up for audio processing */
+ static bool thread_initialised_for_audio_processing ();
+
/* sets up the process callback thread */
static void thread_init_callback (void *);
diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h
index 8e510b3..086544f 100644
--- a/libs/ardour/ardour/audioregion.h
+++ b/libs/ardour/ardour/audioregion.h
@@ -73,7 +73,11 @@ class LIBARDOUR_API AudioRegion : public Region
bool speed_mismatch (float) const;
boost::shared_ptr<AudioSource> audio_source (uint32_t n=0) const;
-
+
+ // if several audio files associated with a region,
+ // information about file with MAX channel count will be provided
+ uint32_t get_related_audio_file_channel_count () const;
+
void set_scale_amplitude (gain_t);
gain_t scale_amplitude() const { return _scale_amplitude; }
diff --git a/libs/ardour/ardour/audiosource.h b/libs/ardour/ardour/audiosource.h
index 095d9d2..c02310e 100644
--- a/libs/ardour/ardour/audiosource.h
+++ b/libs/ardour/ardour/audiosource.h
@@ -109,8 +109,6 @@ class LIBARDOUR_API AudioSource : virtual public Source,
static bool _build_missing_peakfiles;
static bool _build_peakfiles;
- static size_t _working_buffers_size;
-
/* these collections of working buffers for supporting
playlist's reading from potentially nested/recursive
sources assume SINGLE THREADED reads by the butler
diff --git a/libs/ardour/ardour/automation_control.h b/libs/ardour/ardour/automation_control.h
index 24a9e0d..5d73e4a 100644
--- a/libs/ardour/ardour/automation_control.h
+++ b/libs/ardour/ardour/automation_control.h
@@ -101,6 +101,7 @@ protected:
ARDOUR::Session& _session;
const ParameterDescriptor _desc;
+ XMLNode* _before; //used for undo of touch start/stop pairs.
};
diff --git a/libs/ardour/ardour/butler.h b/libs/ardour/ardour/butler.h
index 94b6fb8..7f08474 100644
--- a/libs/ardour/ardour/butler.h
+++ b/libs/ardour/ardour/butler.h
@@ -61,6 +61,8 @@ class LIBARDOUR_API Butler : public SessionHandleRef
bool transport_work_requested() const;
void drop_references ();
+ void map_parameters ();
+
framecnt_t audio_diskstream_capture_buffer_size() const { return audio_dstream_capture_buffer_size; }
framecnt_t audio_diskstream_playback_buffer_size() const { return audio_dstream_playback_buffer_size; }
uint32_t midi_diskstream_buffer_size() const { return midi_dstream_buffer_size; }
diff --git a/libs/ardour/ardour/chan_count.h b/libs/ardour/ardour/chan_count.h
index 9f9fd07..b613f67 100644
--- a/libs/ardour/ardour/chan_count.h
+++ b/libs/ardour/ardour/chan_count.h
@@ -154,7 +154,7 @@ private:
} // namespace ARDOUR
-std::ostream& operator<<(std::ostream& o, const ARDOUR::ChanCount& c);
+LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::ChanCount& c);
#endif // __ardour_chan_count_h__
diff --git a/libs/ardour/ardour/coreaudiosource.h b/libs/ardour/ardour/coreaudiosource.h
index 5e8e696..44016b4 100644
--- a/libs/ardour/ardour/coreaudiosource.h
+++ b/libs/ardour/ardour/coreaudiosource.h
@@ -39,6 +39,8 @@ class LIBARDOUR_API CoreAudioSource : public AudioFileSource {
float sample_rate() const;
int update_header (framepos_t when, struct tm&, time_t);
+ uint32_t channel_count () const { return n_channels; }
+
int flush_header () {return 0;};
void set_header_timeline_position () {};
bool clamped_at_unity () const { return false; }
diff --git a/libs/ardour/ardour/debug.h b/libs/ardour/ardour/debug.h
index 1c19d85..94974a1 100644
--- a/libs/ardour/ardour/debug.h
+++ b/libs/ardour/ardour/debug.h
@@ -69,6 +69,7 @@ namespace PBD {
LIBARDOUR_API extern DebugBits AudioEngine;
LIBARDOUR_API extern DebugBits Soundcloud;
LIBARDOUR_API extern DebugBits Butler;
+ LIBARDOUR_API extern DebugBits GenericMidi;
}
}
diff --git a/libs/ardour/ardour/directory_names.h b/libs/ardour/ardour/directory_names.h
index db3fc1d..5c0eae9 100644
--- a/libs/ardour/ardour/directory_names.h
+++ b/libs/ardour/ardour/directory_names.h
@@ -42,6 +42,10 @@ namespace ARDOUR {
LIBARDOUR_API extern const char* const ladspa_dir_name;
LIBARDOUR_API extern const char* const panner_dir_name;
LIBARDOUR_API extern const char* const backend_dir_name;
+ LIBARDOUR_API extern const char* const automation_dir_name;
+ LIBARDOUR_API extern const char* const analysis_dir_name;
+ LIBARDOUR_API extern const char* const plugins_dir_name;
+ LIBARDOUR_API extern const char* const externals_dir_name;
};
diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h
index fc41d10..fb9be65 100644
--- a/libs/ardour/ardour/diskstream.h
+++ b/libs/ardour/ardour/diskstream.h
@@ -103,8 +103,8 @@ class LIBARDOUR_API Diskstream : public SessionObject, public PublicDiskstream
framecnt_t roll_delay() const { return _roll_delay; }
void set_roll_delay (framecnt_t);
- bool record_enabled() const { return g_atomic_int_get (&_record_enabled); }
- bool record_safe () const { return g_atomic_int_get (&_record_safe); }
+ bool record_enabled() const { return g_atomic_int_get (const_cast<gint*>(&_record_enabled)); }
+ bool record_safe () const { return g_atomic_int_get (const_cast<gint*>(&_record_safe)); }
virtual void set_record_enabled (bool yn) = 0;
virtual void set_record_safe (bool yn) = 0;
@@ -147,6 +147,8 @@ class LIBARDOUR_API Diskstream : public SessionObject, public PublicDiskstream
static framecnt_t default_disk_read_chunk_frames ();
static framecnt_t default_disk_write_chunk_frames ();
+ static void set_buffering_parameters (BufferingPreset bp);
+
/* Stateful */
virtual XMLNode& get_state(void);
virtual int set_state(const XMLNode&, int version);
@@ -169,8 +171,15 @@ class LIBARDOUR_API Diskstream : public SessionObject, public PublicDiskstream
void move_processor_automation (boost::weak_ptr<Processor>,
std::list<Evoral::RangeMove<framepos_t> > const &);
- /** For non-butler contexts (allocates temporary working buffers) */
- virtual int do_refill_with_alloc() = 0;
+ /** For non-butler contexts (allocates temporary working buffers)
+ *
+ * This accessible method has a default argument; derived classes
+ * must inherit the virtual method that we call which does NOT
+ * have a default argument, to avoid complications with inheritance
+ */
+ int do_refill_with_alloc(bool partial_fill = true) {
+ return _do_refill_with_alloc (partial_fill);
+ }
virtual void set_block_size (pframes_t) = 0;
bool pending_overwrite () const {
@@ -203,6 +212,11 @@ class LIBARDOUR_API Diskstream : public SessionObject, public PublicDiskstream
virtual int can_internal_playback_seek (framecnt_t distance) = 0;
virtual void reset_write_sources (bool, bool force = false) = 0;
virtual void non_realtime_input_change () = 0;
+ /* accessible method has default argument, so use standard C++ "trick"
+ to avoid complications with inheritance, by adding this virtual
+ method which does NOT have a default argument.
+ */
+ virtual int _do_refill_with_alloc (bool partial_fill) = 0;
protected:
friend class Auditioner;
@@ -345,6 +359,12 @@ class LIBARDOUR_API Diskstream : public SessionObject, public PublicDiskstream
XMLNode* deprecated_io_node;
void route_going_away ();
+
+ static bool get_buffering_presets (BufferingPreset bp,
+ framecnt_t& read_chunk_size,
+ framecnt_t& read_buffer_size,
+ framecnt_t& write_chunk_size,
+ framecnt_t& write_buffer_size);
};
}; /* namespace ARDOUR */
diff --git a/libs/ardour/ardour/engine_state_controller.h b/libs/ardour/ardour/engine_state_controller.h
new file mode 100644
index 0000000..737fb3b
--- /dev/null
+++ b/libs/ardour/ardour/engine_state_controller.h
@@ -0,0 +1,653 @@
+/*
+ Copyright (C) 2014 Waves Audio Ltd.
+
+ 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__engine_state_controller__
+#define __gtk2_ardour__engine_state_controller__
+
+#include <vector>
+#include <list>
+
+#include "ardour/types.h"
+#include "ardour/audio_backend.h"
+
+namespace ARDOUR {
+
+class AudioBackendInfo;
+
+/**
+ * @class EngineStateController
+ * @brief EngineStateController class.
+ *
+ * Implements usecases for Audio devices and Audio/Midi ports.
+ * Persistantly saves to the config device configuration settings and audio/midi port states
+ */
+class EngineStateController
+{
+ public:
+
+ // public data types:
+
+ /**
+ * @struct PortState
+ * Structure which represents AudioPort state
+ */
+ struct PortState {
+ std::string name; ///< Audio Port name
+ bool active; ///< Audio Port state
+
+ PortState ()
+ : name("")
+ , active(false)
+ {
+ }
+
+ PortState (const std::string& name)
+ : name(name)
+ , active(false)
+ {
+ }
+
+ bool operator==(const PortState& rhs) {return rhs.name == name; }
+
+ };
+
+ /// @typedef Type for the list of all available audio ports
+ typedef std::list<PortState> PortStateList;
+
+ /**
+ * @struct MidiPortState
+ * Structure which represents MidiPort state.
+ */
+ struct MidiPortState
+ {
+ std::string name; ///< Midi Port name
+ bool active; ///< Midi Port state
+ bool available; ///< Midi Port availability - if it is physicaly available or not
+ bool scene_connected; ///< Is midi port used for scene MIDI marker in/out
+ bool mtc_in; ///< Is midi port used as MTC in
+
+ MidiPortState(const std::string& name)
+ : name(name)
+ , active(false)
+ , available(false)
+ , scene_connected(false)
+ , mtc_in(false)
+ {}
+
+ bool operator==(const MidiPortState& rhs)
+ {
+ return name == rhs.name;
+ }
+ };
+
+ /// @typedef Type for the list of MidiPorts ever registered in the system
+ typedef std::list<MidiPortState> MidiPortStateList;
+
+
+ //Interfaces
+
+ /** Get an instance of EngineStateController singleton.
+ * @return EngineStateController instance pointer
+ */
+ static EngineStateController* instance ();
+
+ /** Associate session with EngineStateController instance.
+ */
+ void set_session (Session* session);
+
+ /** Remove link to the associated session.
+ */
+ void remove_session ();
+
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // General backend/device information methods
+
+ /** Provides names of all available backends.
+ *
+ * @param[out] available_backends - vector of available backends
+ */
+ void available_backends (std::vector<const AudioBackendInfo*>& available_backends);
+
+ /** Provides the name of currently used backend.
+ *
+ * @return the name of currently used backend
+ */
+ const std::string& get_current_backend_name() const;
+
+ /** Provides the name of currently used device.
+ *
+ * @return the name of currently used device
+ */
+ const std::string& get_current_device_name () const;
+
+ /** Provides names for all available devices.
+ *
+ * @param[out] device_vector - vector of available devices
+ */
+ void enumerate_devices (std::vector<ARDOUR::AudioBackend::DeviceStatus>& device_vector) const;
+
+ /** Get sample rate used by current device.
+ *
+ * @return current sample rate
+ */
+ ARDOUR::framecnt_t get_current_sample_rate () const;
+
+ /** Get default sample rate for current backend.
+ *
+ * @return default sample rate for current backend
+ */
+ ARDOUR::framecnt_t get_default_sample_rate () const;
+
+ /** Get sample rates which are supported by current device and current backend.
+ *
+ * @param[out] sample_rates - vector of supported sample rates
+ */
+ void available_sample_rates_for_current_device (std::vector<float>& sample_rates) const;
+
+ /** Get buffer size used by current device.
+ *
+ * @return current buffer size
+ */
+ ARDOUR::pframes_t get_current_buffer_size () const;
+
+ /** Get default buffer size for current backend.
+ *
+ * @return default buffer size for current backend
+ */
+ ARDOUR::pframes_t get_default_buffer_size () const;
+
+ /** Get buffer sizes which are supported by current device and current backend.
+ *
+ * @param[out] buffer_sizes - vector of supported buffer_sizes
+ */
+ void available_buffer_sizes_for_current_device (std::vector<ARDOUR::pframes_t>& buffer_sizes) const;
+
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // device state control methods
+
+ /** Get the number of all enabled Audio inputs.
+ *
+ * @return number of all enabled Audio inputs
+ */
+ uint32_t get_available_inputs_count() const;
+ /** Get the number of all enabled Audio outputs.
+ *
+ * @return number of all enabled Audio outputs
+ */
+ uint32_t get_available_outputs_count () const;
+
+ /** Get vector of all enabled physical Audio input port names.
+ *
+ * @param[out] port_names - vector of all enabled Audio input names
+ */
+ void get_physical_audio_inputs (std::vector<std::string>& port_names);
+ /** Get vector of all enabled physical Audio input port names.
+ *
+ * @param[out] port_names - vector of all enabled Audio input names
+ */
+ void get_physical_audio_outputs (std::vector<std::string>& port_names);
+
+ /** Get vector of all enabled physical MIDI input port names.
+ *
+ * @param[out] port_names - vector of all enabled MIDI input names
+ */
+ void get_physical_midi_inputs (std::vector<std::string>& port_names);
+ /** Get vector of all enabled physical MIDI output port names.
+ *
+ * @param[out] port_names - vector of all enabled MIDI output names
+ */
+ void get_physical_midi_outputs (std::vector<std::string>& port_names);
+
+ /** Sets new state to all Audio inputs.
+ *
+ * @param[in] state - new state
+ */
+ void set_state_to_all_inputs(bool state);
+ /** Sets new state to all Audio outputs.
+ * @note Does nothing in Stereo Out mode
+ * @param[in] state - new state
+ */
+ void set_state_to_all_outputs(bool state);
+
+ /** Get vector of states for all physical Audio input ports.
+ *
+ * @param[out] channel_states - vector of input port states
+ */
+ void get_physical_audio_input_states(std::vector<PortState>& channel_states);
+ /** Get vector of states for all physical Audio output ports.
+ *
+ * @param[out] channel_states - vector of output port states
+ */
+ void get_physical_audio_output_states(std::vector<PortState>& channel_states);
+
+ /** Set state of the specified Audio input port.
+ *
+ * @param[in] port_name - input name
+ * @param[in] state - new state
+ */
+ void set_physical_audio_input_state(const std::string& port_name, bool state);
+ /** Set state of the specified Audio output port.
+ *
+ * @param[in] port_name - output name
+ * @param[in] state - new state
+ */
+ void set_physical_audio_output_state(const std::string& port_name, bool state);
+
+ /** Get state of the specified Audio input port.
+ *
+ * @param[in] port_name - input name
+ * @return input state
+ */
+ bool get_physical_audio_input_state(const std::string& port_name);
+ /** Get state of the specified Audi output port.
+ *
+ * @param[in] port_name - output name
+ * @return output state
+ */
+ bool get_physical_audio_output_state(const std::string& port_name);
+
+
+ /** Get vector of all enabled MIDI input port names.
+ *
+ * @param[out] channel_states - vector of enabled inputs
+ */
+ void get_physical_midi_input_states (std::vector<MidiPortState>& channel_states);
+ /** Get vector of all enabled MIDI output port names.
+ *
+ * @param[out] channel_states - vector of enabled outputs
+ */
+ void get_physical_midi_output_states (std::vector<MidiPortState>& channel_states);
+
+ /** Get name of mtc source port
+ *
+ * return name of mtc source port
+ */
+ std::string get_mtc_source_port ();
+
+ /** Set ltc source port
+ *
+ * @param[in] port - name of ltc source port
+ */
+ void set_ltc_source_port (const std::string& port);
+ /** Get name of ltc source port
+ *
+ * return name of ltc source port
+ */
+ std::string get_ltc_source_port ();
+
+ /** Set ltc output port
+ *
+ * @param[in] port - name of ltc output port
+ */
+ void set_ltc_output_port (const std::string&);
+ /** Get name of ltc output port
+ *
+ * return name of ltc output port
+ */
+ std::string get_ltc_output_port ();
+
+ /** Set state of the specified MIDI input port.
+ *
+ * @param[in] port_name - input name
+ * @param[in] state - new state
+ */
+ void set_physical_midi_input_state(const std::string& port_name, bool state);
+ /** Set state of the specified MIDI output port.
+ *
+ * @param[in] port_name - output name
+ * @param[in] state - new state
+ */
+ void set_physical_midi_output_state(const std::string& port_name, bool state);
+ /** Get state of the specified MIDI input port.
+ *
+ * @param[in] port_name - input name
+ * @param[out] scene_connected - is port used as Scene In or not
+ * @return input state
+ */
+ bool get_physical_midi_input_state(const std::string& port_name, bool& scene_connected);
+ /** Get state of the specified MIDI output port.
+ *
+ * @param[in] port_name - output name
+ * @param[out] scene_connected - is port used as Scene Out or not
+ * @return output state
+ */
+ bool get_physical_midi_output_state(const std::string& port_name, bool& scene_connected);
+
+ /** Set state of Scene In connection for the specified MIDI input port.
+ *
+ * @param[in] port_name - input name
+ * @param[in] state - new state
+ */
+ void set_physical_midi_scene_in_connection_state(const std::string& port_name, bool state);
+ /** Set state of Scene Out connection for the specified MIDI output port.
+ *
+ * @param[in] port_name - input name
+ * @param[in] state - new state
+ */
+ void set_physical_midi_scenen_out_connection_state(const std::string&, bool);
+
+ /** Disocnnect all MIDI input ports from Scene In.
+ */
+ void set_all_midi_scene_inputs_disconnected();
+ /** Disocnnect all MIDI output ports from Scene Out.
+ */
+ void set_all_midi_scene_outputs_disconnected();
+
+ /** Set MIDI TimeCode input port
+ * @note There is a sense to choose MIDI TimeCode input only because
+ * our MIDI TimeCode is propagated to all midi output ports.
+ */
+ void set_mtc_source_port (const std::string&);
+
+ /** Check if AudioEngine setup is required
+ * @return true if setup is required, otherwise - false
+ */
+ bool is_setup_required() const {return ARDOUR::AudioEngine::instance()->setup_required (); }
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ // Methods set parameters inside the controller
+ // the state of engine won't change untill we make a "push" of this state to the backend
+ // NOTE: Use push_state_to_backend() method to update backend with the most recent controller state
+
+ /** Set new sample rate for current device in EngineStateController database
+ * @note Use push_state_to_backend() method to update backend/device state with the most recent controller state
+ * @param sample_rate - new sample rate
+ */
+ bool set_new_sample_rate_in_controller(framecnt_t sample_rate);
+ /** Set new buffer size for current device in EngineStateController database
+ * @note Use push_state_to_backend() method to update backend/device state with the most recent controller state
+ * @param buffer_size - new buffer size
+ */
+ bool set_new_buffer_size_in_controller(pframes_t buffer_size);
+
+ /** @brief push current controller state to backend.
+ * Propagate and set all current EngineStateController parameters to the backend
+ * @note Engine will be restarted if it's running when this method is called.
+ * @note If an attempt ot set parameters is unsuccessful current device will be switched to "None".
+ * @param start - start the Engine if it was not running when this function was called.
+ * @return true on success, otherwise - false
+ */
+ bool push_current_state_to_backend(bool start);
+ /** Switch to new backend
+ * @note The change will be propagated emmidiatelly as if push_current_state_to_backend () was called.
+ * @param backend_name - new backend name.
+ * @return true on success, otherwise - false
+ */
+ bool set_new_backend_as_current(const std::string& backend_name);
+ /** Switch to new device
+ * @note The change will be propagated emmidiatelly as if push_current_state_to_backend () was called.
+ * @param device_name - new device name.
+ * @return true on success, otherwise - false
+ */
+ bool set_new_device_as_current(const std::string& device_name);
+
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ // Methods to save/serialize setting states
+
+ /** Serialize Audio/Midi settings (entire EngineStateController database) to XML
+ * @return XML note with serialized states
+ */
+ XMLNode& serialize_audio_midi_settings();
+ /** Save Audio/Midi settings (entire EngineStateController database) to config persistently
+ */
+ void save_audio_midi_settings();
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ //UPDATE SIGNALS
+ /** This signal is emitted if the sample rate changes */
+ PBD::Signal0<void> SampleRateChanged;
+ /** This signal is emitted if the buffer size changes */
+ PBD::Signal0<void> BufferSizeChanged;
+ /** This signal is emitted if the device list changes */
+ PBD::Signal1<void, bool> DeviceListChanged;
+ /** This signal is emitted if the device cannot operate properly */
+ PBD::Signal0<void> DeviceError;
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ //ENGINE STATE SIGNALS
+ /** This signal is emitted when the engine is started */
+ PBD::Signal0<void> EngineRunning;
+ /** This signal is emitted when the engine is stopped */
+ PBD::Signal0<void> EngineStopped;
+ /** This signal is emitted if Engine processing is terminated */
+ PBD::Signal0<void> EngineHalted;
+
+ /** This signal is emitted if the AUDIO input channel configuration changes */
+ PBD::Signal0<void> InputConfigChanged;
+ /** This signal is emitted if the AUDIO output channel configuration changes */
+ PBD::Signal0<void> OutputConfigChanged;
+ /** This signal is emitted if the AUDIO output connection mode changes
+ * @note By output connection mode "Stereo Out" or "Multi Out" is meant
+ */
+ PBD::Signal0<void> OutputConnectionModeChanged;
+
+ /** This signals is emitted if the MIDI input channel configuration changes */
+ PBD::Signal0<void> MIDIInputConfigChanged;
+ /** This signals is emitted if the MIDI output channel configuration changes */
+ PBD::Signal0<void> MIDIOutputConfigChanged;
+ /** This signals is emitted if the MIDI Scene In connection changes */
+ PBD::Signal2<void, const std::vector<std::string>&, bool> MIDISceneInputConnectionChanged;
+ /** This signals is emitted if the MIDI Scene Out connection changes */
+ PBD::Signal2<void, const std::vector<std::string>&, bool> MIDISceneOutputConnectionChanged;
+
+ /** This signal is emitted if the MTC Input channel is changed */
+ PBD::Signal1<void, const std::string&> MTCInputChanged;
+
+ /** This signal is emitted if new Audio/MIDI ports are registered or unregistered */
+ PBD::Signal0<void> PortRegistrationChanged;
+
+ private:
+
+ EngineStateController(); /// singleton
+ ~EngineStateController(); /// singleton
+ EngineStateController(const EngineStateController& ); /// prohibited
+ EngineStateController& operator=(const EngineStateController&); /// prohibited
+
+ ////////////////////////////////////////////////////////////////////////////////////////////
+ // private data structures
+
+ /** @struct Engine state
+ * @brief State structure.
+ * Contains information about single device/backend state
+ */
+ struct State {
+ std::string backend_name; ///< state backend name
+ std::string device_name; ///< state device name
+ ARDOUR::framecnt_t sample_rate; ///< sample rate used by the device in this state
+ ARDOUR::pframes_t buffer_size; ///< buffer size used by the device in this state
+
+ PortStateList input_channel_states; ///< states of device Audio inputs
+ PortStateList multi_out_channel_states; ///< states of device Audio inputs in Multi Out mode
+ PortStateList stereo_out_channel_states; ///< states of device Audio inputs in Stereo Out mode
+ bool active; ///< was this state the most recent active one
+
+ State()
+ : sample_rate(0)
+ , buffer_size(0)
+ , input_channel_states (0)
+ , multi_out_channel_states (0)
+ , stereo_out_channel_states (0)
+ , active (false)
+ {
+ }
+
+ bool operator==(const State& rhs)
+ {
+ return (backend_name == rhs.backend_name) && (device_name == rhs.device_name);
+ }
+
+ /** Forms string name for the state
+ * @return name string
+ */
+ std::string form_state_name() {
+ return std::string("State:" + backend_name + ":" + device_name);
+ }
+
+ /** @struct StatepPredicate
+ * This predicate is used to identify a state during search in the list of states
+ */
+ struct StatePredicate
+ {
+ StatePredicate(const std::string& backend_name, const std::string& device_name)
+ : _backend_name (backend_name)
+ , _device_name (device_name)
+ {}
+
+ bool operator()(boost::shared_ptr<ARDOUR::EngineStateController::State> rhs)
+ {
+ return (_backend_name == rhs->backend_name) && (_device_name == rhs->device_name);
+ }
+
+ private:
+ std::string _backend_name;
+ std::string _device_name;
+ };
+ };
+
+ /// @typedef Type for the state pointer
+ typedef boost::shared_ptr<State> StatePtr;
+ /// @typedef Type for the list of states
+ typedef std::list<StatePtr> StateList;
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////
+ // methods to manage setting states
+
+ /** Deserializes and loads Engine and Audio port states from the config to EngineStateController
+ */
+ void _deserialize_and_load_engine_states();
+ /** Deserializes and loads MIDI port states from the config to EngineStateController
+ */
+ void _deserialize_and_load_midi_port_states();
+ /** Serializes Engine and Audio port states from EngineStateController to XML node
+ * @param[in,out] audio_midi_settings_node - node to serialize the satets to
+ */
+ void _serialize_engine_states(XMLNode* audio_midi_settings_node);
+ /** Serializes MIDI port states from EngineStateController to XML node
+ * @param[in,out] audio_midi_settings_node - node to serialize the satets to
+ */
+ void _serialize_midi_port_states(XMLNode* audio_midi_settings_node);
+
+ /** Provides initial state configuration.
+ * It loades the last active state if there is one and it is aplicable.
+ * Otherwise default state (None device with default sample rate and buffer size) is loaded.
+ */
+ void _do_initial_engine_setup();
+
+ /** Loades provided state.
+ * @note It's possible that provided state can't be loaded
+ * (device disconnected or reqested parameters are not supported anymore).
+ * @param state - state to apply
+ * @return true on success, otherwise - false
+ */
+ bool _apply_state(const StatePtr& state);
+
+ /** Gets available device channels from engine and updates internal controller state
+ */
+ void _update_device_channels_state();
+
+ /** Check "Stereo Out" mode channels state configuration and make it correspond Stereo Out mode requirements
+ */
+ void _refresh_stereo_out_channel_states();
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // internal helper functions
+ /** make sure that current device parameters are supported and fit session requirements
+ * @return true if current state is valid and all parameters are supported, otherwise - false
+ */
+ bool _validate_current_device_state();
+
+ /** change ltc source port in case of the input ports list change
+ */
+ void _update_ltc_source_port ();
+ /** change ltc source port in case of the output ports list change
+ */
+ void _update_ltc_output_port ();
+
+ /** check that port is still existed in the list of input ports
+ @param[in] port - port name
+ @return true if current port is existed, otherwise - false
+ */
+ bool _audio_input_port_exists (const std::string& port);
+ /** check that port is still existed in the list of output ports
+ @param[in] port - port name
+ @return true if current port is existed, otherwise - false
+ */
+ bool _audio_output_port_exists (const std::string& port);
+
+
+
+ ////////////////////////////////////////
+ // callbacks
+ /** Invoked when Engine starts running
+ */
+ void _on_engine_running();
+ /** Invoked when Engine is halted
+ */
+ void _on_engine_halted();
+ /** Invoked when Engine processing is terminated
+ */
+ void _on_engine_stopped();
+ /** Invoked when Device error accured, it failed to start or didn't accept the change which should
+ */
+ void _on_device_error();
+ /** Invoked when current device changes sample rate
+ */
+ void _on_sample_rate_change(ARDOUR::framecnt_t);
+ /** Invoked when current device changes buffer size
+ */
+ void _on_buffer_size_change(ARDOUR::pframes_t);
+ /** Invoked when the list of available devices is changed
+ */
+ void _on_device_list_change();
+ /** Invoked when the config parameter is changed
+ */
+ void _on_parameter_changed (const std::string&);
+ /** Invoked when Audio/MIDI ports are registered or unregistered
+ */
+ void _on_ports_registration_update ();
+ /** Invoked when session loading process is complete
+ */
+ void _on_session_loaded();
+ ////////////////////////////////////////
+
+ ////////////////////////////////////////
+ // attributes
+ StatePtr _current_state; ///< current state pointer
+ // list of system states
+ StateList _states; ///< list of all available states
+
+ MidiPortStateList _midi_inputs; ///< midi input states
+ MidiPortStateList _midi_outputs; ///< midi output states
+
+ std::string _last_used_real_device; ///< last active non-default (real) device
+
+ Session* _session; ///< current session
+
+ // Engine connections stuff
+ PBD::ScopedConnectionList update_connections; ///< connection container for update signals
+ PBD::ScopedConnectionList session_connections; ///< connection container for session signals
+ PBD::ScopedConnection running_connection; ///< connection container for EngineRunning signal
+ PBD::ScopedConnection halt_connection; ///< connection container for EngineHalted signal
+ PBD::ScopedConnection stopped_connection; ///< connection container for EngineStopped signal
+};
+
+} // namespace ARDOUR
+
+#endif /* defined(__gtk2_ardour__engine_state_controller__) */
diff --git a/libs/ardour/ardour/export_format_base.h b/libs/ardour/ardour/export_format_base.h
index aa2ef69..093913e 100644
--- a/libs/ardour/ardour/export_format_base.h
+++ b/libs/ardour/ardour/export_format_base.h
@@ -102,6 +102,7 @@ class LIBARDOUR_API ExportFormatBase {
SR_48 = 48000,
SR_88_2 = 88200,
SR_96 = 96000,
+ SR_176_4 = 176400,
SR_192 = 192000
};
diff --git a/libs/ardour/ardour/export_format_specification.h b/libs/ardour/ardour/export_format_specification.h
index ed6e259..87a7729 100644
--- a/libs/ardour/ardour/export_format_specification.h
+++ b/libs/ardour/ardour/export_format_specification.h
@@ -114,11 +114,42 @@ class LIBARDOUR_API ExportFormatSpecification : public ExportFormatBase {
std::string format_name () const { return _format_name; }
Type type () const { return _type; }
- FormatId format_id () const { return *format_ids.begin(); }
- Endianness endianness () const { return *endiannesses.begin(); }
- SampleFormat sample_format () const { return *sample_formats.begin(); }
- SampleRate sample_rate () const { return *sample_rates.begin(); }
- Quality quality () const { return *qualities.begin(); }
+
+ FormatId format_id () const {
+ if (!format_ids.empty() )
+ return *format_ids.begin();
+ else
+ return FormatId(0);
+ }
+
+ Endianness endianness () const {
+ if (!endiannesses.empty() )
+ return *endiannesses.begin();
+ else
+ return Endianness(0);
+ }
+
+ SampleFormat sample_format () const {
+ if (!sample_formats.empty() )
+ return *sample_formats.begin();
+ else
+ return SampleFormat(0);
+ }
+
+ SampleRate sample_rate () const {
+ if (!sample_rates.empty() )
+ return *sample_rates.begin();
+ else
+ return SampleRate(0);
+
+ }
+
+ Quality quality () const {
+ if (!qualities.empty() )
+ return *qualities.begin();
+ else
+ return Quality(0);
+ }
DitherType dither_type () const { return _dither_type; }
SRCQuality src_quality () const { return _src_quality; }
diff --git a/libs/ardour/ardour/export_graph_builder.h b/libs/ardour/ardour/export_graph_builder.h
index 40960b2..5dc6cd7 100644
--- a/libs/ardour/ardour/export_graph_builder.h
+++ b/libs/ardour/ardour/export_graph_builder.h
@@ -68,22 +68,25 @@ class LIBARDOUR_API ExportGraphBuilder
unsigned get_normalize_cycle_count() const;
void reset ();
+ void cleanup (bool remove_out_files = false);
void set_current_timespan (boost::shared_ptr<ExportTimespan> span);
void add_config (FileSpec const & config);
private:
void add_split_config (FileSpec const & config);
-
+
class Encoder {
- public:
+ public:
template <typename T> boost::shared_ptr<AudioGrapher::Sink<T> > init (FileSpec const & new_config);
void add_child (FileSpec const & new_config);
+ void remove_children ();
+ void destroy_writer (bool delete_out_file);
bool operator== (FileSpec const & other_config) const;
static int get_real_format (FileSpec const & config);
- private:
+ private:
typedef boost::shared_ptr<AudioGrapher::SndfileWriter<Sample> > FloatWriterPtr;
typedef boost::shared_ptr<AudioGrapher::SndfileWriter<int> > IntWriterPtr;
typedef boost::shared_ptr<AudioGrapher::SndfileWriter<short> > ShortWriterPtr;
@@ -95,6 +98,8 @@ class LIBARDOUR_API ExportGraphBuilder
std::list<ExportFilenamePtr> filenames;
PBD::ScopedConnection copy_files_connection;
+ std::string writer_filename;
+
// Only one of these should be available at a time
FloatWriterPtr float_writer;
IntWriterPtr int_writer;
@@ -103,14 +108,15 @@ class LIBARDOUR_API ExportGraphBuilder
// sample format converter
class SFC {
- public:
+ public:
// This constructor so that this can be constructed like a Normalizer
SFC (ExportGraphBuilder &, FileSpec const & new_config, framecnt_t max_frames);
FloatSinkPtr sink ();
void add_child (FileSpec const & new_config);
+ void remove_children (bool remove_out_files);
bool operator== (FileSpec const & other_config) const;
- private:
+ private:
typedef boost::shared_ptr<AudioGrapher::SampleFormatConverter<Sample> > FloatConverterPtr;
typedef boost::shared_ptr<AudioGrapher::SampleFormatConverter<int> > IntConverterPtr;
typedef boost::shared_ptr<AudioGrapher::SampleFormatConverter<short> > ShortConverterPtr;
@@ -126,10 +132,11 @@ class LIBARDOUR_API ExportGraphBuilder
};
class Normalizer {
- public:
+ public:
Normalizer (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t max_frames);
FloatSinkPtr sink ();
void add_child (FileSpec const & new_config);
+ void remove_children (bool remove_out_files);
bool operator== (FileSpec const & other_config) const;
unsigned get_normalize_cycle_count() const;
@@ -137,7 +144,7 @@ class LIBARDOUR_API ExportGraphBuilder
/// Returns true when finished
bool process ();
- private:
+ private:
typedef boost::shared_ptr<AudioGrapher::PeakReader> PeakReaderPtr;
typedef boost::shared_ptr<AudioGrapher::Normalizer> NormalizerPtr;
typedef boost::shared_ptr<AudioGrapher::TmpFile<Sample> > TmpFilePtr;
@@ -163,13 +170,15 @@ class LIBARDOUR_API ExportGraphBuilder
// sample rate converter
class SRC {
- public:
+ public:
SRC (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t max_frames);
FloatSinkPtr sink ();
void add_child (FileSpec const & new_config);
+ void remove_children (bool remove_out_files);
+
bool operator== (FileSpec const & other_config) const;
- private:
+ private:
typedef boost::shared_ptr<AudioGrapher::SampleRateConverter> SRConverterPtr;
template<typename T>
@@ -185,13 +194,14 @@ class LIBARDOUR_API ExportGraphBuilder
// Silence trimmer + adder
class SilenceHandler {
- public:
+ public:
SilenceHandler (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t max_frames);
FloatSinkPtr sink ();
void add_child (FileSpec const & new_config);
+ void remove_children (bool remove_out_files);
bool operator== (FileSpec const & other_config) const;
- private:
+ private:
typedef boost::shared_ptr<AudioGrapher::SilenceTrimmer<Sample> > SilenceTrimmerPtr;
ExportGraphBuilder & parent;
@@ -203,12 +213,13 @@ class LIBARDOUR_API ExportGraphBuilder
// channel configuration
class ChannelConfig {
- public:
+ public:
ChannelConfig (ExportGraphBuilder & parent, FileSpec const & new_config, ChannelMap & channel_map);
void add_child (FileSpec const & new_config);
+ void remove_children (bool remove_out_files);
bool operator== (FileSpec const & other_config) const;
- private:
+ private:
typedef boost::shared_ptr<AudioGrapher::Interleaver<Sample> > InterleaverPtr;
typedef boost::shared_ptr<AudioGrapher::Chunker<Sample> > ChunkerPtr;
diff --git a/libs/ardour/ardour/filter.h b/libs/ardour/ardour/filter.h
index 2b6476c..e80d1fc 100644
--- a/libs/ardour/ardour/filter.h
+++ b/libs/ardour/ardour/filter.h
@@ -43,7 +43,7 @@ class LIBARDOUR_API Filter {
protected:
Filter (ARDOUR::Session& s) : session(s) {}
- int make_new_sources (boost::shared_ptr<ARDOUR::Region>, ARDOUR::SourceList&, std::string suffix = "");
+ int make_new_sources (boost::shared_ptr<ARDOUR::Region>, ARDOUR::SourceList&, std::string suffix = "", bool use_session_sample_rate = true);
int finish (boost::shared_ptr<ARDOUR::Region>, ARDOUR::SourceList&, std::string region_name = "");
ARDOUR::Session& session;
diff --git a/libs/ardour/ardour/location.h b/libs/ardour/ardour/location.h
index f809dbf..6b1f89d 100644
--- a/libs/ardour/ardour/location.h
+++ b/libs/ardour/ardour/location.h
@@ -62,7 +62,7 @@ class LIBARDOUR_API Location : public SessionHandleRef, public PBD::StatefulDest
Location (Session &, const XMLNode&);
Location* operator= (const Location& other);
- bool operator==(const Location& other);
+ bool operator==(const Location& other);
bool locked() const { return _locked; }
void lock ();
@@ -86,8 +86,8 @@ class LIBARDOUR_API Location : public SessionHandleRef, public PBD::StatefulDest
void set_hidden (bool yn, void *src);
void set_cd (bool yn, void *src);
void set_is_range_marker (bool yn, void* src);
- void set_skip (bool yn);
- void set_skipping (bool yn);
+ void set_skip (bool yn);
+ void set_skipping (bool yn);
bool is_auto_punch () const { return _flags & IsAutoPunch; }
bool is_auto_loop () const { return _flags & IsAutoLoop; }
@@ -105,28 +105,29 @@ class LIBARDOUR_API Location : public SessionHandleRef, public PBD::StatefulDest
boost::shared_ptr<SceneChange> scene_change() const { return _scene_change; }
void set_scene_change (boost::shared_ptr<SceneChange>);
- /* these are static signals for objects that want to listen to all
- locations at once.
- */
+ /* these are static signals for objects that want to listen to all
+ locations at once.
+ */
static PBD::Signal1<void,Location*> name_changed;
static PBD::Signal1<void,Location*> end_changed;
static PBD::Signal1<void,Location*> start_changed;
static PBD::Signal1<void,Location*> flags_changed;
- static PBD::Signal1<void,Location*> lock_changed;
+ static PBD::Signal1<void,Location*> lock_changed;
static PBD::Signal1<void,Location*> position_lock_style_changed;
/* this is sent only when both start and end change at the same time */
static PBD::Signal1<void,Location*> changed;
- /* these are member signals for objects that care only about
- changes to this object
- */
+ /* these are member signals for objects that care only about
+ changes to this object
+ */
+ PBD::Signal0<void> Changed;
+
PBD::Signal0<void> NameChanged;
PBD::Signal0<void> EndChanged;
PBD::Signal0<void> StartChanged;
- PBD::Signal0<void> Changed;
PBD::Signal0<void> FlagsChanged;
PBD::Signal0<void> LockChanged;
PBD::Signal0<void> PositionLockStyleChanged;
@@ -143,8 +144,9 @@ class LIBARDOUR_API Location : public SessionHandleRef, public PBD::StatefulDest
void set_position_lock_style (PositionLockStyle ps);
void recompute_frames_from_bbt ();
- static PBD::Signal0<void> scene_changed;
-
+ static PBD::Signal0<void> scene_changed; /* for use by backend scene change management, class level */
+ PBD::Signal0<void> SceneChangeChanged; /* for use by objects interested in this object */
+
private:
std::string _name;
framepos_t _start;
@@ -155,7 +157,7 @@ class LIBARDOUR_API Location : public SessionHandleRef, public PBD::StatefulDest
bool _locked;
PositionLockStyle _position_lock_style;
boost::shared_ptr<SceneChange> _scene_change;
-
+
void set_mark (bool yn);
bool set_flag_internal (bool yn, Flags flag);
void recompute_bbt_from_frames ();
@@ -193,32 +195,32 @@ class LIBARDOUR_API Locations : public SessionHandleRef, public PBD::StatefulDes
Location* mark_at (framepos_t, framecnt_t slop = 0) const;
- framepos_t first_mark_before (framepos_t, bool include_special_ranges = false);
+ framepos_t first_mark_before (framepos_t, bool include_special_ranges = false);
framepos_t first_mark_after (framepos_t, bool include_special_ranges = false);
void marks_either_side (framepos_t const, framepos_t &, framepos_t &) const;
void find_all_between (framepos_t start, framepos_t, LocationList&, Location::Flags);
-
+
PBD::Signal1<void,Location*> current_changed;
- /* Objects that care about individual addition and removal of Locations should connect to added/removed.
- If an object additionally cares about potential mass clearance of Locations, they should connect to changed.
- */
+ /* Objects that care about individual addition and removal of Locations should connect to added/removed.
+ If an object additionally cares about potential mass clearance of Locations, they should connect to changed.
+ */
PBD::Signal1<void,Location*> added;
PBD::Signal1<void,Location*> removed;
PBD::Signal0<void> changed; /* emitted when any action that could have added/removed more than 1 location actually removed 1 or more */
template<class T> void apply (T& obj, void (T::*method)(const LocationList&)) const {
- /* We don't want to hold the lock while the given method runs, so take a copy
- of the list and pass that instead.
- */
- Locations::LocationList copy;
- {
- Glib::Threads::Mutex::Lock lm (lock);
- copy = locations;
- }
+ /* We don't want to hold the lock while the given method runs, so take a copy
+ of the list and pass that instead.
+ */
+ Locations::LocationList copy;
+ {
+ Glib::Threads::Mutex::Lock lm (lock);
+ copy = locations;
+ }
(obj.*method)(copy);
}
diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h
index 21b7fde..0a83ffe 100644
--- a/libs/ardour/ardour/lv2_plugin.h
+++ b/libs/ardour/ardour/lv2_plugin.h
@@ -240,7 +240,6 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
LV2_Feature _def_state_feature;
// Options passed to plugin
- int32_t _block_length;
int32_t _seq_size;
mutable unsigned _state_version;
diff --git a/libs/ardour/ardour/midi_diskstream.h b/libs/ardour/ardour/midi_diskstream.h
index 6610708..dac262e 100644
--- a/libs/ardour/ardour/midi_diskstream.h
+++ b/libs/ardour/ardour/midi_diskstream.h
@@ -128,10 +128,10 @@ class LIBARDOUR_API MidiDiskstream : public Diskstream
protected:
friend class MidiTrack;
friend class Auditioner;
- int seek (framepos_t which_sample, bool complete_refill = false);
+ int seek (framepos_t which_sample, bool complete_refill = false);
+ int _do_refill_with_alloc (bool one_chunk_only);
int process (BufferSet&, framepos_t transport_frame, pframes_t nframes, framecnt_t &, bool need_diskstream);
-
frameoffset_t calculate_playback_distance (pframes_t nframes);
bool commit (framecnt_t nframes);
@@ -143,8 +143,6 @@ class LIBARDOUR_API MidiDiskstream : public Diskstream
int do_flush (RunContext context, bool force = false);
int do_refill ();
- int do_refill_with_alloc();
-
int read (framepos_t& start, framecnt_t cnt, bool reversed);
void finish_capture ();
diff --git a/libs/ardour/ardour/midiport_manager.h b/libs/ardour/ardour/midiport_manager.h
index 5e87238..4d6453b 100644
--- a/libs/ardour/ardour/midiport_manager.h
+++ b/libs/ardour/ardour/midiport_manager.h
@@ -60,6 +60,9 @@ class LIBARDOUR_API MidiPortManager {
MIDI::Port* scene_input_port () const { return _scene_input_port; }
MIDI::Port* scene_output_port () const { return _scene_output_port; }
+ boost::shared_ptr<MidiPort> mmc_in() const { return boost::dynamic_pointer_cast<MidiPort>(_mmc_in); }
+ boost::shared_ptr<MidiPort> mmc_out() const { return boost::dynamic_pointer_cast<MidiPort>(_mmc_out); }
+
boost::shared_ptr<MidiPort> scene_in() const { return boost::dynamic_pointer_cast<MidiPort>(_scene_in); }
boost::shared_ptr<MidiPort> scene_out() const { return boost::dynamic_pointer_cast<MidiPort>(_scene_out); }
diff --git a/libs/ardour/ardour/mix.h b/libs/ardour/ardour/mix.h
index 3cd9a3e..4676c01 100644
--- a/libs/ardour/ardour/mix.h
+++ b/libs/ardour/ardour/mix.h
@@ -27,13 +27,23 @@
extern "C" {
/* SSE functions */
- LIBARDOUR_API float x86_sse_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current);
- LIBARDOUR_API void x86_sse_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain);
- LIBARDOUR_API void x86_sse_mix_buffers_with_gain(ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain);
- LIBARDOUR_API void x86_sse_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes);
+ LIBARDOUR_API float x86_sse_compute_peak (const float * buf, uint32_t nsamples, float current);
+ LIBARDOUR_API void x86_sse_apply_gain_to_buffer (float * buf, uint32_t nframes, float gain);
+ LIBARDOUR_API void x86_sse_mix_buffers_with_gain(float * dst, const float * src, uint32_t nframes, float gain);
+ LIBARDOUR_API void x86_sse_mix_buffers_no_gain (float * dst, const float * src, uint32_t nframes);
}
-LIBARDOUR_API void x86_sse_find_peaks (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float *min, float *max);
+extern "C" {
+/* AVX functions */
+ LIBARDOUR_API float x86_sse_avx_compute_peak (const float * buf, uint32_t nsamples, float current);
+ LIBARDOUR_API void x86_sse_avx_apply_gain_to_buffer (float * buf, uint32_t nframes, float gain);
+ LIBARDOUR_API void x86_sse_avx_mix_buffers_with_gain(float * dst, const float * src, uint32_t nframes, float gain);
+ LIBARDOUR_API void x86_sse_avx_mix_buffers_no_gain (float * dst, const float * src, uint32_t nframes);
+ LIBARDOUR_API void x86_sse_avx_copy_vector (float * dst, const float * src, uint32_t nframes);
+}
+
+LIBARDOUR_API void x86_sse_find_peaks (const float * buf, uint32_t nsamples, float *min, float *max);
+LIBARDOUR_API void x86_sse_avx_find_peaks (const float * buf, uint32_t nsamples, float *min, float *max);
/* debug wrappers for SSE functions */
@@ -41,6 +51,7 @@ LIBARDOUR_API float debug_compute_peak (const ARDOUR::Sample * buf
LIBARDOUR_API void debug_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain);
LIBARDOUR_API void debug_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain);
LIBARDOUR_API void debug_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes);
+LIBARDOUR_API void debug_copy_vector (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes);
#endif
@@ -61,5 +72,6 @@ LIBARDOUR_API void default_find_peaks (const ARDOUR::Sample * bu
LIBARDOUR_API void default_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain);
LIBARDOUR_API void default_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain);
LIBARDOUR_API void default_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes);
+LIBARDOUR_API void default_copy_vector (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes);
#endif /* __ardour_mix_h__ */
diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h
index e01f56d..f9578a1 100644
--- a/libs/ardour/ardour/plugin_insert.h
+++ b/libs/ardour/ardour/plugin_insert.h
@@ -53,6 +53,7 @@ class LIBARDOUR_API PluginInsert : public Processor
XMLNode& state(bool);
XMLNode& get_state(void);
int set_state(const XMLNode&, int version);
+ void update_id (PBD::ID);
void run (BufferSet& in, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
void silence (framecnt_t nframes);
@@ -141,6 +142,8 @@ class LIBARDOUR_API PluginInsert : public Processor
return _match.method == Split;
}
+ void configured_io (ChanCount &in, ChanCount &out) { in = _configured_in; out = _configured_out; }
+
PBD::Signal2<void,BufferSet*, BufferSet*> AnalysisDataGathered;
PBD::Signal0<void> PluginIoReConfigure;
@@ -181,6 +184,9 @@ class LIBARDOUR_API PluginInsert : public Processor
ChanCount midi_bypass;
+ ChanCount _configured_in;
+ ChanCount _configured_out;
+
/** Description of how we can match our plugin's IO to our own insert IO */
struct Match {
Match () : method (Impossible), plugins (0) {}
diff --git a/libs/ardour/ardour/plugin_manager.h b/libs/ardour/ardour/plugin_manager.h
index 3a6a210..663bb92 100644
--- a/libs/ardour/ardour/plugin_manager.h
+++ b/libs/ardour/ardour/plugin_manager.h
@@ -144,6 +144,8 @@ class LIBARDOUR_API PluginManager : public boost::noncopyable {
std::string get_ladspa_category (uint32_t id);
std::vector<uint32_t> ladspa_plugin_whitelist;
+ Glib::Threads::Mutex _lock;
+
static PluginManager* _instance; // singleton
PluginManager ();
};
diff --git a/libs/ardour/ardour/port_insert.h b/libs/ardour/ardour/port_insert.h
index 3270809..54d8583 100644
--- a/libs/ardour/ardour/port_insert.h
+++ b/libs/ardour/ardour/port_insert.h
@@ -64,6 +64,8 @@ class LIBARDOUR_API PortInsert : public IOProcessor
void activate ();
void deactivate ();
+ void set_pre_fader (bool);
+
uint32_t bit_slot() const { return _bitslot; }
void start_latency_detection ();
diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h
index fa75876..c7d3608 100644
--- a/libs/ardour/ardour/processor.h
+++ b/libs/ardour/ardour/processor.h
@@ -107,7 +107,7 @@ class LIBARDOUR_API Processor : public SessionObject, public Automatable, public
XMLNode& get_state (void);
int set_state (const XMLNode&, int version);
- void set_pre_fader (bool);
+ virtual void set_pre_fader (bool);
PBD::Signal0<void> ActiveChanged;
PBD::Signal2<void,ChanCount,ChanCount> ConfigurationChanged;
diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h
index 52c3309..afa7432 100644
--- a/libs/ardour/ardour/rc_configuration_vars.h
+++ b/libs/ardour/ardour/rc_configuration_vars.h
@@ -29,15 +29,21 @@
DO dump the config using cfgtool to system_config
after modifying this file.
- ./waf && build/cfgtool/cfgtool system_config
+ ./waf && gtk2_ardour/arcfg system_config
*****************************************************/
/* IO connection */
CONFIG_VARIABLE (bool, auto_connect_standard_busses, "auto-connect-standard-busses", true)
+/* this variable is used to indicate output mode in Waves Tracks:
+ "Multi Out" == AutoConnectPhysical and "Stereo Out" == AutoConnectMaster
+*/
CONFIG_VARIABLE (AutoConnectOption, output_auto_connect, "output-auto-connect", AutoConnectMaster)
CONFIG_VARIABLE (AutoConnectOption, input_auto_connect, "input-auto-connect", AutoConnectPhysical)
+/* Naming */
+CONFIG_VARIABLE (TracksAutoNamingRule, tracks_auto_naming, "tracks-auto-naming", UseDefaultNames)
+
/* MIDI and MIDI related */
CONFIG_VARIABLE (bool, trace_midi_input, "trace-midi-input", false)
@@ -51,15 +57,23 @@ CONFIG_VARIABLE (int32_t, mmc_receive_device_id, "mmc-receive-device-id", 0x7f)
CONFIG_VARIABLE (int32_t, mmc_send_device_id, "mmc-send-device-id", 0)
CONFIG_VARIABLE (int32_t, initial_program_change, "initial-program-change", -1)
CONFIG_VARIABLE (bool, first_midi_bank_is_zero, "display-first-midi-bank-as-zero", false)
-CONFIG_VARIABLE (int32_t, inter_scene_gap_msecs, "inter-scene-gap-msecs", 1)
+CONFIG_VARIABLE (int32_t, inter_scene_gap_frames, "inter-scene-gap-frames", 1)
/* Timecode and related */
CONFIG_VARIABLE (int, mtc_qf_speed_tolerance, "mtc-qf-speed-tolerance", 5)
CONFIG_VARIABLE (bool, timecode_sync_frame_rate, "timecode-sync-frame-rate", true)
+#ifdef USE_TRACKS_CODE_FEATURES
+CONFIG_VARIABLE (bool, timecode_source_is_synced, "timecode-source-is-synced", true)
+#else
CONFIG_VARIABLE (bool, timecode_source_is_synced, "timecode-source-is-synced", false)
+#endif
CONFIG_VARIABLE (bool, timecode_source_2997, "timecode-source-2997", false)
+#ifdef USE_TRACKS_CODE_FEATURES
+CONFIG_VARIABLE (SyncSource, sync_source, "sync-source", MTC)
+#else
CONFIG_VARIABLE (SyncSource, sync_source, "sync-source", Engine)
+#endif
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)
@@ -77,6 +91,7 @@ CONFIG_VARIABLE (RemoteModel, remote_model, "remote-model", MixerOrdered)
CONFIG_VARIABLE (uint32_t, minimum_disk_read_bytes, "minimum-disk-read-bytes", ARDOUR::Diskstream::default_disk_read_chunk_frames() * sizeof (ARDOUR::Sample))
CONFIG_VARIABLE (uint32_t, minimum_disk_write_bytes, "minimum-disk-write-bytes", ARDOUR::Diskstream::default_disk_write_chunk_frames() * sizeof (ARDOUR::Sample))
CONFIG_VARIABLE (float, midi_readahead, "midi-readahead", 1.0)
+CONFIG_VARIABLE (BufferingPreset, buffering_preset, "buffering-preset", Medium)
CONFIG_VARIABLE (float, audio_capture_buffer_seconds, "capture-buffer-seconds", 5.0)
CONFIG_VARIABLE (float, audio_playback_buffer_seconds, "playback-buffer-seconds", 5.0)
CONFIG_VARIABLE (float, midi_track_buffer_seconds, "midi-track-buffer-seconds", 1.0)
@@ -99,7 +114,11 @@ CONFIG_VARIABLE (RegionSelectionAfterSplit, region_selection_after_split, "regio
/* monitoring, mute, solo etc */
+#ifdef USE_TRACKS_CODE_FEATURES
+CONFIG_VARIABLE (bool, mute_affects_pre_fader, "mute-affects-pre-fader", true)
+#else
CONFIG_VARIABLE (bool, mute_affects_pre_fader, "mute-affects-pre-fader", false)
+#endif
CONFIG_VARIABLE (bool, mute_affects_post_fader, "mute-affects-post-fader", true)
CONFIG_VARIABLE (bool, mute_affects_control_outs, "mute-affects-control-outs", true)
CONFIG_VARIABLE (bool, mute_affects_main_outs, "mute-affects-main-outs", true)
@@ -141,20 +160,39 @@ CONFIG_VARIABLE (bool, stop_recording_on_xrun, "stop-recording-on-xrun", false)
CONFIG_VARIABLE (bool, create_xrun_marker, "create-xrun-marker", true)
CONFIG_VARIABLE (bool, stop_at_session_end, "stop-at-session-end", false)
CONFIG_VARIABLE (bool, seamless_loop, "seamless-loop", false)
+#ifdef USE_TRACKS_CODE_FEATURES
+CONFIG_VARIABLE (bool, loop_is_mode, "loop-is-mode", true)
+#else
CONFIG_VARIABLE (bool, loop_is_mode, "loop-is-mode", false)
+#endif
CONFIG_VARIABLE (framecnt_t, preroll, "preroll", 0)
CONFIG_VARIABLE (framecnt_t, postroll, "postroll", 0)
CONFIG_VARIABLE (float, rf_speed, "rf-speed", 2.0f)
-CONFIG_VARIABLE (float, shuttle_speed_factor, "shuttle-speed-factor", 1.0f)
-CONFIG_VARIABLE (float, shuttle_speed_threshold, "shuttle-speed-threshold", 5.0f)
+CONFIG_VARIABLE (float, shuttle_speed_factor, "shuttle-speed-factor", 1.0f) // used for MMC shuttle
+CONFIG_VARIABLE (float, shuttle_speed_threshold, "shuttle-speed-threshold", 5.0f) // used for MMC shuttle
CONFIG_VARIABLE (ShuttleBehaviour, shuttle_behaviour, "shuttle-behaviour", Sprung)
CONFIG_VARIABLE (ShuttleUnits, shuttle_units, "shuttle-units", Percentage)
+CONFIG_VARIABLE (float, shuttle_max_speed, "shuttle-max-speed", 8.0f)
CONFIG_VARIABLE (bool, locate_while_waiting_for_sync, "locate-while-waiting-for-sync", false)
CONFIG_VARIABLE (bool, disable_disarm_during_roll, "disable-disarm-during-roll", false)
+#ifdef USE_TRACKS_CODE_FEATURES
+CONFIG_VARIABLE (AutoReturnTarget, auto_return_target_list, "auto-return-target-list", AutoReturnTarget(LastLocate) )
+#else
+CONFIG_VARIABLE (AutoReturnTarget, auto_return_target_list, "auto-return-target-list", AutoReturnTarget(LastLocate|RangeSelectionStart|Loop|RegionSelectionStart))
+#endif
/* metering */
+#ifdef USE_TRACKS_CODE_FEATURES
+CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 60.0f)
+CONFIG_VARIABLE (MeterType, meter_type_master, "meter-type-master", MeterPeak)
+#else
CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 13.3f)
+CONFIG_VARIABLE (MeterType, meter_type_master, "meter-type-master", MeterK20)
+#endif
+CONFIG_VARIABLE (MeterType, meter_type_track, "meter-type-track", MeterPeak)
+CONFIG_VARIABLE (MeterType, meter_type_bus, "meter-type-bus", MeterPeak)
+
/* miscellany */
@@ -170,11 +208,18 @@ CONFIG_VARIABLE (bool, use_overlap_equivalency, "use-overlap-equivalency", false
CONFIG_VARIABLE (bool, periodic_safety_backups, "periodic-safety-backups", true)
CONFIG_VARIABLE (uint32_t, periodic_safety_backup_interval, "periodic-safety-backup-interval", 120)
CONFIG_VARIABLE (float, automation_interval_msecs, "automation-interval-msecs", 30)
-CONFIG_VARIABLE (std::string, default_session_parent_dir, "default-session-parent-dir", "~")
+#ifdef __APPLE__
+CONFIG_VARIABLE_SPECIAL (std::string, default_session_parent_dir, "default-session-parent-dir", "~/Music", poor_mans_glob)
+#elif defined (PLATFORM_WINDOWS)
+CONFIG_VARIABLE_SPECIAL (std::string, default_session_parent_dir, "default-session-parent-dir", "~\\Documents", poor_mans_glob)
+#else
+CONFIG_VARIABLE_SPECIAL (std::string, default_session_parent_dir, "default-session-parent-dir", "~", poor_mans_glob)
+#endif
CONFIG_VARIABLE (bool, allow_special_bus_removal, "allow-special-bus-removal", false)
CONFIG_VARIABLE (int32_t, processor_usage, "processor-usage", -1)
CONFIG_VARIABLE (gain_t, max_gain, "max-gain", 2.0) /* +6.0dB */
CONFIG_VARIABLE (uint32_t, max_recent_sessions, "max-recent-sessions", 10)
+CONFIG_VARIABLE (uint32_t, max_recent_templates, "max-recent-templates", 10)
CONFIG_VARIABLE (double, automation_thinning_factor, "automation-thinning-factor", 20.0)
CONFIG_VARIABLE (std::string, freesound_download_dir, "freesound-download-dir", Glib::get_home_dir() + "/Freesound/snd")
CONFIG_VARIABLE (framecnt_t, range_location_minimum, "range-location-minimum", 128) /* samples */
@@ -187,6 +232,7 @@ CONFIG_VARIABLE (bool, use_plugin_own_gui, "use-plugin-own-gui", true)
CONFIG_VARIABLE (bool, use_windows_vst, "use-windows-vst", true)
CONFIG_VARIABLE (bool, use_lxvst, "use-lxvst", true)
CONFIG_VARIABLE (bool, discover_vst_on_start, "discover-vst-on-start", false)
+CONFIG_VARIABLE (bool, verbose_plugin_scan, "verbose-plugin-scan", true)
CONFIG_VARIABLE (int, vst_scan_timeout, "vst-scan-timeout", 600) /* deciseconds, per plugin, <= 0 no timeout */
CONFIG_VARIABLE (bool, discover_audio_units, "discover-audio-units", false)
@@ -206,14 +252,15 @@ CONFIG_VARIABLE (DenormalModel, denormal_model, "denormal-model", DenormalFTZDAZ
CONFIG_VARIABLE (std::string, osx_pingback_url, "osx-pingback-url", "http://community.ardour.org/pingback/osx/")
CONFIG_VARIABLE (std::string, linux_pingback_url, "linux-pingback-url", "http://community.ardour.org/pingback/linux/")
-CONFIG_VARIABLE (std::string, tutorial_manual_url, "tutorial-manual-url", "http://ardour.org/flossmanual")
+CONFIG_VARIABLE (std::string, windows_pingback_url, "windows-pingback-url", "http://community.ardour.org/pingback/windows/")
+CONFIG_VARIABLE (std::string, tutorial_manual_url, "tutorial-manual-url", "http://ardour.org/tutorial")
CONFIG_VARIABLE (std::string, reference_manual_url, "reference-manual-url", "http://manual.ardour.org/")
CONFIG_VARIABLE (std::string, updates_url, "updates-url", "http://ardour.org/whatsnew.html")
CONFIG_VARIABLE (std::string, donate_url, "donate-url", "http://ardour.org/donate")
/* video timeline configuration */
CONFIG_VARIABLE (bool, video_advanced_setup, "video-advanced-setup", false)
-CONFIG_VARIABLE (std::string, video_server_url, "video-server-url", "http://localhost:1554")
+CONFIG_VARIABLE (std::string, video_server_url, "video-server-url", "http://127.0.0.1:1554")
#ifndef PLATFORM_WINDOWS
CONFIG_VARIABLE (std::string, video_server_docroot, "video-server-docroot", "/")
#else
diff --git a/libs/ardour/ardour/recent_sessions.h b/libs/ardour/ardour/recent_sessions.h
index 03134da..7c4158c 100644
--- a/libs/ardour/ardour/recent_sessions.h
+++ b/libs/ardour/ardour/recent_sessions.h
@@ -30,8 +30,11 @@ namespace ARDOUR {
typedef std::deque<std::pair<std::string,std::string> > RecentSessions;
LIBARDOUR_API int read_recent_sessions (RecentSessions& rs);
+ LIBARDOUR_API int read_recent_templates (std::deque<std::string>& rt);
LIBARDOUR_API int store_recent_sessions (std::string name, std::string path);
+ LIBARDOUR_API int store_recent_templates (const std::string& session_template_full_name);
LIBARDOUR_API int write_recent_sessions (RecentSessions& rs);
+ LIBARDOUR_API int write_recent_templates (std::deque<std::string>& rt);
LIBARDOUR_API int remove_recent_sessions (const std::string& path);
}; // namespace ARDOUR
diff --git a/libs/ardour/ardour/resampled_source.h b/libs/ardour/ardour/resampled_source.h
index bb088f3..0c90581 100644
--- a/libs/ardour/ardour/resampled_source.h
+++ b/libs/ardour/ardour/resampled_source.h
@@ -36,7 +36,7 @@ class LIBARDOUR_API ResampledImportableSource : public ImportableSource
~ResampledImportableSource ();
framecnt_t read (Sample* buffer, framecnt_t nframes);
- float ratio() const { return src_data.src_ratio; }
+ float ratio() const { return _src_data.src_ratio; }
uint32_t channels() const { return source->channels(); }
framecnt_t length() const { return source->length(); }
framecnt_t samplerate() const { return source->samplerate(); }
@@ -52,10 +52,11 @@ class LIBARDOUR_API ResampledImportableSource : public ImportableSource
private:
boost::shared_ptr<ImportableSource> source;
- float* input;
- int _src_type;
- SRC_STATE* src_state;
- SRC_DATA src_data;
+ float* _input;
+ int _src_type;
+ SRC_STATE* _src_state;
+ SRC_DATA _src_data;
+ bool _end_of_input;
};
}
diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h
index cce1e15..64e40e1 100644
--- a/libs/ardour/ardour/route.h
+++ b/libs/ardour/ardour/route.h
@@ -546,8 +546,11 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
bool _self_solo;
uint32_t _soloed_by_others_upstream;
uint32_t _soloed_by_others_downstream;
- uint32_t _solo_isolated;
+ bool _solo_isolated;
+ uint32_t _solo_isolated_by_upstream;
+ void mod_solo_isolated_by_upstream (bool, void*);
+
bool _denormal_protection;
bool _recordable : 1;
diff --git a/libs/ardour/ardour/runtime_functions.h b/libs/ardour/ardour/runtime_functions.h
index e1d6b99..45d6ec7 100644
--- a/libs/ardour/ardour/runtime_functions.h
+++ b/libs/ardour/ardour/runtime_functions.h
@@ -25,17 +25,19 @@
namespace ARDOUR {
- typedef float (*compute_peak_t) (const ARDOUR::Sample *, pframes_t, float);
- typedef void (*find_peaks_t) (const ARDOUR::Sample *, pframes_t, float *, float*);
+ typedef float (*compute_peak_t) (const ARDOUR::Sample *, pframes_t, float);
+ typedef void (*find_peaks_t) (const ARDOUR::Sample *, pframes_t, float *, float*);
typedef void (*apply_gain_to_buffer_t) (ARDOUR::Sample *, pframes_t, float);
typedef void (*mix_buffers_with_gain_t) (ARDOUR::Sample *, const ARDOUR::Sample *, pframes_t, float);
typedef void (*mix_buffers_no_gain_t) (ARDOUR::Sample *, const ARDOUR::Sample *, pframes_t);
+ typedef void (*copy_vector_t) (ARDOUR::Sample *, const ARDOUR::Sample *, pframes_t);
LIBARDOUR_API extern compute_peak_t compute_peak;
LIBARDOUR_API extern find_peaks_t find_peaks;
LIBARDOUR_API extern apply_gain_to_buffer_t apply_gain_to_buffer;
LIBARDOUR_API extern mix_buffers_with_gain_t mix_buffers_with_gain;
LIBARDOUR_API extern mix_buffers_no_gain_t mix_buffers_no_gain;
+ LIBARDOUR_API extern copy_vector_t copy_vector;
}
#endif /* __ardour_runtime_functions_h__ */
diff --git a/libs/ardour/ardour/scene_change.h b/libs/ardour/ardour/scene_change.h
index ee71198..661d223 100644
--- a/libs/ardour/ardour/scene_change.h
+++ b/libs/ardour/ardour/scene_change.h
@@ -36,17 +36,21 @@ class SceneChange : public PBD::Stateful
static boost::shared_ptr<SceneChange> factory (const XMLNode&, int version);
static std::string xml_node_name;
- uint32_t color() const;
- void set_color (uint32_t);
- bool color_out_of_bounds() const { return _color == out_of_bound_color; }
- static const uint32_t out_of_bound_color;
-
- PBD::Signal0<void> ColorChanged;
+ uint32_t color() const;
+ void set_color (uint32_t);
+ bool color_out_of_bounds() const { return _color == out_of_bound_color; }
+ static const uint32_t out_of_bound_color;
-protected:
- /* derived classes are responsible for serializing & deserializing this value */
- uint32_t _color;
+ bool active () const { return _active; }
+ void set_active (bool);
+
+ PBD::Signal0<void> ColorChanged;
+ PBD::Signal0<void> ActiveChanged;
+ protected:
+ /* derived classes are responsible for serializing & deserializing this value */
+ uint32_t _color;
+ bool _active;
};
} /* namespace */
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index bbc8293..5517f0e 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -176,9 +176,14 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
bool dirty() const { return _state_of_the_state & Dirty; }
void set_deletion_in_progress ();
void clear_deletion_in_progress ();
+ bool reconnection_in_progress() const { return _reconnecting_routes_in_progress; }
bool deletion_in_progress() const { return _state_of_the_state & Deletion; }
+ bool routes_deletion_in_progress() const { return _route_deletion_in_progress; }
+
PBD::Signal0<void> DirtyChanged;
+ PBD::Signal1<void, bool> RouteAddedOrRemoved;
+
const SessionDirectory& session_directory () const { return *(_session_dir.get()); }
static PBD::Signal1<void,std::string> Dialog;
@@ -214,6 +219,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO);
bool have_rec_enabled_track () const;
+ bool have_rec_disabled_track () const;
bool have_captured() const { return _have_captured; }
@@ -292,9 +298,20 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
PBD::Signal0<void> IOConnectionsComplete;
+ /* Timecode status signals */
+ PBD::Signal1<void, bool> MTCSyncStateChanged;
+ PBD::Signal1<void, bool> LTCSyncStateChanged;
+
/* Record status signals */
- PBD::Signal0<void> RecordStateChanged;
+ PBD::Signal0<void> RecordStateChanged; /* signals changes in recording state (i.e. are we recording) */
+ /* XXX may 2015: paul says: it isn't clear to me that this has semantics that cannot be inferrred
+ from the previous signal and session state.
+ */
+ PBD::Signal0<void> RecordArmStateChanged; /* signals changes in recording arming */
+
+ /* Emited when session is loaded */
+ PBD::Signal0<void> SessionLoaded;
/* Transport mechanism signals */
@@ -331,6 +348,9 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
/* Step Editing status changed */
PBD::Signal1<void,bool> StepEditStatusChange;
+ /* Timecode state signals */
+ PBD::Signal0<void> MtcOrLtcInputPortChanged;
+
void queue_event (SessionEvent*);
void request_roll_at_and_return (framepos_t start, framepos_t return_to);
@@ -539,13 +559,17 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
RouteGroup* route_group = 0, uint32_t how_many = 1, std::string name_template = ""
);
- void remove_route (boost::shared_ptr<Route>);
- void resort_routes ();
- void resort_routes_using (boost::shared_ptr<RouteList>);
+ void remove_routes (boost::shared_ptr<RouteList>);
+ void remove_route (boost::shared_ptr<Route>);
+
+ void resort_routes ();
+ void resort_routes_using (boost::shared_ptr<RouteList>);
AudioEngine & engine() { return _engine; }
AudioEngine const & engine () const { return _engine; }
+ static std::string default_track_name_pattern (DataType);
+
/* Time */
framepos_t transport_frame () const {return _transport_frame; }
@@ -586,7 +610,9 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void request_sync_source (Slave*);
bool synced_to_engine() const { return _slave && config.get_external_sync() && Config->get_sync_source() == Engine; }
-
+ bool synced_to_mtc () const { return config.get_external_sync() && Config->get_sync_source() == MTC && g_atomic_int_get (const_cast<gint*>(&_mtc_active)); }
+ bool synced_to_ltc () const { return config.get_external_sync() && Config->get_sync_source() == LTC && g_atomic_int_get (const_cast<gint*>(&_ltc_active)); }
+
double transport_speed() const { return _transport_speed; }
bool transport_stopped() const { return _transport_speed == 0.0f; }
bool transport_rolling() const { return _transport_speed != 0.0f; }
@@ -709,6 +735,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
PBD::Signal0<void> SoloChanged;
PBD::Signal0<void> IsolatedChanged;
+ PBD::Signal0<void> session_routes_reconnected;
+
/* monitor/master out */
void add_monitor_section ();
@@ -824,6 +852,14 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void maybe_update_session_range (framepos_t, framepos_t);
+ /* temporary hacks to allow selection to be pushed from GUI into backend.
+ Whenever we move the selection object into libardour, these will go away.
+ */
+ void set_range_selection (framepos_t start, framepos_t end);
+ void set_object_selection (framepos_t start, framepos_t end);
+ void clear_range_selection ();
+ void clear_object_selection ();
+
/* buffers for gain and pan */
gain_t* gain_automation_buffer () const;
@@ -979,6 +1015,13 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
MIDI::MachineControl& mmc() { return *_mmc; }
+ void reconnect_midi_scene_ports (bool);
+ void reconnect_mtc_ports ();
+ void reconnect_mmc_ports (bool);
+
+ void reconnect_ltc_input ();
+ void reconnect_ltc_output ();
+
protected:
friend class AudioEngine;
void set_block_size (pframes_t nframes);
@@ -1050,6 +1093,11 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
bool _under_nsm_control;
unsigned int _xrun_count;
+ void mtc_status_changed (bool);
+ PBD::ScopedConnection mtc_status_connection;
+ void ltc_status_changed (bool);
+ PBD::ScopedConnection ltc_status_connection;
+
void initialize_latencies ();
void set_worst_io_latencies ();
void set_worst_playback_latency ();
@@ -1087,6 +1135,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
bool have_first_delta_accumulator;
SlaveState _slave_state;
+ gint _mtc_active;
+ gint _ltc_active;
framepos_t slave_wait_end;
void reset_slave_state ();
@@ -1229,7 +1279,6 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void update_skips (Location*, bool consolidate);
void update_marks (Location* loc);
- void update_loop (Location* loc);
void consolidate_skips (Location*);
void sync_locations_to_skips ();
void _sync_locations_to_skips ();
@@ -1251,6 +1300,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
int post_engine_init ();
int immediately_post_engine ();
void remove_empty_sounds ();
+
+ void session_loaded ();
void setup_midi_control ();
int midi_read (MIDI::Port *);
@@ -1413,6 +1464,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void engine_halted ();
void xrun_recovery ();
void set_track_loop (bool);
+ bool select_playhead_priority_target (framepos_t&);
+ void follow_playhead_priority ();
/* These are synchronous and so can only be called from within the process
* cycle
@@ -1440,6 +1493,9 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void add_routes (RouteList&, bool input_auto_connect, bool output_auto_connect, bool save);
void add_routes_inner (RouteList&, bool input_auto_connect, bool output_auto_connect);
bool _adding_routes_in_progress;
+ bool _reconnecting_routes_in_progress;
+ bool _route_deletion_in_progress;
+
uint32_t destructive_index;
boost::shared_ptr<Route> XMLRouteFactory (const XMLNode&, int);
@@ -1447,7 +1503,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void route_processors_changed (RouteProcessorChange);
- bool find_route_name (std::string const &, uint32_t& id, char* name, size_t name_len, bool);
+ bool find_route_name (std::string const &, uint32_t& id, std::string& name, bool);
void count_existing_track_channels (ChanCount& in, ChanCount& out);
void auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
bool with_lock, bool connect_inputs = true,
@@ -1466,6 +1522,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void route_listen_changed (void *src, boost::weak_ptr<Route>);
void route_mute_changed (void *src);
void route_solo_changed (bool self_solo_change, void *src, boost::weak_ptr<Route>);
+ void routes_solo_changed (boost::shared_ptr<RouteList> solo_change_routes);
void route_solo_isolated_changed (void *src, boost::weak_ptr<Route>);
void update_route_solo_state (boost::shared_ptr<RouteList> r = boost::shared_ptr<RouteList>());
@@ -1634,6 +1691,12 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void set_play_range (std::list<AudioRange>&, bool leave_rolling);
void unset_play_range ();
+ /* temporary hacks to allow selection to be pushed from GUI into backend
+ Whenever we move the selection object into libardour, these will go away.
+ */
+ Evoral::Range<framepos_t> _range_selection;
+ Evoral::Range<framepos_t> _object_selection;
+
/* main outs */
uint32_t main_outs;
@@ -1676,8 +1739,9 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
mutable bool have_looped; ///< Used in ::audible_frame(*)
- void update_have_rec_enabled_track ();
+ void update_route_record_state ();
gint _have_rec_enabled_track;
+ gint _have_rec_disabled_track;
static int ask_about_playlist_deletion (boost::shared_ptr<Playlist>);
@@ -1706,7 +1770,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
/** temporary list of Diskstreams used only during load of 2.X sessions */
std::list<boost::shared_ptr<Diskstream> > _diskstreams_2X;
- void add_session_range_location (framepos_t, framepos_t);
+ void set_session_range_location (framepos_t, framepos_t);
void setup_midi_machine_control ();
@@ -1741,9 +1805,6 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
boost::shared_ptr<IO> _ltc_input;
boost::shared_ptr<IO> _ltc_output;
- void reconnect_ltc_input ();
- void reconnect_ltc_output ();
-
/* Scene Changing */
SceneChanger* _scene_changer;
@@ -1759,6 +1820,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void save_as_bring_callback (uint32_t, uint32_t, std::string);
static int get_session_info_from_path (XMLTree& state_tree, const std::string& xmlpath);
+ static const uint32_t session_end_shift;
};
diff --git a/libs/ardour/ardour/session_configuration_vars.h b/libs/ardour/ardour/session_configuration_vars.h
index ec11fc5..823cf5f 100644
--- a/libs/ardour/ardour/session_configuration_vars.h
+++ b/libs/ardour/ardour/session_configuration_vars.h
@@ -27,7 +27,6 @@
CONFIG_VARIABLE (uint32_t, destructive_xfade_msecs, "destructive-xfade-msecs", 2)
CONFIG_VARIABLE (bool, use_region_fades, "use-region-fades", true)
-CONFIG_VARIABLE (bool, show_region_fades, "show-region-fades", true)
CONFIG_VARIABLE (SampleFormat, native_file_data_format, "native-file-data-format", ARDOUR::FormatFloat)
CONFIG_VARIABLE (HeaderFormat, native_file_header_format, "native-file-header-format", ARDOUR::WAVE)
CONFIG_VARIABLE (bool, auto_play, "auto-play", false)
@@ -46,8 +45,6 @@ CONFIG_VARIABLE (std::string, take_name, "take-name", "Take1")
CONFIG_VARIABLE (bool, jack_time_master, "jack-time-master", true)
CONFIG_VARIABLE (bool, use_video_sync, "use-video-sync", false)
CONFIG_VARIABLE (float, video_pullup, "video-pullup", 0.0f)
-CONFIG_VARIABLE (bool, show_summary, "show-summary", true)
-CONFIG_VARIABLE (bool, show_group_tabs, "show-group-tabs", true)
CONFIG_VARIABLE (bool, external_sync, "external-sync", false)
CONFIG_VARIABLE (InsertMergePolicy, insert_merge_policy, "insert-merge-policy", InsertMergeRelax)
CONFIG_VARIABLE (framecnt_t, timecode_offset, "timecode-offset", 0)
@@ -57,6 +54,15 @@ CONFIG_VARIABLE (std::string, timecode_generator_offset, "timecode-generator-off
CONFIG_VARIABLE (bool, glue_new_markers_to_bars_and_beats, "glue-new-markers-to-bars-and-beats", false)
CONFIG_VARIABLE (bool, midi_copy_is_fork, "midi-copy-is-fork", false)
CONFIG_VARIABLE (bool, glue_new_regions_to_bars_and_beats, "glue-new-regions-to-bars-and-beats", false)
+/* These are GUI-only properties and should not be present in this
+ * context. There needs to be a new GUI-level session-scoped configuration
+ * variable header.
+ */
+CONFIG_VARIABLE (double, wave_amplitude_zoom, "wave-amplitude-zoom", 0.0)
+CONFIG_VARIABLE (uint16_t, wave_zoom_factor, "wave-zoom-factor", 2)
+CONFIG_VARIABLE (bool, show_summary, "show-summary", true)
+CONFIG_VARIABLE (bool, show_group_tabs, "show-group-tabs", true)
+CONFIG_VARIABLE (bool, show_region_fades, "show-region-fades", true)
CONFIG_VARIABLE (bool, use_video_file_fps, "use-video-file-fps", false)
CONFIG_VARIABLE (bool, videotimeline_pullup, "videotimeline-pullup", true)
CONFIG_VARIABLE (bool, show_busses_on_meterbridge, "show-busses-on-meterbridge", false)
@@ -68,3 +74,14 @@ CONFIG_VARIABLE (bool, show_solo_on_meterbridge, "show-solo-on-meterbridge", fal
CONFIG_VARIABLE (bool, show_monitor_on_meterbridge, "show-monitor-on-meterbridge", false)
CONFIG_VARIABLE (bool, show_name_on_meterbridge, "show-name-on-meterbridge", true)
CONFIG_VARIABLE (uint32_t, meterbridge_label_height, "meterbridge-label-height", 0)
+
+#ifdef USE_TRACKS_CODE_FEATURES
+/* This variable was not discussed with Ardour developers and is considered
+ weakly conceived. It is also poorly named, since we have "groups" already
+ present in libardour but this variable has nothing to do with it. There
+ should have been more discussion about what was required and the best
+ way to accomplish it.
+*/
+CONFIG_VARIABLE (bool, enable_group_edit, "enable-group-edit", false)
+/* These are GUI-only properties and should not be present in this context */
+#endif
diff --git a/libs/ardour/ardour/session_event.h b/libs/ardour/ardour/session_event.h
index 96145e7..a8c17a1 100644
--- a/libs/ardour/ardour/session_event.h
+++ b/libs/ardour/ardour/session_event.h
@@ -134,6 +134,7 @@ public:
static const framepos_t Immediate = -1;
+ static bool has_per_thread_pool ();
static void create_per_thread_pool (const std::string& n, uint32_t nitems);
static void init_event_pool ();
diff --git a/libs/ardour/ardour/slave.h b/libs/ardour/ardour/slave.h
index 8396a33..bda47ce 100644
--- a/libs/ardour/ardour/slave.h
+++ b/libs/ardour/ardour/slave.h
@@ -237,19 +237,21 @@ struct LIBARDOUR_API SafeTime {
class LIBARDOUR_API TimecodeSlave : public Slave {
public:
- TimecodeSlave () {}
-
- virtual Timecode::TimecodeFormat apparent_timecode_format() const = 0;
-
- /* this is intended to be used by a UI and polled from a timeout. it should
- return a string describing the current position of the TC source. it
- should NOT do any computation, but should use a cached value
- of the TC source position.
- */
- virtual std::string approximate_current_position() const = 0;
-
- framepos_t timecode_offset;
- bool timecode_negative_offset;
+ TimecodeSlave () {}
+
+ virtual Timecode::TimecodeFormat apparent_timecode_format() const = 0;
+
+ /* this is intended to be used by a UI and polled from a timeout. it should
+ return a string describing the current position of the TC source. it
+ should NOT do any computation, but should use a cached value
+ of the TC source position.
+ */
+ virtual std::string approximate_current_position() const = 0;
+
+ framepos_t timecode_offset;
+ bool timecode_negative_offset;
+
+ PBD::Signal1<void, bool> ActiveChanged;
};
class LIBARDOUR_API MTC_Slave : public TimecodeSlave {
diff --git a/libs/ardour/ardour/sndfilesource.h b/libs/ardour/ardour/sndfilesource.h
index 5a4a115..45e049e 100644
--- a/libs/ardour/ardour/sndfilesource.h
+++ b/libs/ardour/ardour/sndfilesource.h
@@ -66,6 +66,7 @@ class LIBARDOUR_API SndFileSource : public AudioFileSource {
bool set_destructive (bool yn);
bool one_of_several_channels () const;
+ uint32_t channel_count () const { return _info.channels; }
bool clamped_at_unity () const;
diff --git a/libs/ardour/ardour/srcfilesource.h b/libs/ardour/ardour/srcfilesource.h
index 073329c..3dc1590 100644
--- a/libs/ardour/ardour/srcfilesource.h
+++ b/libs/ardour/ardour/srcfilesource.h
@@ -63,7 +63,7 @@ protected:
}
private:
- static const uint32_t blocksize;
+ static const uint32_t max_blocksize;
boost::shared_ptr<AudioFileSource> _source;
mutable SRC_STATE* _src_state;
diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h
index 24a3f53..d5ae295 100644
--- a/libs/ardour/ardour/tempo.h
+++ b/libs/ardour/ardour/tempo.h
@@ -323,7 +323,7 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
void change_initial_tempo (double bpm, double note_type);
void insert_time (framepos_t, framecnt_t);
- bool cut_time (framepos_t where, framecnt_t amount); //returns true if anything was moved
+ bool remove_time (framepos_t where, framecnt_t amount); //returns true if anything was moved
int n_tempos () const;
int n_meters () const;
diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h
index b1b4388..17e0b0d 100644
--- a/libs/ardour/ardour/types.h
+++ b/libs/ardour/ardour/types.h
@@ -456,6 +456,11 @@ namespace ARDOUR {
AutoConnectPhysical = 0x1,
AutoConnectMaster = 0x2
};
+
+ enum TracksAutoNamingRule {
+ UseDefaultNames = 0x1,
+ NameAfterDriver = 0x2
+ };
enum SampleFormat {
FormatFloat = 0,
@@ -623,6 +628,20 @@ namespace ARDOUR {
uint32_t max; //< samples
};
+ enum BufferingPreset {
+ Small,
+ Medium,
+ Large,
+ Custom,
+ };
+
+ enum AutoReturnTarget {
+ LastLocate = 0x1,
+ RangeSelectionStart = 0x2,
+ Loop = 0x4,
+ RegionSelectionStart = 0x8,
+ };
+
} // namespace ARDOUR
@@ -632,6 +651,7 @@ namespace ARDOUR {
std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
+std::istream& operator>>(std::istream& o, ARDOUR::TracksAutoNamingRule& sf);
std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
@@ -648,10 +668,14 @@ std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
std::istream& operator>>(std::istream& o, ARDOUR::RegionSelectionAfterSplit& sf);
+std::istream& operator>>(std::istream& o, ARDOUR::BufferingPreset& var);
+std::istream& operator>>(std::istream& o, ARDOUR::AutoReturnTarget& sf);
+std::istream& operator>>(std::istream& o, ARDOUR::MeterType& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::TracksAutoNamingRule& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
@@ -668,7 +692,9 @@ std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::RegionSelectionAfterSplit& sf);
-
+std::ostream& operator<<(std::ostream& o, const ARDOUR::BufferingPreset& var);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoReturnTarget& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterType& sf);
/* because these operators work on types which can be used when making
a UI_CONFIG_VARIABLE (in gtk2_ardour) we need them to be exported.
diff --git a/libs/ardour/ardour/utils.h b/libs/ardour/ardour/utils.h
index 4b71c15..7be3462 100644
--- a/libs/ardour/ardour/utils.h
+++ b/libs/ardour/ardour/utils.h
@@ -63,8 +63,6 @@ LIBARDOUR_API std::string bump_name_number(const std::string& s);
LIBARDOUR_API int cmp_nocase (const std::string& s, const std::string& s2);
LIBARDOUR_API int cmp_nocase_utf8 (const std::string& s1, const std::string& s2);
-LIBARDOUR_API int touch_file(std::string path);
-
LIBARDOUR_API std::string region_name_from_path (std::string path, bool strip_channels, bool add_channel_suffix = false, uint32_t total = 0, uint32_t this_one = 0);
LIBARDOUR_API bool path_is_paired (std::string path, std::string& pair_base);
@@ -161,8 +159,6 @@ LIBARDOUR_API double slider_position_to_gain_with_max (double g, double max_gain
#define METER_FALLOFF_MODERATE 13.3f // EBU-PPM, IRT PPM- 20dB / 1.5 sec
#define METER_FALLOFF_MEDIUM 20.0f
#define METER_FALLOFF_FAST 32.0f
-#define METER_FALLOFF_FASTER 46.0f
-#define METER_FALLOFF_FASTEST 70.0f
LIBARDOUR_API float meter_falloff_to_float (ARDOUR::MeterFalloff);
LIBARDOUR_API ARDOUR::MeterFalloff meter_falloff_from_float (float);
diff --git a/libs/ardour/ardour/vst_info_file.h b/libs/ardour/ardour/vst_info_file.h
index 5e61380..f253ab0 100644
--- a/libs/ardour/ardour/vst_info_file.h
+++ b/libs/ardour/ardour/vst_info_file.h
@@ -25,6 +25,21 @@
#include "ardour/vst_types.h"
#include <vector>
+/* Cache File extensions */
+# if ( defined(__x86_64__) || defined(_M_X64) )
+# define VST_EXT_BLACKLIST ".fsb64"
+#else
+# define VST_EXT_BLACKLIST ".fsb"
+#endif
+
+# if ( defined(__x86_64__) || defined(_M_X64) )
+#define VST_EXT_INFOFILE ".fsi64"
+#define VST_BLACKLIST "vst64_blacklist.txt"
+#else
+#define VST_EXT_INFOFILE ".fsi32"
+#define VST_BLACKLIST "vst32_blacklist.txt"
+#endif
+
#ifndef VST_SCANNER_APP
namespace ARDOUR {
#endif
@@ -35,8 +50,6 @@ enum VSTScanMode {
VST_SCAN_INTERNAL
};
-LIBARDOUR_API extern std::string get_personal_vst_info_cache_dir ();
-LIBARDOUR_API extern std::string get_personal_vst_blacklist_dir ();
LIBARDOUR_API extern void vstfx_free_info_list (std::vector<VSTInfo *> *infos);
#ifdef LXVST_SUPPORT
diff --git a/libs/ardour/audio_buffer.cc b/libs/ardour/audio_buffer.cc
index de2c1dd..6d8b2aa 100644
--- a/libs/ardour/audio_buffer.cc
+++ b/libs/ardour/audio_buffer.cc
@@ -43,7 +43,7 @@ AudioBuffer::AudioBuffer(size_t capacity)
AudioBuffer::~AudioBuffer()
{
if (_owns_data)
- free(_data);
+ cache_aligned_free(_data);
}
void
@@ -60,7 +60,7 @@ AudioBuffer::resize (size_t size)
return;
}
- free (_data);
+ cache_aligned_free (_data);
cache_aligned_malloc ((void**) &_data, sizeof (Sample) * size);
diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc
index 00e1f92..d443b9a 100644
--- a/libs/ardour/audio_diskstream.cc
+++ b/libs/ardour/audio_diskstream.cc
@@ -46,9 +46,11 @@
#include "ardour/debug.h"
#include "ardour/io.h"
#include "ardour/playlist_factory.h"
+#include "ardour/profile.h"
#include "ardour/region_factory.h"
#include "ardour/session.h"
#include "ardour/session_playlists.h"
+#include "ardour/sndfile_helpers.h"
#include "ardour/source_factory.h"
#include "ardour/track.h"
#include "ardour/types.h"
@@ -61,7 +63,6 @@ using namespace std;
using namespace ARDOUR;
using namespace PBD;
-size_t AudioDiskstream::_working_buffers_size = 0;
Sample* AudioDiskstream::_mixdown_buffer = 0;
gain_t* AudioDiskstream::_gain_buffer = 0;
@@ -132,9 +133,13 @@ AudioDiskstream::~AudioDiskstream ()
void
AudioDiskstream::allocate_working_buffers()
{
- _working_buffers_size = max (disk_write_chunk_frames, disk_read_chunk_frames);
- _mixdown_buffer = new Sample[_working_buffers_size];
- _gain_buffer = new gain_t[_working_buffers_size];
+ /* with varifill buffer refilling, we compute the read size in bytes (to optimize
+ for disk i/o bandwidth) and then convert back into samples. These buffers
+ need to reflect the maximum size we could use, which is 4MB reads, or 2M samples
+ using 16 bit samples.
+ */
+ _mixdown_buffer = new Sample[2*1048576];
+ _gain_buffer = new gain_t[2*1048576];
}
void
@@ -142,7 +147,6 @@ AudioDiskstream::free_working_buffers()
{
delete [] _mixdown_buffer;
delete [] _gain_buffer;
- _working_buffers_size = 0;
_mixdown_buffer = 0;
_gain_buffer = 0;
}
@@ -209,9 +213,9 @@ AudioDiskstream::non_realtime_locate (framepos_t location)
/* now refill channel buffers */
if (speed() != 1.0f || speed() != -1.0f) {
- seek ((framepos_t) (location * (double) speed()));
+ seek ((framepos_t) (location * (double) speed()), true);
} else {
- seek (location);
+ seek (location, true);
}
}
@@ -602,7 +606,7 @@ AudioDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t
/* no varispeed playback if we're recording, because the output .... TBD */
- if (rec_nframes == 0 && _actual_speed != 1.0f) {
+ if (rec_nframes == 0 && _actual_speed != 1.0) {
necessary_samples = (framecnt_t) ceil ((nframes * fabs (_actual_speed))) + 2;
} else {
necessary_samples = nframes;
@@ -923,9 +927,15 @@ AudioDiskstream::seek (framepos_t frame, bool complete_refill)
file_frame = frame;
if (complete_refill) {
- while ((ret = do_refill_with_alloc ()) > 0) ;
+ /* call _do_refill() to refill the entire buffer, using
+ the largest reads possible.
+ */
+ while ((ret = do_refill_with_alloc (false)) > 0) ;
} else {
- ret = do_refill_with_alloc ();
+ /* call _do_refill() to refill just one chunk, and then
+ return.
+ */
+ ret = do_refill_with_alloc (true);
}
return ret;
@@ -952,7 +962,7 @@ AudioDiskstream::internal_playback_seek (framecnt_t distance)
boost::shared_ptr<ChannelList> c = channels.reader();
for (chan = c->begin(); chan != c->end(); ++chan) {
- (*chan)->playback_buf->increment_read_ptr (llabs(distance));
+ (*chan)->playback_buf->increment_read_ptr (::llabs(distance));
}
if (first_recordable_frame < max_framepos) {
@@ -1067,12 +1077,18 @@ AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
}
int
-AudioDiskstream::do_refill_with_alloc ()
+AudioDiskstream::_do_refill_with_alloc (bool partial_fill)
{
- Sample* mix_buf = new Sample[disk_read_chunk_frames];
- float* gain_buf = new float[disk_read_chunk_frames];
+ /* We limit disk reads to at most 4MB chunks, which with floating point
+ samples would be 1M samples. But we might use 16 or 14 bit samples,
+ in which case 4MB is more samples than that. Therefore size this for
+ the smallest sample value .. 4MB = 2M samples (16 bit).
+ */
+
+ Sample* mix_buf = new Sample[2*1048576];
+ float* gain_buf = new float[2*1048576];
- int ret = _do_refill(mix_buf, gain_buf);
+ int ret = _do_refill (mix_buf, gain_buf, (partial_fill ? disk_read_chunk_frames : 0));
delete [] mix_buf;
delete [] gain_buf;
@@ -1082,9 +1098,15 @@ AudioDiskstream::do_refill_with_alloc ()
/** Get some more data from disk and put it in our channels' playback_bufs,
* if there is suitable space in them.
+ *
+ * If fill_level is non-zero, then we will refill the buffer so that there is
+ * still at least fill_level samples of space left to be filled. This is used
+ * after locates so that we do not need to wait to fill the entire buffer.
+ *
*/
+
int
-AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
+AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
{
int32_t ret = 0;
framecnt_t to_read;
@@ -1097,6 +1119,14 @@ AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
boost::shared_ptr<ChannelList> c = channels.reader();
framecnt_t ts;
+ /* do not read from disk while session is marked as Loading, to avoid
+ useless redundant I/O.
+ */
+
+ if (_session.state_of_the_state() & Session::Loading) {
+ return 0;
+ }
+
if (c->empty()) {
return 0;
}
@@ -1116,13 +1146,13 @@ AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
return 0;
}
- /* if there are 2+ chunks of disk i/o possible for
- this track, let the caller know so that it can arrange
- for us to be called again, ASAP.
- */
-
- if (total_space >= (_slaved ? 3 : 2) * disk_read_chunk_frames) {
- ret = 1;
+ if (fill_level) {
+ if (fill_level < total_space) {
+ total_space -= fill_level;
+ } else {
+ /* we can't do anything with it */
+ fill_level = 0;
+ }
}
/* if we're running close to normal speed and there isn't enough
@@ -1149,10 +1179,6 @@ AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
return 0;
}
- /* never do more than disk_read_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
-
- total_space = min (disk_read_chunk_frames, total_space);
-
if (reversed) {
if (file_frame == 0) {
@@ -1219,6 +1245,30 @@ AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
framepos_t file_frame_tmp = 0;
+ /* total_space is in samples. We want to optimize read sizes in various sizes using bytes */
+
+ const size_t bits_per_sample = format_data_width (_session.config.get_native_file_data_format());
+ size_t total_bytes = total_space * bits_per_sample / 8;
+
+ /* chunk size range is 256kB to 4MB. Bigger is faster in terms of MB/sec, but bigger chunk size always takes longer
+ */
+ size_t byte_size_for_read = max ((size_t) (256 * 1024), min ((size_t) (4 * 1048576), total_bytes));
+
+ /* find nearest (lower) multiple of 16384 */
+
+ byte_size_for_read = (byte_size_for_read / 16384) * 16384;
+
+ /* now back to samples */
+
+ framecnt_t samples_to_read = byte_size_for_read / (bits_per_sample / 8);
+
+ //cerr << name() << " will read " << byte_size_for_read << " out of total bytes " << total_bytes << " in buffer of "
+ // << c->front()->playback_buf->bufsize() * bits_per_sample / 8 << " bps = " << bits_per_sample << endl;
+ // cerr << name () << " read samples = " << samples_to_read << " out of total space " << total_space << " in buffer of " << c->front()->playback_buf->bufsize() << " samples\n";
+
+ // uint64_t before = g_get_monotonic_time ();
+ // uint64_t elapsed;
+
for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
ChannelInfo* chan (*i);
@@ -1228,7 +1278,7 @@ AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
chan->playback_buf->get_write_vector (&vector);
- if ((framecnt_t) vector.len[0] > disk_read_chunk_frames) {
+ if ((framecnt_t) vector.len[0] > samples_to_read) {
/* we're not going to fill the first chunk, so certainly do not bother with the
other part. it won't be connected with the part we do fill, as in:
@@ -1260,7 +1310,7 @@ AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
len2 = vector.len[1];
to_read = min (ts, len1);
- to_read = min (to_read, disk_read_chunk_frames);
+ to_read = min (to_read, (framecnt_t) samples_to_read);
assert (to_read >= 0);
@@ -1279,8 +1329,9 @@ AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
if (to_read) {
- /* we read all of vector.len[0], but it wasn't an entire disk_read_chunk_frames of data,
- so read some or all of vector.len[1] as well.
+ /* we read all of vector.len[0], but it wasn't the
+ entire samples_to_read of data, so read some or
+ all of vector.len[1] as well.
*/
if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
@@ -1297,11 +1348,17 @@ AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
}
+ // elapsed = g_get_monotonic_time () - before;
+ // cerr << "\tbandwidth = " << (byte_size_for_read / 1048576.0) / (elapsed/1000000.0) << "MB/sec\n";
+
file_frame = file_frame_tmp;
assert (file_frame >= 0);
+ ret = ((total_space - samples_to_read) > disk_read_chunk_frames);
+
+ c->front()->playback_buf->get_write_vector (&vector);
+
out:
-
return ret;
}
@@ -2070,7 +2127,7 @@ AudioDiskstream::allocate_temporary_buffers ()
when slaving to MTC, Timecode etc.
*/
- double const sp = max (fabsf (_actual_speed), 1.2f);
+ double const sp = max (fabs (_actual_speed), 1.2);
framecnt_t required_wrap_size = (framecnt_t) ceil (_session.get_block_size() * sp) + 2;
if (required_wrap_size > wrap_buffer_size) {
@@ -2362,6 +2419,10 @@ AudioDiskstream::set_destructive (bool yn)
bool
AudioDiskstream::can_become_destructive (bool& requires_bounce) const
{
+ if (Profile->get_trx()) {
+ return false;
+ }
+
if (!_playlist) {
requires_bounce = false;
return false;
diff --git a/libs/ardour/audio_library.cc b/libs/ardour/audio_library.cc
index 35c0972..a1643c8 100644
--- a/libs/ardour/audio_library.cc
+++ b/libs/ardour/audio_library.cc
@@ -34,9 +34,10 @@
#include <glibmm/convert.h>
#include "pbd/compose.h"
+#include "pbd/error.h"
+#include "pbd/file_utils.h"
#include "ardour/audio_library.h"
-#include "ardour/utils.h"
#include "ardour/filesystem_paths.h"
#include "i18n.h"
diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc
index c056763..40cbded 100644
--- a/libs/ardour/audio_track.cc
+++ b/libs/ardour/audio_track.cc
@@ -35,6 +35,7 @@
#include "ardour/meter.h"
#include "ardour/playlist_factory.h"
#include "ardour/processor.h"
+#include "ardour/profile.h"
#include "ardour/region.h"
#include "ardour/region_factory.h"
#include "ardour/session.h"
@@ -62,7 +63,7 @@ AudioTrack::create_diskstream ()
{
AudioDiskstream::Flag dflags = AudioDiskstream::Flag (AudioDiskstream::Recordable);
- if (_mode == Destructive) {
+ if (_mode == Destructive && !Profile->get_trx()) {
dflags = AudioDiskstream::Flag (dflags | AudioDiskstream::Destructive);
} else if (_mode == NonLayered){
dflags = AudioDiskstream::Flag(dflags | AudioDiskstream::NonLayered);
@@ -77,7 +78,11 @@ AudioTrack::set_diskstream (boost::shared_ptr<Diskstream> ds)
Track::set_diskstream (ds);
_diskstream->set_track (this);
- _diskstream->set_destructive (_mode == Destructive);
+ if (Profile->get_trx()) {
+ _diskstream->set_destructive (false);
+ } else {
+ _diskstream->set_destructive (_mode == Destructive);
+ }
_diskstream->set_non_layered (_mode == NonLayered);
if (audio_diskstream()->deprecated_io_node) {
@@ -106,7 +111,7 @@ AudioTrack::set_mode (TrackMode m)
{
if (m != _mode) {
- if (_diskstream->set_destructive (m == Destructive)) {
+ if (!Profile->get_trx() && _diskstream->set_destructive (m == Destructive)) {
return -1;
}
@@ -129,8 +134,15 @@ AudioTrack::can_use_mode (TrackMode m, bool& bounce_required)
return true;
case Destructive:
+ if (Profile->get_trx()) {
+ return false;
+ } else {
+ return _diskstream->can_become_destructive (bounce_required);
+ }
+ break;
+
default:
- return _diskstream->can_become_destructive (bounce_required);
+ return false;
}
}
@@ -193,6 +205,14 @@ AudioTrack::set_state (const XMLNode& node, int version)
_mode = Normal;
}
+ if (Profile->get_trx() && _mode == Destructive) {
+ /* Tracks does not support destructive tracks and trying to
+ handle it as a normal track would be wrong.
+ */
+ error << string_compose (_("%1: this session uses destructive tracks, which are not supported"), PROGRAM_NAME) << endmsg;
+ return -1;
+ }
+
if (Track::set_state (node, version)) {
return -1;
}
@@ -309,7 +329,7 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
if (!lm.locked()) {
boost::shared_ptr<AudioDiskstream> diskstream = audio_diskstream();
framecnt_t playback_distance = diskstream->calculate_playback_distance(nframes);
- if (can_internal_playback_seek(llabs(playback_distance))) {
+ if (can_internal_playback_seek(::llabs(playback_distance))) {
/* TODO should declick */
internal_playback_seek(playback_distance);
}
diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc
index 4b9a81e..8274ba9 100644
--- a/libs/ardour/audio_unit.cc
+++ b/libs/ardour/audio_unit.cc
@@ -73,6 +73,7 @@ static string preset_search_path = "/Library/Audio/Presets:/Network/Library/Audi
static string preset_suffix = ".aupreset";
static bool preset_search_path_initialized = false;
FILE * AUPluginInfo::_crashlog_fd = NULL;
+bool AUPluginInfo::_scan_only = true;
static void au_blacklist (std::string id)
@@ -97,10 +98,14 @@ static void au_unblacklist (std::string id)
}
std::string bl;
- std::ifstream ifs(fn.c_str());
- bl.assign ((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
- ::g_unlink(fn.c_str());
+ {
+ std::ifstream ifs(fn.c_str());
+ bl.assign ((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
+ }
+
+ ::g_unlink (fn.c_str());
+ assert (!Glib::file_test (fn, Glib::FILE_TEST_EXISTS));
assert(id.find("\n") == string::npos);
id += "\n"; // add separator
@@ -454,6 +459,9 @@ AUPlugin::AUPlugin (const AUPlugin& other)
{
init ();
+ for (size_t i = 0; i < descriptors.size(); ++i) {
+ set_parameter (i, other.get_parameter (i));
+ }
}
AUPlugin::~AUPlugin ()
@@ -1181,21 +1189,12 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out)
audio_out = 2;
found = true;
} else if (possible_out < -2) {
- /* explicitly variable number of outputs.
-
- Since Ardour can handle any configuration,
- we have to somehow pick a number.
-
- We'll use the number of inputs
- to the master bus, or 2 if there
- is no master bus.
- */
- boost::shared_ptr<Route> master = _session.master_out();
- if (master) {
- audio_out = master->input()->n_ports().n_audio();
- } else {
- audio_out = 2;
- }
+ /* explicitly variable number of outputs.
+ *
+ * We really need to ask the user in this case.
+ * stereo will be correct in 99.9% of all cases.
+ */
+ audio_out = 2;
found = true;
} else {
/* exact number of outputs */
@@ -1270,21 +1269,12 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out)
audio_out = 2;
found = true;
} else if (possible_out < -2) {
- /* explicitly variable number of outputs.
-
- Since Ardour can handle any configuration,
- we have to somehow pick a number.
-
- We'll use the number of inputs
- to the master bus, or 2 if there
- is no master bus.
- */
- boost::shared_ptr<Route> master = _session.master_out();
- if (master) {
- audio_out = master->input()->n_ports().n_audio();
- } else {
- audio_out = 2;
- }
+ /* explicitly variable number of outputs.
+ *
+ * We really need to ask the user in this case.
+ * stereo will be correct in 99.9% of all cases.
+ */
+ audio_out = 2;
found = true;
} else {
/* exact number of outputs */
@@ -1326,15 +1316,14 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out)
}
if (found) {
+ out.set (DataType::MIDI, 0);
+ out.set (DataType::AUDIO, audio_out);
DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("\tCHOSEN: in %1 out %2\n", in, out));
} else {
DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("\tFAIL: no io configs match %1\n", in));
return false;
}
- out.set (DataType::MIDI, 0);
- out.set (DataType::AUDIO, audio_out);
-
return true;
}
@@ -2277,10 +2266,19 @@ AUPluginInfo::au_cache_path ()
}
PluginInfoList*
-AUPluginInfo::discover ()
+AUPluginInfo::discover (bool scan_only)
{
XMLTree tree;
+ /* AU require a CAComponentDescription pointer provided by the OS.
+ * Ardour only caches port and i/o config. It can't just 'scan' without
+ * 'discovering' (like we do for VST).
+ *
+ * "Scan Only" means
+ * "Iterate over all plugins. skip the ones where there's no io-cache".
+ */
+ _scan_only = scan_only;
+
if (!Glib::file_test (au_cache_path(), Glib::FILE_TEST_EXISTS)) {
ARDOUR::BootMessage (_("Discovering AudioUnit plugins (could take some time ...)"));
}
@@ -2498,8 +2496,9 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
info->version = 0;
}
- if (cached_io_configuration (info->unique_id, info->version, cacomp, info->cache, info->name)) {
+ const int rv = cached_io_configuration (info->unique_id, info->version, cacomp, info->cache, info->name);
+ if (rv == 0) {
/* here we have to map apple's wildcard system to a simple pair
of values. in ::can_do() we use the whole system, but here
we need a single pair of values. XXX probably means we should
@@ -2533,7 +2532,8 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
plugs.push_back (info);
- } else {
+ }
+ else if (rv == -1) {
error << string_compose (_("Cannot get I/O configuration info for AU %1"), info->name) << endmsg;
}
@@ -2545,7 +2545,7 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
au_crashlog(string_compose("End AU discovery for Type: %1", (int)desc.componentType));
}
-bool
+int
AUPluginInfo::cached_io_configuration (const std::string& unique_id,
UInt32 version,
CAComponent& comp,
@@ -2569,7 +2569,12 @@ AUPluginInfo::cached_io_configuration (const std::string& unique_id,
if (cim != cached_info.end()) {
cinfo = cim->second;
- return true;
+ return 0;
+ }
+
+ if (_scan_only) {
+ PBD::info << string_compose (_("Skipping AU %1 (not indexed. Discover new plugins to add)"), name) << endmsg;
+ return 1;
}
CAAudioUnit unit;
@@ -2582,19 +2587,19 @@ AUPluginInfo::cached_io_configuration (const std::string& unique_id,
try {
if (CAAudioUnit::Open (comp, unit) != noErr) {
- return false;
+ return -1;
}
} catch (...) {
warning << string_compose (_("Could not load AU plugin %1 - ignored"), name) << endmsg;
- return false;
+ return -1;
}
DEBUG_TRACE (DEBUG::AudioUnits, "get AU channel info\n");
if ((ret = unit.GetChannelInfo (&channel_info, cnt)) < 0) {
- return false;
+ return -1;
}
if (ret > 0) {
@@ -2620,7 +2625,7 @@ AUPluginInfo::cached_io_configuration (const std::string& unique_id,
add_cached_info (id, cinfo);
save_cached_info ();
- return true;
+ return 0;
}
void
diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc
index c18b5dd..00a381f 100644
--- a/libs/ardour/audioengine.cc
+++ b/libs/ardour/audioengine.cc
@@ -455,7 +455,7 @@ AudioEngine::backend_reset_requested()
void
AudioEngine::do_reset_backend()
{
- SessionEvent::create_per_thread_pool (X_("Backend reset processing thread"), 512);
+ SessionEvent::create_per_thread_pool (X_("Backend reset processing thread"), 1024);
Glib::Threads::Mutex::Lock guard (_reset_request_lock);
@@ -468,25 +468,28 @@ AudioEngine::do_reset_backend()
Glib::Threads::RecMutex::Lock pl (_state_lock);
g_atomic_int_dec_and_test (&_hw_reset_request_count);
- std::cout << "AudioEngine::RESET::Reset request processing. Requests left: " << _hw_reset_request_count << std::endl;
- DeviceResetStarted(); // notify about device reset to be started
-
- // backup the device name
- std::string name = _backend->device_name ();
-
- std::cout << "AudioEngine::RESET::Stoping engine..." << std::endl;
- stop();
-
- std::cout << "AudioEngine::RESET::Reseting device..." << std::endl;
- if ( 0 == _backend->reset_device () ) {
-
- std::cout << "AudioEngine::RESET::Starting engine..." << std::endl;
- start ();
-
+ std::cout << "AudioEngine::RESET::Reset request processing. Requests left: " << _hw_reset_request_count << std::endl;
+ DeviceResetStarted(); // notify about device reset to be started
+
+ // backup the device name
+ std::string name = _backend->device_name ();
+
+ std::cout << "AudioEngine::RESET::Reseting device..." << std::endl;
+ if ( ( 0 == stop () ) &&
+ ( 0 == _backend->reset_device () ) &&
+ ( 0 == start () ) ) {
+
+ std::cout << "AudioEngine::RESET::Engine started..." << std::endl;
+
// inform about possible changes
BufferSizeChanged (_backend->buffer_size() );
- } else {
- DeviceError();
+ DeviceResetFinished(); // notify about device reset finish
+
+ } else {
+
+ DeviceResetFinished(); // notify about device reset finish
+ // we've got an error
+ DeviceError();
}
std::cout << "AudioEngine::RESET::Done." << std::endl;
@@ -522,6 +525,8 @@ AudioEngine::do_devicelist_update()
_devicelist_update_lock.unlock();
+ Glib::Threads::RecMutex::Lock pl (_state_lock);
+
g_atomic_int_dec_and_test (&_hw_devicelist_update_count);
DeviceListChanged (); /* EMIT SIGNAL */
@@ -623,9 +628,11 @@ AudioEngine::remove_session ()
void
AudioEngine::reconnect_session_routes (bool reconnect_inputs, bool reconnect_outputs)
{
- if (_session) {
- _session->reconnect_existing_routes(true, true, reconnect_inputs, reconnect_outputs);
- }
+#ifdef USE_TRACKS_CODE_FEATURES
+ if (_session) {
+ _session->reconnect_existing_routes(true, true, reconnect_inputs, reconnect_outputs);
+ }
+#endif
}
@@ -768,7 +775,7 @@ void
AudioEngine::drop_backend ()
{
if (_backend) {
- stop(false);
+ _backend->stop ();
_backend->drop_device ();
_backend.reset ();
_running = false;
@@ -856,18 +863,28 @@ AudioEngine::stop (bool for_latency)
return 0;
}
- if (_session && _running) {
- // it's not a halt, but should be handled the same way:
- // disable record, stop transport and I/O processign but save the data.
- _session->engine_halted ();
- }
+ Glib::Threads::Mutex::Lock pl (_process_lock, Glib::Threads::NOT_LOCK);
- Glib::Threads::Mutex::Lock lm (_process_lock);
+ if (running()) {
+ pl.acquire ();
+ }
if (_backend->stop ()) {
return -1;
}
-
+
+ if (pl.locked ()) {
+ pl.release ();
+ }
+
+ if (_session && _running &&
+ (_session->state_of_the_state() & Session::Loading) == 0 &&
+ (_session->state_of_the_state() & Session::Deletion) == 0) {
+ // it's not a halt, but should be handled the same way:
+ // disable record, stop transport and I/O processign but save the data.
+ _session->engine_halted ();
+ }
+
_running = false;
_processed_frames = 0;
_measuring_latency = MeasureNone;
@@ -1151,6 +1168,12 @@ AudioEngine::set_systemic_output_latency (uint32_t ol)
return _backend->set_systemic_output_latency (ol);
}
+bool
+AudioEngine::thread_initialised_for_audio_processing ()
+{
+ return SessionEvent::has_per_thread_pool () && AsyncMIDIPort::is_process_thread();
+}
+
/* END OF BACKEND PROXY API */
void
diff --git a/libs/ardour/audiofile_tagger.cc b/libs/ardour/audiofile_tagger.cc
index 61a05d4..e2d8117 100644
--- a/libs/ardour/audiofile_tagger.cc
+++ b/libs/ardour/audiofile_tagger.cc
@@ -43,6 +43,16 @@ bool
AudiofileTagger::tag_file (std::string const & filename, SessionMetadata const & metadata)
{
TagLib::FileRef file (filename.c_str());
+ if (file.isNull()) {
+ std::cerr << "TagLib::FileRef is null for file" << filename << std::endl;
+ return true; // continue anyway?!
+ }
+
+ if (!file.tag()) {
+ std::cerr << "TagLib::Tag is null for file" << filename << std::endl;
+ return true; // continue anyway?!
+ }
+
TagLib::Tag & tag (*file.tag());
tag_generic (tag, metadata);
diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc
index 8113b26..a353556 100644
--- a/libs/ardour/audioregion.cc
+++ b/libs/ardour/audioregion.cc
@@ -25,6 +25,7 @@
#include <set>
#include <boost/scoped_array.hpp>
+#include <boost/shared_ptr.hpp>
#include <glibmm/threads.h>
@@ -49,6 +50,11 @@
#include "ardour/parameter_descriptor.h"
#include "ardour/progress.h"
+#include "ardour/sndfilesource.h"
+#ifdef HAVE_COREAUDIO
+#include "ardour/coreaudiosource.h"
+#endif // HAVE_COREAUDIO
+
#include "i18n.h"
#include <locale.h>
@@ -1562,6 +1568,34 @@ AudioRegion::audio_source (uint32_t n) const
return boost::dynamic_pointer_cast<AudioSource>(source(n));
}
+uint32_t
+AudioRegion::get_related_audio_file_channel_count () const
+{
+ uint32_t chan_count = 0;
+ for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
+
+ boost::shared_ptr<SndFileSource> sndf = boost::dynamic_pointer_cast<SndFileSource>(*i);
+ if (sndf ) {
+
+ if (sndf->channel_count() > chan_count) {
+ chan_count = sndf->channel_count();
+ }
+ }
+#ifdef HAVE_COREAUDIO
+ else {
+ boost::shared_ptr<CoreAudioSource> cauf = boost::dynamic_pointer_cast<CoreAudioSource>(*i);
+ if (cauf) {
+ if (cauf->channel_count() > chan_count) {
+ chan_count = cauf->channel_count();
+ }
+ }
+ }
+#endif // HAVE_COREAUDIO
+ }
+
+ return chan_count;
+}
+
int
AudioRegion::adjust_transients (frameoffset_t delta)
{
diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc
index 566a37f..d9e7c93 100644
--- a/libs/ardour/audiosource.cc
+++ b/libs/ardour/audiosource.cc
@@ -68,7 +68,6 @@ using namespace PBD;
Glib::Threads::Mutex AudioSource::_level_buffer_lock;
vector<boost::shared_array<Sample> > AudioSource::_mixdown_buffers;
vector<boost::shared_array<gain_t> > AudioSource::_gain_buffers;
-size_t AudioSource::_working_buffers_size = 0;
bool AudioSource::_build_missing_peakfiles = false;
/** true if we want peakfiles (e.g. if we are displaying a GUI) */
@@ -271,8 +270,8 @@ AudioSource::initialize_peakfile (string audio_path)
_peaks_built = false;
} else {
// Check if the audio file has changed since the peakfile was built.
- struct stat stat_file;
- int err = stat (audio_path.c_str(), &stat_file);
+ GStatBuf stat_file;
+ int err = g_stat (audio_path.c_str(), &stat_file);
if (err) {
@@ -364,26 +363,36 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t
return -1;
}
- /* check actual size of the peakfile is at least large enough for all
- * the data in the audio file. if it is too short, assume that a crash
- * or other error truncated it, and rebuild it from scratch.
- */
+ if (!_captured_for.empty()) {
- const off_t expected_file_size = (_length / (double) samples_per_file_peak) * sizeof (PeakData);
-
- if (statbuf.st_size < expected_file_size) {
- warning << string_compose (_("peak file %1 is truncated from %2 to %3"), peakpath, expected_file_size, statbuf.st_size) << endmsg;
- const_cast<AudioSource*>(this)->build_peaks_from_scratch ();
- if (g_stat (peakpath.c_str(), &statbuf) != 0) {
- error << string_compose (_("Cannot open peakfile @ %1 for size check (%2) after rebuild"), peakpath, strerror (errno)) << endmsg;
- }
+ /* _captured_for is only set after a capture pass is
+ * complete. so we know that capturing is finished for this
+ * file, and now we can check actual size of the peakfile is at
+ * least large enough for all the data in the audio file. if it
+ * is too short, assume that a crash or other error truncated
+ * it, and rebuild it from scratch.
+ *
+ * XXX this may not work for destructive recording, but we
+ * might decided to get rid of that anyway.
+ *
+ */
+
+ const off_t expected_file_size = (_length / (double) samples_per_file_peak) * sizeof (PeakData);
+
if (statbuf.st_size < expected_file_size) {
- fatal << "peak file is still truncated after rebuild" << endmsg;
- /*NOTREACHED*/
+ warning << string_compose (_("peak file %1 is truncated from %2 to %3"), peakpath, expected_file_size, statbuf.st_size) << endmsg;
+ const_cast<AudioSource*>(this)->build_peaks_from_scratch ();
+ if (g_stat (peakpath.c_str(), &statbuf) != 0) {
+ error << string_compose (_("Cannot open peakfile @ %1 for size check (%2) after rebuild"), peakpath, strerror (errno)) << endmsg;
+ }
+ if (statbuf.st_size < expected_file_size) {
+ fatal << "peak file is still truncated after rebuild" << endmsg;
+ /*NOTREACHED*/
+ }
}
}
- ScopedFileDescriptor sfd (::open (peakpath.c_str(), O_RDONLY));
+ ScopedFileDescriptor sfd (g_open (peakpath.c_str(), O_RDONLY, 0444));
if (sfd < 0) {
error << string_compose (_("Cannot open peakfile @ %1 for reading (%2)"), peakpath, strerror (errno)) << endmsg;
@@ -766,7 +775,7 @@ AudioSource::build_peaks_from_scratch ()
int
AudioSource::prepare_for_peakfile_writes ()
{
- if ((_peakfile_fd = open (peakpath.c_str(), O_CREAT|O_RDWR, 0664)) < 0) {
+ if ((_peakfile_fd = g_open (peakpath.c_str(), O_CREAT|O_RDWR, 0664)) < 0) {
error << string_compose(_("AudioSource: cannot open peakpath (c) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
return -1;
}
diff --git a/libs/ardour/auditioner.cc b/libs/ardour/auditioner.cc
index 30a354a..27d56d7 100644
--- a/libs/ardour/auditioner.cc
+++ b/libs/ardour/auditioner.cc
@@ -34,6 +34,7 @@
#include "ardour/midi_region.h"
#include "ardour/plugin.h"
#include "ardour/plugin_insert.h"
+#include "ardour/profile.h"
#include "ardour/region_factory.h"
#include "ardour/route.h"
#include "ardour/session.h"
@@ -327,7 +328,11 @@ Auditioner::set_diskstream (boost::shared_ptr<Diskstream> ds)
Track::set_diskstream (ds);
_diskstream->set_track (this);
- _diskstream->set_destructive (_mode == Destructive);
+ if (Profile->get_trx()) {
+ _diskstream->set_destructive (false);
+ } else {
+ _diskstream->set_destructive (_mode == Destructive);
+ }
_diskstream->set_non_layered (_mode == NonLayered);
_diskstream->set_record_enabled (false);
_diskstream->request_input_monitoring (false);
@@ -477,7 +482,7 @@ Auditioner::audition_region (boost::shared_ptr<Region> region)
offset = 0;
}
- _diskstream->seek (offset);
+ _diskstream->seek (offset, true);
current_frame = offset;
g_atomic_int_set (&_auditioning, 1);
diff --git a/libs/ardour/automation_control.cc b/libs/ardour/automation_control.cc
index 2195203..26ea53c 100644
--- a/libs/ardour/automation_control.cc
+++ b/libs/ardour/automation_control.cc
@@ -19,12 +19,15 @@
*/
#include <iostream>
-
#include "ardour/automation_control.h"
#include "ardour/automation_watch.h"
#include "ardour/event_type_map.h"
#include "ardour/session.h"
+#include "pbd/memento_command.h"
+
+#include "i18n.h"
+
using namespace std;
using namespace ARDOUR;
using namespace PBD;
@@ -85,6 +88,8 @@ AutomationControl::set_automation_state (AutoState as)
}
if (as == Write) {
+ /* get state for undo */
+ _before = &alist ()->get_state ();
AutomationWatch::instance().add_automation_watch (shared_from_this());
} else if (as == Touch) {
if (!touching()) {
@@ -113,9 +118,16 @@ AutomationControl::set_automation_style (AutoStyle as)
void
AutomationControl::start_touch(double when)
{
- if (!_list) return;
+ if (!_list) {
+ return;
+ }
+
if (!touching()) {
+
if (alist()->automation_state() == Touch) {
+ /* subtle. aligns the user value with the playback */
+ set_value (get_value ());
+ _before = &alist ()->get_state ();
alist()->start_touch (when);
if (!_desc.toggled) {
AutomationWatch::instance().add_automation_watch (shared_from_this());
@@ -131,11 +143,22 @@ AutomationControl::stop_touch(bool mark, double when)
if (!_list) return;
if (touching()) {
set_touching (false);
+
+ if (alist()->automation_state() == Write) {
+ _session.begin_reversible_command (string_compose (_("write %1 automation"), name ()));
+ _session.add_command (new MementoCommand<AutomationList> (*alist ().get (), _before, &alist ()->get_state ()));
+ _session.commit_reversible_command ();
+ }
+
if (alist()->automation_state() == Touch) {
alist()->stop_touch (mark, when);
if (!_desc.toggled) {
AutomationWatch::instance().remove_automation_watch (shared_from_this());
}
+
+ _session.begin_reversible_command (string_compose (_("touch %1 automation"), name ()));
+ _session.add_command (new MementoCommand<AutomationList> (*alist ().get (), _before, &alist ()->get_state ()));
+ _session.commit_reversible_command ();
}
}
}
@@ -152,7 +175,7 @@ AutomationControl::internal_to_interface (double val) const
if (_desc.logarithmic) {
if (val > 0) {
- val = pow (val, 1/1.5);
+ val = pow (val, 1./2.0);
} else {
val = 0;
}
@@ -168,7 +191,7 @@ AutomationControl::interface_to_internal (double val) const
if (val <= 0) {
val = 0;
} else {
- val = pow (val, 1.5);
+ val = pow (val, 2.0);
}
}
diff --git a/libs/ardour/automation_list.cc b/libs/ardour/automation_list.cc
index 7f7599f..706a333 100644
--- a/libs/ardour/automation_list.cc
+++ b/libs/ardour/automation_list.cc
@@ -276,7 +276,11 @@ AutomationList::state (bool full)
if (_state != Write) {
root->add_property ("state", auto_state_to_string (_state));
} else {
- root->add_property ("state", auto_state_to_string (Off));
+ if (_events.empty ()) {
+ root->add_property ("state", auto_state_to_string (Off));
+ } else {
+ root->add_property ("state", auto_state_to_string (Touch));
+ }
}
} else {
/* never save anything but Off for automation state to a template */
diff --git a/libs/ardour/automation_watch.cc b/libs/ardour/automation_watch.cc
index 4e833fc..3714f17 100644
--- a/libs/ardour/automation_watch.cc
+++ b/libs/ardour/automation_watch.cc
@@ -128,7 +128,7 @@ AutomationWatch::timer ()
(*aw)->list()->add (time, (*aw)->user_double(), true);
}
}
- } else { //transport stopped or reversed. stop the automation pass and start a new one (for bonus points, someday store the previous pass in an undo record)
+ } else if (time != _last_time) { //transport stopped or reversed. stop the automation pass and start a new one (for bonus points, someday store the previous pass in an undo record)
for (AutomationWatches::iterator aw = automation_watches.begin(); aw != automation_watches.end(); ++aw) {
DEBUG_TRACE (DEBUG::Automation, string_compose ("%1: transport in rewind, speed %2, in write pass ? %3 writing ? %4\n",
(*aw)->name(), _session->transport_speed(), _session->transport_rolling(),
diff --git a/libs/ardour/butler.cc b/libs/ardour/butler.cc
index 01c21b4..f8f8c83 100644
--- a/libs/ardour/butler.cc
+++ b/libs/ardour/butler.cc
@@ -54,6 +54,7 @@ Butler::Butler(Session& s)
g_atomic_int_set(&should_do_transport_work, 0);
SessionEvent::pool->set_trash (&pool_trash);
+ /* catch future changes to parameters */
Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Butler::config_changed, this, _1));
}
@@ -63,15 +64,38 @@ Butler::~Butler()
}
void
+Butler::map_parameters ()
+{
+ /* use any current ones that we care about */
+ boost::function<void (std::string)> ff (boost::bind (&Butler::config_changed, this, _1));
+ Config->map_parameters (ff);
+}
+
+void
Butler::config_changed (std::string p)
{
if (p == "playback-buffer-seconds") {
- /* size is in Samples, not bytes */
- audio_dstream_playback_buffer_size = (uint32_t) floor (Config->get_audio_playback_buffer_seconds() * _session.frame_rate());
_session.adjust_playback_buffering ();
+ if (Config->get_buffering_preset() == Custom) {
+ /* size is in Samples, not bytes */
+ audio_dstream_playback_buffer_size = (uint32_t) floor (Config->get_audio_playback_buffer_seconds() * _session.frame_rate());
+ _session.adjust_playback_buffering ();
+ } else {
+ std::cerr << "Skip explicit buffer seconds, preset in use\n";
+ }
} else if (p == "capture-buffer-seconds") {
+ if (Config->get_buffering_preset() == Custom) {
+ audio_dstream_capture_buffer_size = (uint32_t) floor (Config->get_audio_capture_buffer_seconds() * _session.frame_rate());
+ _session.adjust_capture_buffering ();
+ } else {
+ std::cerr << "Skip explicit buffer seconds, preset in use\n";
+ }
+ } else if (p == "buffering-preset") {
+ Diskstream::set_buffering_parameters (Config->get_buffering_preset());
audio_dstream_capture_buffer_size = (uint32_t) floor (Config->get_audio_capture_buffer_seconds() * _session.frame_rate());
+ audio_dstream_playback_buffer_size = (uint32_t) floor (Config->get_audio_playback_buffer_seconds() * _session.frame_rate());
_session.adjust_capture_buffering ();
+ _session.adjust_playback_buffering ();
} else if (p == "midi-readahead") {
MidiDiskstream::set_readahead_frames ((framecnt_t) (Config->get_midi_readahead() * _session.frame_rate()));
}
@@ -80,14 +104,16 @@ Butler::config_changed (std::string p)
int
Butler::start_thread()
{
- const float rate = (float)_session.frame_rate();
-
+ // set up capture and playback buffering
+ Diskstream::set_buffering_parameters (Config->get_buffering_preset());
+
/* size is in Samples, not bytes */
+ const float rate = (float)_session.frame_rate();
audio_dstream_capture_buffer_size = (uint32_t) floor (Config->get_audio_capture_buffer_seconds() * rate);
audio_dstream_playback_buffer_size = (uint32_t) floor (Config->get_audio_playback_buffer_seconds() * rate);
-
+
/* size is in bytes
- * XXX: Jack needs to tell us the MIDI buffer size
+ * XXX: AudioEngine needs to tell us the MIDI buffer size
* (i.e. how many MIDI bytes we might see in a cycle)
*/
midi_dstream_buffer_size = (uint32_t) floor (Config->get_midi_track_buffer_seconds() * rate);
@@ -103,6 +129,11 @@ Butler::start_thread()
//pthread_detach (thread);
have_thread = true;
+
+ // we are ready to request buffer adjustments
+ _session.adjust_capture_buffering ();
+ _session.adjust_playback_buffering ();
+
return 0;
}
diff --git a/libs/ardour/debug.cc b/libs/ardour/debug.cc
index 0a00e89..d7b7269 100644
--- a/libs/ardour/debug.cc
+++ b/libs/ardour/debug.cc
@@ -65,5 +65,6 @@ PBD::DebugBits PBD::DEBUG::Ports = PBD::new_debug_bit ("Ports");
PBD::DebugBits PBD::DEBUG::AudioEngine = PBD::new_debug_bit ("AudioEngine");
PBD::DebugBits PBD::DEBUG::Soundcloud = PBD::new_debug_bit ("Soundcloud");
PBD::DebugBits PBD::DEBUG::Butler = PBD::new_debug_bit ("Butler");
+PBD::DebugBits PBD::DEBUG::GenericMidi = PBD::new_debug_bit ("genericmidi");
diff --git a/libs/ardour/directory_names.cc b/libs/ardour/directory_names.cc
index a5d7bbb..d8c35c5 100644
--- a/libs/ardour/directory_names.cc
+++ b/libs/ardour/directory_names.cc
@@ -39,5 +39,9 @@ const char* const surfaces_dir_name = X_("surfaces");
const char* const ladspa_dir_name = X_("ladspa");
const char* const panner_dir_name = X_("panners");
const char* const backend_dir_name = X_("backends");
+const char* const automation_dir_name = X_("automation");
+const char* const analysis_dir_name = X_("analysis");
+const char* const plugins_dir_name = X_("plugins");
+const char* const externals_dir_name = X_("externals");
}
diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc
index 9f3322d..91859e7 100644
--- a/libs/ardour/diskstream.cc
+++ b/libs/ardour/diskstream.cc
@@ -42,6 +42,7 @@
#include "ardour/diskstream.h"
#include "ardour/io.h"
#include "ardour/pannable.h"
+#include "ardour/profile.h"
#include "ardour/playlist.h"
#include "ardour/session.h"
#include "ardour/track.h"
@@ -498,6 +499,11 @@ Diskstream::set_state (const XMLNode& node, int /*version*/)
_flags = Flag (string_2_enum (prop->value(), _flags));
}
+ if (Profile->get_trx() && (_flags & Destructive)) {
+ error << string_compose (_("%1: this session uses destructive tracks, which are not supported"), PROGRAM_NAME) << endmsg;
+ return -1;
+ }
+
if ((prop = node.property (X_("capture-alignment"))) != 0) {
set_align_choice (AlignChoice (string_2_enum (prop->value(), _alignment_choice)), true);
} else {
@@ -799,3 +805,63 @@ Diskstream::default_disk_write_chunk_frames ()
{
return 65536;
}
+
+void
+Diskstream::set_buffering_parameters (BufferingPreset bp)
+{
+ framecnt_t read_chunk_size;
+ framecnt_t read_buffer_size;
+ framecnt_t write_chunk_size;
+ framecnt_t write_buffer_size;
+
+ if (!get_buffering_presets (bp, read_chunk_size, read_buffer_size, write_chunk_size, write_buffer_size)) {
+ return;
+ }
+
+ disk_read_chunk_frames = read_chunk_size;
+ disk_write_chunk_frames = write_chunk_size;
+ Config->set_audio_capture_buffer_seconds (write_buffer_size);
+ Config->set_audio_playback_buffer_seconds (read_buffer_size);
+
+ cerr << "Set buffering params to " << disk_read_chunk_frames << '|' << disk_write_chunk_frames << '|'
+ << Config->get_audio_playback_buffer_seconds() << '|'
+ << Config->get_audio_capture_buffer_seconds ()
+ << endl;
+}
+
+bool
+Diskstream::get_buffering_presets (BufferingPreset bp,
+ framecnt_t& read_chunk_size,
+ framecnt_t& read_buffer_size,
+ framecnt_t& write_chunk_size,
+ framecnt_t& write_buffer_size)
+{
+ switch (bp) {
+ case Small:
+ read_chunk_size = 65536; /* samples */
+ write_chunk_size = 65536; /* samples */
+ read_buffer_size = 5; /* seconds */
+ write_buffer_size = 5; /* seconds */
+ break;
+
+ case Medium:
+ read_chunk_size = 262144; /* samples */
+ write_chunk_size = 131072; /* samples */
+ read_buffer_size = 10; /* seconds */
+ write_buffer_size = 10; /* seconds */
+ break;
+
+ case Large:
+ read_chunk_size = 524288; /* samples */
+ write_chunk_size = 131072; /* samples */
+ read_buffer_size = 20; /* seconds */
+ write_buffer_size = 20; /* seconds */
+ break;
+
+ default:
+ return false;
+ }
+
+ return true;
+}
+
diff --git a/libs/ardour/engine_state_controller.cc b/libs/ardour/engine_state_controller.cc
new file mode 100644
index 0000000..eb4cb14
--- /dev/null
+++ b/libs/ardour/engine_state_controller.cc
@@ -0,0 +1,1907 @@
+/*
+ Copyright (C) 2014 Waves Audio Ltd.
+
+ 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.
+
+*/
+
+#include "ardour/engine_state_controller.h"
+
+#include "ardour/audioengine.h"
+#include "ardour/session.h"
+#include "ardour/rc_configuration.h"
+#include "ardour/data_type.h"
+
+#include "pbd/pthread_utils.h"
+#include "pbd/error.h"
+#include "i18n.h"
+
+
+using namespace ARDOUR;
+using namespace PBD;
+
+namespace {
+
+struct DevicePredicate
+{
+ DevicePredicate (const std::string& device_name)
+ : _device_name (device_name)
+ {}
+
+ bool operator ()(const AudioBackend::DeviceStatus& rhs)
+ {
+ return _device_name == rhs.name;
+ }
+
+ private:
+ std::string _device_name;
+};
+}
+
+EngineStateController*
+EngineStateController::instance ()
+{
+ static EngineStateController instance;
+ return &instance;
+}
+
+
+EngineStateController::EngineStateController ()
+ : _current_state ()
+ , _last_used_real_device ("")
+
+{
+ AudioEngine::instance ()->Running.connect_same_thread (running_connection, boost::bind (&EngineStateController::_on_engine_running, this));
+ AudioEngine::instance ()->Stopped.connect_same_thread (stopped_connection, boost::bind (&EngineStateController::_on_engine_stopped, this));
+ AudioEngine::instance ()->Halted.connect_same_thread (stopped_connection, boost::bind (&EngineStateController::_on_engine_stopped, this));
+
+ /* Subscribe for udpates from AudioEngine */
+ AudioEngine::instance ()->PortRegisteredOrUnregistered.connect_same_thread (update_connections, boost::bind (&EngineStateController::_on_ports_registration_update, this));
+ AudioEngine::instance ()->SampleRateChanged.connect_same_thread (update_connections, boost::bind (&EngineStateController::_on_sample_rate_change, this, _1));
+ AudioEngine::instance ()->BufferSizeChanged.connect_same_thread (update_connections, boost::bind (&EngineStateController::_on_buffer_size_change, this, _1));
+ AudioEngine::instance ()->DeviceListChanged.connect_same_thread (update_connections, boost::bind (&EngineStateController::_on_device_list_change, this));
+ AudioEngine::instance ()->DeviceError.connect_same_thread (update_connections, boost::bind (&EngineStateController::_on_device_error, this));
+
+ /* Global configuration parameters update */
+ Config->ParameterChanged.connect_same_thread (update_connections, boost::bind (&EngineStateController::_on_parameter_changed, this, _1));
+
+ _deserialize_and_load_engine_states ();
+ _deserialize_and_load_midi_port_states ();
+ _do_initial_engine_setup ();
+
+ // now push the sate to the backend
+ push_current_state_to_backend (false);
+}
+
+
+EngineStateController::~EngineStateController ()
+{
+}
+
+
+void
+EngineStateController::set_session (Session* session)
+{
+ _session = session;
+ _session->SessionLoaded.connect_same_thread (session_connections, boost::bind (&EngineStateController::_on_session_loaded, this));
+}
+
+
+void
+EngineStateController::remove_session ()
+{
+ session_connections.drop_connections ();
+ _session = 0;
+}
+
+
+XMLNode&
+EngineStateController::serialize_audio_midi_settings ()
+{
+
+ XMLNode* root = new XMLNode ("AudioMidiSettings");
+
+ _serialize_engine_states (root);
+ _serialize_midi_port_states (root);
+
+ return *root;
+}
+
+
+void
+EngineStateController::save_audio_midi_settings ()
+{
+ Config->add_extra_xml (serialize_audio_midi_settings ());
+ Config->save_state ();
+}
+
+
+void
+EngineStateController::_deserialize_and_load_engine_states ()
+{
+ XMLNode* audio_midi_settings_root = ARDOUR::Config->extra_xml ("AudioMidiSettings");
+
+ if (!audio_midi_settings_root) {
+ return;
+ }
+
+ XMLNode* engine_states = audio_midi_settings_root->child ("EngineStates");
+
+ if (!engine_states) {
+ return;
+ }
+
+ XMLNodeList state_nodes_list = engine_states->children ();
+ XMLNodeConstIterator state_node_iter = state_nodes_list.begin ();
+
+ for (; state_node_iter != state_nodes_list.end (); ++state_node_iter) {
+
+ XMLNode* state_node = *state_node_iter;
+ StatePtr engine_state (new State);
+ XMLProperty* prop = NULL;
+
+ if ((prop = state_node->property ("backend-name")) == 0) {
+ continue;
+ }
+ engine_state->backend_name = prop->value ();
+
+ if ((prop = state_node->property ("device-name")) == 0) {
+ continue;
+ }
+ engine_state->device_name = prop->value ();
+
+ if ((prop = state_node->property ("sample-rate")) == 0) {
+ continue;
+ }
+ engine_state->sample_rate = atoi (prop->value ());
+
+ if ((prop = state_node->property ("buffer-size")) == 0) {
+ continue;
+ }
+ engine_state->buffer_size = atoi (prop->value ());
+
+ if ((prop = state_node->property ("active")) == 0) {
+ continue;
+ }
+ engine_state->active = string_is_affirmative (prop->value ());
+
+ XMLNodeList state_children_list = state_node->children ();
+ XMLNodeConstIterator state_child_iter = state_children_list.begin ();
+
+ for (; state_child_iter != state_children_list.end (); ++state_child_iter) {
+ XMLNode* state_child = *state_child_iter;
+
+ if (state_child->name () == "InputConfiguration") {
+
+ XMLNodeList input_states_nodes = state_child->children ();
+ XMLNodeConstIterator input_state_node_iter = input_states_nodes.begin ();
+ PortStateList& input_states = engine_state->input_channel_states;
+
+ for (; input_state_node_iter != input_states_nodes.end (); ++input_state_node_iter) {
+
+ XMLNode* input_state_node = *input_state_node_iter;
+
+ if (input_state_node->name () != "input") {
+ continue;
+ }
+ PortState input_state (input_state_node->name ());
+
+ if ((prop = input_state_node->property ("name")) == 0) {
+ continue;
+ }
+ input_state.name = prop->value ();
+
+ if ((prop = input_state_node->property ("active")) == 0) {
+ continue;
+ }
+ input_state.active = string_is_affirmative (prop->value ());
+
+ input_states.push_back (input_state);
+ }
+
+ } else if (state_child->name () == "MultiOutConfiguration") {
+
+ XMLNodeList multi_out_state_nodes = state_child->children ();
+ XMLNodeConstIterator multi_out_state_node_iter = multi_out_state_nodes.begin ();
+ PortStateList& multi_out_states = engine_state->multi_out_channel_states;
+
+ for (; multi_out_state_node_iter != multi_out_state_nodes.end (); ++multi_out_state_node_iter) {
+
+ XMLNode* multi_out_state_node = *multi_out_state_node_iter;
+
+ if (multi_out_state_node->name () != "output") {
+ continue;
+ }
+ PortState multi_out_state (multi_out_state_node->name ());
+
+ if ((prop = multi_out_state_node->property ("name")) == 0) {
+ continue;
+ }
+ multi_out_state.name = prop->value ();
+
+ if ((prop = multi_out_state_node->property ("active")) == 0) {
+ continue;
+ }
+ multi_out_state.active = string_is_affirmative (prop->value ());
+
+ multi_out_states.push_back (multi_out_state);
+ }
+ } else if (state_child->name () == "StereoOutConfiguration") {
+
+ XMLNodeList stereo_out_state_nodes = state_child->children ();
+ XMLNodeConstIterator stereo_out_state_node_iter = stereo_out_state_nodes.begin ();
+ PortStateList& stereo_out_states = engine_state->stereo_out_channel_states;
+
+ for (; stereo_out_state_node_iter != stereo_out_state_nodes.end (); ++stereo_out_state_node_iter) {
+
+ XMLNode* stereo_out_state_node = *stereo_out_state_node_iter;
+
+ if (stereo_out_state_node->name () != "output") {
+ continue;
+ }
+ PortState stereo_out_state (stereo_out_state_node->name ());
+
+ if ((prop = stereo_out_state_node->property ("name")) == 0) {
+ continue;
+ }
+ stereo_out_state.name = prop->value ();
+
+ if ((prop = stereo_out_state_node->property ("active")) == 0) {
+ continue;
+ }
+ stereo_out_state.active = string_is_affirmative (prop->value ());
+
+ stereo_out_states.push_back (stereo_out_state);
+ }
+ }
+ }
+
+ _states.push_back (engine_state);
+ }
+}
+
+
+void
+EngineStateController::_deserialize_and_load_midi_port_states ()
+{
+ XMLNode* audio_midi_settings_root = ARDOUR::Config->extra_xml ("AudioMidiSettings");
+
+ if (!audio_midi_settings_root) {
+ return;
+ }
+
+ XMLNode* midi_states = audio_midi_settings_root->child ("MidiStates");
+
+ if (!midi_states) {
+ return;
+ }
+
+ XMLNodeList state_nodes_list = midi_states->children ();
+ XMLNodeConstIterator state_node_iter = state_nodes_list.begin ();
+ for (; state_node_iter != state_nodes_list.end (); ++state_node_iter) {
+
+ XMLNode* state_node = *state_node_iter;
+ if (state_node->name () == "MidiInputs") {
+
+ XMLNodeList input_state_nodes = state_node->children ();
+ XMLNodeConstIterator input_state_node_iter = input_state_nodes.begin ();
+ _midi_inputs.clear ();
+
+ for (; input_state_node_iter != input_state_nodes.end (); ++input_state_node_iter) {
+
+ XMLNode* input_state_node = *input_state_node_iter;
+ XMLProperty* prop = NULL;
+
+ if (input_state_node->name () != "input") {
+ continue;
+ }
+ MidiPortState input_state (input_state_node->name ());
+
+ if ((prop = input_state_node->property ("name")) == 0) {
+ continue;
+ }
+ input_state.name = prop->value ();
+
+ if ((prop = input_state_node->property ("active")) == 0) {
+ continue;
+ }
+ input_state.active = string_is_affirmative (prop->value ());
+
+ if ((prop = input_state_node->property ("scene-connected")) == 0) {
+ continue;
+ }
+ input_state.scene_connected = string_is_affirmative (prop->value ());
+
+ if ((prop = input_state_node->property ("mtc-in")) == 0) {
+ continue;
+ }
+ input_state.mtc_in = string_is_affirmative (prop->value ());
+
+ _midi_inputs.push_back (input_state);
+ }
+
+ } else if (state_node->name () == "MidiOutputs") {
+
+ XMLNodeList output_state_nodes = state_node->children ();
+ XMLNodeConstIterator output_state_node_iter = output_state_nodes.begin ();
+ _midi_outputs.clear ();
+
+ for (; output_state_node_iter != output_state_nodes.end (); ++output_state_node_iter) {
+
+ XMLNode* output_state_node = *output_state_node_iter;
+ XMLProperty* prop = NULL;
+
+ if (output_state_node->name () != "output") {
+ continue;
+ }
+ MidiPortState output_state (output_state_node->name ());
+
+ if ((prop = output_state_node->property ("name")) == 0) {
+ continue;
+ }
+ output_state.name = prop->value ();
+
+ if ((prop = output_state_node->property ("active")) == 0) {
+ continue;
+ }
+ output_state.active = string_is_affirmative (prop->value ());
+
+ if ((prop = output_state_node->property ("scene-connected")) == 0) {
+ continue;
+ }
+ output_state.scene_connected = string_is_affirmative (prop->value ());
+
+ if ((prop = output_state_node->property ("mtc-in")) == 0) {
+ continue;
+ }
+ output_state.mtc_in = string_is_affirmative (prop->value ());
+
+ _midi_outputs.push_back (output_state);
+ }
+ }
+ }
+}
+
+
+void
+EngineStateController::_serialize_engine_states (XMLNode* audio_midi_settings_node)
+{
+ if (!audio_midi_settings_node) {
+ return;
+ }
+
+ // clean up state data first
+ audio_midi_settings_node->remove_nodes_and_delete ("EngineStates" );
+
+ XMLNode* engine_states = new XMLNode ("EngineStates" );
+
+ StateList::const_iterator state_iter = _states.begin ();
+ for (; state_iter != _states.end (); ++state_iter) {
+
+ StatePtr state_ptr = *state_iter;
+
+ // create new node for the state
+ XMLNode* state_node = new XMLNode ("State");
+
+ state_node->add_property ("backend-name", state_ptr->backend_name);
+ state_node->add_property ("device-name", state_ptr->device_name);
+ state_node->add_property ("sample-rate", state_ptr->sample_rate);
+ state_node->add_property ("buffer-size", state_ptr->buffer_size);
+ state_node->add_property ("active", state_ptr->active ? "yes" : "no");
+
+ // store channel states:
+ // inputs
+ XMLNode* input_config_node = new XMLNode ("InputConfiguration");
+ PortStateList& input_channels = state_ptr->input_channel_states;
+ PortStateList::const_iterator input_state_iter = input_channels.begin ();
+ for (; input_state_iter != input_channels.end (); ++input_state_iter) {
+ XMLNode* input_state_node = new XMLNode ("input");
+ input_state_node->add_property ("name", input_state_iter->name);
+ input_state_node->add_property ("active", input_state_iter->active ? "yes" : "no");
+ input_config_node->add_child_nocopy (*input_state_node);
+ }
+ state_node->add_child_nocopy (*input_config_node);
+
+ // multi out outputs
+ XMLNode* multi_out_config_node = new XMLNode ("MultiOutConfiguration");
+ PortStateList& multi_out_channels = state_ptr->multi_out_channel_states;
+ PortStateList::const_iterator multi_out_state_iter = multi_out_channels.begin ();
+ for (; multi_out_state_iter != multi_out_channels.end (); ++multi_out_state_iter) {
+ XMLNode* multi_out_state_node = new XMLNode ("output" );
+ multi_out_state_node->add_property ("name", multi_out_state_iter->name);
+ multi_out_state_node->add_property ("active", multi_out_state_iter->active ? "yes" : "no");
+ multi_out_config_node->add_child_nocopy (*multi_out_state_node);
+ }
+ state_node->add_child_nocopy (*multi_out_config_node);
+
+ // stereo out outputs
+ XMLNode* stereo_out_config_node = new XMLNode ("StereoOutConfiguration");
+ PortStateList& stereo_out_channels = state_ptr->stereo_out_channel_states;
+ PortStateList::const_iterator stereo_out_state_iter = stereo_out_channels.begin ();
+ for (; stereo_out_state_iter != stereo_out_channels.end (); ++stereo_out_state_iter) {
+ XMLNode* stereo_out_state_node = new XMLNode ("output" );
+ stereo_out_state_node->add_property ("name", stereo_out_state_iter->name);
+ stereo_out_state_node->add_property ("active", stereo_out_state_iter->active ? "yes" : "no");
+ stereo_out_config_node->add_child_nocopy (*stereo_out_state_node);
+ }
+ state_node->add_child_nocopy (*stereo_out_config_node);
+
+ engine_states->add_child_nocopy (*state_node);
+ }
+
+ audio_midi_settings_node->add_child_nocopy (*engine_states);
+}
+
+
+void
+EngineStateController::_serialize_midi_port_states (XMLNode* audio_midi_settings_node)
+{
+ if (!audio_midi_settings_node) {
+ return;
+ }
+
+ // clean up state data first
+ audio_midi_settings_node->remove_nodes_and_delete ("MidiStates" );
+
+ XMLNode* midi_states_node = new XMLNode ("MidiStates" );
+
+ XMLNode* midi_input_states_node = new XMLNode ("MidiInputs" );
+ MidiPortStateList::const_iterator midi_input_state_iter = _midi_inputs.begin ();
+ for (; midi_input_state_iter != _midi_inputs.end (); ++midi_input_state_iter) {
+ XMLNode* midi_input_node = new XMLNode ("input" );
+ midi_input_node->add_property ("name", midi_input_state_iter->name);
+ midi_input_node->add_property ("active", midi_input_state_iter->active ? "yes" : "no");
+ midi_input_node->add_property ("scene_connected", midi_input_state_iter->scene_connected ? "yes" : "no");
+ midi_input_node->add_property ("mtc-in", midi_input_state_iter->mtc_in ? "yes" : "no");
+ midi_input_states_node->add_child_nocopy (*midi_input_node);
+ }
+ midi_states_node->add_child_nocopy (*midi_input_states_node);
+
+ XMLNode* midi_output_states_node = new XMLNode ("MidiOutputs" );
+ MidiPortStateList::const_iterator midi_output_state_iter = _midi_outputs.begin ();
+ for (; midi_output_state_iter != _midi_outputs.end (); ++midi_output_state_iter) {
+ XMLNode* midi_output_node = new XMLNode ("output" );
+ midi_output_node->add_property ("name", midi_output_state_iter->name);
+ midi_output_node->add_property ("active", midi_output_state_iter->active ? "yes" : "no");
+ midi_output_node->add_property ("scene_connected", midi_output_state_iter->scene_connected ? "yes" : "no");
+ midi_output_node->add_property ("mtc-in", midi_output_state_iter->mtc_in ? "yes" : "no");
+ midi_output_states_node->add_child_nocopy (*midi_output_node);
+ }
+ midi_states_node->add_child_nocopy (*midi_output_states_node);
+
+ audio_midi_settings_node->add_child_nocopy (*midi_states_node);
+}
+
+
+bool
+EngineStateController::_apply_state (const StatePtr& state)
+{
+ bool applied = false;
+
+ if (set_new_backend_as_current (state->backend_name)) {
+ applied = set_new_device_as_current (state->device_name);
+ }
+
+ return applied;
+}
+
+
+void
+EngineStateController::_do_initial_engine_setup ()
+{
+ bool state_applied = false;
+
+ // if we have no saved state load default values
+ if (!_states.empty ()) {
+
+ // look for last active state first
+ StateList::const_iterator state_iter = _states.begin ();
+ for (; state_iter != _states.end (); ++state_iter) {
+ if ( (*state_iter)->active ) {
+ state_applied = _apply_state (*state_iter);
+ break;
+ }
+ }
+
+ // last active state was not applied
+ // try others
+ if (!state_applied) {
+ StateList::const_iterator state_iter = _states.begin ();
+ for (; state_iter != _states.end (); ++state_iter) {
+ state_applied = _apply_state (*state_iter);
+ break;
+ }
+ }
+ }
+
+ if (!state_applied ){
+ std::vector<const AudioBackendInfo*> backends = AudioEngine::instance ()->available_backends ();
+
+ if (!backends.empty ()) {
+
+ if (!set_new_backend_as_current (backends.front ()->name )) {
+ std::cerr << "\tfailed to set backend [" << backends.front ()->name << "]\n";
+ }
+ }
+
+ }
+}
+
+
+bool
+EngineStateController::_validate_current_device_state ()
+{
+ boost::shared_ptr<AudioBackend> backend = AudioEngine::instance ()->current_backend ();
+ assert (backend);
+
+ // check if device parameters from the state record are still valid
+ // validate sample rate
+ std::vector<float> sample_rates = backend->available_sample_rates (_current_state->device_name);
+
+ if (sample_rates.empty ()) {
+ return false;
+ }
+
+ // check if session desired sample rate (if it's set) could be used with this device
+ if (_session != 0) {
+
+ if ( !set_new_sample_rate_in_controller (_session->nominal_frame_rate ())) {
+ if ( !set_new_sample_rate_in_controller (backend->default_sample_rate ()) ) {
+ if (!set_new_sample_rate_in_controller (sample_rates.front ()) ) {
+ return false;
+ }
+ }
+ }
+
+ } else {
+ // check if current sample rate is supported because we have no session desired sample rate value
+ if ( !set_new_sample_rate_in_controller (_current_state->sample_rate)) {
+ if ( !set_new_sample_rate_in_controller (backend->default_sample_rate ()) ) {
+ if (!set_new_sample_rate_in_controller (sample_rates.front ()) ) {
+ return false;
+ }
+ }
+ }
+ }
+
+ // validate buffer size
+ std::vector<pframes_t> buffer_sizes = backend->available_buffer_sizes (_current_state->device_name);
+ // check if buffer size is supported
+ std::vector<pframes_t>::iterator bs_iter = std::find (buffer_sizes.begin (), buffer_sizes.end (), _current_state->buffer_size);
+ // if current is not found switch to default if is supported
+ if (bs_iter == buffer_sizes.end ()) {
+ bs_iter = std::find (buffer_sizes.begin (), buffer_sizes.end (), backend->default_buffer_size (_current_state->device_name));
+
+ if (bs_iter != buffer_sizes.end ()) {
+ _current_state->buffer_size = backend->default_buffer_size (_current_state->device_name);
+ } else {
+ if (!buffer_sizes.empty ()) {
+ _current_state->buffer_size = buffer_sizes.front ();
+ }
+ }
+
+ }
+
+ return true;
+}
+
+
+void
+EngineStateController::_update_ltc_source_port ()
+{
+ // this method is called if the list of ports is changed
+
+ // check that ltc-in port from Config still exists
+ if (_audio_input_port_exists (get_ltc_source_port ())) {
+ // audio port, that was saved in Config, exists
+ return ;
+ }
+
+ //otherwise set first available audio port
+ if (!_current_state->input_channel_states.empty ()) {
+ set_ltc_source_port (_current_state->input_channel_states.front ().name);
+ return ;
+ }
+
+ // no available audio-in ports
+ set_ltc_source_port ("");
+}
+
+void
+EngineStateController::_update_ltc_output_port ()
+{
+ // this method is called if the list of ports is changed
+
+ // check that ltc-out port from Config still exists
+ if (_audio_output_port_exists (get_ltc_output_port ())) {
+ // audio port, that was saved in Config, exists
+ return ;
+ }
+
+ PortStateList* output_states;
+ if (Config->get_output_auto_connect () & AutoConnectMaster) {
+ output_states = &_current_state->stereo_out_channel_states;
+ } else {
+ output_states = &_current_state->multi_out_channel_states;
+ }
+
+ //otherwise set first available audio port
+ if (!output_states->empty ()) {
+ set_ltc_output_port (output_states->front ().name);
+ return ;
+ }
+
+ // no available audio-out ports
+ set_ltc_output_port ("");
+}
+
+
+bool
+EngineStateController::_audio_input_port_exists (const std::string& port_name)
+{
+ PortStateList::const_iterator iter = _current_state->input_channel_states.begin ();
+ for (; iter != _current_state->input_channel_states.end (); ++iter ) {
+ if (iter->name == port_name)
+ return true;
+ }
+ return false;
+}
+
+bool
+EngineStateController::_audio_output_port_exists (const std::string& port_name)
+{
+ PortStateList* output_states;
+ if (Config->get_output_auto_connect () & AutoConnectMaster) {
+ output_states = &_current_state->stereo_out_channel_states;
+ } else {
+ output_states = &_current_state->multi_out_channel_states;
+ }
+
+ PortStateList::const_iterator iter = output_states->begin ();
+ for (; iter != output_states->end (); ++iter ) {
+ if (iter->name == port_name)
+ return true;
+ }
+ return false;
+}
+
+
+const std::string&
+EngineStateController::get_current_backend_name () const
+{
+ return _current_state->backend_name;
+}
+
+
+const std::string&
+EngineStateController::get_current_device_name () const
+{
+ return _current_state->device_name;
+}
+
+
+void
+EngineStateController::available_backends (std::vector<const AudioBackendInfo*>& available_backends)
+{
+ available_backends = AudioEngine::instance ()->available_backends ();
+}
+
+
+void
+EngineStateController::enumerate_devices (std::vector<AudioBackend::DeviceStatus>& device_vector) const
+{
+ boost::shared_ptr<AudioBackend> backend = AudioEngine::instance ()->current_backend ();
+ assert (backend);
+ device_vector = backend->enumerate_devices ();
+}
+
+
+framecnt_t
+EngineStateController::get_current_sample_rate () const
+{
+ return _current_state->sample_rate;
+}
+
+
+framecnt_t
+EngineStateController::get_default_sample_rate () const
+{
+ boost::shared_ptr<AudioBackend> backend = AudioEngine::instance ()->current_backend ();
+ assert (backend);
+ return backend->default_sample_rate ();
+}
+
+
+void
+EngineStateController::available_sample_rates_for_current_device (std::vector<float>& sample_rates) const
+{
+ boost::shared_ptr<AudioBackend> backend = AudioEngine::instance ()->current_backend ();
+ assert (backend);
+ sample_rates = backend->available_sample_rates (_current_state->device_name);
+}
+
+
+uint32_t
+EngineStateController::get_current_buffer_size () const
+{
+ return _current_state->buffer_size;
+}
+
+
+uint32_t
+EngineStateController::get_default_buffer_size () const
+{
+ boost::shared_ptr<AudioBackend> backend = AudioEngine::instance ()->current_backend ();
+ assert (backend);
+ return backend->default_buffer_size (_current_state->device_name);
+}
+
+
+void
+EngineStateController::available_buffer_sizes_for_current_device (std::vector<pframes_t>& buffer_sizes) const
+{
+ boost::shared_ptr<AudioBackend> backend = AudioEngine::instance ()->current_backend ();
+ assert (backend);
+ buffer_sizes = backend->available_buffer_sizes (_current_state->device_name);
+}
+
+
+bool
+EngineStateController::set_new_backend_as_current (const std::string& backend_name)
+{
+ if (backend_name == AudioEngine::instance ()->current_backend_name ()) {
+ return true;
+ }
+
+ boost::shared_ptr<AudioBackend> backend = AudioEngine::instance ()->set_backend (backend_name, PROGRAM_NAME, "");
+ if (backend)
+ {
+ if (_current_state != NULL) {
+ _current_state->active = false;
+ }
+
+ StateList::iterator found_state_iter = find_if (_states.begin (), _states.end (),
+ State::StatePredicate (backend_name, "None"));
+
+ if (found_state_iter != _states.end ()) {
+ // we found a record for new engine with None device - switch to it
+ _current_state = *found_state_iter;
+ _validate_current_device_state ();
+ } else {
+ // create new record for this engine with default device
+ _current_state = boost::shared_ptr<State>(new State ());
+ _current_state->backend_name = backend_name;
+ _current_state->device_name = "None";
+ _validate_current_device_state ();
+ _states.push_front (_current_state);
+ }
+
+ push_current_state_to_backend (false);
+
+ return true;
+ }
+
+ return false;
+}
+
+
+bool
+EngineStateController::set_new_device_as_current (const std::string& device_name)
+{
+ if (_current_state->device_name == device_name) {
+ return true;
+ }
+
+ boost::shared_ptr<AudioBackend> backend = AudioEngine::instance ()->current_backend ();
+ assert (backend);
+
+ std::vector<AudioBackend::DeviceStatus> device_vector = backend->enumerate_devices ();
+
+ // validate the device
+ std::vector<AudioBackend::DeviceStatus>::iterator device_iter;
+ device_iter = std::find_if (device_vector.begin (), device_vector.end (), DevicePredicate (device_name));
+
+ // device is available
+ if (device_iter != device_vector.end ()) {
+
+ boost::shared_ptr<State> previous_state (_current_state);
+
+ // look through state list and find the record for this device and current engine
+ StateList::iterator found_state_iter = find_if (_states.begin (), _states.end (),
+ State::StatePredicate (backend->name (), device_name));
+
+ if (found_state_iter != _states.end ())
+ {
+ // we found a record for current engine and provided device name - switch to it
+
+ _current_state = *found_state_iter;
+
+ if (!_validate_current_device_state ()) {
+ _current_state = previous_state;
+ return false;
+ }
+
+ } else {
+
+ // the record is not found, create new one
+ _current_state = boost::shared_ptr<State>(new State ());
+
+ _current_state->backend_name = backend->name ();
+ _current_state->device_name = device_name;
+
+ if (!_validate_current_device_state ()) {
+ _current_state = previous_state;
+ return false;
+ }
+
+ _states.push_front (_current_state);
+ }
+
+ if (previous_state != NULL) {
+ previous_state->active = false;
+ }
+
+ push_current_state_to_backend (false);
+
+ _last_used_real_device.clear ();
+
+ if (device_name != "None") {
+ _last_used_real_device = device_name;
+ }
+
+ return true;
+ }
+
+ // device is not supported by current backend
+ return false;
+}
+
+
+bool
+EngineStateController::set_new_sample_rate_in_controller (framecnt_t sample_rate)
+{
+ boost::shared_ptr<AudioBackend> backend = AudioEngine::instance ()->current_backend ();
+ assert (backend);
+
+ std::vector<float> sample_rates = backend->available_sample_rates (_current_state->device_name);
+ std::vector<float>::iterator iter = std::find (sample_rates.begin (), sample_rates.end (), (float)sample_rate);
+
+ if (iter != sample_rates.end ()) {
+ _current_state->sample_rate = sample_rate;
+ return true;
+ }
+
+ return false;
+}
+
+
+bool
+EngineStateController::set_new_buffer_size_in_controller (pframes_t buffer_size)
+{
+ boost::shared_ptr<AudioBackend> backend = AudioEngine::instance ()->current_backend ();
+ assert (backend);
+
+ std::vector<uint32_t> buffer_sizes = backend->available_buffer_sizes (_current_state->device_name);
+ std::vector<uint32_t>::iterator iter = std::find (buffer_sizes.begin (), buffer_sizes.end (), buffer_size);
+
+ if (iter != buffer_sizes.end ()) {
+ _current_state->buffer_size = buffer_size;
+ return true;
+ }
+
+ return false;
+}
+
+
+uint32_t
+EngineStateController::get_available_inputs_count () const
+{
+ uint32_t available_channel_count = 0;
+
+ PortStateList::const_iterator iter = _current_state->input_channel_states.begin ();
+
+ for (; iter != _current_state->input_channel_states.end (); ++iter) {
+ if (iter->active) {
+ ++available_channel_count;
+ }
+ }
+
+ return available_channel_count;
+}
+
+
+uint32_t
+EngineStateController::get_available_outputs_count () const
+{
+ uint32_t available_channel_count = 0;
+
+ PortStateList* output_states;
+ if (Config->get_output_auto_connect () & AutoConnectMaster) {
+ output_states = &_current_state->stereo_out_channel_states;
+ } else {
+ output_states = &_current_state->multi_out_channel_states;
+ }
+
+ PortStateList::const_iterator iter = output_states->begin ();
+
+ for (; iter != output_states->end (); ++iter) {
+ if (iter->active) {
+ ++available_channel_count;
+ }
+ }
+
+ return available_channel_count;
+}
+
+
+void
+EngineStateController::get_physical_audio_inputs (std::vector<std::string>& port_names)
+{
+ port_names.clear ();
+
+ PortStateList &input_states = _current_state->input_channel_states;
+
+ PortStateList::iterator iter = input_states.begin ();
+ for (; iter != input_states.end (); ++iter) {
+ if (iter->active) {
+ port_names.push_back (iter->name);
+ }
+ }
+}
+
+
+void
+EngineStateController::get_physical_audio_outputs (std::vector<std::string>& port_names)
+{
+ port_names.clear ();
+
+ PortStateList* output_states;
+ if (Config->get_output_auto_connect () & AutoConnectMaster) {
+ output_states = &_current_state->stereo_out_channel_states;
+ } else {
+ output_states = &_current_state->multi_out_channel_states;
+ }
+
+ PortStateList::iterator iter = output_states->begin ();
+ for (; iter != output_states->end (); ++iter) {
+ if (iter->active) {
+ port_names.push_back (iter->name);
+ }
+ }
+}
+
+
+void
+EngineStateController::get_physical_midi_inputs (std::vector<std::string>& port_names)
+{
+ port_names.clear ();
+
+ MidiPortStateList::iterator iter = _midi_inputs.begin ();
+ for (; iter != _midi_inputs.end (); ++iter) {
+ if (iter->available && iter->active) {
+ port_names.push_back (iter->name);
+ }
+ }
+}
+
+
+void
+EngineStateController::get_physical_midi_outputs (std::vector<std::string>& port_names)
+{
+ port_names.clear ();
+
+ MidiPortStateList::iterator iter = _midi_outputs.begin ();
+ for (; iter != _midi_outputs.end (); ++iter) {
+ if (iter->available && iter->active) {
+ port_names.push_back (iter->name);
+ }
+ }
+}
+
+
+void
+EngineStateController::set_physical_audio_input_state (const std::string& port_name, bool state)
+{
+ PortStateList &input_states = _current_state->input_channel_states;
+ PortStateList::iterator found_state_iter;
+ found_state_iter = std::find (input_states.begin (), input_states.end (), PortState (port_name));
+
+ if (found_state_iter != input_states.end () && found_state_iter->active != state ) {
+ found_state_iter->active = state;
+ AudioEngine::instance ()->reconnect_session_routes (true, false);
+
+ InputConfigChanged ();
+ }
+}
+
+
+void
+EngineStateController::set_physical_audio_output_state (const std::string& port_name, bool state)
+{
+ PortStateList* output_states;
+ if (Config->get_output_auto_connect () & AutoConnectMaster) {
+ output_states = &_current_state->stereo_out_channel_states;
+ } else {
+ output_states = &_current_state->multi_out_channel_states;
+ }
+
+ PortStateList::iterator target_state_iter;
+ target_state_iter = std::find (output_states->begin (), output_states->end (), PortState (port_name));
+
+ if (target_state_iter != output_states->end () && target_state_iter->active != state ) {
+ target_state_iter->active = state;
+
+ // if StereoOut mode is used
+ if (Config->get_output_auto_connect () & AutoConnectMaster) {
+
+ // get next element
+ PortStateList::iterator next_state_iter (target_state_iter);
+
+ // loopback
+ if (++next_state_iter == output_states->end ()) {
+ next_state_iter = output_states->begin ();
+ }
+
+
+ // only two outputs should be enabled
+ if (output_states->size () <= 2) {
+
+ target_state_iter->active = true;
+ next_state_iter->active = true;
+
+ } else {
+
+ // if current was set to active - activate next and disable the rest
+ if (target_state_iter->active ) {
+ next_state_iter->active = true;
+ } else {
+ // if current was deactivated but the next is active
+ if (next_state_iter->active) {
+ if (++next_state_iter == output_states->end ()) {
+ next_state_iter = output_states->begin ();
+ }
+ next_state_iter->active = true;
+ } else {
+ // if current was deactivated but the previous is active - restore the state of current
+ target_state_iter->active = true; // state restored;
+ --target_state_iter; // switch to previous to make it stop point in the next cycle
+ target_state_iter->active = true;
+ }
+ }
+
+ // now deactivate the rest
+ while (++next_state_iter != target_state_iter) {
+
+ if (next_state_iter == output_states->end ()) {
+ next_state_iter = output_states->begin ();
+ // we jumped, so additional check is required
+ if (next_state_iter == target_state_iter) {
+ break;
+ }
+ }
+
+ next_state_iter->active = false;
+ }
+
+ }
+ }
+
+ AudioEngine::instance ()->reconnect_session_routes (false, true);
+ OutputConfigChanged ();
+ }
+}
+
+
+bool
+EngineStateController::get_physical_audio_input_state (const std::string& port_name)
+{
+ bool state = false;
+
+ PortStateList &input_states = _current_state->input_channel_states;
+ PortStateList::iterator found_state_iter;
+ found_state_iter = std::find (input_states.begin (), input_states.end (), PortState (port_name));
+
+ if (found_state_iter != input_states.end ()) {
+ state = found_state_iter->active;
+ }
+
+ return state;
+}
+
+
+bool
+EngineStateController::get_physical_audio_output_state (const std::string& port_name)
+{
+ bool state = false;
+
+ PortStateList* output_states;
+ if (Config->get_output_auto_connect () & AutoConnectMaster) {
+ output_states = &_current_state->stereo_out_channel_states;
+ } else {
+ output_states = &_current_state->multi_out_channel_states;
+ }
+
+ PortStateList::iterator found_state_iter;
+ found_state_iter = std::find (output_states->begin (), output_states->end (), PortState (port_name));
+
+ if (found_state_iter != output_states->end ()) {
+ state = found_state_iter->active;
+ }
+
+ return state;
+}
+
+
+void
+EngineStateController::set_physical_midi_input_state (const std::string& port_name, bool state) {
+
+ MidiPortStateList::iterator found_state_iter;
+ found_state_iter = std::find (_midi_inputs.begin (), _midi_inputs.end (), MidiPortState (port_name));
+
+ if (found_state_iter != _midi_inputs.end () && found_state_iter->available && found_state_iter->active != state ) {
+ found_state_iter->active = state;
+
+ if (_session) {
+ // reconnect MTC inputs as well
+ if (found_state_iter->mtc_in) {
+ _session->reconnect_mtc_ports ();
+ }
+ _session->reconnect_mmc_ports (true);
+ }
+
+ MIDIInputConfigChanged ();
+ }
+}
+
+
+void
+EngineStateController::set_physical_midi_output_state (const std::string& port_name, bool state) {
+
+ MidiPortStateList::iterator found_state_iter;
+ found_state_iter = std::find (_midi_outputs.begin (), _midi_outputs.end (), MidiPortState (port_name));
+
+ if (found_state_iter != _midi_outputs.end () && found_state_iter->available && found_state_iter->active != state ) {
+ found_state_iter->active = state;
+
+ if (_session) {
+ _session->reconnect_mmc_ports (false);
+ }
+
+ MIDIOutputConfigChanged ();
+ }
+}
+
+
+bool
+EngineStateController::get_physical_midi_input_state (const std::string& port_name, bool& scene_connected) {
+
+ bool state = false;
+
+ MidiPortStateList::iterator found_state_iter;
+ found_state_iter = std::find (_midi_inputs.begin (), _midi_inputs.end (), MidiPortState (port_name));
+
+ if (found_state_iter != _midi_inputs.end () && found_state_iter->available) {
+ state = found_state_iter->active;
+ scene_connected = found_state_iter->scene_connected;
+ }
+
+ return state;
+}
+
+
+bool
+EngineStateController::get_physical_midi_output_state (const std::string& port_name, bool& scene_connected) {
+
+ bool state = false;
+
+ MidiPortStateList::iterator found_state_iter;
+ found_state_iter = std::find (_midi_outputs.begin (), _midi_outputs.end (), MidiPortState (port_name));
+
+ if (found_state_iter != _midi_outputs.end () && found_state_iter->available) {
+ state = found_state_iter->active;
+ scene_connected = found_state_iter->scene_connected;
+ }
+
+ return state;
+}
+
+
+void
+EngineStateController::set_physical_midi_scene_in_connection_state (const std::string& port_name, bool state) {
+
+ MidiPortStateList::iterator found_state_iter;
+ found_state_iter = std::find (_midi_inputs.begin (), _midi_inputs.end (), MidiPortState (port_name));
+
+ if (found_state_iter != _midi_inputs.end () && found_state_iter->available && found_state_iter->active ) {
+ found_state_iter->scene_connected = state;
+
+ std::vector<std::string> ports;
+ ports.push_back (port_name);
+ MIDISceneInputConnectionChanged (ports, state);
+ }
+
+}
+
+
+void
+EngineStateController::set_physical_midi_scenen_out_connection_state (const std::string& port_name, bool state) {
+
+ MidiPortStateList::iterator found_state_iter;
+ found_state_iter = std::find (_midi_outputs.begin (), _midi_outputs.end (), MidiPortState (port_name));
+
+ if (found_state_iter != _midi_outputs.end () && found_state_iter->available && found_state_iter->active ) {
+ found_state_iter->scene_connected = state;
+
+ std::vector<std::string> ports;
+ ports.push_back (port_name);
+ MIDISceneOutputConnectionChanged (ports, state);
+ }
+
+}
+
+
+void
+EngineStateController::set_all_midi_scene_inputs_disconnected ()
+{
+ MidiPortStateList::iterator iter = _midi_inputs.begin ();
+ for (; iter != _midi_inputs.end (); ++iter) {
+ iter->scene_connected = false;
+ }
+
+ std::vector<std::string> ports;
+ MIDISceneInputConnectionChanged (ports, false);
+}
+
+
+void
+EngineStateController::set_all_midi_scene_outputs_disconnected ()
+{
+ MidiPortStateList::iterator iter = _midi_outputs.begin ();
+ for (; iter != _midi_outputs.end (); ++iter) {
+ iter->scene_connected = false;
+ }
+
+ std::vector<std::string> ports;
+ MIDISceneOutputConnectionChanged (ports, false);
+}
+
+
+void
+EngineStateController::set_mtc_source_port (const std::string& port_name)
+{
+ MidiPortStateList::iterator iter = _midi_inputs.begin ();
+ for (; iter != _midi_inputs.end (); ++iter) {
+ iter->mtc_in = false;
+
+ if (iter->name == port_name) {
+ iter->mtc_in = true;
+
+ if (_session) {
+ _session->reconnect_mtc_ports ();
+ }
+ }
+ }
+
+ if (_session && port_name.empty ()) {
+ _session->reconnect_mtc_ports ();
+ }
+
+ MTCInputChanged (port_name);
+}
+
+
+void
+EngineStateController::set_state_to_all_inputs (bool state)
+{
+ bool something_changed = false;
+
+ PortStateList::iterator iter = _current_state->input_channel_states.begin ();
+ for (; iter != _current_state->input_channel_states.end (); ++iter) {
+ if (iter->active != state) {
+ iter->active = state;
+ something_changed = true;
+ }
+ }
+
+ if (something_changed) {
+ AudioEngine::instance ()->reconnect_session_routes (true, false);
+ InputConfigChanged ();
+ }
+}
+
+
+void
+EngineStateController::set_state_to_all_outputs (bool state)
+{
+ // unapplicable in Stereo Out mode, just return
+ if (Config->get_output_auto_connect () & AutoConnectMaster) {
+ return;
+ }
+
+ bool something_changed = false;
+
+ PortStateList::iterator iter = _current_state->multi_out_channel_states.begin ();
+ for (; iter != _current_state->multi_out_channel_states.end (); ++iter) {
+ if (iter->active != state) {
+ iter->active = state;
+ something_changed = true;
+ }
+ }
+
+ if (something_changed) {
+ AudioEngine::instance ()->reconnect_session_routes (false, true);
+ OutputConfigChanged ();
+ }
+}
+
+
+void
+EngineStateController::get_physical_audio_input_states (std::vector<PortState>& channel_states)
+{
+ PortStateList &input_states = _current_state->input_channel_states;
+ channel_states.assign (input_states.begin (), input_states.end ());
+}
+
+
+void
+EngineStateController::get_physical_audio_output_states (std::vector<PortState>& channel_states)
+{
+ PortStateList* output_states;
+ if (Config->get_output_auto_connect () & AutoConnectMaster) {
+ output_states = &_current_state->stereo_out_channel_states;
+ } else {
+ output_states = &_current_state->multi_out_channel_states;
+ }
+
+ channel_states.assign (output_states->begin (), output_states->end ());
+}
+
+
+void
+EngineStateController::get_physical_midi_input_states (std::vector<MidiPortState>& channel_states)
+{
+ channel_states.clear ();
+
+ MidiPortStateList::iterator iter = _midi_inputs.begin ();
+
+ for (; iter != _midi_inputs.end (); ++iter ) {
+ if (iter->available) {
+ MidiPortState state (iter->name);
+ state.active = iter->active;
+ state.available = true;
+ state.scene_connected = iter->scene_connected;
+ state.mtc_in = iter->mtc_in;
+ channel_states.push_back (state);
+ }
+ }
+}
+
+void
+EngineStateController::get_physical_midi_output_states (std::vector<MidiPortState>& channel_states)
+{
+ channel_states.clear ();
+
+ MidiPortStateList::iterator iter = _midi_outputs.begin ();
+
+ for (; iter != _midi_outputs.end (); ++iter ) {
+ if (iter->available) {
+ MidiPortState state (iter->name);
+ state.active = iter->active;
+ state.available = true;
+ state.scene_connected = iter->scene_connected;
+ state.mtc_in = iter->mtc_in;
+ channel_states.push_back (state);
+ }
+ }
+}
+
+
+void
+EngineStateController::_on_session_loaded ()
+{
+ if (!_session) {
+ return;
+ }
+
+ AudioEngine::instance ()->reconnect_session_routes (true, true);
+ _session->reconnect_mtc_ports ();
+ _session->reconnect_mmc_ports (true);
+ _session->reconnect_mmc_ports (false);
+
+ // This is done during session construction
+ // _session->reconnect_ltc_input ();
+ // _session->reconnect_ltc_output ();
+
+ framecnt_t desired_sample_rate = _session->nominal_frame_rate ();
+ if ( desired_sample_rate > 0 && set_new_sample_rate_in_controller (desired_sample_rate))
+ {
+ push_current_state_to_backend (false);
+ SampleRateChanged (); // emit a signal
+ }
+}
+
+
+void
+EngineStateController::_on_sample_rate_change (framecnt_t new_sample_rate)
+{
+ if (_current_state->sample_rate != new_sample_rate) {
+
+ // if sample rate has been changed
+ framecnt_t sample_rate_to_set = new_sample_rate;
+ if (AudioEngine::instance ()->session ()) {
+ // and we have current session we should restore it back to the one tracks uses
+ sample_rate_to_set = AudioEngine::instance ()->session ()->frame_rate ();
+ }
+
+ if ( !set_new_sample_rate_in_controller (sample_rate_to_set)) {
+ // if sample rate can't be set
+ // switch to NONE device
+ set_new_device_as_current ("None");
+ DeviceListChanged (false);
+ DeviceError ();
+ }
+ }
+
+ SampleRateChanged (); // emit a signal
+}
+
+
+void
+EngineStateController::_on_buffer_size_change (pframes_t new_buffer_size)
+{
+ if (_current_state->buffer_size != new_buffer_size) {
+ _current_state->buffer_size = new_buffer_size;
+ }
+
+ BufferSizeChanged (); // emit a signal
+}
+
+
+void
+EngineStateController::_on_device_list_change ()
+{
+ bool current_device_disconnected = false;
+
+ boost::shared_ptr<AudioBackend> backend = AudioEngine::instance ()->current_backend ();
+ assert (backend);
+
+ std::vector<AudioBackend::DeviceStatus> device_vector = backend->enumerate_devices ();
+
+ // find out out if current device is still available if it's not None
+ if (_current_state->device_name != "None")
+ {
+ std::vector<AudioBackend::DeviceStatus>::iterator device_iter;
+ device_iter = std::find_if (device_vector.begin (), device_vector.end (), DevicePredicate (_current_state->device_name));
+
+ // if current device is not available any more - switch to None device
+ if (device_iter == device_vector.end ()) {
+
+ StateList::iterator found_state_iter = find_if (_states.begin (), _states.end (),
+ State::StatePredicate (_current_state->backend_name, "None"));
+
+ if (found_state_iter != _states.end ()) {
+ // found the record - switch to it
+ _current_state = *found_state_iter;
+ _validate_current_device_state ();
+ } else {
+ // create new record for this engine with default device
+ _current_state = boost::shared_ptr<State>(new State ());
+ _current_state->backend_name = backend->name ();
+ _current_state->device_name = "None";
+ _validate_current_device_state ();
+ _states.push_front (_current_state);
+ }
+
+ push_current_state_to_backend (true);
+ current_device_disconnected = true;
+ }
+ } else {
+ // if the device which was active before is available now - switch to it
+
+ std::vector<AudioBackend::DeviceStatus>::iterator device_iter;
+ device_iter = std::find_if (device_vector.begin (), device_vector.end (), DevicePredicate (_last_used_real_device));
+
+ if (device_iter != device_vector.end ()) {
+ StateList::iterator found_state_iter = find_if (_states.begin (), _states.end (),
+ State::StatePredicate (_current_state->backend_name,
+ _last_used_real_device));
+
+ if (found_state_iter != _states.end ()) {
+
+ boost::shared_ptr<State> previous_state (_current_state);
+ _current_state = *found_state_iter;
+
+ if (_validate_current_device_state ()) {
+ push_current_state_to_backend (false);
+ } else {
+ // cannot use this device right now
+ _last_used_real_device.clear ();
+ _current_state = previous_state;
+ }
+ }
+ }
+ }
+
+ DeviceListChanged (current_device_disconnected); // emit a signal
+}
+
+
+void
+EngineStateController::_update_device_channels_state ()
+{
+ boost::shared_ptr<AudioBackend> backend = AudioEngine::instance ()->current_backend ();
+ assert (backend);
+
+ // update audio input states
+ std::vector<std::string> phys_audio_inputs;
+ backend->get_physical_inputs (DataType::AUDIO, phys_audio_inputs);
+
+ PortStateList new_input_states;
+ PortStateList &input_states = _current_state->input_channel_states;
+
+ std::vector<std::string>::const_iterator input_iter = phys_audio_inputs.begin ();
+ for (; input_iter != phys_audio_inputs.end (); ++input_iter) {
+
+ PortState state (*input_iter);
+ state.active = true;
+ PortStateList::const_iterator found_state_iter = std::find (input_states.begin (), input_states.end (), state);
+
+ if (found_state_iter != input_states.end ()) {
+ new_input_states.push_back (*found_state_iter);
+ } else {
+ new_input_states.push_back (state);
+ }
+ }
+ _current_state->input_channel_states = new_input_states;
+
+ // update audio output states (multi out mode)
+ std::vector<std::string> phys_audio_outputs;
+ backend->get_physical_outputs (DataType::AUDIO, phys_audio_outputs);
+
+ PortStateList new_output_states;
+ PortStateList &output_multi_states = _current_state->multi_out_channel_states;
+
+ std::vector<std::string>::const_iterator output_iter = phys_audio_outputs.begin ();
+ for (; output_iter != phys_audio_outputs.end (); ++output_iter) {
+
+ PortState state (*output_iter);
+ state.active = true;
+ PortStateList::const_iterator found_state_iter = std::find (output_multi_states.begin (), output_multi_states.end (), state);
+
+ if (found_state_iter != output_multi_states.end ()) {
+ new_output_states.push_back (*found_state_iter);
+ } else {
+ new_output_states.push_back (state);
+ }
+ }
+
+ _current_state->multi_out_channel_states = new_output_states;
+
+ // update audio output states (stereo out mode)
+ new_output_states.clear ();
+ PortStateList &output_stereo_states = _current_state->stereo_out_channel_states;
+
+ output_iter = phys_audio_outputs.begin ();
+ for (; output_iter != phys_audio_outputs.end (); ++output_iter) {
+
+ PortState state (*output_iter);
+ state.active = true;
+ PortStateList::const_iterator found_state_iter = std::find (output_stereo_states.begin (), output_stereo_states.end (), state);
+
+ if (found_state_iter != output_stereo_states.end ()) {
+ new_output_states.push_back (*found_state_iter);
+ } else {
+ new_output_states.push_back (state);
+ }
+ }
+
+ _current_state->stereo_out_channel_states = new_output_states;
+ _refresh_stereo_out_channel_states ();
+
+
+ // update midi ports: unlike audio ports which states are saved per device
+ // each midi port state is saved individualy
+ // so get all midi ports from the backend
+ // and compare to the list of midi ports we have
+ // if physical port is new, add it to our state list
+ // if physical port is present in our state list - mark it available
+ // if there is no corresponding physical port to one we have in a list - leave it unavailable
+ MidiPortStateList::iterator iter = _midi_inputs.begin ();
+ for (; iter != _midi_inputs.end (); ++iter) {
+ iter->available = false;
+ }
+
+ for (iter = _midi_outputs.begin (); iter != _midi_outputs.end (); ++iter) {
+ iter->available = false;
+ }
+
+ // update midi input ports
+ std::vector<std::string> phys_midi_inputs;
+ backend->get_physical_inputs (DataType::MIDI, phys_midi_inputs);
+
+ std::vector<std::string>::const_iterator midi_input_iter = phys_midi_inputs.begin ();
+ for (; midi_input_iter != phys_midi_inputs.end (); ++midi_input_iter) {
+
+ MidiPortState state (*midi_input_iter);
+ state.active = false;
+ state.available = true;
+ MidiPortStateList::iterator found_state_iter = std::find (_midi_inputs.begin (), _midi_inputs.end (), state);
+
+ if (found_state_iter != _midi_inputs.end ()) {
+ found_state_iter->available = true;
+ } else {
+ _midi_inputs.push_back (state);
+ }
+ }
+
+ // update midi output ports
+ std::vector<std::string> phys_midi_outputs;
+ backend->get_physical_outputs (DataType::MIDI, phys_midi_outputs);
+
+ std::vector<std::string>::const_iterator midi_output_iter = phys_midi_outputs.begin ();
+ for (; midi_output_iter != phys_midi_outputs.end (); ++midi_output_iter) {
+
+ MidiPortState state (*midi_output_iter);
+ state.active = false;
+ state.available = true;
+ MidiPortStateList::iterator found_state_iter = std::find (_midi_outputs.begin (), _midi_outputs.end (), state);
+
+ if (found_state_iter != _midi_outputs.end ()) {
+ found_state_iter->available = true;
+ } else {
+ _midi_outputs.push_back (state);
+ }
+ }
+}
+
+
+void
+EngineStateController::_refresh_stereo_out_channel_states ()
+{
+ PortStateList &output_states = _current_state->stereo_out_channel_states;
+ PortStateList::iterator active_iter = output_states.begin ();
+
+ for (; active_iter != output_states.end (); ++active_iter) {
+ if (active_iter->active) {
+ break;
+ }
+ }
+
+ uint32_t pending_active_channels = 2;
+ PortStateList::iterator iter = output_states.begin ();
+ // if found active
+ if (active_iter != output_states.end ()) {
+ iter = active_iter;
+ if (++iter == output_states.end ()) {
+ iter = output_states.begin ();
+ }
+
+ (iter++)->active = true;
+ pending_active_channels = 0;
+ }
+
+ // drop the rest of the states to false (until we reach the end or first existing active channel)
+ for (; iter != output_states.end () && iter != active_iter; ++iter) {
+ if (pending_active_channels) {
+ iter->active = true;
+ --pending_active_channels;
+ } else {
+ iter->active = false;
+ }
+ }
+}
+
+
+void
+EngineStateController::_on_engine_running ()
+{
+ AudioEngine::instance ()->reconnect_session_routes (true, true);
+ _current_state->active = true;
+
+ EngineRunning (); // emit a signal
+}
+
+
+void
+EngineStateController::_on_engine_stopped ()
+{
+ EngineStopped ();
+}
+
+
+void
+EngineStateController::_on_engine_halted ()
+{
+ EngineHalted ();
+}
+
+
+void
+EngineStateController::_on_device_error ()
+{
+ set_new_device_as_current ("None");
+ push_current_state_to_backend (true);
+ DeviceListChanged (false);
+ DeviceError ();
+}
+
+
+void
+EngineStateController::_on_parameter_changed (const std::string& parameter_name)
+{
+ if (parameter_name == "output-auto-connect") {
+
+ AudioEngine::instance ()->reconnect_session_routes (false, true);
+ OutputConfigChanged (); // emit a signal
+ OutputConnectionModeChanged (); // emit signal
+ }
+}
+
+
+void
+EngineStateController::_on_ports_registration_update ()
+{
+ _update_device_channels_state ();
+
+ // update MIDI connections
+ if (_session) {
+ _session->reconnect_midi_scene_ports (true);
+ _session->reconnect_midi_scene_ports (false);
+
+ _session->reconnect_mtc_ports ();
+
+ _session->reconnect_mmc_ports (true);
+ _session->reconnect_mmc_ports (false);
+
+ _session->reconnect_ltc_input ();
+ _session->reconnect_ltc_output ();
+ }
+
+ _update_ltc_source_port ();
+ _update_ltc_output_port ();
+
+ PortRegistrationChanged (); // emit a signal
+}
+
+
+bool
+EngineStateController::push_current_state_to_backend (bool start)
+{
+ boost::shared_ptr<AudioBackend> backend = AudioEngine::instance ()->current_backend ();
+
+ if (!backend) {
+ return false;
+ }
+
+ // check if anything changed
+ bool state_changed = (_current_state->device_name != backend->device_name ()) ||
+ (_current_state->sample_rate != backend->sample_rate ()) ||
+ (_current_state->buffer_size != backend->buffer_size ());
+
+ bool was_running = AudioEngine::instance ()->running ();
+
+ Glib::Threads::RecMutex::Lock sl (AudioEngine::instance ()->state_lock ());
+ if (state_changed) {
+
+ if (was_running) {
+
+ if (_current_state->device_name != backend->device_name ()) {
+ // device has been changed
+ // the list of ports has been changed too
+ // current ltc_source_port and ltc_output_port aren't available
+ set_ltc_source_port ("");
+ set_ltc_output_port ("");
+ }
+
+ if (AudioEngine::instance ()->stop ()) {
+ return false;
+ }
+ }
+
+ int result = 0;
+ {
+ std::cout << "EngineStateController::Setting device: " << _current_state->device_name << std::endl;
+ if ((_current_state->device_name != backend->device_name ()) && (result = backend->set_device_name (_current_state->device_name))) {
+ error << string_compose (_("Cannot set device name to %1"), get_current_device_name ()) << endmsg;
+ }
+
+ if (!result ) {
+ std::cout << "EngineStateController::Setting device sample rate " << _current_state->sample_rate << std::endl;
+ result = backend->set_sample_rate (_current_state->sample_rate);
+
+ if (result) {
+ error << string_compose (_("Cannot set sample rate to %1"), get_current_sample_rate ()) << endmsg;
+ }
+ }
+
+ if (!result ) {
+ std::cout << "EngineStateController::Setting device buffer size " << _current_state->buffer_size << std::endl;
+ result = backend->set_buffer_size (_current_state->buffer_size);
+
+ if (result) {
+ error << string_compose (_("Cannot set buffer size to %1"), get_current_buffer_size ()) << endmsg;
+ }
+ }
+ }
+
+ if (result) // error during device setup
+ {
+ //switch to None device and notify about the issue
+ set_new_device_as_current ("None");
+ DeviceListChanged (false);
+ DeviceError ();
+ }
+
+ if (AudioEngine::instance ()->backend_reset_requested ()) {
+ // device asked for reset, do not start engine now
+ // free sate lock and let Engine reset the device as it's required
+ return true;
+ }
+ }
+
+ if (start || (was_running && state_changed)) {
+ if (AudioEngine::instance ()->start () && !AudioEngine::instance ()->is_reset_requested ()) {
+ //switch to None device and notify about the issue
+ set_new_device_as_current ("None");
+ AudioEngine::instance ()->start ();
+ DeviceListChanged (false);
+ DeviceError ();
+ return false;
+ }
+ }
+
+ save_audio_midi_settings ();
+
+ return true;
+}
+
+
+std::string
+EngineStateController::get_mtc_source_port ()
+{
+ MidiPortStateList::const_iterator state_iter = _midi_inputs.begin ();
+ for (; state_iter != _midi_inputs.end (); ++state_iter) {
+ if (state_iter->available && state_iter->mtc_in) {
+ return (state_iter->name);
+ }
+ }
+
+ return "";
+}
+
+void
+EngineStateController::set_ltc_source_port (const std::string& port)
+{
+ Config->set_ltc_source_port (port);
+}
+
+std::string
+EngineStateController::get_ltc_source_port ()
+{
+ return Config->get_ltc_source_port ();
+}
+
+void
+EngineStateController::set_ltc_output_port (const std::string& port)
+{
+ Config->set_ltc_output_port (port);
+}
+
+std::string
+EngineStateController::get_ltc_output_port ()
+{
+ return Config->get_ltc_output_port ();
+}
+
diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc
index a1cf8d0..8607b9f 100644
--- a/libs/ardour/enums.cc
+++ b/libs/ardour/enums.cc
@@ -96,6 +96,7 @@ setup_enum_writer ()
AutoState _AutoState;
AutoStyle _AutoStyle;
AutoConnectOption _AutoConnectOption;
+ TracksAutoNamingRule _TracksAutoNamingRule;
Session::StateOfTheState _Session_StateOfTheState;
Route::Flag _Route_Flag;
Source::Flag _Source_Flag;
@@ -129,6 +130,8 @@ setup_enum_writer ()
Session::SlaveState _Session_SlaveState;
MTC_Status _MIDI_MTC_Status;
Evoral::OverlapType _OverlapType;
+ BufferingPreset _BufferingPreset;
+ AutoReturnTarget _AutoReturnTarget;
#define REGISTER(e) enum_writer.register_distinct (typeid(e).name(), i, s); i.clear(); s.clear()
#define REGISTER_BITS(e) enum_writer.register_bits (typeid(e).name(), i, s); i.clear(); s.clear()
@@ -319,6 +322,10 @@ setup_enum_writer ()
REGISTER_ENUM (AutoConnectMaster);
REGISTER_BITS (_AutoConnectOption);
+ REGISTER_ENUM (UseDefaultNames);
+ REGISTER_ENUM (NameAfterDriver);
+ REGISTER_BITS (_TracksAutoNamingRule);
+
REGISTER_ENUM (FormatFloat);
REGISTER_ENUM (FormatInt24);
REGISTER_ENUM (FormatInt16);
@@ -654,6 +661,18 @@ setup_enum_writer ()
REGISTER_ENUM (Evoral::OverlapEnd);
REGISTER_ENUM (Evoral::OverlapExternal);
REGISTER(_OverlapType);
+
+ REGISTER_ENUM (Small);
+ REGISTER_ENUM (Medium);
+ REGISTER_ENUM (Large);
+ REGISTER_ENUM (Custom);
+ REGISTER(_BufferingPreset);
+
+ REGISTER_ENUM (LastLocate);
+ REGISTER_ENUM (RangeSelectionStart);
+ REGISTER_ENUM (Loop);
+ REGISTER_ENUM (RegionSelectionStart);
+ REGISTER_BITS (_AutoReturnTarget);
}
} /* namespace ARDOUR */
@@ -687,6 +706,7 @@ std::ostream& operator<<(std::ostream& o, const SampleFormat& var)
std::string s = enum_2_string (var);
return o << s;
}
+
std::istream& operator>>(std::istream& o, AutoConnectOption& var)
{
std::string s;
@@ -701,6 +721,20 @@ std::ostream& operator<<(std::ostream& o, const AutoConnectOption& var)
return o << s;
}
+std::istream& operator>>(std::istream& o, TracksAutoNamingRule& var)
+{
+ std::string s;
+ o >> s;
+ var = (TracksAutoNamingRule) string_2_enum (s, var);
+ return o;
+}
+
+std::ostream& operator<<(std::ostream& o, const TracksAutoNamingRule& var)
+{
+ std::string s = enum_2_string (var);
+ return o << s;
+}
+
std::istream& operator>>(std::istream& o, MonitorModel& var)
{
std::string s;
@@ -984,3 +1018,45 @@ std::ostream& operator<<(std::ostream& o, const RegionSelectionAfterSplit& var)
std::string s = enum_2_string (var);
return o << s;
}
+
+std::istream& operator>>(std::istream& o, ARDOUR::BufferingPreset& var)
+{
+ std::string s;
+ o >> s;
+ var = (ARDOUR::BufferingPreset) string_2_enum (s, var);
+ return o;
+}
+
+std::ostream& operator<<(std::ostream& o, const ARDOUR::BufferingPreset& var)
+{
+ std::string s = enum_2_string (var);
+ return o << s;
+}
+
+std::istream& operator>>(std::istream& o, AutoReturnTarget& var)
+{
+ std::string s;
+ o >> s;
+ var = (AutoReturnTarget) string_2_enum (s, var);
+ return o;
+}
+
+std::ostream& operator<<(std::ostream& o, const AutoReturnTarget& var)
+{
+ std::string s = enum_2_string (var);
+ return o << s;
+}
+
+std::istream& operator>>(std::istream& o, MeterType& var)
+{
+ std::string s;
+ o >> s;
+ var = (MeterType) string_2_enum (s, var);
+ return o;
+}
+
+std::ostream& operator<<(std::ostream& o, const MeterType& var)
+{
+ std::string s = enum_2_string (var);
+ return o << s;
+}
diff --git a/libs/ardour/export_format_specification.cc b/libs/ardour/export_format_specification.cc
index 32d16c9..5bc10e8 100644
--- a/libs/ardour/export_format_specification.cc
+++ b/libs/ardour/export_format_specification.cc
@@ -591,6 +591,9 @@ ExportFormatSpecification::description (bool include_name)
case SR_96:
components.push_back ("96 kHz");
break;
+ case SR_176_4:
+ components.push_back ("176.4 kHz");
+ break;
case SR_192:
components.push_back ("192 kHz");
break;
diff --git a/libs/ardour/export_graph_builder.cc b/libs/ardour/export_graph_builder.cc
index 5e8c052..be183c7 100644
--- a/libs/ardour/export_graph_builder.cc
+++ b/libs/ardour/export_graph_builder.cc
@@ -1,20 +1,20 @@
/*
- Copyright (C) 2008-2012 Paul Davis
- Author: Sakari Bergen
+ Copyright (C) 2008-2012 Paul Davis
+ Author: Sakari Bergen
- 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 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.
+ 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.
+ 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.
*/
@@ -53,8 +53,8 @@ using std::string;
namespace ARDOUR {
ExportGraphBuilder::ExportGraphBuilder (Session const & session)
- : session (session)
- , thread_pool (hardware_concurrency())
+ : session (session)
+ , thread_pool (hardware_concurrency())
{
process_buffer_frames = session.engine().samples_per_cycle();
}
@@ -113,6 +113,17 @@ ExportGraphBuilder::reset ()
}
void
+ExportGraphBuilder::cleanup (bool remove_out_files/*=false*/)
+{
+ ChannelConfigList::iterator iter = channel_configs.begin();
+
+ while (iter != channel_configs.end() ) {
+ iter->remove_children(remove_out_files);
+ iter = channel_configs.erase(iter);
+ }
+}
+
+void
ExportGraphBuilder::set_current_timespan (boost::shared_ptr<ExportTimespan> span)
{
timespan = span;
@@ -175,7 +186,7 @@ ExportGraphBuilder::add_split_config (FileSpec const & config)
// No duplicate channel config found, create new one
channel_configs.push_back (new ChannelConfig (*this, config, channels));
}
-
+
/* Encoder */
template <>
@@ -210,6 +221,33 @@ ExportGraphBuilder::Encoder::add_child (FileSpec const & new_config)
{
filenames.push_back (new_config.filename);
}
+
+void
+ExportGraphBuilder::Encoder::destroy_writer (bool delete_out_file)
+{
+ if (delete_out_file ) {
+
+ if (float_writer) {
+ float_writer->close ();
+ }
+
+ if (int_writer) {
+ int_writer->close ();
+ }
+
+ if (short_writer) {
+ short_writer->close ();
+ }
+
+ if (std::remove(writer_filename.c_str() ) != 0) {
+ std::cout << "Encoder::destroy_writer () : Error removing file: " << strerror(errno) << std::endl;
+ }
+ }
+
+ float_writer.reset ();
+ int_writer.reset ();
+ short_writer.reset ();
+}
bool
ExportGraphBuilder::Encoder::operator== (FileSpec const & other_config) const
@@ -231,9 +269,9 @@ ExportGraphBuilder::Encoder::init_writer (boost::shared_ptr<AudioGrapher::Sndfil
unsigned channels = config.channel_config->get_n_chans();
int format = get_real_format (config);
config.filename->set_channel_config(config.channel_config);
- string filename = config.filename->get_path (config.format);
+ writer_filename = config.filename->get_path (config.format);
- writer.reset (new AudioGrapher::SndfileWriter<T> (filename, format, channels, config.format->sample_rate(), config.broadcast_info));
+ writer.reset (new AudioGrapher::SndfileWriter<T> (writer_filename, format, channels, config.format->sample_rate(), config.broadcast_info));
writer->FileWritten.connect_same_thread (copy_files_connection, boost::bind (&ExportGraphBuilder::Encoder::copy_files, this, _1));
}
@@ -250,7 +288,7 @@ ExportGraphBuilder::Encoder::copy_files (std::string orig_path)
/* SFC */
ExportGraphBuilder::SFC::SFC (ExportGraphBuilder &, FileSpec const & new_config, framecnt_t max_frames)
- : data_width(0)
+ : data_width(0)
{
config = new_config;
data_width = sndfile_data_width (Encoder::get_real_format (config));
@@ -306,6 +344,20 @@ ExportGraphBuilder::SFC::add_child (FileSpec const & new_config)
}
}
+void
+ExportGraphBuilder::SFC::remove_children (bool remove_out_files)
+{
+ boost::ptr_list<Encoder>::iterator iter = children.begin ();
+
+ while (iter != children.end() ) {
+
+ if (remove_out_files) {
+ iter->destroy_writer(remove_out_files);
+ }
+ iter = children.erase (iter);
+ }
+}
+
bool
ExportGraphBuilder::SFC::operator== (FileSpec const & other_config) const
{
@@ -315,7 +367,7 @@ ExportGraphBuilder::SFC::operator== (FileSpec const & other_config) const
/* Normalizer */
ExportGraphBuilder::Normalizer::Normalizer (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t /*max_frames*/)
- : parent (parent)
+ : parent (parent)
{
std::string tmpfile_path = parent.session.session_directory().export_path();
tmpfile_path = Glib::build_filename(tmpfile_path, "XXXXXX");
@@ -365,11 +417,22 @@ ExportGraphBuilder::Normalizer::add_child (FileSpec const & new_config)
threader->add_output (children.back().sink());
}
+void
+ExportGraphBuilder::Normalizer::remove_children (bool remove_out_files)
+{
+ boost::ptr_list<SFC>::iterator iter = children.begin ();
+
+ while (iter != children.end() ) {
+ iter->remove_children (remove_out_files);
+ iter = children.erase (iter);
+ }
+}
+
bool
ExportGraphBuilder::Normalizer::operator== (FileSpec const & other_config) const
{
return config.format->normalize() == other_config.format->normalize() &&
- config.format->normalize_target() == other_config.format->normalize_target();
+ config.format->normalize_target() == other_config.format->normalize_target();
}
unsigned
@@ -398,7 +461,7 @@ ExportGraphBuilder::Normalizer::start_post_processing()
/* SRC */
ExportGraphBuilder::SRC::SRC (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t max_frames)
- : parent (parent)
+ : parent (parent)
{
config = new_config;
converter.reset (new SampleRateConverter (new_config.channel_config->get_n_chans()));
@@ -424,6 +487,27 @@ ExportGraphBuilder::SRC::add_child (FileSpec const & new_config)
add_child_to_list (new_config, children);
}
}
+
+void
+ExportGraphBuilder::SRC::remove_children (bool remove_out_files)
+{
+ boost::ptr_list<SFC>::iterator sfc_iter = children.begin();
+
+ while (sfc_iter != children.end() ) {
+ converter->remove_output (sfc_iter->sink() );
+ sfc_iter->remove_children (remove_out_files);
+ sfc_iter = children.erase (sfc_iter);
+ }
+
+ boost::ptr_list<Normalizer>::iterator norm_iter = normalized_children.begin();
+
+ while (norm_iter != normalized_children.end() ) {
+ converter->remove_output (norm_iter->sink() );
+ norm_iter->remove_children (remove_out_files);
+ norm_iter = normalized_children.erase (norm_iter);
+ }
+
+}
template<typename T>
void
@@ -448,7 +532,7 @@ ExportGraphBuilder::SRC::operator== (FileSpec const & other_config) const
/* SilenceHandler */
ExportGraphBuilder::SilenceHandler::SilenceHandler (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t max_frames)
- : parent (parent)
+ : parent (parent)
{
config = new_config;
max_frames_in = max_frames;
@@ -486,6 +570,18 @@ ExportGraphBuilder::SilenceHandler::add_child (FileSpec const & new_config)
children.push_back (new SRC (parent, new_config, max_frames_in));
silence_trimmer->add_output (children.back().sink());
}
+
+void
+ExportGraphBuilder::SilenceHandler::remove_children (bool remove_out_files)
+{
+ boost::ptr_list<SRC>::iterator iter = children.begin();
+
+ while (iter != children.end() ) {
+ silence_trimmer->remove_output (iter->sink() );
+ iter->remove_children (remove_out_files);
+ iter = children.erase (iter);
+ }
+}
bool
ExportGraphBuilder::SilenceHandler::operator== (FileSpec const & other_config) const
@@ -493,15 +589,15 @@ ExportGraphBuilder::SilenceHandler::operator== (FileSpec const & other_config) c
ExportFormatSpecification & format = *config.format;
ExportFormatSpecification & other_format = *other_config.format;
return (format.trim_beginning() == other_format.trim_beginning()) &&
- (format.trim_end() == other_format.trim_end()) &&
- (format.silence_beginning_time() == other_format.silence_beginning_time()) &&
- (format.silence_end_time() == other_format.silence_end_time());
+ (format.trim_end() == other_format.trim_end()) &&
+ (format.silence_beginning_time() == other_format.silence_beginning_time()) &&
+ (format.silence_end_time() == other_format.silence_end_time());
}
/* ChannelConfig */
ExportGraphBuilder::ChannelConfig::ChannelConfig (ExportGraphBuilder & parent, FileSpec const & new_config, ChannelMap & channel_map)
- : parent (parent)
+ : parent (parent)
{
typedef ExportChannelConfiguration::ChannelList ChannelList;
@@ -551,6 +647,19 @@ ExportGraphBuilder::ChannelConfig::add_child (FileSpec const & new_config)
children.push_back (new SilenceHandler (parent, new_config, max_frames_out));
chunker->add_output (children.back().sink ());
}
+
+void
+ExportGraphBuilder::ChannelConfig::remove_children (bool remove_out_files)
+{
+ boost::ptr_list<SilenceHandler>::iterator iter = children.begin();
+
+ while(iter != children.end() ) {
+
+ chunker->remove_output (iter->sink ());
+ iter->remove_children (remove_out_files);
+ iter = children.erase(iter);
+ }
+}
bool
ExportGraphBuilder::ChannelConfig::operator== (FileSpec const & other_config) const
diff --git a/libs/ardour/export_handler.cc b/libs/ardour/export_handler.cc
index e755d9b..0495198 100644
--- a/libs/ardour/export_handler.cc
+++ b/libs/ardour/export_handler.cc
@@ -118,7 +118,7 @@ ExportHandler::ExportHandler (Session & session)
ExportHandler::~ExportHandler ()
{
- // TODO remove files that were written but not finished
+ graph_builder->cleanup (export_status->aborted () );
}
/** Add an export to the `to-do' list */
@@ -310,6 +310,13 @@ ExportHandler::finish_timespan ()
}
if (fmt->tag()) {
+ /* close file first, otherwise TagLib enounters an ERROR_SHARING_VIOLATION
+ * The process cannot access the file because it is being used.
+ *
+ * TODO: check Umlauts and encoding in filename.
+ * TagLib eventually calls CreateFileA(),
+ */
+ graph_builder->reset ();
AudiofileTagger::tag_file(filename, *SessionMetadata::Metadata());
}
diff --git a/libs/ardour/export_profile_manager.cc b/libs/ardour/export_profile_manager.cc
index c2d6cb0..8407228 100644
--- a/libs/ardour/export_profile_manager.cc
+++ b/libs/ardour/export_profile_manager.cc
@@ -43,6 +43,7 @@
#include "ardour/export_failed.h"
#include "ardour/directory_names.h"
#include "ardour/filename_extensions.h"
+#include "ardour/profile.h"
#include "ardour/route.h"
#include "ardour/session.h"
#include "ardour/broadcast_info.h"
@@ -392,7 +393,14 @@ ExportProfileManager::init_timespans (XMLNodeList nodes)
timespans.push_back (state);
// Add session as default selection
- Location * session_range = session.locations()->session_range_location();
+ Location * session_range;
+
+ if (Profile->get_trx()) {
+ session_range = (session.get_play_loop () ? session.locations()->auto_loop_location () : session.locations()->session_range_location());
+ } else {
+ session_range = session.locations()->session_range_location();
+ }
+
if (!session_range) { return false; }
ExportTimespanPtr timespan = handler->add_timespan();
@@ -477,7 +485,8 @@ ExportProfileManager::update_ranges () {
/* Session */
- Location * session_range = session.locations()->session_range_location();
+ Location * session_range = (session.get_play_loop () ? session.locations()->auto_loop_location () :
+ session.locations()->session_range_location());
if (session_range) {
ranges->push_back (session_range);
}
diff --git a/libs/ardour/filesystem_paths.cc b/libs/ardour/filesystem_paths.cc
index 231bc84..fe1afd8 100644
--- a/libs/ardour/filesystem_paths.cc
+++ b/libs/ardour/filesystem_paths.cc
@@ -49,13 +49,28 @@ user_config_directory_name (int version = -1)
version = atoi (X_(PROGRAM_VERSION));
}
+ /* ARDOUR::Profile may not be available when this is
+ called, so rely on build-time detection of the
+ product name etc.
+ */
+
+#ifdef USE_TRACKS_CODE_FEATURES
+ /* Tracks does not use versioned configuration folders, which may or
+ may not be problematic in the future.
+ */
+ return X_(PROGRAM_NAME);
+
+#else
const string config_dir_name = string_compose ("%1%2", X_(PROGRAM_NAME), version);
#if defined (__APPLE__) || defined (PLATFORM_WINDOWS)
+ /* Use mixed-case folder name on OS X and Windows */
return config_dir_name;
#else
+ /* use lower case folder name on Linux */
return downcase (config_dir_name);
#endif
+#endif
}
std::string
@@ -173,7 +188,7 @@ user_cache_directory ()
exit (1);
}
} else if (!Glib::file_test (p, Glib::FILE_TEST_IS_DIR)) {
- error << string_compose (_("Cache directory %1 already exists and is not a directory/folder - cannot run"),
+ fatal << string_compose (_("Cache directory %1 already exists and is not a directory/folder - cannot run"),
p) << endmsg;
exit (1);
}
diff --git a/libs/ardour/filter.cc b/libs/ardour/filter.cc
index d782db9..382e6d9 100644
--- a/libs/ardour/filter.cc
+++ b/libs/ardour/filter.cc
@@ -39,7 +39,7 @@ using namespace ARDOUR;
using namespace PBD;
int
-Filter::make_new_sources (boost::shared_ptr<Region> region, SourceList& nsrcs, string suffix)
+Filter::make_new_sources (boost::shared_ptr<Region> region, SourceList& nsrcs, std::string suffix, bool use_session_sample_rate)
{
vector<string> names = region->master_source_names();
assert (region->n_channels() <= names.size());
@@ -70,11 +70,24 @@ Filter::make_new_sources (boost::shared_ptr<Region> region, SourceList& nsrcs, s
}
try {
+ framecnt_t sample_rate;
+ if (use_session_sample_rate) {
+ sample_rate = session.frame_rate();
+ } else {
+ boost::shared_ptr<AudioRegion> aregion = boost::dynamic_pointer_cast<AudioRegion>(region);
+
+ if (aregion) {
+ sample_rate = aregion->audio_source()->sample_rate();
+ } else {
+ return -1;
+ }
+ }
+
nsrcs.push_back (boost::dynamic_pointer_cast<Source> (
- SourceFactory::createWritable (region->data_type(), session,
- path, false, session.frame_rate())));
+ SourceFactory::createWritable (region->data_type(), session,
+ path, false, sample_rate)));
}
-
+
catch (failed_constructor& err) {
error << string_compose (_("filter: error creating new file %1 (%2)"), path, strerror (errno)) << endmsg;
return -1;
diff --git a/libs/ardour/find_session.cc b/libs/ardour/find_session.cc
index 501927c..67aa43d 100644
--- a/libs/ardour/find_session.cc
+++ b/libs/ardour/find_session.cc
@@ -117,7 +117,10 @@ find_session (string str, string& path, string& snapshot, bool& isnew)
suffix = snapshot.find (statefile_suffix);
- if (suffix == string::npos) {
+ const string::size_type start_pos_of_extension = snapshot.size () - strlen (statefile_suffix);
+ // we should check the start of extension position
+ // because files '*.ardour.bak' are possible
+ if (suffix != start_pos_of_extension) {
error << string_compose (_("%1 is not a snapshot file"), str) << endmsg;
return -1;
}
diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc
index 288e69d..5ab66da 100644
--- a/libs/ardour/globals.cc
+++ b/libs/ardour/globals.cc
@@ -37,6 +37,9 @@
#include <errno.h>
#include <time.h>
+#include <glib.h>
+#include <glib/gstdio.h>
+
#ifdef PLATFORM_WINDOWS
#include <windows.h> // for LARGE_INTEGER
#endif
@@ -131,6 +134,7 @@ find_peaks_t ARDOUR::find_peaks = 0;
apply_gain_to_buffer_t ARDOUR::apply_gain_to_buffer = 0;
mix_buffers_with_gain_t ARDOUR::mix_buffers_with_gain = 0;
mix_buffers_no_gain_t ARDOUR::mix_buffers_no_gain = 0;
+copy_vector_t ARDOUR::copy_vector = 0;
PBD::Signal1<void,std::string> ARDOUR::BootMessage;
PBD::Signal3<void,std::string,std::string,bool> ARDOUR::PluginScanMessage;
@@ -156,11 +160,32 @@ setup_hardware_optimization (bool try_optimization)
if (try_optimization) {
- FPU fpu;
+ FPU* fpu = FPU::instance();
#if defined (ARCH_X86) && defined (BUILD_SSE_OPTIMIZATIONS)
- if (fpu.has_sse()) {
+#ifdef PLATFORM_WINDOWS
+ /* We have AVX-optimized code for Windows */
+
+ if (fpu->has_avx()) {
+#else
+ /* AVX code doesn't compile on Linux yet */
+
+ if (false) {
+#endif
+ info << "Using AVX optimized routines" << endmsg;
+
+ // AVX SET
+ compute_peak = x86_sse_avx_compute_peak;
+ find_peaks = x86_sse_avx_find_peaks;
+ apply_gain_to_buffer = x86_sse_avx_apply_gain_to_buffer;
+ mix_buffers_with_gain = x86_sse_avx_mix_buffers_with_gain;
+ mix_buffers_no_gain = x86_sse_avx_mix_buffers_no_gain;
+ copy_vector = x86_sse_avx_copy_vector;
+
+ generic_mix_functions = false;
+
+ } else if (fpu->has_sse()) {
info << "Using SSE optimized routines" << endmsg;
@@ -170,6 +195,7 @@ setup_hardware_optimization (bool try_optimization)
apply_gain_to_buffer = x86_sse_apply_gain_to_buffer;
mix_buffers_with_gain = x86_sse_mix_buffers_with_gain;
mix_buffers_no_gain = x86_sse_mix_buffers_no_gain;
+ copy_vector = default_copy_vector;
generic_mix_functions = false;
@@ -187,6 +213,7 @@ setup_hardware_optimization (bool try_optimization)
apply_gain_to_buffer = veclib_apply_gain_to_buffer;
mix_buffers_with_gain = veclib_mix_buffers_with_gain;
mix_buffers_no_gain = veclib_mix_buffers_no_gain;
+ copy_vector = default_copy_vector;
generic_mix_functions = false;
@@ -206,6 +233,7 @@ setup_hardware_optimization (bool try_optimization)
apply_gain_to_buffer = default_apply_gain_to_buffer;
mix_buffers_with_gain = default_mix_buffers_with_gain;
mix_buffers_no_gain = default_mix_buffers_no_gain;
+ copy_vector = default_copy_vector;
info << "No H/W specific optimizations in use" << endmsg;
}
@@ -560,7 +588,8 @@ ARDOUR::no_auto_connect()
void
ARDOUR::setup_fpu ()
{
-
+ FPU* fpu = FPU::instance ();
+
if (getenv ("ARDOUR_RUNNING_UNDER_VALGRIND")) {
// valgrind doesn't understand this assembler stuff
// September 10th, 2007
@@ -570,13 +599,8 @@ ARDOUR::setup_fpu ()
#if defined(ARCH_X86) && defined(USE_XMMINTRIN)
int MXCSR;
- FPU fpu;
-
- /* XXX use real code to determine if the processor supports
- DenormalsAreZero and FlushToZero
- */
- if (!fpu.has_flush_to_zero() && !fpu.has_denormals_are_zero()) {
+ if (!fpu->has_flush_to_zero() && !fpu->has_denormals_are_zero()) {
return;
}
@@ -593,21 +617,21 @@ ARDOUR::setup_fpu ()
break;
case DenormalFTZ:
- if (fpu.has_flush_to_zero()) {
+ if (fpu->has_flush_to_zero()) {
MXCSR |= _MM_FLUSH_ZERO_ON;
}
break;
case DenormalDAZ:
MXCSR &= ~_MM_FLUSH_ZERO_ON;
- if (fpu.has_denormals_are_zero()) {
+ if (fpu->has_denormals_are_zero()) {
MXCSR |= 0x40;
}
break;
case DenormalFTZDAZ:
- if (fpu.has_flush_to_zero()) {
- if (fpu.has_denormals_are_zero()) {
+ if (fpu->has_flush_to_zero()) {
+ if (fpu->has_denormals_are_zero()) {
MXCSR |= _MM_FLUSH_ZERO_ON | 0x40;
} else {
MXCSR |= _MM_FLUSH_ZERO_ON;
@@ -635,7 +659,7 @@ ARDOUR::translation_enable_path ()
bool
ARDOUR::translations_are_enabled ()
{
- int fd = ::open (ARDOUR::translation_enable_path().c_str(), O_RDONLY);
+ int fd = g_open (ARDOUR::translation_enable_path().c_str(), O_RDONLY, 0444);
if (fd < 0) {
return translate_by_default;
@@ -657,7 +681,7 @@ bool
ARDOUR::set_translations_enabled (bool yn)
{
string i18n_enabler = ARDOUR::translation_enable_path();
- int fd = ::open (i18n_enabler.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0644);
+ int fd = g_open (i18n_enabler.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0644);
if (fd < 0) {
return false;
diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc
index 69f7c90..82d4bd0 100644
--- a/libs/ardour/io.cc
+++ b/libs/ardour/io.cc
@@ -39,6 +39,7 @@
#include "ardour/debug.h"
#include "ardour/io.h"
#include "ardour/port.h"
+#include "ardour/profile.h"
#include "ardour/route.h"
#include "ardour/session.h"
#include "ardour/user_bundle.h"
@@ -692,13 +693,16 @@ IO::set_state_2X (const XMLNode& node, int version, bool in)
int
IO::connecting_became_legal ()
{
- int ret;
+ int ret = 0;
assert (pending_state_node);
connection_legal_c.disconnect ();
- ret = make_connections (*pending_state_node, pending_state_node_version, pending_state_node_in);
+ // it's not required for TracksLive, as long as TracksLive's session does all the connections when it's being loaded
+ if (!Profile->get_trx() ) {
+ ret = make_connections (*pending_state_node, pending_state_node_version, pending_state_node_in);
+ }
delete pending_state_node;
pending_state_node = 0;
@@ -1154,7 +1158,6 @@ IO::parse_io_string (const string& str, vector<string>& ports)
return 0;
}
- pos = 0;
opos = 0;
ports.clear ();
diff --git a/libs/ardour/location.cc b/libs/ardour/location.cc
index 2c19ebd..c693e1f 100644
--- a/libs/ardour/location.cc
+++ b/libs/ardour/location.cc
@@ -72,6 +72,7 @@ Location::Location (Session& s, framepos_t sample_start, framepos_t sample_end,
, _flags (bits)
, _locked (false)
, _position_lock_style (s.config.get_glue_new_markers_to_bars_and_beats() ? MusicTime : AudioTime)
+
{
recompute_bbt_from_frames ();
@@ -89,6 +90,7 @@ Location::Location (const Location& other)
, _bbt_end (other._bbt_end)
, _flags (other._flags)
, _position_lock_style (other._position_lock_style)
+
{
/* copy is not locked even if original was */
@@ -166,10 +168,10 @@ Location::operator= (const Location& other)
void
Location::set_name (const std::string& str)
{
- _name = str;
+ _name = str;
- name_changed (this); /* EMIT SIGNAL */
- NameChanged (); /* EMIT SIGNAL */
+ name_changed (this); /* EMIT SIGNAL */
+ NameChanged (); /* EMIT SIGNAL */
}
/** Set start position.
@@ -221,11 +223,11 @@ Location::set_start (framepos_t s, bool force, bool allow_bbt_recompute)
return 0;
} else if (!force) {
- /* range locations must exceed a minimum duration */
- if (_end - s < Config->get_range_location_minimum()) {
- return -1;
- }
- }
+ /* range locations must exceed a minimum duration */
+ if (_end - s < Config->get_range_location_minimum()) {
+ return -1;
+ }
+ }
if (s != _start) {
@@ -288,11 +290,11 @@ Location::set_end (framepos_t e, bool force, bool allow_bbt_recompute)
assert (_end >= 0);
return 0;
- } else if (!force) {
- /* range locations must exceed a minimum duration */
- if (e - _start < Config->get_range_location_minimum()) {
- return -1;
- }
+ } else if (!force) {
+ /* range locations must exceed a minimum duration */
+ if (e - _start < Config->get_range_location_minimum()) {
+ return -1;
+ }
}
if (e != _end) {
@@ -329,8 +331,8 @@ Location::set (framepos_t s, framepos_t e, bool allow_bbt_recompute)
return -1;
}
- bool start_change = false;
- bool end_change = false;
+ bool start_change = false;
+ bool end_change = false;
if (is_mark()) {
@@ -342,8 +344,8 @@ Location::set (framepos_t s, framepos_t e, bool allow_bbt_recompute)
recompute_bbt_from_frames ();
}
- start_change = true;
- end_change = true;
+ start_change = true;
+ end_change = true;
}
assert (_start >= 0);
@@ -351,64 +353,64 @@ Location::set (framepos_t s, framepos_t e, bool allow_bbt_recompute)
} else {
- /* range locations must exceed a minimum duration */
- if (e - s < Config->get_range_location_minimum()) {
- return -1;
- }
+ /* range locations must exceed a minimum duration */
+ if (e - s < Config->get_range_location_minimum()) {
+ return -1;
+ }
- if (s != _start) {
+ if (s != _start) {
- framepos_t const old = _start;
- _start = s;
+ framepos_t const old = _start;
+ _start = s;
- if (allow_bbt_recompute) {
- recompute_bbt_from_frames ();
- }
+ if (allow_bbt_recompute) {
+ recompute_bbt_from_frames ();
+ }
- start_change = true;
+ start_change = true;
- if (is_session_range ()) {
- Session::StartTimeChanged (old); /* EMIT SIGNAL */
- AudioFileSource::set_header_position_offset (s);
- }
- }
+ if (is_session_range ()) {
+ Session::StartTimeChanged (old); /* EMIT SIGNAL */
+ AudioFileSource::set_header_position_offset (s);
+ }
+ }
- if (e != _end) {
+ if (e != _end) {
- framepos_t const old = _end;
- _end = e;
+ framepos_t const old = _end;
+ _end = e;
- if (allow_bbt_recompute) {
- recompute_bbt_from_frames ();
- }
+ if (allow_bbt_recompute) {
+ recompute_bbt_from_frames ();
+ }
- end_change = true;
+ end_change = true;
- if (is_session_range()) {
- Session::EndTimeChanged (old); /* EMIT SIGNAL */
- }
- }
+ if (is_session_range()) {
+ Session::EndTimeChanged (old); /* EMIT SIGNAL */
+ }
+ }
- assert (_end >= 0);
- }
+ assert (_end >= 0);
+ }
- if (start_change) {
- start_changed(this); /* EMIT SIGNAL */
- StartChanged(); /* EMIT SIGNAL */
- }
+ if (start_change) {
+ start_changed(this); /* EMIT SIGNAL */
+ StartChanged(); /* EMIT SIGNAL */
+ }
- if (end_change) {
- end_changed(this); /* EMIT SIGNAL */
- EndChanged(); /* EMIT SIGNAL */
- }
+ if (end_change) {
+ end_changed(this); /* EMIT SIGNAL */
+ EndChanged(); /* EMIT SIGNAL */
+ }
- if (start_change && end_change) {
- changed (this);
- Changed ();
- }
+ if (start_change && end_change) {
+ changed (this);
+ Changed ();
+ }
- return 0;
+ return 0;
}
int
@@ -441,8 +443,8 @@ void
Location::set_hidden (bool yn, void*)
{
if (set_flag_internal (yn, IsHidden)) {
- flags_changed (this); /* EMIT SIGNAL */
- FlagsChanged ();
+ flags_changed (this); /* EMIT SIGNAL */
+ FlagsChanged ();
}
}
@@ -458,40 +460,40 @@ Location::set_cd (bool yn, void*)
}
if (set_flag_internal (yn, IsCDMarker)) {
- flags_changed (this); /* EMIT SIGNAL */
- FlagsChanged ();
+ flags_changed (this); /* EMIT SIGNAL */
+ FlagsChanged ();
}
}
void
Location::set_is_range_marker (bool yn, void*)
{
- if (set_flag_internal (yn, IsRangeMarker)) {
- flags_changed (this);
- FlagsChanged (); /* EMIT SIGNAL */
- }
+ if (set_flag_internal (yn, IsRangeMarker)) {
+ flags_changed (this);
+ FlagsChanged (); /* EMIT SIGNAL */
+ }
}
void
Location::set_skip (bool yn)
{
- if (is_range_marker() && length() > 0) {
- if (set_flag_internal (yn, IsSkip)) {
- flags_changed (this);
- FlagsChanged ();
- }
- }
+ if (is_range_marker() && length() > 0) {
+ if (set_flag_internal (yn, IsSkip)) {
+ flags_changed (this);
+ FlagsChanged ();
+ }
+ }
}
void
Location::set_skipping (bool yn)
{
- if (is_range_marker() && is_skip() && length() > 0) {
- if (set_flag_internal (yn, IsSkipping)) {
- flags_changed (this);
- FlagsChanged ();
- }
- }
+ if (is_range_marker() && is_skip() && length() > 0) {
+ if (set_flag_internal (yn, IsSkipping)) {
+ flags_changed (this);
+ FlagsChanged ();
+ }
+ }
}
void
@@ -502,8 +504,8 @@ Location::set_auto_punch (bool yn, void*)
}
if (set_flag_internal (yn, IsAutoPunch)) {
- flags_changed (this); /* EMIT SIGNAL */
- FlagsChanged (); /* EMIT SIGNAL */
+ flags_changed (this); /* EMIT SIGNAL */
+ FlagsChanged (); /* EMIT SIGNAL */
}
}
@@ -515,8 +517,8 @@ Location::set_auto_loop (bool yn, void*)
}
if (set_flag_internal (yn, IsAutoLoop)) {
- flags_changed (this); /* EMIT SIGNAL */
- FlagsChanged (); /* EMIT SIGNAL */
+ flags_changed (this); /* EMIT SIGNAL */
+ FlagsChanged (); /* EMIT SIGNAL */
}
}
@@ -625,26 +627,31 @@ Location::set_state (const XMLNode& node, int version)
return -1;
}
- /* can't use set_start() here, because _end
- may make the value of _start illegal.
- */
+ /* can't use set_start() here, because _end
+ may make the value of _start illegal.
+ */
sscanf (prop->value().c_str(), "%" PRId64, &_start);
if ((prop = node.property ("end")) == 0) {
- error << _("XML node for Location has no end information") << endmsg;
- return -1;
+ error << _("XML node for Location has no end information") << endmsg;
+ return -1;
}
sscanf (prop->value().c_str(), "%" PRId64, &_end);
if ((prop = node.property ("flags")) == 0) {
- error << _("XML node for Location has no flags information") << endmsg;
- return -1;
+ error << _("XML node for Location has no flags information") << endmsg;
+ return -1;
}
+ Flags old_flags (_flags);
_flags = Flags (string_2_enum (prop->value(), _flags));
+ if (old_flags != _flags) {
+ FlagsChanged ();
+ }
+
if ((prop = node.property ("locked")) != 0) {
_locked = string_is_affirmative (prop->value());
} else {
@@ -653,26 +660,26 @@ Location::set_state (const XMLNode& node, int version)
for (cd_iter = cd_list.begin(); cd_iter != cd_list.end(); ++cd_iter) {
- cd_node = *cd_iter;
+ cd_node = *cd_iter;
- if (cd_node->name() != "CD-Info") {
- continue;
- }
+ if (cd_node->name() != "CD-Info") {
+ continue;
+ }
- if ((prop = cd_node->property ("name")) != 0) {
- cd_name = prop->value();
- } else {
- throw failed_constructor ();
- }
+ if ((prop = cd_node->property ("name")) != 0) {
+ cd_name = prop->value();
+ } else {
+ throw failed_constructor ();
+ }
- if ((prop = cd_node->property ("value")) != 0) {
- cd_value = prop->value();
- } else {
- throw failed_constructor ();
- }
+ if ((prop = cd_node->property ("value")) != 0) {
+ cd_value = prop->value();
+ } else {
+ throw failed_constructor ();
+ }
- cd_info[cd_name] = cd_value;
+ cd_info[cd_name] = cd_value;
}
if ((prop = node.property ("position-lock-style")) != 0) {
@@ -752,9 +759,13 @@ Location::unlock ()
void
Location::set_scene_change (boost::shared_ptr<SceneChange> sc)
{
- _scene_change = sc;
-
- scene_changed (); /* EMIT SIGNAL */
+ if (_scene_change != sc) {
+ _scene_change = sc;
+ _session.set_dirty ();
+
+ scene_changed (); /* EMIT SIGNAL */
+ SceneChangeChanged (); /* EMIT SIGNAL */
+ }
}
/*---------------------------------------------------------------------- */
@@ -788,7 +799,7 @@ Locations::set_current (Location *loc, bool want_lock)
}
if (ret == 0) {
- current_changed (current_location); /* EMIT SIGNAL */
+ current_changed (current_location); /* EMIT SIGNAL */
}
return ret;
}
@@ -800,51 +811,55 @@ Locations::next_available_name(string& result,string base)
string::size_type l;
int suffix;
char buf[32];
- std::map<uint32_t,bool> taken;
- uint32_t n;
+ std::map<uint32_t,bool> taken;
+ uint32_t n;
result = base;
- l = base.length();
+ l = base.length();
- if (!base.empty()) {
+ if (!base.empty()) {
- /* find all existing names that match "base", and store
- the numeric part of them (if any) in the map "taken"
- */
+ /* find all existing names that match "base", and store
+ the numeric part of them (if any) in the map "taken"
+ */
- for (i = locations.begin(); i != locations.end(); ++i) {
+ for (i = locations.begin(); i != locations.end(); ++i) {
- const string& temp ((*i)->name());
+ const string& temp ((*i)->name());
- if (!temp.find (base,0)) {
+ if (!temp.find (base,0)) {
+ /* grab what comes after the "base" as if it was
+ a number, and assuming that works OK,
+ store it in "taken" so that we know it
+ has been used.
+ */
+ if ((suffix = atoi (temp.substr(l))) != 0) {
+ taken.insert (make_pair (suffix,true));
+ }
+ }
+ }
+ }
- if ((suffix = atoi (temp.substr(l,3))) != 0) {
- taken.insert (make_pair (suffix,true));
- }
- }
- }
- }
+ /* Now search for an un-used suffix to add to "base". This
+ will find "holes" in the numbering sequence when a location
+ was deleted.
- /* Now search for an un-used suffix to add to "base". This
- will find "holes" in the numbering sequence when a location
- was deleted.
-
- This must start at 1, both for human-numbering reasons
- and also because the call to atoi() above would return
- zero if there is no recognizable numeric suffix, causing
- "base 0" not to be inserted into the "taken" map.
- */
-
- n = 1;
-
- while (n < UINT32_MAX) {
- if (taken.find (n) == taken.end()) {
- snprintf (buf, sizeof(buf), "%d", n);
- result += buf;
- return 1;
- }
- ++n;
- }
+ This must start at 1, both for human-numbering reasons
+ and also because the call to atoi() above would return
+ zero if there is no recognizable numeric suffix, causing
+ "base 0" not to be inserted into the "taken" map.
+ */
+
+ n = 1;
+
+ while (n < UINT32_MAX) {
+ if (taken.find (n) == taken.end()) {
+ snprintf (buf, sizeof(buf), "%d", n);
+ result += buf;
+ return 1;
+ }
+ ++n;
+ }
return 0;
}
@@ -945,7 +960,7 @@ Locations::clear_ranges ()
current_location = 0;
}
- changed ();
+ changed ();
current_changed (0); /* EMIT SIGNAL */
}
@@ -966,7 +981,7 @@ Locations::add (Location *loc, bool make_current)
added (loc); /* EMIT SIGNAL */
if (make_current) {
- current_changed (current_location); /* EMIT SIGNAL */
+ current_changed (current_location); /* EMIT SIGNAL */
}
if (loc->is_session_range()) {
@@ -1008,7 +1023,7 @@ Locations::remove (Location *loc)
removed (loc); /* EMIT SIGNAL */
if (was_current) {
- current_changed (0); /* EMIT SIGNAL */
+ current_changed (0); /* EMIT SIGNAL */
}
}
}
@@ -1069,6 +1084,8 @@ Locations::set_state (const XMLNode& node, int version)
if (i != locations.end()) {
/* we can re-use an old Location object */
loc = *i;
+
+ // changed locations will be updated by Locations::changed signal
loc->set_state (**niter, version);
} else {
loc = new Location (_session, **niter);
@@ -1156,16 +1173,16 @@ typedef std::pair<framepos_t,Location*> LocationPair;
struct LocationStartEarlierComparison
{
- bool operator() (LocationPair a, LocationPair b) {
- return a.first < b.first;
- }
+ bool operator() (LocationPair a, LocationPair b) {
+ return a.first < b.first;
+ }
};
struct LocationStartLaterComparison
{
- bool operator() (LocationPair a, LocationPair b) {
- return a.first > b.first;
- }
+ bool operator() (LocationPair a, LocationPair b) {
+ return a.first > b.first;
+ }
};
framepos_t
@@ -1374,7 +1391,7 @@ Locations::auto_punch_location () const
return const_cast<Location*> (*i);
}
}
- return 0;
+ return 0;
}
uint32_t
@@ -1393,12 +1410,12 @@ Locations::num_range_markers () const
Location *
Locations::get_location_by_id(PBD::ID id)
{
- LocationList::iterator it;
- for (it = locations.begin(); it != locations.end(); ++it)
- if (id == (*it)->id())
- return *it;
+ LocationList::iterator it;
+ for (it = locations.begin(); it != locations.end(); ++it)
+ if (id == (*it)->id())
+ return *it;
- return 0;
+ return 0;
}
void
diff --git a/libs/ardour/ltc_slave.cc b/libs/ardour/ltc_slave.cc
index c5840f6..ab84cf6 100644
--- a/libs/ardour/ltc_slave.cc
+++ b/libs/ardour/ltc_slave.cc
@@ -26,6 +26,7 @@
#include "pbd/pthread_utils.h"
#include "ardour/debug.h"
+#include "ardour/profile.h"
#include "ardour/slave.h"
#include "ardour/session.h"
#include "ardour/audioengine.h"
@@ -151,6 +152,8 @@ LTC_Slave::reset()
ltc_speed = 0;
engine_dll_initstate = 0;
sync_lock_broken = false;
+
+ ActiveChanged (false); /* EMIT SIGNAL */
}
void
@@ -443,8 +446,10 @@ LTC_Slave::speed_and_position (double& speed, framepos_t& pos)
if (last_timestamp == 0) {
engine_dll_initstate = 0;
if (delayedlocked < 10) ++delayedlocked;
- }
- else if (engine_dll_initstate != transport_direction && ltc_speed != 0) {
+ } else if (engine_dll_initstate != transport_direction && ltc_speed != 0) {
+
+ ActiveChanged (true); /* EMIT SIGNAL */
+
engine_dll_initstate = transport_direction;
init_engine_dll(last_ltc_frame + rint(ltc_speed * double(2 * nframes + now - last_timestamp)),
session.engine().samples_per_cycle());
@@ -488,6 +493,7 @@ LTC_Slave::speed_and_position (double& speed, framepos_t& pos)
reset();
speed = 0;
pos = session.transport_frame();
+ ActiveChanged (false); /* EMIT SIGNAL */
return true;
}
@@ -556,7 +562,7 @@ LTC_Slave::speed_and_position (double& speed, framepos_t& pos)
speed = 1.0;
}
- if (speed != 0 && delayedlocked == 0 && fabsf(speed) != 1.0) {
+ if (speed != 0 && delayedlocked == 0 && fabs(speed) != 1.0) {
sync_lock_broken = true;
DEBUG_TRACE (DEBUG::LTC, string_compose ("LTC speed not locked %1 %2\n", speed, ltc_speed));
}
@@ -604,7 +610,7 @@ LTC_Slave::approximate_current_delta() const
} else {
snprintf(delta, sizeof(delta), "\u0394<span foreground=\"%s\" face=\"monospace\" >%s%s%lld</span>sm",
sync_lock_broken ? "red" : "green",
- LEADINGZERO(llabs(current_delta)), PLUSMINUS(-current_delta), llabs(current_delta));
+ LEADINGZERO(::llabs(current_delta)), PLUSMINUS(-current_delta), ::llabs(current_delta));
}
return std::string(delta);
}
diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc
index 243312f..e5b8ffd 100644
--- a/libs/ardour/lv2_plugin.cc
+++ b/libs/ardour/lv2_plugin.cc
@@ -309,7 +309,6 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
_latency_control_port = 0;
_next_cycle_start = std::numeric_limits<framepos_t>::max();
_next_cycle_speed = 1.0;
- _block_length = _engine.samples_per_cycle();
_seq_size = _engine.raw_buffer_size(DataType::MIDI);
_state_version = 0;
_was_activated = false;
@@ -355,11 +354,17 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
#ifdef HAVE_LV2_1_2_0
LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
+ static const int32_t _min_block_length = 1; // may happen during split-cycles
+ static const int32_t _max_block_length = 8192; // max possible (with all engines and during export)
+ /* @drobilla: Does it make sense to re-instantiate all plugins
+ * whenever the buffersize changes?
+ * Is there a way to find plugins that require the min/max blocksize option?
+ */
LV2_Options_Option options[] = {
{ LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength),
- sizeof(int32_t), atom_Int, &_block_length },
+ sizeof(int32_t), atom_Int, &_min_block_length },
{ LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength),
- sizeof(int32_t), atom_Int, &_block_length },
+ sizeof(int32_t), atom_Int, &_max_block_length },
{ LV2_OPTIONS_INSTANCE, 0, _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize),
sizeof(int32_t), atom_Int, &_seq_size },
{ LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
@@ -1908,7 +1913,7 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
TempoMetric tmetric = tmap.metric_at(_session.transport_frame(), &metric_i);
if (_freewheel_control_port) {
- *_freewheel_control_port = _session.engine().freewheeling();
+ *_freewheel_control_port = _session.engine().freewheeling() ? 1.f : 0.f;
}
if (_bpm_control_port) {
diff --git a/libs/ardour/macosx/libardour.xcodeproj/project.pbxproj b/libs/ardour/macosx/libardour.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..c31e8b0
--- /dev/null
+++ b/libs/ardour/macosx/libardour.xcodeproj/project.pbxproj
@@ -0,0 +1,3464 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 432653E6194EF73C00BEFB46 /* amp.h in Headers */ = {isa = PBXBuildFile; fileRef = 432652FC194EF73C00BEFB46 /* amp.h */; };
+ 432653E7194EF73C00BEFB46 /* analyser.h in Headers */ = {isa = PBXBuildFile; fileRef = 432652FD194EF73C00BEFB46 /* analyser.h */; };
+ 432653E8194EF73C00BEFB46 /* ardour.h in Headers */ = {isa = PBXBuildFile; fileRef = 432652FE194EF73C00BEFB46 /* ardour.h */; };
+ 432653E9194EF73C00BEFB46 /* async_midi_port.h in Headers */ = {isa = PBXBuildFile; fileRef = 432652FF194EF73C00BEFB46 /* async_midi_port.h */; };
+ 432653EA194EF73C00BEFB46 /* audio_backend.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265300194EF73C00BEFB46 /* audio_backend.h */; };
+ 432653EB194EF73C00BEFB46 /* audio_buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265301194EF73C00BEFB46 /* audio_buffer.h */; };
+ 432653EC194EF73C00BEFB46 /* audio_diskstream.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265302194EF73C00BEFB46 /* audio_diskstream.h */; };
+ 432653ED194EF73C00BEFB46 /* audio_library.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265303194EF73C00BEFB46 /* audio_library.h */; };
+ 432653EE194EF73C00BEFB46 /* audio_playlist_importer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265304194EF73C00BEFB46 /* audio_playlist_importer.h */; };
+ 432653EF194EF73C00BEFB46 /* audio_playlist_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265305194EF73C00BEFB46 /* audio_playlist_source.h */; };
+ 432653F0194EF73C00BEFB46 /* audio_port.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265306194EF73C00BEFB46 /* audio_port.h */; };
+ 432653F1194EF73C00BEFB46 /* audio_region_importer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265307194EF73C00BEFB46 /* audio_region_importer.h */; };
+ 432653F2194EF73C00BEFB46 /* audio_track.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265308194EF73C00BEFB46 /* audio_track.h */; };
+ 432653F3194EF73C00BEFB46 /* audio_track_importer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265309194EF73C00BEFB46 /* audio_track_importer.h */; };
+ 432653F4194EF73C00BEFB46 /* audio_unit.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326530A194EF73C00BEFB46 /* audio_unit.h */; };
+ 432653F5194EF73C00BEFB46 /* audioanalyser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326530B194EF73C00BEFB46 /* audioanalyser.h */; };
+ 432653F6194EF73C00BEFB46 /* audioengine.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326530C194EF73C00BEFB46 /* audioengine.h */; };
+ 432653F7194EF73C00BEFB46 /* audiofile_tagger.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326530D194EF73C00BEFB46 /* audiofile_tagger.h */; };
+ 432653F8194EF73C00BEFB46 /* audiofilesource.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326530E194EF73C00BEFB46 /* audiofilesource.h */; };
+ 432653F9194EF73C00BEFB46 /* audioplaylist.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326530F194EF73C00BEFB46 /* audioplaylist.h */; };
+ 432653FA194EF73C00BEFB46 /* audioregion.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265310194EF73C00BEFB46 /* audioregion.h */; };
+ 432653FB194EF73C00BEFB46 /* audiosource.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265311194EF73C00BEFB46 /* audiosource.h */; };
+ 432653FC194EF73C00BEFB46 /* auditioner.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265312194EF73C00BEFB46 /* auditioner.h */; };
+ 432653FD194EF73C00BEFB46 /* auto_bundle.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265313194EF73C00BEFB46 /* auto_bundle.h */; };
+ 432653FE194EF73C00BEFB46 /* automatable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265314194EF73C00BEFB46 /* automatable.h */; };
+ 432653FF194EF73C00BEFB46 /* automatable_sequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265315194EF73C00BEFB46 /* automatable_sequence.h */; };
+ 43265400194EF73C00BEFB46 /* automation_control.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265316194EF73C00BEFB46 /* automation_control.h */; };
+ 43265401194EF73C00BEFB46 /* automation_list.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265317194EF73C00BEFB46 /* automation_list.h */; };
+ 43265402194EF73C00BEFB46 /* automation_watch.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265318194EF73C00BEFB46 /* automation_watch.h */; };
+ 43265403194EF73C00BEFB46 /* beats_frames_converter.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265319194EF73C00BEFB46 /* beats_frames_converter.h */; };
+ 43265404194EF73C00BEFB46 /* broadcast_info.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326531A194EF73C00BEFB46 /* broadcast_info.h */; };
+ 43265405194EF73C00BEFB46 /* buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326531B194EF73C00BEFB46 /* buffer.h */; };
+ 43265406194EF73C00BEFB46 /* buffer_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326531C194EF73C00BEFB46 /* buffer_manager.h */; };
+ 43265407194EF73C00BEFB46 /* buffer_set.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326531D194EF73C00BEFB46 /* buffer_set.h */; };
+ 43265408194EF73C00BEFB46 /* bundle.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326531E194EF73C00BEFB46 /* bundle.h */; };
+ 43265409194EF73C00BEFB46 /* butler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326531F194EF73C00BEFB46 /* butler.h */; };
+ 4326540A194EF73C00BEFB46 /* caimportable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265320194EF73C00BEFB46 /* caimportable.h */; };
+ 4326540B194EF73C00BEFB46 /* capturing_processor.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265321194EF73C00BEFB46 /* capturing_processor.h */; };
+ 4326540C194EF73C00BEFB46 /* chan_count.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265322194EF73C00BEFB46 /* chan_count.h */; };
+ 4326540D194EF73D00BEFB46 /* chan_mapping.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265323194EF73C00BEFB46 /* chan_mapping.h */; };
+ 4326540E194EF73D00BEFB46 /* click.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265324194EF73C00BEFB46 /* click.h */; };
+ 4326540F194EF73D00BEFB46 /* comparable_shared_ptr.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265325194EF73C00BEFB46 /* comparable_shared_ptr.h */; };
+ 43265410194EF73D00BEFB46 /* configuration.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265326194EF73C00BEFB46 /* configuration.h */; };
+ 43265411194EF73D00BEFB46 /* configuration_variable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265327194EF73C00BEFB46 /* configuration_variable.h */; };
+ 43265412194EF73D00BEFB46 /* control_protocol_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265328194EF73C00BEFB46 /* control_protocol_manager.h */; };
+ 43265413194EF73D00BEFB46 /* coreaudiosource.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265329194EF73C00BEFB46 /* coreaudiosource.h */; };
+ 43265414194EF73D00BEFB46 /* cycle_timer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326532A194EF73C00BEFB46 /* cycle_timer.h */; };
+ 43265415194EF73D00BEFB46 /* cycles.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326532B194EF73C00BEFB46 /* cycles.h */; };
+ 43265416194EF73D00BEFB46 /* data_type.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326532C194EF73C00BEFB46 /* data_type.h */; };
+ 43265417194EF73D00BEFB46 /* dB.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326532D194EF73C00BEFB46 /* dB.h */; };
+ 43265418194EF73D00BEFB46 /* debug.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326532E194EF73C00BEFB46 /* debug.h */; };
+ 43265419194EF73D00BEFB46 /* delivery.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326532F194EF73C00BEFB46 /* delivery.h */; };
+ 4326541A194EF73D00BEFB46 /* directory_names.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265330194EF73C00BEFB46 /* directory_names.h */; };
+ 4326541B194EF73D00BEFB46 /* diskstream.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265331194EF73C00BEFB46 /* diskstream.h */; };
+ 4326541C194EF73D00BEFB46 /* element_import_handler.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265332194EF73C00BEFB46 /* element_import_handler.h */; };
+ 4326541D194EF73D00BEFB46 /* element_importer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265333194EF73C00BEFB46 /* element_importer.h */; };
+ 4326541E194EF73D00BEFB46 /* engine_state_controller.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265334194EF73C00BEFB46 /* engine_state_controller.h */; };
+ 4326541F194EF73D00BEFB46 /* event_type_map.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265335194EF73C00BEFB46 /* event_type_map.h */; };
+ 43265420194EF73D00BEFB46 /* export_channel.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265336194EF73C00BEFB46 /* export_channel.h */; };
+ 43265421194EF73D00BEFB46 /* export_channel_configuration.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265337194EF73C00BEFB46 /* export_channel_configuration.h */; };
+ 43265422194EF73D00BEFB46 /* export_failed.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265338194EF73C00BEFB46 /* export_failed.h */; };
+ 43265423194EF73D00BEFB46 /* export_filename.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265339194EF73C00BEFB46 /* export_filename.h */; };
+ 43265424194EF73D00BEFB46 /* export_format_base.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326533A194EF73C00BEFB46 /* export_format_base.h */; };
+ 43265425194EF73D00BEFB46 /* export_format_compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326533B194EF73C00BEFB46 /* export_format_compatibility.h */; };
+ 43265426194EF73D00BEFB46 /* export_format_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326533C194EF73C00BEFB46 /* export_format_manager.h */; };
+ 43265427194EF73D00BEFB46 /* export_format_specification.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326533D194EF73C00BEFB46 /* export_format_specification.h */; };
+ 43265428194EF73D00BEFB46 /* export_formats.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326533E194EF73C00BEFB46 /* export_formats.h */; };
+ 43265429194EF73D00BEFB46 /* export_graph_builder.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326533F194EF73C00BEFB46 /* export_graph_builder.h */; };
+ 4326542A194EF73D00BEFB46 /* export_handler.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265340194EF73C00BEFB46 /* export_handler.h */; };
+ 4326542B194EF73D00BEFB46 /* export_multiplication.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265341194EF73C00BEFB46 /* export_multiplication.h */; };
+ 4326542C194EF73D00BEFB46 /* export_pointers.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265342194EF73C00BEFB46 /* export_pointers.h */; };
+ 4326542D194EF73D00BEFB46 /* export_preset.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265343194EF73C00BEFB46 /* export_preset.h */; };
+ 4326542E194EF73D00BEFB46 /* export_profile_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265344194EF73C00BEFB46 /* export_profile_manager.h */; };
+ 4326542F194EF73D00BEFB46 /* export_status.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265345194EF73C00BEFB46 /* export_status.h */; };
+ 43265430194EF73D00BEFB46 /* export_timespan.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265346194EF73C00BEFB46 /* export_timespan.h */; };
+ 43265431194EF73D00BEFB46 /* file_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265347194EF73C00BEFB46 /* file_source.h */; };
+ 43265432194EF73D00BEFB46 /* filename_extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265348194EF73C00BEFB46 /* filename_extensions.h */; };
+ 43265433194EF73D00BEFB46 /* filesystem_paths.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265349194EF73C00BEFB46 /* filesystem_paths.h */; };
+ 43265434194EF73D00BEFB46 /* filter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326534A194EF73C00BEFB46 /* filter.h */; };
+ 43265435194EF73D00BEFB46 /* graph.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326534B194EF73C00BEFB46 /* graph.h */; };
+ 43265436194EF73D00BEFB46 /* graphnode.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326534C194EF73C00BEFB46 /* graphnode.h */; };
+ 43265437194EF73D00BEFB46 /* iec1ppmdsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326534D194EF73C00BEFB46 /* iec1ppmdsp.h */; };
+ 43265438194EF73D00BEFB46 /* iec2ppmdsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326534E194EF73C00BEFB46 /* iec2ppmdsp.h */; };
+ 43265439194EF73D00BEFB46 /* import_status.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326534F194EF73C00BEFB46 /* import_status.h */; };
+ 4326543A194EF73D00BEFB46 /* importable_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265350194EF73C00BEFB46 /* importable_source.h */; };
+ 4326543B194EF73D00BEFB46 /* instrument_info.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265351194EF73C00BEFB46 /* instrument_info.h */; };
+ 4326543C194EF73D00BEFB46 /* internal_return.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265352194EF73C00BEFB46 /* internal_return.h */; };
+ 4326543D194EF73D00BEFB46 /* internal_send.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265353194EF73C00BEFB46 /* internal_send.h */; };
+ 4326543E194EF73D00BEFB46 /* interpolation.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265354194EF73C00BEFB46 /* interpolation.h */; };
+ 4326543F194EF73D00BEFB46 /* interthread_info.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265355194EF73C00BEFB46 /* interthread_info.h */; };
+ 43265440194EF73D00BEFB46 /* io.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265356194EF73C00BEFB46 /* io.h */; };
+ 43265441194EF73D00BEFB46 /* io_processor.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265357194EF73C00BEFB46 /* io_processor.h */; };
+ 43265442194EF73D00BEFB46 /* jack_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265358194EF73C00BEFB46 /* jack_utils.h */; };
+ 43265443194EF73D00BEFB46 /* kmeterdsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265359194EF73C00BEFB46 /* kmeterdsp.h */; };
+ 43265444194EF73D00BEFB46 /* ladspa.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326535A194EF73C00BEFB46 /* ladspa.h */; };
+ 43265445194EF73D00BEFB46 /* ladspa_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326535B194EF73C00BEFB46 /* ladspa_plugin.h */; };
+ 43265446194EF73D00BEFB46 /* latent.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326535C194EF73C00BEFB46 /* latent.h */; };
+ 43265447194EF73D00BEFB46 /* libardour_visibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326535D194EF73C00BEFB46 /* libardour_visibility.h */; };
+ 43265448194EF73D00BEFB46 /* linux_vst_support.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326535E194EF73C00BEFB46 /* linux_vst_support.h */; };
+ 43265449194EF73D00BEFB46 /* location.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326535F194EF73C00BEFB46 /* location.h */; };
+ 4326544A194EF73D00BEFB46 /* location_importer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265360194EF73C00BEFB46 /* location_importer.h */; };
+ 4326544B194EF73D00BEFB46 /* logcurve.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265361194EF73C00BEFB46 /* logcurve.h */; };
+ 4326544C194EF73D00BEFB46 /* lv2_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265362194EF73C00BEFB46 /* lv2_plugin.h */; };
+ 4326544D194EF73D00BEFB46 /* lxvst_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265363194EF73C00BEFB46 /* lxvst_plugin.h */; };
+ 4326544E194EF73D00BEFB46 /* meter.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265364194EF73C00BEFB46 /* meter.h */; };
+ 4326544F194EF73D00BEFB46 /* midi_automation_list_binder.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265365194EF73C00BEFB46 /* midi_automation_list_binder.h */; };
+ 43265450194EF73D00BEFB46 /* midi_buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265366194EF73C00BEFB46 /* midi_buffer.h */; };
+ 43265451194EF73D00BEFB46 /* midi_diskstream.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265367194EF73C00BEFB46 /* midi_diskstream.h */; };
+ 43265452194EF73D00BEFB46 /* midi_model.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265368194EF73C00BEFB46 /* midi_model.h */; };
+ 43265453194EF73D00BEFB46 /* midi_operator.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265369194EF73C00BEFB46 /* midi_operator.h */; };
+ 43265454194EF73D00BEFB46 /* midi_patch_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326536A194EF73C00BEFB46 /* midi_patch_manager.h */; };
+ 43265455194EF73D00BEFB46 /* midi_playlist.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326536B194EF73C00BEFB46 /* midi_playlist.h */; };
+ 43265456194EF73D00BEFB46 /* midi_playlist_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326536C194EF73C00BEFB46 /* midi_playlist_source.h */; };
+ 43265457194EF73D00BEFB46 /* midi_port.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326536D194EF73C00BEFB46 /* midi_port.h */; };
+ 43265458194EF73D00BEFB46 /* midi_region.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326536E194EF73C00BEFB46 /* midi_region.h */; };
+ 43265459194EF73D00BEFB46 /* midi_ring_buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326536F194EF73C00BEFB46 /* midi_ring_buffer.h */; };
+ 4326545A194EF73D00BEFB46 /* midi_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265370194EF73C00BEFB46 /* midi_source.h */; };
+ 4326545B194EF73D00BEFB46 /* midi_state_tracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265371194EF73C00BEFB46 /* midi_state_tracker.h */; };
+ 4326545C194EF73D00BEFB46 /* midi_stretch.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265372194EF73C00BEFB46 /* midi_stretch.h */; };
+ 4326545D194EF73D00BEFB46 /* midi_track.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265373194EF73C00BEFB46 /* midi_track.h */; };
+ 4326545E194EF73D00BEFB46 /* midi_ui.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265374194EF73C00BEFB46 /* midi_ui.h */; };
+ 4326545F194EF73D00BEFB46 /* midiport_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265375194EF73C00BEFB46 /* midiport_manager.h */; };
+ 43265460194EF73D00BEFB46 /* mix.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265376194EF73C00BEFB46 /* mix.h */; };
+ 43265461194EF73D00BEFB46 /* monitor_processor.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265377194EF73C00BEFB46 /* monitor_processor.h */; };
+ 43265462194EF73D00BEFB46 /* movable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265378194EF73C00BEFB46 /* movable.h */; };
+ 43265463194EF73D00BEFB46 /* msvc_libardour.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265379194EF73C00BEFB46 /* msvc_libardour.h */; };
+ 43265464194EF73D00BEFB46 /* mtdm.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326537A194EF73C00BEFB46 /* mtdm.h */; };
+ 43265465194EF73D00BEFB46 /* mute_master.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326537B194EF73C00BEFB46 /* mute_master.h */; };
+ 43265466194EF73D00BEFB46 /* noise.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326537C194EF73C00BEFB46 /* noise.h */; };
+ 43265467194EF73D00BEFB46 /* onset_detector.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326537D194EF73C00BEFB46 /* onset_detector.h */; };
+ 43265468194EF73D00BEFB46 /* operations.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326537E194EF73C00BEFB46 /* operations.h */; };
+ 43265469194EF73D00BEFB46 /* pan_controllable.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326537F194EF73C00BEFB46 /* pan_controllable.h */; };
+ 4326546A194EF73D00BEFB46 /* pannable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265380194EF73C00BEFB46 /* pannable.h */; };
+ 4326546B194EF73D00BEFB46 /* panner.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265381194EF73C00BEFB46 /* panner.h */; };
+ 4326546C194EF73D00BEFB46 /* panner_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265382194EF73C00BEFB46 /* panner_manager.h */; };
+ 4326546D194EF73D00BEFB46 /* panner_shell.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265383194EF73C00BEFB46 /* panner_shell.h */; };
+ 4326546E194EF73D00BEFB46 /* pcm_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265384194EF73C00BEFB46 /* pcm_utils.h */; };
+ 4326546F194EF73D00BEFB46 /* peak.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265385194EF73C00BEFB46 /* peak.h */; };
+ 43265470194EF73D00BEFB46 /* pi_controller.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265386194EF73C00BEFB46 /* pi_controller.h */; };
+ 43265471194EF73D00BEFB46 /* pitch.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265387194EF73C00BEFB46 /* pitch.h */; };
+ 43265472194EF73D00BEFB46 /* playlist.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265388194EF73C00BEFB46 /* playlist.h */; };
+ 43265473194EF73D00BEFB46 /* playlist_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265389194EF73C00BEFB46 /* playlist_factory.h */; };
+ 43265474194EF73D00BEFB46 /* playlist_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326538A194EF73C00BEFB46 /* playlist_source.h */; };
+ 43265475194EF73D00BEFB46 /* plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326538B194EF73C00BEFB46 /* plugin.h */; };
+ 43265476194EF73D00BEFB46 /* plugin_insert.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326538C194EF73C00BEFB46 /* plugin_insert.h */; };
+ 43265477194EF73D00BEFB46 /* plugin_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326538D194EF73C00BEFB46 /* plugin_manager.h */; };
+ 43265478194EF73D00BEFB46 /* plugin_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326538E194EF73C00BEFB46 /* plugin_types.h */; };
+ 43265479194EF73D00BEFB46 /* port.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326538F194EF73C00BEFB46 /* port.h */; };
+ 4326547A194EF73D00BEFB46 /* port_engine.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265390194EF73C00BEFB46 /* port_engine.h */; };
+ 4326547B194EF73D00BEFB46 /* port_insert.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265391194EF73C00BEFB46 /* port_insert.h */; };
+ 4326547C194EF73D00BEFB46 /* port_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265392194EF73C00BEFB46 /* port_manager.h */; };
+ 4326547D194EF73D00BEFB46 /* port_set.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265393194EF73C00BEFB46 /* port_set.h */; };
+ 4326547E194EF73D00BEFB46 /* process_thread.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265394194EF73C00BEFB46 /* process_thread.h */; };
+ 4326547F194EF73D00BEFB46 /* processor.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265395194EF73C00BEFB46 /* processor.h */; };
+ 43265480194EF73D00BEFB46 /* profile.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265396194EF73C00BEFB46 /* profile.h */; };
+ 43265481194EF73D00BEFB46 /* progress.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265397194EF73C00BEFB46 /* progress.h */; };
+ 43265482194EF73D00BEFB46 /* proxy_controllable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265398194EF73C00BEFB46 /* proxy_controllable.h */; };
+ 43265483194EF73D00BEFB46 /* public_diskstream.h in Headers */ = {isa = PBXBuildFile; fileRef = 43265399194EF73C00BEFB46 /* public_diskstream.h */; };
+ 43265484194EF73D00BEFB46 /* quantize.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326539A194EF73C00BEFB46 /* quantize.h */; };
+ 43265485194EF73D00BEFB46 /* rb_effect.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326539B194EF73C00BEFB46 /* rb_effect.h */; };
+ 43265486194EF73D00BEFB46 /* rc_configuration.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326539C194EF73C00BEFB46 /* rc_configuration.h */; };
+ 43265487194EF73D00BEFB46 /* rc_configuration_vars.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326539D194EF73C00BEFB46 /* rc_configuration_vars.h */; };
+ 43265488194EF73D00BEFB46 /* readable.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326539E194EF73C00BEFB46 /* readable.h */; };
+ 43265489194EF73D00BEFB46 /* recent_sessions.h in Headers */ = {isa = PBXBuildFile; fileRef = 4326539F194EF73C00BEFB46 /* recent_sessions.h */; };
+ 4326548A194EF73D00BEFB46 /* region.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653A0194EF73C00BEFB46 /* region.h */; };
+ 4326548B194EF73D00BEFB46 /* region_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653A1194EF73C00BEFB46 /* region_factory.h */; };
+ 4326548C194EF73D00BEFB46 /* region_sorters.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653A2194EF73C00BEFB46 /* region_sorters.h */; };
+ 4326548D194EF73D00BEFB46 /* resampled_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653A3194EF73C00BEFB46 /* resampled_source.h */; };
+ 4326548E194EF73D00BEFB46 /* return.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653A4194EF73C00BEFB46 /* return.h */; };
+ 4326548F194EF73D00BEFB46 /* reverse.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653A5194EF73C00BEFB46 /* reverse.h */; };
+ 43265490194EF73D00BEFB46 /* revision.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653A6194EF73C00BEFB46 /* revision.h */; };
+ 43265491194EF73D00BEFB46 /* route.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653A7194EF73C00BEFB46 /* route.h */; };
+ 43265492194EF73D00BEFB46 /* route_graph.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653A8194EF73C00BEFB46 /* route_graph.h */; };
+ 43265493194EF73D00BEFB46 /* route_group.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653A9194EF73C00BEFB46 /* route_group.h */; };
+ 43265494194EF73D00BEFB46 /* route_group_member.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653AA194EF73C00BEFB46 /* route_group_member.h */; };
+ 43265495194EF73D00BEFB46 /* route_group_specialized.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653AB194EF73C00BEFB46 /* route_group_specialized.h */; };
+ 43265496194EF73D00BEFB46 /* runtime_functions.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653AC194EF73C00BEFB46 /* runtime_functions.h */; };
+ 43265497194EF73D00BEFB46 /* search_paths.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653AD194EF73C00BEFB46 /* search_paths.h */; };
+ 43265498194EF73D00BEFB46 /* send.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653AE194EF73C00BEFB46 /* send.h */; };
+ 43265499194EF73D00BEFB46 /* session.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653AF194EF73C00BEFB46 /* session.h */; };
+ 4326549A194EF73D00BEFB46 /* session_configuration.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653B0194EF73C00BEFB46 /* session_configuration.h */; };
+ 4326549B194EF73D00BEFB46 /* session_configuration_vars.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653B1194EF73C00BEFB46 /* session_configuration_vars.h */; };
+ 4326549C194EF73D00BEFB46 /* session_directory.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653B2194EF73C00BEFB46 /* session_directory.h */; };
+ 4326549D194EF73D00BEFB46 /* session_event.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653B3194EF73C00BEFB46 /* session_event.h */; };
+ 4326549E194EF73D00BEFB46 /* session_handle.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653B4194EF73C00BEFB46 /* session_handle.h */; };
+ 4326549F194EF73D00BEFB46 /* session_metadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653B5194EF73C00BEFB46 /* session_metadata.h */; };
+ 432654A0194EF73D00BEFB46 /* session_object.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653B6194EF73C00BEFB46 /* session_object.h */; };
+ 432654A1194EF73D00BEFB46 /* session_playlist.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653B7194EF73C00BEFB46 /* session_playlist.h */; };
+ 432654A2194EF73D00BEFB46 /* session_playlists.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653B8194EF73C00BEFB46 /* session_playlists.h */; };
+ 432654A3194EF73D00BEFB46 /* session_route.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653B9194EF73C00BEFB46 /* session_route.h */; };
+ 432654A4194EF73D00BEFB46 /* session_state_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653BA194EF73C00BEFB46 /* session_state_utils.h */; };
+ 432654A5194EF73D00BEFB46 /* session_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653BB194EF73C00BEFB46 /* session_utils.h */; };
+ 432654A6194EF73D00BEFB46 /* silentfilesource.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653BC194EF73C00BEFB46 /* silentfilesource.h */; };
+ 432654A7194EF73D00BEFB46 /* slave.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653BD194EF73C00BEFB46 /* slave.h */; };
+ 432654A8194EF73D00BEFB46 /* smf_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653BE194EF73C00BEFB46 /* smf_source.h */; };
+ 432654A9194EF73D00BEFB46 /* sndfile_helpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653BF194EF73C00BEFB46 /* sndfile_helpers.h */; };
+ 432654AA194EF73D00BEFB46 /* sndfileimportable.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653C0194EF73C00BEFB46 /* sndfileimportable.h */; };
+ 432654AB194EF73D00BEFB46 /* sndfilesource.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653C1194EF73C00BEFB46 /* sndfilesource.h */; };
+ 432654AC194EF73D00BEFB46 /* soundseq.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653C2194EF73C00BEFB46 /* soundseq.h */; };
+ 432654AD194EF73D00BEFB46 /* source.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653C3194EF73C00BEFB46 /* source.h */; };
+ 432654AE194EF73D00BEFB46 /* source_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653C4194EF73C00BEFB46 /* source_factory.h */; };
+ 432654AF194EF73D00BEFB46 /* speaker.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653C5194EF73C00BEFB46 /* speaker.h */; };
+ 432654B0194EF73D00BEFB46 /* speakers.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653C6194EF73C00BEFB46 /* speakers.h */; };
+ 432654B1194EF73D00BEFB46 /* spline.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653C7194EF73C00BEFB46 /* spline.h */; };
+ 432654B2194EF73D00BEFB46 /* srcfilesource.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653C8194EF73C00BEFB46 /* srcfilesource.h */; };
+ 432654B3194EF73D00BEFB46 /* stretch.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653C9194EF73C00BEFB46 /* stretch.h */; };
+ 432654B4194EF73D00BEFB46 /* strip_silence.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653CA194EF73C00BEFB46 /* strip_silence.h */; };
+ 432654B5194EF73D00BEFB46 /* system_exec.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653CB194EF73C00BEFB46 /* system_exec.h */; };
+ 432654B6194EF73D00BEFB46 /* tape_file_matcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653CC194EF73C00BEFB46 /* tape_file_matcher.h */; };
+ 432654B7194EF73D00BEFB46 /* template_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653CD194EF73C00BEFB46 /* template_utils.h */; };
+ 432654B8194EF73D00BEFB46 /* tempo.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653CE194EF73C00BEFB46 /* tempo.h */; };
+ 432654B9194EF73D00BEFB46 /* tempo_map_importer.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653CF194EF73C00BEFB46 /* tempo_map_importer.h */; };
+ 432654BA194EF73D00BEFB46 /* thread_buffers.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653D0194EF73C00BEFB46 /* thread_buffers.h */; };
+ 432654BB194EF73D00BEFB46 /* ticker.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653D1194EF73C00BEFB46 /* ticker.h */; };
+ 432654BC194EF73D00BEFB46 /* timecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653D2194EF73C00BEFB46 /* timecode.h */; };
+ 432654BD194EF73D00BEFB46 /* timefx_request.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653D3194EF73C00BEFB46 /* timefx_request.h */; };
+ 432654BE194EF73D00BEFB46 /* timestamps.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653D4194EF73C00BEFB46 /* timestamps.h */; };
+ 432654BF194EF73D00BEFB46 /* track.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653D5194EF73C00BEFB46 /* track.h */; };
+ 432654C0194EF73D00BEFB46 /* transient_detector.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653D6194EF73C00BEFB46 /* transient_detector.h */; };
+ 432654C1194EF73D00BEFB46 /* trimmable.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653D7194EF73C00BEFB46 /* trimmable.h */; };
+ 432654C2194EF73D00BEFB46 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653D8194EF73C00BEFB46 /* types.h */; };
+ 432654C3194EF73D00BEFB46 /* unknown_processor.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653D9194EF73C00BEFB46 /* unknown_processor.h */; };
+ 432654C4194EF73D00BEFB46 /* uri_map.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653DA194EF73C00BEFB46 /* uri_map.h */; };
+ 432654C5194EF73D00BEFB46 /* user_bundle.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653DB194EF73C00BEFB46 /* user_bundle.h */; };
+ 432654C6194EF73D00BEFB46 /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653DC194EF73C00BEFB46 /* utils.h */; };
+ 432654C7194EF73D00BEFB46 /* version.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653DD194EF73C00BEFB46 /* version.h */; };
+ 432654C8194EF73D00BEFB46 /* aeffectx.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653DF194EF73C00BEFB46 /* aeffectx.h */; };
+ 432654C9194EF73D00BEFB46 /* vst_info_file.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653E0194EF73C00BEFB46 /* vst_info_file.h */; };
+ 432654CA194EF73D00BEFB46 /* vst_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653E1194EF73C00BEFB46 /* vst_plugin.h */; };
+ 432654CB194EF73D00BEFB46 /* vst_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653E2194EF73C00BEFB46 /* vst_types.h */; };
+ 432654CC194EF73D00BEFB46 /* vumeterdsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653E3194EF73C00BEFB46 /* vumeterdsp.h */; };
+ 432654CD194EF73D00BEFB46 /* windows_vst_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653E4194EF73C00BEFB46 /* windows_vst_plugin.h */; };
+ 432654CE194EF73D00BEFB46 /* worker.h in Headers */ = {isa = PBXBuildFile; fileRef = 432653E5194EF73C00BEFB46 /* worker.h */; };
+ 432859E61A10F415006C3E03 /* midi_scene_change.h in Headers */ = {isa = PBXBuildFile; fileRef = 432859E21A10F415006C3E03 /* midi_scene_change.h */; };
+ 432859E71A10F415006C3E03 /* midi_scene_changer.h in Headers */ = {isa = PBXBuildFile; fileRef = 432859E31A10F415006C3E03 /* midi_scene_changer.h */; };
+ 432859E81A10F415006C3E03 /* mididm.h in Headers */ = {isa = PBXBuildFile; fileRef = 432859E41A10F415006C3E03 /* mididm.h */; };
+ 432859E91A10F415006C3E03 /* soundcloud_upload.h in Headers */ = {isa = PBXBuildFile; fileRef = 432859E51A10F415006C3E03 /* soundcloud_upload.h */; };
+ 432859F31A10F436006C3E03 /* midi_scene_change.cc in Sources */ = {isa = PBXBuildFile; fileRef = 432859EE1A10F436006C3E03 /* midi_scene_change.cc */; };
+ 432859F41A10F436006C3E03 /* midi_scene_changer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 432859EF1A10F436006C3E03 /* midi_scene_changer.cc */; };
+ 432859F51A10F436006C3E03 /* mididm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 432859F01A10F436006C3E03 /* mididm.cc */; };
+ 432859F61A10F436006C3E03 /* scene_change.cc in Sources */ = {isa = PBXBuildFile; fileRef = 432859F11A10F436006C3E03 /* scene_change.cc */; };
+ 432859F71A10F436006C3E03 /* soundcloud_upload.cc in Sources */ = {isa = PBXBuildFile; fileRef = 432859F21A10F436006C3E03 /* soundcloud_upload.cc */; };
+ 43AA8383194EEB2600A67B56 /* amp.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82AE194EEB2600A67B56 /* amp.cc */; };
+ 43AA8384194EEB2600A67B56 /* analyser.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82AF194EEB2600A67B56 /* analyser.cc */; };
+ 43AA8385194EEB2600A67B56 /* async_midi_port.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82B0194EEB2600A67B56 /* async_midi_port.cc */; };
+ 43AA8386194EEB2600A67B56 /* audio_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82B1194EEB2600A67B56 /* audio_buffer.cc */; };
+ 43AA8387194EEB2600A67B56 /* audio_diskstream.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82B2194EEB2600A67B56 /* audio_diskstream.cc */; };
+ 43AA8388194EEB2600A67B56 /* audio_library.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82B3194EEB2600A67B56 /* audio_library.cc */; };
+ 43AA8389194EEB2600A67B56 /* audio_playlist_importer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82B4194EEB2600A67B56 /* audio_playlist_importer.cc */; };
+ 43AA838A194EEB2600A67B56 /* audio_playlist_source.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82B5194EEB2600A67B56 /* audio_playlist_source.cc */; };
+ 43AA838B194EEB2600A67B56 /* audio_playlist.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82B6194EEB2600A67B56 /* audio_playlist.cc */; };
+ 43AA838C194EEB2600A67B56 /* audio_port.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82B7194EEB2600A67B56 /* audio_port.cc */; };
+ 43AA838D194EEB2600A67B56 /* audio_region_importer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82B8194EEB2600A67B56 /* audio_region_importer.cc */; };
+ 43AA838E194EEB2600A67B56 /* audio_track_importer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82B9194EEB2600A67B56 /* audio_track_importer.cc */; };
+ 43AA838F194EEB2600A67B56 /* audio_track.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82BA194EEB2600A67B56 /* audio_track.cc */; };
+ 43AA8390194EEB2600A67B56 /* audio_unit.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82BB194EEB2600A67B56 /* audio_unit.cc */; };
+ 43AA8391194EEB2600A67B56 /* audioanalyser.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82BC194EEB2600A67B56 /* audioanalyser.cc */; };
+ 43AA8392194EEB2600A67B56 /* audioengine.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82BD194EEB2600A67B56 /* audioengine.cc */; };
+ 43AA8393194EEB2600A67B56 /* audiofile_tagger.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82BE194EEB2600A67B56 /* audiofile_tagger.cc */; };
+ 43AA8394194EEB2600A67B56 /* audiofilesource.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82BF194EEB2600A67B56 /* audiofilesource.cc */; };
+ 43AA8395194EEB2600A67B56 /* audioregion.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82C0194EEB2600A67B56 /* audioregion.cc */; };
+ 43AA8396194EEB2600A67B56 /* audiosource.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82C1194EEB2600A67B56 /* audiosource.cc */; };
+ 43AA8397194EEB2600A67B56 /* auditioner.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82C2194EEB2600A67B56 /* auditioner.cc */; };
+ 43AA8398194EEB2600A67B56 /* auto_bundle.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82C3194EEB2600A67B56 /* auto_bundle.cc */; };
+ 43AA8399194EEB2600A67B56 /* automatable.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82C4194EEB2600A67B56 /* automatable.cc */; };
+ 43AA839A194EEB2600A67B56 /* automation_control.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82C5194EEB2600A67B56 /* automation_control.cc */; };
+ 43AA839B194EEB2600A67B56 /* automation_list.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82C6194EEB2600A67B56 /* automation_list.cc */; };
+ 43AA839C194EEB2600A67B56 /* automation_watch.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82C7194EEB2600A67B56 /* automation_watch.cc */; };
+ 43AA839D194EEB2600A67B56 /* automation.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82C8194EEB2600A67B56 /* automation.cc */; };
+ 43AA839E194EEB2600A67B56 /* beats_frames_converter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82C9194EEB2600A67B56 /* beats_frames_converter.cc */; };
+ 43AA839F194EEB2600A67B56 /* broadcast_info.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82CA194EEB2600A67B56 /* broadcast_info.cc */; };
+ 43AA83A0194EEB2600A67B56 /* buffer_manager.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82CB194EEB2600A67B56 /* buffer_manager.cc */; };
+ 43AA83A1194EEB2600A67B56 /* buffer_set.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82CC194EEB2600A67B56 /* buffer_set.cc */; };
+ 43AA83A2194EEB2600A67B56 /* buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82CD194EEB2600A67B56 /* buffer.cc */; };
+ 43AA83A3194EEB2600A67B56 /* bundle.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82CE194EEB2600A67B56 /* bundle.cc */; };
+ 43AA83A4194EEB2600A67B56 /* butler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82CF194EEB2600A67B56 /* butler.cc */; };
+ 43AA83A5194EEB2600A67B56 /* caimportable.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82D0194EEB2600A67B56 /* caimportable.cc */; };
+ 43AA83A6194EEB2600A67B56 /* capturing_processor.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82D1194EEB2600A67B56 /* capturing_processor.cc */; };
+ 43AA83A7194EEB2600A67B56 /* chan_count.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82D2194EEB2600A67B56 /* chan_count.cc */; };
+ 43AA83A8194EEB2600A67B56 /* chan_mapping.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82D3194EEB2600A67B56 /* chan_mapping.cc */; };
+ 43AA83A9194EEB2600A67B56 /* config_text.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82D4194EEB2600A67B56 /* config_text.cc */; };
+ 43AA83AA194EEB2600A67B56 /* configuration.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82D5194EEB2600A67B56 /* configuration.cc */; };
+ 43AA83AB194EEB2600A67B56 /* control_protocol_manager.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82D6194EEB2600A67B56 /* control_protocol_manager.cc */; };
+ 43AA83AC194EEB2600A67B56 /* coreaudiosource.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82D7194EEB2600A67B56 /* coreaudiosource.cc */; };
+ 43AA83AD194EEB2600A67B56 /* cycle_timer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82D8194EEB2600A67B56 /* cycle_timer.cc */; };
+ 43AA83AE194EEB2600A67B56 /* data_type.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82D9194EEB2600A67B56 /* data_type.cc */; };
+ 43AA83AF194EEB2600A67B56 /* debug.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82DA194EEB2600A67B56 /* debug.cc */; };
+ 43AA83B0194EEB2600A67B56 /* default_click.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82DB194EEB2600A67B56 /* default_click.cc */; };
+ 43AA83B1194EEB2600A67B56 /* delivery.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82DC194EEB2600A67B56 /* delivery.cc */; };
+ 43AA83B2194EEB2600A67B56 /* directory_names.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82DD194EEB2600A67B56 /* directory_names.cc */; };
+ 43AA83B3194EEB2600A67B56 /* diskstream.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82DE194EEB2600A67B56 /* diskstream.cc */; };
+ 43AA83B4194EEB2600A67B56 /* element_import_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82DF194EEB2600A67B56 /* element_import_handler.cc */; };
+ 43AA83B5194EEB2600A67B56 /* element_importer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82E0194EEB2600A67B56 /* element_importer.cc */; };
+ 43AA83B6194EEB2600A67B56 /* engine_slave.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82E1194EEB2600A67B56 /* engine_slave.cc */; };
+ 43AA83B7194EEB2600A67B56 /* engine_state_controller.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82E2194EEB2600A67B56 /* engine_state_controller.cc */; };
+ 43AA83B8194EEB2600A67B56 /* enums.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82E3194EEB2600A67B56 /* enums.cc */; };
+ 43AA83B9194EEB2600A67B56 /* event_type_map.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82E4194EEB2600A67B56 /* event_type_map.cc */; };
+ 43AA83BA194EEB2600A67B56 /* export_channel_configuration.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82E5194EEB2600A67B56 /* export_channel_configuration.cc */; };
+ 43AA83BB194EEB2600A67B56 /* export_channel.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82E6194EEB2600A67B56 /* export_channel.cc */; };
+ 43AA83BC194EEB2600A67B56 /* export_failed.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82E7194EEB2600A67B56 /* export_failed.cc */; };
+ 43AA83BD194EEB2600A67B56 /* export_filename.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82E8194EEB2600A67B56 /* export_filename.cc */; };
+ 43AA83BE194EEB2600A67B56 /* export_format_base.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82E9194EEB2600A67B56 /* export_format_base.cc */; };
+ 43AA83BF194EEB2600A67B56 /* export_format_manager.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82EA194EEB2600A67B56 /* export_format_manager.cc */; };
+ 43AA83C0194EEB2600A67B56 /* export_format_specification.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82EB194EEB2600A67B56 /* export_format_specification.cc */; };
+ 43AA83C1194EEB2600A67B56 /* export_formats.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82EC194EEB2600A67B56 /* export_formats.cc */; };
+ 43AA83C2194EEB2600A67B56 /* export_graph_builder.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82ED194EEB2600A67B56 /* export_graph_builder.cc */; };
+ 43AA83C3194EEB2600A67B56 /* export_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82EE194EEB2600A67B56 /* export_handler.cc */; };
+ 43AA83C4194EEB2600A67B56 /* export_multiplication.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82EF194EEB2600A67B56 /* export_multiplication.cc */; };
+ 43AA83C5194EEB2600A67B56 /* export_preset.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82F0194EEB2600A67B56 /* export_preset.cc */; };
+ 43AA83C6194EEB2600A67B56 /* export_profile_manager.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82F1194EEB2600A67B56 /* export_profile_manager.cc */; };
+ 43AA83C7194EEB2600A67B56 /* export_status.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82F2194EEB2600A67B56 /* export_status.cc */; };
+ 43AA83C8194EEB2600A67B56 /* export_timespan.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82F3194EEB2600A67B56 /* export_timespan.cc */; };
+ 43AA83C9194EEB2600A67B56 /* file_source.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82F4194EEB2600A67B56 /* file_source.cc */; };
+ 43AA83CA194EEB2600A67B56 /* filename_extensions.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82F5194EEB2600A67B56 /* filename_extensions.cc */; };
+ 43AA83CB194EEB2600A67B56 /* filesystem_paths.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82F6194EEB2600A67B56 /* filesystem_paths.cc */; };
+ 43AA83CC194EEB2600A67B56 /* filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82F7194EEB2600A67B56 /* filter.cc */; };
+ 43AA83CD194EEB2600A67B56 /* find_session.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82F8194EEB2600A67B56 /* find_session.cc */; };
+ 43AA83CE194EEB2600A67B56 /* globals.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82F9194EEB2600A67B56 /* globals.cc */; };
+ 43AA83CF194EEB2600A67B56 /* graph.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82FA194EEB2600A67B56 /* graph.cc */; };
+ 43AA83D0194EEB2600A67B56 /* graphnode.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82FB194EEB2600A67B56 /* graphnode.cc */; };
+ 43AA83D1194EEB2600A67B56 /* iec1ppmdsp.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82FC194EEB2600A67B56 /* iec1ppmdsp.cc */; };
+ 43AA83D2194EEB2600A67B56 /* iec2ppmdsp.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82FD194EEB2600A67B56 /* iec2ppmdsp.cc */; };
+ 43AA83D3194EEB2600A67B56 /* import.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82FE194EEB2600A67B56 /* import.cc */; };
+ 43AA83D4194EEB2600A67B56 /* instrument_info.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA82FF194EEB2600A67B56 /* instrument_info.cc */; };
+ 43AA83D5194EEB2600A67B56 /* internal_return.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8300194EEB2600A67B56 /* internal_return.cc */; };
+ 43AA83D6194EEB2600A67B56 /* internal_send.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8301194EEB2600A67B56 /* internal_send.cc */; };
+ 43AA83D7194EEB2600A67B56 /* interpolation.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8302194EEB2600A67B56 /* interpolation.cc */; };
+ 43AA83D8194EEB2600A67B56 /* io_processor.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8303194EEB2600A67B56 /* io_processor.cc */; };
+ 43AA83D9194EEB2600A67B56 /* io.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8304194EEB2600A67B56 /* io.cc */; };
+ 43AA83DA194EEB2600A67B56 /* kmeterdsp.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8305194EEB2600A67B56 /* kmeterdsp.cc */; };
+ 43AA83DB194EEB2600A67B56 /* ladspa_plugin.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8306194EEB2600A67B56 /* ladspa_plugin.cc */; };
+ 43AA83DC194EEB2600A67B56 /* linux_vst_support.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8307194EEB2600A67B56 /* linux_vst_support.cc */; };
+ 43AA83DD194EEB2600A67B56 /* location_importer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8308194EEB2600A67B56 /* location_importer.cc */; };
+ 43AA83DE194EEB2600A67B56 /* location.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8309194EEB2600A67B56 /* location.cc */; };
+ 43AA83DF194EEB2600A67B56 /* ltc_slave.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA830A194EEB2600A67B56 /* ltc_slave.cc */; };
+ 43AA83E0194EEB2600A67B56 /* lv2_evbuf.c in Sources */ = {isa = PBXBuildFile; fileRef = 43AA830B194EEB2600A67B56 /* lv2_evbuf.c */; };
+ 43AA83E1194EEB2600A67B56 /* lv2_plugin.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA830C194EEB2600A67B56 /* lv2_plugin.cc */; };
+ 43AA83E2194EEB2600A67B56 /* lxvst_plugin.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA830D194EEB2600A67B56 /* lxvst_plugin.cc */; };
+ 43AA83E3194EEB2600A67B56 /* meter.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA830E194EEB2600A67B56 /* meter.cc */; };
+ 43AA83E4194EEB2600A67B56 /* midi_automation_list_binder.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA830F194EEB2600A67B56 /* midi_automation_list_binder.cc */; };
+ 43AA83E5194EEB2600A67B56 /* midi_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8310194EEB2600A67B56 /* midi_buffer.cc */; };
+ 43AA83E6194EEB2600A67B56 /* midi_clock_slave.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8311194EEB2600A67B56 /* midi_clock_slave.cc */; };
+ 43AA83E7194EEB2600A67B56 /* midi_diskstream.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8312194EEB2600A67B56 /* midi_diskstream.cc */; };
+ 43AA83E8194EEB2600A67B56 /* midi_model.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8313194EEB2600A67B56 /* midi_model.cc */; };
+ 43AA83E9194EEB2600A67B56 /* midi_patch_manager.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8314194EEB2600A67B56 /* midi_patch_manager.cc */; };
+ 43AA83EA194EEB2600A67B56 /* midi_playlist_source.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8315194EEB2600A67B56 /* midi_playlist_source.cc */; };
+ 43AA83EB194EEB2600A67B56 /* midi_playlist.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8316194EEB2600A67B56 /* midi_playlist.cc */; };
+ 43AA83EC194EEB2600A67B56 /* midi_port.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8317194EEB2600A67B56 /* midi_port.cc */; };
+ 43AA83ED194EEB2600A67B56 /* midi_region.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8318194EEB2600A67B56 /* midi_region.cc */; };
+ 43AA83EE194EEB2600A67B56 /* midi_ring_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8319194EEB2600A67B56 /* midi_ring_buffer.cc */; };
+ 43AA83EF194EEB2600A67B56 /* midi_source.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA831A194EEB2600A67B56 /* midi_source.cc */; };
+ 43AA83F0194EEB2600A67B56 /* midi_state_tracker.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA831B194EEB2600A67B56 /* midi_state_tracker.cc */; };
+ 43AA83F1194EEB2600A67B56 /* midi_stretch.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA831C194EEB2600A67B56 /* midi_stretch.cc */; };
+ 43AA83F2194EEB2600A67B56 /* midi_track.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA831D194EEB2600A67B56 /* midi_track.cc */; };
+ 43AA83F3194EEB2600A67B56 /* midi_ui.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA831E194EEB2600A67B56 /* midi_ui.cc */; };
+ 43AA83F4194EEB2600A67B56 /* midiport_manager.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA831F194EEB2600A67B56 /* midiport_manager.cc */; };
+ 43AA83F5194EEB2600A67B56 /* mix.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8320194EEB2600A67B56 /* mix.cc */; };
+ 43AA83F6194EEB2600A67B56 /* monitor_processor.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8321194EEB2600A67B56 /* monitor_processor.cc */; };
+ 43AA83F7194EEB2600A67B56 /* mtc_slave.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8322194EEB2600A67B56 /* mtc_slave.cc */; };
+ 43AA83F8194EEB2600A67B56 /* mtdm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8323194EEB2600A67B56 /* mtdm.cc */; };
+ 43AA83F9194EEB2600A67B56 /* mute_master.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8324194EEB2600A67B56 /* mute_master.cc */; };
+ 43AA83FA194EEB2600A67B56 /* onset_detector.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8325194EEB2600A67B56 /* onset_detector.cc */; };
+ 43AA83FB194EEB2600A67B56 /* operations.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8326194EEB2600A67B56 /* operations.cc */; };
+ 43AA83FC194EEB2600A67B56 /* pan_controllable.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8327194EEB2600A67B56 /* pan_controllable.cc */; };
+ 43AA83FD194EEB2600A67B56 /* pannable.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8328194EEB2600A67B56 /* pannable.cc */; };
+ 43AA83FE194EEB2600A67B56 /* panner_manager.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8329194EEB2600A67B56 /* panner_manager.cc */; };
+ 43AA83FF194EEB2600A67B56 /* panner_shell.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA832A194EEB2600A67B56 /* panner_shell.cc */; };
+ 43AA8400194EEB2600A67B56 /* panner.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA832B194EEB2600A67B56 /* panner.cc */; };
+ 43AA8401194EEB2600A67B56 /* pcm_utils.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA832C194EEB2600A67B56 /* pcm_utils.cc */; };
+ 43AA8402194EEB2600A67B56 /* pi_controller.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA832D194EEB2600A67B56 /* pi_controller.cc */; };
+ 43AA8403194EEB2600A67B56 /* playlist_factory.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA832E194EEB2600A67B56 /* playlist_factory.cc */; };
+ 43AA8404194EEB2600A67B56 /* playlist_source.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA832F194EEB2600A67B56 /* playlist_source.cc */; };
+ 43AA8405194EEB2600A67B56 /* playlist.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8330194EEB2600A67B56 /* playlist.cc */; };
+ 43AA8406194EEB2600A67B56 /* plugin_insert.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8331194EEB2600A67B56 /* plugin_insert.cc */; };
+ 43AA8407194EEB2600A67B56 /* plugin_manager.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8332194EEB2600A67B56 /* plugin_manager.cc */; };
+ 43AA8408194EEB2600A67B56 /* plugin.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8333194EEB2600A67B56 /* plugin.cc */; };
+ 43AA8409194EEB2600A67B56 /* port_insert.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8334194EEB2600A67B56 /* port_insert.cc */; };
+ 43AA840A194EEB2600A67B56 /* port_manager.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8335194EEB2600A67B56 /* port_manager.cc */; };
+ 43AA840B194EEB2600A67B56 /* port_set.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8336194EEB2600A67B56 /* port_set.cc */; };
+ 43AA840C194EEB2600A67B56 /* port.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8337194EEB2600A67B56 /* port.cc */; };
+ 43AA840D194EEB2600A67B56 /* process_thread.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8338194EEB2600A67B56 /* process_thread.cc */; };
+ 43AA840E194EEB2600A67B56 /* processor.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8339194EEB2600A67B56 /* processor.cc */; };
+ 43AA840F194EEB2600A67B56 /* progress.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA833A194EEB2600A67B56 /* progress.cc */; };
+ 43AA8410194EEB2600A67B56 /* quantize.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA833B194EEB2600A67B56 /* quantize.cc */; };
+ 43AA8411194EEB2600A67B56 /* rb_effect.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA833C194EEB2600A67B56 /* rb_effect.cc */; };
+ 43AA8412194EEB2600A67B56 /* rc_configuration.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA833D194EEB2600A67B56 /* rc_configuration.cc */; };
+ 43AA8413194EEB2600A67B56 /* rdff.c in Sources */ = {isa = PBXBuildFile; fileRef = 43AA833E194EEB2600A67B56 /* rdff.c */; };
+ 43AA8414194EEB2600A67B56 /* recent_sessions.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA833F194EEB2600A67B56 /* recent_sessions.cc */; };
+ 43AA8415194EEB2600A67B56 /* region_factory.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8340194EEB2600A67B56 /* region_factory.cc */; };
+ 43AA8416194EEB2600A67B56 /* region.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8341194EEB2600A67B56 /* region.cc */; };
+ 43AA8417194EEB2600A67B56 /* resampled_source.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8342194EEB2600A67B56 /* resampled_source.cc */; };
+ 43AA8418194EEB2600A67B56 /* return.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8343194EEB2600A67B56 /* return.cc */; };
+ 43AA8419194EEB2600A67B56 /* reverse.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8344194EEB2600A67B56 /* reverse.cc */; };
+ 43AA841A194EEB2600A67B56 /* revision.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8345194EEB2600A67B56 /* revision.cc */; };
+ 43AA841B194EEB2600A67B56 /* route_graph.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8346194EEB2600A67B56 /* route_graph.cc */; };
+ 43AA841C194EEB2600A67B56 /* route_group_member.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8347194EEB2600A67B56 /* route_group_member.cc */; };
+ 43AA841D194EEB2600A67B56 /* route_group.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8348194EEB2600A67B56 /* route_group.cc */; };
+ 43AA841E194EEB2600A67B56 /* route.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8349194EEB2600A67B56 /* route.cc */; };
+ 43AA841F194EEB2600A67B56 /* search_paths.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA834A194EEB2600A67B56 /* search_paths.cc */; };
+ 43AA8420194EEB2600A67B56 /* send.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA834B194EEB2600A67B56 /* send.cc */; };
+ 43AA8421194EEB2600A67B56 /* session_butler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA834C194EEB2600A67B56 /* session_butler.cc */; };
+ 43AA8422194EEB2600A67B56 /* session_click.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA834D194EEB2600A67B56 /* session_click.cc */; };
+ 43AA8423194EEB2600A67B56 /* session_command.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA834E194EEB2600A67B56 /* session_command.cc */; };
+ 43AA8424194EEB2600A67B56 /* session_configuration.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA834F194EEB2600A67B56 /* session_configuration.cc */; };
+ 43AA8425194EEB2600A67B56 /* session_directory.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8350194EEB2600A67B56 /* session_directory.cc */; };
+ 43AA8426194EEB2600A67B56 /* session_events.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8351194EEB2600A67B56 /* session_events.cc */; };
+ 43AA8427194EEB2600A67B56 /* session_export.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8352194EEB2600A67B56 /* session_export.cc */; };
+ 43AA8428194EEB2600A67B56 /* session_handle.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8353194EEB2600A67B56 /* session_handle.cc */; };
+ 43AA8429194EEB2600A67B56 /* session_ltc.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8354194EEB2600A67B56 /* session_ltc.cc */; };
+ 43AA842A194EEB2600A67B56 /* session_metadata.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8355194EEB2600A67B56 /* session_metadata.cc */; };
+ 43AA842B194EEB2600A67B56 /* session_midi.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8356194EEB2600A67B56 /* session_midi.cc */; };
+ 43AA842C194EEB2600A67B56 /* session_object.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8357194EEB2600A67B56 /* session_object.cc */; };
+ 43AA842D194EEB2600A67B56 /* session_playlists.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8358194EEB2600A67B56 /* session_playlists.cc */; };
+ 43AA842E194EEB2600A67B56 /* session_process.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8359194EEB2600A67B56 /* session_process.cc */; };
+ 43AA842F194EEB2600A67B56 /* session_rtevents.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA835A194EEB2600A67B56 /* session_rtevents.cc */; };
+ 43AA8430194EEB2600A67B56 /* session_state_utils.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA835B194EEB2600A67B56 /* session_state_utils.cc */; };
+ 43AA8431194EEB2600A67B56 /* session_state.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA835C194EEB2600A67B56 /* session_state.cc */; };
+ 43AA8432194EEB2600A67B56 /* session_time.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA835D194EEB2600A67B56 /* session_time.cc */; };
+ 43AA8433194EEB2600A67B56 /* session_transport.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA835E194EEB2600A67B56 /* session_transport.cc */; };
+ 43AA8434194EEB2600A67B56 /* session_vst.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA835F194EEB2600A67B56 /* session_vst.cc */; };
+ 43AA8435194EEB2600A67B56 /* session.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8360194EEB2600A67B56 /* session.cc */; };
+ 43AA8436194EEB2600A67B56 /* slave.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8361194EEB2600A67B56 /* slave.cc */; };
+ 43AA8437194EEB2600A67B56 /* smf_source.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8362194EEB2600A67B56 /* smf_source.cc */; };
+ 43AA8438194EEB2600A67B56 /* sndfile_helpers.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8363194EEB2600A67B56 /* sndfile_helpers.cc */; };
+ 43AA8439194EEB2600A67B56 /* sndfileimportable.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8364194EEB2600A67B56 /* sndfileimportable.cc */; };
+ 43AA843A194EEB2600A67B56 /* sndfilesource.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8365194EEB2600A67B56 /* sndfilesource.cc */; };
+ 43AA843B194EEB2600A67B56 /* source_factory.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8366194EEB2600A67B56 /* source_factory.cc */; };
+ 43AA843C194EEB2600A67B56 /* source.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8367194EEB2600A67B56 /* source.cc */; };
+ 43AA843D194EEB2600A67B56 /* speakers.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8368194EEB2600A67B56 /* speakers.cc */; };
+ 43AA843E194EEB2600A67B56 /* srcfilesource.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8369194EEB2600A67B56 /* srcfilesource.cc */; };
+ 43AA843F194EEB2600A67B56 /* sse_functions_64bit.s in Sources */ = {isa = PBXBuildFile; fileRef = 43AA836A194EEB2600A67B56 /* sse_functions_64bit.s */; };
+ 43AA8440194EEB2600A67B56 /* sse_functions_xmm.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA836B194EEB2600A67B56 /* sse_functions_xmm.cc */; };
+ 43AA8441194EEB2600A67B56 /* sse_functions.s in Sources */ = {isa = PBXBuildFile; fileRef = 43AA836C194EEB2600A67B56 /* sse_functions.s */; };
+ 43AA8442194EEB2600A67B56 /* st_pitch.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA836D194EEB2600A67B56 /* st_pitch.cc */; };
+ 43AA8443194EEB2600A67B56 /* st_stretch.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA836E194EEB2600A67B56 /* st_stretch.cc */; };
+ 43AA8444194EEB2600A67B56 /* strip_silence.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA836F194EEB2600A67B56 /* strip_silence.cc */; };
+ 43AA8445194EEB2600A67B56 /* system_exec.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8370194EEB2600A67B56 /* system_exec.cc */; };
+ 43AA8446194EEB2600A67B56 /* tape_file_matcher.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8371194EEB2600A67B56 /* tape_file_matcher.cc */; };
+ 43AA8447194EEB2600A67B56 /* template_utils.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8372194EEB2600A67B56 /* template_utils.cc */; };
+ 43AA8448194EEB2600A67B56 /* tempo_map_importer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8373194EEB2600A67B56 /* tempo_map_importer.cc */; };
+ 43AA8449194EEB2600A67B56 /* tempo.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8374194EEB2600A67B56 /* tempo.cc */; };
+ 43AA844A194EEB2600A67B56 /* thread_buffers.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8375194EEB2600A67B56 /* thread_buffers.cc */; };
+ 43AA844B194EEB2600A67B56 /* ticker.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8376194EEB2600A67B56 /* ticker.cc */; };
+ 43AA844C194EEB2600A67B56 /* track.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8377194EEB2600A67B56 /* track.cc */; };
+ 43AA844D194EEB2600A67B56 /* transient_detector.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8378194EEB2600A67B56 /* transient_detector.cc */; };
+ 43AA844E194EEB2600A67B56 /* unknown_processor.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8379194EEB2600A67B56 /* unknown_processor.cc */; };
+ 43AA844F194EEB2600A67B56 /* uri_map.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA837A194EEB2600A67B56 /* uri_map.cc */; };
+ 43AA8450194EEB2600A67B56 /* user_bundle.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA837B194EEB2600A67B56 /* user_bundle.cc */; };
+ 43AA8451194EEB2600A67B56 /* utils.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA837C194EEB2600A67B56 /* utils.cc */; };
+ 43AA8452194EEB2600A67B56 /* version.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA837D194EEB2600A67B56 /* version.cc */; };
+ 43AA8453194EEB2600A67B56 /* vst_info_file.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA837E194EEB2600A67B56 /* vst_info_file.cc */; };
+ 43AA8454194EEB2600A67B56 /* vst_plugin.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA837F194EEB2600A67B56 /* vst_plugin.cc */; };
+ 43AA8455194EEB2600A67B56 /* vumeterdsp.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8380194EEB2600A67B56 /* vumeterdsp.cc */; };
+ 43AA8456194EEB2600A67B56 /* windows_vst_plugin.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8381194EEB2600A67B56 /* windows_vst_plugin.cc */; };
+ 43AA8457194EEB2600A67B56 /* worker.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8382194EEB2600A67B56 /* worker.cc */; };
+ 43AA84B9194EEB5F00A67B56 /* audio_engine_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8459194EEB5F00A67B56 /* audio_engine_test.cc */; };
+ 43AA84BA194EEB5F00A67B56 /* audio_engine_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA845A194EEB5F00A67B56 /* audio_engine_test.h */; };
+ 43AA84BB194EEB5F00A67B56 /* audio_region_read_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA845B194EEB5F00A67B56 /* audio_region_read_test.cc */; };
+ 43AA84BC194EEB5F00A67B56 /* audio_region_read_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA845C194EEB5F00A67B56 /* audio_region_read_test.h */; };
+ 43AA84BD194EEB5F00A67B56 /* audio_region_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA845D194EEB5F00A67B56 /* audio_region_test.cc */; };
+ 43AA84BE194EEB5F00A67B56 /* audio_region_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA845E194EEB5F00A67B56 /* audio_region_test.h */; };
+ 43AA84BF194EEB5F00A67B56 /* automation_list_property_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA845F194EEB5F00A67B56 /* automation_list_property_test.cc */; };
+ 43AA84C0194EEB5F00A67B56 /* automation_list_property_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8460194EEB5F00A67B56 /* automation_list_property_test.h */; };
+ 43AA84C1194EEB5F00A67B56 /* bbt_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8461194EEB5F00A67B56 /* bbt_test.cc */; };
+ 43AA84C2194EEB5F00A67B56 /* bbt_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8462194EEB5F00A67B56 /* bbt_test.h */; };
+ 43AA84C3194EEB5F00A67B56 /* combine_regions_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8463194EEB5F00A67B56 /* combine_regions_test.cc */; };
+ 43AA84C4194EEB5F00A67B56 /* combine_regions_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8464194EEB5F00A67B56 /* combine_regions_test.h */; };
+ 43AA84C5194EEB5F00A67B56 /* control_surfaces_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8465194EEB5F00A67B56 /* control_surfaces_test.cc */; };
+ 43AA84C6194EEB5F00A67B56 /* control_surfaces_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8466194EEB5F00A67B56 /* control_surfaces_test.h */; };
+ 43AA84C7194EEB5F00A67B56 /* dummy_lxvst.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA847C194EEB5F00A67B56 /* dummy_lxvst.cc */; };
+ 43AA84C8194EEB5F00A67B56 /* framepos_minus_beats_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA847D194EEB5F00A67B56 /* framepos_minus_beats_test.cc */; };
+ 43AA84C9194EEB5F00A67B56 /* framepos_minus_beats_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA847E194EEB5F00A67B56 /* framepos_minus_beats_test.h */; };
+ 43AA84CA194EEB5F00A67B56 /* framepos_plus_beats_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA847F194EEB5F00A67B56 /* framepos_plus_beats_test.cc */; };
+ 43AA84CB194EEB5F00A67B56 /* framepos_plus_beats_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8480194EEB5F00A67B56 /* framepos_plus_beats_test.h */; };
+ 43AA84CC194EEB5F00A67B56 /* framewalk_to_beats_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8481194EEB5F00A67B56 /* framewalk_to_beats_test.cc */; };
+ 43AA84CD194EEB5F00A67B56 /* framewalk_to_beats_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8482194EEB5F00A67B56 /* framewalk_to_beats_test.h */; };
+ 43AA84CE194EEB5F00A67B56 /* interpolation_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8483194EEB5F00A67B56 /* interpolation_test.cc */; };
+ 43AA84CF194EEB5F00A67B56 /* interpolation_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8484194EEB5F00A67B56 /* interpolation_test.h */; };
+ 43AA84D0194EEB5F00A67B56 /* jack_utils_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8485194EEB5F00A67B56 /* jack_utils_test.cc */; };
+ 43AA84D1194EEB5F00A67B56 /* jack_utils_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8486194EEB5F00A67B56 /* jack_utils_test.h */; };
+ 43AA84D2194EEB5F00A67B56 /* load_session.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8487194EEB5F00A67B56 /* load_session.cc */; };
+ 43AA84D3194EEB5F00A67B56 /* load_sessions_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8488194EEB5F00A67B56 /* load_sessions_test.cc */; };
+ 43AA84D4194EEB5F00A67B56 /* load_sessions_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8489194EEB5F00A67B56 /* load_sessions_test.h */; };
+ 43AA84D5194EEB5F00A67B56 /* midi_clock_slave_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA848A194EEB5F00A67B56 /* midi_clock_slave_test.cc */; };
+ 43AA84D6194EEB5F00A67B56 /* midi_clock_slave_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA848B194EEB5F00A67B56 /* midi_clock_slave_test.h */; };
+ 43AA84D7194EEB5F00A67B56 /* mtdm_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA848C194EEB5F00A67B56 /* mtdm_test.cc */; };
+ 43AA84D8194EEB5F00A67B56 /* mtdm_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA848D194EEB5F00A67B56 /* mtdm_test.h */; };
+ 43AA84D9194EEB5F00A67B56 /* playlist_equivalent_regions_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA848E194EEB5F00A67B56 /* playlist_equivalent_regions_test.cc */; };
+ 43AA84DA194EEB5F00A67B56 /* playlist_equivalent_regions_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA848F194EEB5F00A67B56 /* playlist_equivalent_regions_test.h */; };
+ 43AA84DB194EEB5F00A67B56 /* playlist_layering_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8490194EEB5F00A67B56 /* playlist_layering_test.cc */; };
+ 43AA84DC194EEB5F00A67B56 /* playlist_layering_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8491194EEB5F00A67B56 /* playlist_layering_test.h */; };
+ 43AA84DD194EEB5F00A67B56 /* playlist_read_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8492194EEB5F00A67B56 /* playlist_read_test.cc */; };
+ 43AA84DE194EEB5F00A67B56 /* playlist_read_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8493194EEB5F00A67B56 /* playlist_read_test.h */; };
+ 43AA84DF194EEB5F00A67B56 /* plugins_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8494194EEB5F00A67B56 /* plugins_test.cc */; };
+ 43AA84E0194EEB5F00A67B56 /* plugins_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8495194EEB5F00A67B56 /* plugins_test.h */; };
+ 43AA84E1194EEB5F00A67B56 /* load_session.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8497194EEB5F00A67B56 /* load_session.cc */; };
+ 43AA84E2194EEB5F00A67B56 /* lots_of_regions.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8498194EEB5F00A67B56 /* lots_of_regions.cc */; };
+ 43AA84E3194EEB5F00A67B56 /* runpc.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA8499194EEB5F00A67B56 /* runpc.cc */; };
+ 43AA84E4194EEB5F00A67B56 /* region_naming_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA84AA194EEB5F00A67B56 /* region_naming_test.cc */; };
+ 43AA84E5194EEB5F00A67B56 /* region_naming_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84AB194EEB5F00A67B56 /* region_naming_test.h */; };
+ 43AA84E6194EEB5F00A67B56 /* resampled_source_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA84AC194EEB5F00A67B56 /* resampled_source_test.cc */; };
+ 43AA84E7194EEB5F00A67B56 /* resampled_source_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84AD194EEB5F00A67B56 /* resampled_source_test.h */; };
+ 43AA84E8194EEB5F00A67B56 /* session_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA84AE194EEB5F00A67B56 /* session_test.cc */; };
+ 43AA84E9194EEB5F00A67B56 /* session_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84AF194EEB5F00A67B56 /* session_test.h */; };
+ 43AA84EA194EEB5F00A67B56 /* tempo_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA84B0194EEB5F00A67B56 /* tempo_test.cc */; };
+ 43AA84EB194EEB5F00A67B56 /* tempo_test.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84B1194EEB5F00A67B56 /* tempo_test.h */; };
+ 43AA84EC194EEB5F00A67B56 /* test_common.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA84B2194EEB5F00A67B56 /* test_common.cc */; };
+ 43AA84ED194EEB5F00A67B56 /* test_common.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84B3194EEB5F00A67B56 /* test_common.h */; };
+ 43AA84EE194EEB5F00A67B56 /* test_needing_session.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA84B4194EEB5F00A67B56 /* test_needing_session.cc */; };
+ 43AA84EF194EEB5F00A67B56 /* test_needing_session.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84B5194EEB5F00A67B56 /* test_needing_session.h */; };
+ 43AA84F0194EEB5F00A67B56 /* test_util.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA84B6194EEB5F00A67B56 /* test_util.cc */; };
+ 43AA84F1194EEB5F00A67B56 /* test_util.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84B7194EEB5F00A67B56 /* test_util.h */; };
+ 43AA84F2194EEB5F00A67B56 /* testrunner.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA84B8194EEB5F00A67B56 /* testrunner.cc */; };
+ 43AA85DC194EEB8B00A67B56 /* amp.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84F4194EEB8B00A67B56 /* amp.h */; };
+ 43AA85DD194EEB8B00A67B56 /* analyser.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84F5194EEB8B00A67B56 /* analyser.h */; };
+ 43AA85DE194EEB8B00A67B56 /* ardour.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84F6194EEB8B00A67B56 /* ardour.h */; };
+ 43AA85DF194EEB8B00A67B56 /* async_midi_port.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84F7194EEB8B00A67B56 /* async_midi_port.h */; };
+ 43AA85E0194EEB8B00A67B56 /* audio_backend.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84F8194EEB8B00A67B56 /* audio_backend.h */; };
+ 43AA85E1194EEB8B00A67B56 /* audio_buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84F9194EEB8B00A67B56 /* audio_buffer.h */; };
+ 43AA85E2194EEB8B00A67B56 /* audio_diskstream.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84FA194EEB8B00A67B56 /* audio_diskstream.h */; };
+ 43AA85E3194EEB8B00A67B56 /* audio_library.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84FB194EEB8B00A67B56 /* audio_library.h */; };
+ 43AA85E4194EEB8B00A67B56 /* audio_playlist_importer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84FC194EEB8B00A67B56 /* audio_playlist_importer.h */; };
+ 43AA85E5194EEB8B00A67B56 /* audio_playlist_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84FD194EEB8B00A67B56 /* audio_playlist_source.h */; };
+ 43AA85E6194EEB8B00A67B56 /* audio_port.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84FE194EEB8B00A67B56 /* audio_port.h */; };
+ 43AA85E7194EEB8B00A67B56 /* audio_region_importer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA84FF194EEB8B00A67B56 /* audio_region_importer.h */; };
+ 43AA85E8194EEB8B00A67B56 /* audio_track_importer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8500194EEB8B00A67B56 /* audio_track_importer.h */; };
+ 43AA85E9194EEB8B00A67B56 /* audio_track.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8501194EEB8B00A67B56 /* audio_track.h */; };
+ 43AA85EA194EEB8B00A67B56 /* audio_unit.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8502194EEB8B00A67B56 /* audio_unit.h */; };
+ 43AA85EB194EEB8B00A67B56 /* audioanalyser.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8503194EEB8B00A67B56 /* audioanalyser.h */; };
+ 43AA85EC194EEB8B00A67B56 /* audioengine.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8504194EEB8B00A67B56 /* audioengine.h */; };
+ 43AA85ED194EEB8B00A67B56 /* audiofile_tagger.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8505194EEB8B00A67B56 /* audiofile_tagger.h */; };
+ 43AA85EE194EEB8B00A67B56 /* audiofilesource.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8506194EEB8B00A67B56 /* audiofilesource.h */; };
+ 43AA85EF194EEB8B00A67B56 /* audioplaylist.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8507194EEB8B00A67B56 /* audioplaylist.h */; };
+ 43AA85F0194EEB8B00A67B56 /* audioregion.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8508194EEB8B00A67B56 /* audioregion.h */; };
+ 43AA85F1194EEB8B00A67B56 /* audiosource.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8509194EEB8B00A67B56 /* audiosource.h */; };
+ 43AA85F2194EEB8B00A67B56 /* auditioner.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA850A194EEB8B00A67B56 /* auditioner.h */; };
+ 43AA85F3194EEB8B00A67B56 /* auto_bundle.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA850B194EEB8B00A67B56 /* auto_bundle.h */; };
+ 43AA85F4194EEB8B00A67B56 /* automatable_sequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA850C194EEB8B00A67B56 /* automatable_sequence.h */; };
+ 43AA85F5194EEB8B00A67B56 /* automatable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA850D194EEB8B00A67B56 /* automatable.h */; };
+ 43AA85F6194EEB8B00A67B56 /* automation_control.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA850E194EEB8B00A67B56 /* automation_control.h */; };
+ 43AA85F7194EEB8B00A67B56 /* automation_list.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA850F194EEB8B00A67B56 /* automation_list.h */; };
+ 43AA85F8194EEB8B00A67B56 /* automation_watch.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8510194EEB8B00A67B56 /* automation_watch.h */; };
+ 43AA85F9194EEB8B00A67B56 /* beats_frames_converter.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8511194EEB8B00A67B56 /* beats_frames_converter.h */; };
+ 43AA85FA194EEB8B00A67B56 /* broadcast_info.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8512194EEB8B00A67B56 /* broadcast_info.h */; };
+ 43AA85FB194EEB8B00A67B56 /* buffer_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8513194EEB8B00A67B56 /* buffer_manager.h */; };
+ 43AA85FC194EEB8B00A67B56 /* buffer_set.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8514194EEB8B00A67B56 /* buffer_set.h */; };
+ 43AA85FD194EEB8B00A67B56 /* buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8515194EEB8B00A67B56 /* buffer.h */; };
+ 43AA85FE194EEB8B00A67B56 /* bundle.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8516194EEB8B00A67B56 /* bundle.h */; };
+ 43AA85FF194EEB8B00A67B56 /* butler.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8517194EEB8B00A67B56 /* butler.h */; };
+ 43AA8600194EEB8B00A67B56 /* caimportable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8518194EEB8B00A67B56 /* caimportable.h */; };
+ 43AA8601194EEB8B00A67B56 /* capturing_processor.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8519194EEB8B00A67B56 /* capturing_processor.h */; };
+ 43AA8602194EEB8B00A67B56 /* chan_count.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA851A194EEB8B00A67B56 /* chan_count.h */; };
+ 43AA8603194EEB8B00A67B56 /* chan_mapping.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA851B194EEB8B00A67B56 /* chan_mapping.h */; };
+ 43AA8604194EEB8B00A67B56 /* click.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA851C194EEB8B00A67B56 /* click.h */; };
+ 43AA8605194EEB8B00A67B56 /* comparable_shared_ptr.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA851D194EEB8B00A67B56 /* comparable_shared_ptr.h */; };
+ 43AA8606194EEB8B00A67B56 /* configuration_variable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA851E194EEB8B00A67B56 /* configuration_variable.h */; };
+ 43AA8607194EEB8B00A67B56 /* configuration.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA851F194EEB8B00A67B56 /* configuration.h */; };
+ 43AA8608194EEB8B00A67B56 /* control_protocol_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8520194EEB8B00A67B56 /* control_protocol_manager.h */; };
+ 43AA8609194EEB8B00A67B56 /* coreaudiosource.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8521194EEB8B00A67B56 /* coreaudiosource.h */; };
+ 43AA860A194EEB8B00A67B56 /* cycle_timer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8522194EEB8B00A67B56 /* cycle_timer.h */; };
+ 43AA860B194EEB8B00A67B56 /* cycles.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8523194EEB8B00A67B56 /* cycles.h */; };
+ 43AA860C194EEB8B00A67B56 /* data_type.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8524194EEB8B00A67B56 /* data_type.h */; };
+ 43AA860D194EEB8B00A67B56 /* dB.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8525194EEB8B00A67B56 /* dB.h */; };
+ 43AA860E194EEB8B00A67B56 /* debug.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8526194EEB8B00A67B56 /* debug.h */; };
+ 43AA860F194EEB8B00A67B56 /* delivery.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8527194EEB8B00A67B56 /* delivery.h */; };
+ 43AA8610194EEB8B00A67B56 /* directory_names.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8528194EEB8B00A67B56 /* directory_names.h */; };
+ 43AA8611194EEB8B00A67B56 /* diskstream.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8529194EEB8B00A67B56 /* diskstream.h */; };
+ 43AA8612194EEB8B00A67B56 /* element_import_handler.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA852A194EEB8B00A67B56 /* element_import_handler.h */; };
+ 43AA8613194EEB8B00A67B56 /* element_importer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA852B194EEB8B00A67B56 /* element_importer.h */; };
+ 43AA8614194EEB8B00A67B56 /* engine_state_controller.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA852C194EEB8B00A67B56 /* engine_state_controller.h */; };
+ 43AA8615194EEB8B00A67B56 /* event_type_map.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA852D194EEB8B00A67B56 /* event_type_map.h */; };
+ 43AA8616194EEB8B00A67B56 /* export_channel_configuration.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA852E194EEB8B00A67B56 /* export_channel_configuration.h */; };
+ 43AA8617194EEB8B00A67B56 /* export_channel.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA852F194EEB8B00A67B56 /* export_channel.h */; };
+ 43AA8618194EEB8B00A67B56 /* export_failed.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8530194EEB8B00A67B56 /* export_failed.h */; };
+ 43AA8619194EEB8B00A67B56 /* export_filename.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8531194EEB8B00A67B56 /* export_filename.h */; };
+ 43AA861A194EEB8B00A67B56 /* export_format_base.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8532194EEB8B00A67B56 /* export_format_base.h */; };
+ 43AA861B194EEB8B00A67B56 /* export_format_compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8533194EEB8B00A67B56 /* export_format_compatibility.h */; };
+ 43AA861C194EEB8B00A67B56 /* export_format_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8534194EEB8B00A67B56 /* export_format_manager.h */; };
+ 43AA861D194EEB8B00A67B56 /* export_format_specification.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8535194EEB8B00A67B56 /* export_format_specification.h */; };
+ 43AA861E194EEB8B00A67B56 /* export_formats.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8536194EEB8B00A67B56 /* export_formats.h */; };
+ 43AA861F194EEB8B00A67B56 /* export_graph_builder.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8537194EEB8B00A67B56 /* export_graph_builder.h */; };
+ 43AA8620194EEB8B00A67B56 /* export_handler.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8538194EEB8B00A67B56 /* export_handler.h */; };
+ 43AA8621194EEB8B00A67B56 /* export_multiplication.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8539194EEB8B00A67B56 /* export_multiplication.h */; };
+ 43AA8622194EEB8B00A67B56 /* export_pointers.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA853A194EEB8B00A67B56 /* export_pointers.h */; };
+ 43AA8623194EEB8B00A67B56 /* export_preset.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA853B194EEB8B00A67B56 /* export_preset.h */; };
+ 43AA8624194EEB8B00A67B56 /* export_profile_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA853C194EEB8B00A67B56 /* export_profile_manager.h */; };
+ 43AA8625194EEB8B00A67B56 /* export_status.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA853D194EEB8B00A67B56 /* export_status.h */; };
+ 43AA8626194EEB8B00A67B56 /* export_timespan.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA853E194EEB8B00A67B56 /* export_timespan.h */; };
+ 43AA8627194EEB8B00A67B56 /* file_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA853F194EEB8B00A67B56 /* file_source.h */; };
+ 43AA8628194EEB8B00A67B56 /* filename_extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8540194EEB8B00A67B56 /* filename_extensions.h */; };
+ 43AA8629194EEB8B00A67B56 /* filesystem_paths.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8541194EEB8B00A67B56 /* filesystem_paths.h */; };
+ 43AA862A194EEB8B00A67B56 /* filter.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8542194EEB8B00A67B56 /* filter.h */; };
+ 43AA862B194EEB8B00A67B56 /* graph.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8543194EEB8B00A67B56 /* graph.h */; };
+ 43AA862C194EEB8B00A67B56 /* graphnode.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8544194EEB8B00A67B56 /* graphnode.h */; };
+ 43AA862D194EEB8B00A67B56 /* iec1ppmdsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8545194EEB8B00A67B56 /* iec1ppmdsp.h */; };
+ 43AA862E194EEB8B00A67B56 /* iec2ppmdsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8546194EEB8B00A67B56 /* iec2ppmdsp.h */; };
+ 43AA862F194EEB8B00A67B56 /* import_status.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8547194EEB8B00A67B56 /* import_status.h */; };
+ 43AA8630194EEB8B00A67B56 /* importable_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8548194EEB8B00A67B56 /* importable_source.h */; };
+ 43AA8631194EEB8B00A67B56 /* instrument_info.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8549194EEB8B00A67B56 /* instrument_info.h */; };
+ 43AA8632194EEB8B00A67B56 /* internal_return.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA854A194EEB8B00A67B56 /* internal_return.h */; };
+ 43AA8633194EEB8B00A67B56 /* internal_send.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA854B194EEB8B00A67B56 /* internal_send.h */; };
+ 43AA8634194EEB8B00A67B56 /* interpolation.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA854C194EEB8B00A67B56 /* interpolation.h */; };
+ 43AA8635194EEB8B00A67B56 /* interthread_info.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA854D194EEB8B00A67B56 /* interthread_info.h */; };
+ 43AA8636194EEB8B00A67B56 /* io_processor.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA854E194EEB8B00A67B56 /* io_processor.h */; };
+ 43AA8637194EEB8B00A67B56 /* io.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA854F194EEB8B00A67B56 /* io.h */; };
+ 43AA8638194EEB8B00A67B56 /* jack_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8550194EEB8B00A67B56 /* jack_utils.h */; };
+ 43AA8639194EEB8B00A67B56 /* kmeterdsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8551194EEB8B00A67B56 /* kmeterdsp.h */; };
+ 43AA863A194EEB8B00A67B56 /* ladspa_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8552194EEB8B00A67B56 /* ladspa_plugin.h */; };
+ 43AA863B194EEB8B00A67B56 /* ladspa.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8553194EEB8B00A67B56 /* ladspa.h */; };
+ 43AA863C194EEB8B00A67B56 /* latent.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8554194EEB8B00A67B56 /* latent.h */; };
+ 43AA863D194EEB8B00A67B56 /* libardour_visibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8555194EEB8B00A67B56 /* libardour_visibility.h */; };
+ 43AA863E194EEB8B00A67B56 /* linux_vst_support.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8556194EEB8B00A67B56 /* linux_vst_support.h */; };
+ 43AA863F194EEB8B00A67B56 /* location_importer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8557194EEB8B00A67B56 /* location_importer.h */; };
+ 43AA8640194EEB8B00A67B56 /* location.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8558194EEB8B00A67B56 /* location.h */; };
+ 43AA8641194EEB8B00A67B56 /* logcurve.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8559194EEB8B00A67B56 /* logcurve.h */; };
+ 43AA8642194EEB8B00A67B56 /* lv2_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA855A194EEB8B00A67B56 /* lv2_plugin.h */; };
+ 43AA8643194EEB8B00A67B56 /* lxvst_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA855B194EEB8B00A67B56 /* lxvst_plugin.h */; };
+ 43AA8644194EEB8B00A67B56 /* meter.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA855C194EEB8B00A67B56 /* meter.h */; };
+ 43AA8645194EEB8B00A67B56 /* midi_automation_list_binder.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA855D194EEB8B00A67B56 /* midi_automation_list_binder.h */; };
+ 43AA8646194EEB8B00A67B56 /* midi_buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA855E194EEB8B00A67B56 /* midi_buffer.h */; };
+ 43AA8647194EEB8B00A67B56 /* midi_diskstream.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA855F194EEB8B00A67B56 /* midi_diskstream.h */; };
+ 43AA8648194EEB8B00A67B56 /* midi_model.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8560194EEB8B00A67B56 /* midi_model.h */; };
+ 43AA8649194EEB8B00A67B56 /* midi_operator.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8561194EEB8B00A67B56 /* midi_operator.h */; };
+ 43AA864A194EEB8B00A67B56 /* midi_patch_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8562194EEB8B00A67B56 /* midi_patch_manager.h */; };
+ 43AA864B194EEB8B00A67B56 /* midi_playlist_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8563194EEB8B00A67B56 /* midi_playlist_source.h */; };
+ 43AA864C194EEB8B00A67B56 /* midi_playlist.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8564194EEB8B00A67B56 /* midi_playlist.h */; };
+ 43AA864D194EEB8B00A67B56 /* midi_port.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8565194EEB8B00A67B56 /* midi_port.h */; };
+ 43AA864E194EEB8B00A67B56 /* midi_region.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8566194EEB8B00A67B56 /* midi_region.h */; };
+ 43AA864F194EEB8B00A67B56 /* midi_ring_buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8567194EEB8B00A67B56 /* midi_ring_buffer.h */; };
+ 43AA8650194EEB8B00A67B56 /* midi_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8568194EEB8B00A67B56 /* midi_source.h */; };
+ 43AA8651194EEB8B00A67B56 /* midi_state_tracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8569194EEB8B00A67B56 /* midi_state_tracker.h */; };
+ 43AA8652194EEB8B00A67B56 /* midi_stretch.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA856A194EEB8B00A67B56 /* midi_stretch.h */; };
+ 43AA8653194EEB8B00A67B56 /* midi_track.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA856B194EEB8B00A67B56 /* midi_track.h */; };
+ 43AA8654194EEB8B00A67B56 /* midi_ui.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA856C194EEB8B00A67B56 /* midi_ui.h */; };
+ 43AA8655194EEB8B00A67B56 /* midiport_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA856D194EEB8B00A67B56 /* midiport_manager.h */; };
+ 43AA8656194EEB8B00A67B56 /* mix.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA856E194EEB8B00A67B56 /* mix.h */; };
+ 43AA8657194EEB8B00A67B56 /* monitor_processor.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA856F194EEB8B00A67B56 /* monitor_processor.h */; };
+ 43AA8658194EEB8B00A67B56 /* movable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8570194EEB8B00A67B56 /* movable.h */; };
+ 43AA8659194EEB8B00A67B56 /* msvc_libardour.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8571194EEB8B00A67B56 /* msvc_libardour.h */; };
+ 43AA865A194EEB8B00A67B56 /* mtdm.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8572194EEB8B00A67B56 /* mtdm.h */; };
+ 43AA865B194EEB8B00A67B56 /* mute_master.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8573194EEB8B00A67B56 /* mute_master.h */; };
+ 43AA865C194EEB8B00A67B56 /* noise.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8574194EEB8B00A67B56 /* noise.h */; };
+ 43AA865D194EEB8B00A67B56 /* onset_detector.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8575194EEB8B00A67B56 /* onset_detector.h */; };
+ 43AA865E194EEB8B00A67B56 /* operations.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8576194EEB8B00A67B56 /* operations.h */; };
+ 43AA865F194EEB8B00A67B56 /* pan_controllable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8577194EEB8B00A67B56 /* pan_controllable.h */; };
+ 43AA8660194EEB8B00A67B56 /* pannable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8578194EEB8B00A67B56 /* pannable.h */; };
+ 43AA8661194EEB8B00A67B56 /* panner_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8579194EEB8B00A67B56 /* panner_manager.h */; };
+ 43AA8662194EEB8B00A67B56 /* panner_shell.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA857A194EEB8B00A67B56 /* panner_shell.h */; };
+ 43AA8663194EEB8B00A67B56 /* panner.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA857B194EEB8B00A67B56 /* panner.h */; };
+ 43AA8664194EEB8B00A67B56 /* pcm_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA857C194EEB8B00A67B56 /* pcm_utils.h */; };
+ 43AA8665194EEB8B00A67B56 /* peak.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA857D194EEB8B00A67B56 /* peak.h */; };
+ 43AA8666194EEB8B00A67B56 /* pi_controller.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA857E194EEB8B00A67B56 /* pi_controller.h */; };
+ 43AA8667194EEB8B00A67B56 /* pitch.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA857F194EEB8B00A67B56 /* pitch.h */; };
+ 43AA8668194EEB8B00A67B56 /* playlist_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8580194EEB8B00A67B56 /* playlist_factory.h */; };
+ 43AA8669194EEB8B00A67B56 /* playlist_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8581194EEB8B00A67B56 /* playlist_source.h */; };
+ 43AA866A194EEB8B00A67B56 /* playlist.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8582194EEB8B00A67B56 /* playlist.h */; };
+ 43AA866B194EEB8B00A67B56 /* plugin_insert.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8583194EEB8B00A67B56 /* plugin_insert.h */; };
+ 43AA866C194EEB8B00A67B56 /* plugin_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8584194EEB8B00A67B56 /* plugin_manager.h */; };
+ 43AA866D194EEB8B00A67B56 /* plugin_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8585194EEB8B00A67B56 /* plugin_types.h */; };
+ 43AA866E194EEB8B00A67B56 /* plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8586194EEB8B00A67B56 /* plugin.h */; };
+ 43AA866F194EEB8B00A67B56 /* port_engine.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8587194EEB8B00A67B56 /* port_engine.h */; };
+ 43AA8670194EEB8B00A67B56 /* port_insert.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8588194EEB8B00A67B56 /* port_insert.h */; };
+ 43AA8671194EEB8B00A67B56 /* port_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8589194EEB8B00A67B56 /* port_manager.h */; };
+ 43AA8672194EEB8B00A67B56 /* port_set.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA858A194EEB8B00A67B56 /* port_set.h */; };
+ 43AA8673194EEB8B00A67B56 /* port.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA858B194EEB8B00A67B56 /* port.h */; };
+ 43AA8674194EEB8B00A67B56 /* process_thread.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA858C194EEB8B00A67B56 /* process_thread.h */; };
+ 43AA8675194EEB8B00A67B56 /* processor.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA858D194EEB8B00A67B56 /* processor.h */; };
+ 43AA8676194EEB8B00A67B56 /* profile.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA858E194EEB8B00A67B56 /* profile.h */; };
+ 43AA8677194EEB8B00A67B56 /* progress.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA858F194EEB8B00A67B56 /* progress.h */; };
+ 43AA8678194EEB8B00A67B56 /* proxy_controllable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8590194EEB8B00A67B56 /* proxy_controllable.h */; };
+ 43AA8679194EEB8B00A67B56 /* public_diskstream.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8591194EEB8B00A67B56 /* public_diskstream.h */; };
+ 43AA867A194EEB8B00A67B56 /* quantize.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8592194EEB8B00A67B56 /* quantize.h */; };
+ 43AA867B194EEB8B00A67B56 /* rb_effect.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8593194EEB8B00A67B56 /* rb_effect.h */; };
+ 43AA867C194EEB8B00A67B56 /* rc_configuration_vars.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8594194EEB8B00A67B56 /* rc_configuration_vars.h */; };
+ 43AA867D194EEB8B00A67B56 /* rc_configuration.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8595194EEB8B00A67B56 /* rc_configuration.h */; };
+ 43AA867E194EEB8B00A67B56 /* readable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8596194EEB8B00A67B56 /* readable.h */; };
+ 43AA867F194EEB8B00A67B56 /* recent_sessions.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8597194EEB8B00A67B56 /* recent_sessions.h */; };
+ 43AA8680194EEB8B00A67B56 /* region_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8598194EEB8B00A67B56 /* region_factory.h */; };
+ 43AA8681194EEB8B00A67B56 /* region_sorters.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8599194EEB8B00A67B56 /* region_sorters.h */; };
+ 43AA8682194EEB8B00A67B56 /* region.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA859A194EEB8B00A67B56 /* region.h */; };
+ 43AA8683194EEB8B00A67B56 /* resampled_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA859B194EEB8B00A67B56 /* resampled_source.h */; };
+ 43AA8684194EEB8B00A67B56 /* return.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA859C194EEB8B00A67B56 /* return.h */; };
+ 43AA8685194EEB8B00A67B56 /* reverse.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA859D194EEB8B00A67B56 /* reverse.h */; };
+ 43AA8686194EEB8B00A67B56 /* revision.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA859E194EEB8B00A67B56 /* revision.h */; };
+ 43AA8687194EEB8B00A67B56 /* route_graph.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA859F194EEB8B00A67B56 /* route_graph.h */; };
+ 43AA8688194EEB8B00A67B56 /* route_group_member.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85A0194EEB8B00A67B56 /* route_group_member.h */; };
+ 43AA8689194EEB8B00A67B56 /* route_group_specialized.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85A1194EEB8B00A67B56 /* route_group_specialized.h */; };
+ 43AA868A194EEB8B00A67B56 /* route_group.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85A2194EEB8B00A67B56 /* route_group.h */; };
+ 43AA868B194EEB8B00A67B56 /* route.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85A3194EEB8B00A67B56 /* route.h */; };
+ 43AA868C194EEB8B00A67B56 /* runtime_functions.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85A4194EEB8B00A67B56 /* runtime_functions.h */; };
+ 43AA868D194EEB8B00A67B56 /* search_paths.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85A5194EEB8B00A67B56 /* search_paths.h */; };
+ 43AA868E194EEB8B00A67B56 /* send.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85A6194EEB8B00A67B56 /* send.h */; };
+ 43AA868F194EEB8B00A67B56 /* session_configuration_vars.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85A7194EEB8B00A67B56 /* session_configuration_vars.h */; };
+ 43AA8690194EEB8B00A67B56 /* session_configuration.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85A8194EEB8B00A67B56 /* session_configuration.h */; };
+ 43AA8691194EEB8B00A67B56 /* session_directory.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85A9194EEB8B00A67B56 /* session_directory.h */; };
+ 43AA8692194EEB8B00A67B56 /* session_event.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85AA194EEB8B00A67B56 /* session_event.h */; };
+ 43AA8693194EEB8B00A67B56 /* session_handle.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85AB194EEB8B00A67B56 /* session_handle.h */; };
+ 43AA8694194EEB8B00A67B56 /* session_metadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85AC194EEB8B00A67B56 /* session_metadata.h */; };
+ 43AA8695194EEB8B00A67B56 /* session_object.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85AD194EEB8B00A67B56 /* session_object.h */; };
+ 43AA8696194EEB8B00A67B56 /* session_playlist.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85AE194EEB8B00A67B56 /* session_playlist.h */; };
+ 43AA8697194EEB8B00A67B56 /* session_playlists.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85AF194EEB8B00A67B56 /* session_playlists.h */; };
+ 43AA8698194EEB8B00A67B56 /* session_route.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85B0194EEB8B00A67B56 /* session_route.h */; };
+ 43AA8699194EEB8B00A67B56 /* session_state_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85B1194EEB8B00A67B56 /* session_state_utils.h */; };
+ 43AA869A194EEB8B00A67B56 /* session_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85B2194EEB8B00A67B56 /* session_utils.h */; };
+ 43AA869B194EEB8B00A67B56 /* session.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85B3194EEB8B00A67B56 /* session.h */; };
+ 43AA869C194EEB8B00A67B56 /* silentfilesource.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85B4194EEB8B00A67B56 /* silentfilesource.h */; };
+ 43AA869D194EEB8B00A67B56 /* slave.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85B5194EEB8B00A67B56 /* slave.h */; };
+ 43AA869E194EEB8B00A67B56 /* smf_source.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85B6194EEB8B00A67B56 /* smf_source.h */; };
+ 43AA869F194EEB8B00A67B56 /* sndfile_helpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85B7194EEB8B00A67B56 /* sndfile_helpers.h */; };
+ 43AA86A0194EEB8B00A67B56 /* sndfileimportable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85B8194EEB8B00A67B56 /* sndfileimportable.h */; };
+ 43AA86A1194EEB8B00A67B56 /* sndfilesource.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85B9194EEB8B00A67B56 /* sndfilesource.h */; };
+ 43AA86A2194EEB8B00A67B56 /* soundseq.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85BA194EEB8B00A67B56 /* soundseq.h */; };
+ 43AA86A3194EEB8B00A67B56 /* source_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85BB194EEB8B00A67B56 /* source_factory.h */; };
+ 43AA86A4194EEB8B00A67B56 /* source.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85BC194EEB8B00A67B56 /* source.h */; };
+ 43AA86A5194EEB8B00A67B56 /* speaker.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85BD194EEB8B00A67B56 /* speaker.h */; };
+ 43AA86A6194EEB8B00A67B56 /* speakers.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85BE194EEB8B00A67B56 /* speakers.h */; };
+ 43AA86A7194EEB8B00A67B56 /* spline.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85BF194EEB8B00A67B56 /* spline.h */; };
+ 43AA86A8194EEB8B00A67B56 /* srcfilesource.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85C0194EEB8B00A67B56 /* srcfilesource.h */; };
+ 43AA86A9194EEB8B00A67B56 /* stretch.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85C1194EEB8B00A67B56 /* stretch.h */; };
+ 43AA86AA194EEB8B00A67B56 /* strip_silence.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85C2194EEB8B00A67B56 /* strip_silence.h */; };
+ 43AA86AB194EEB8B00A67B56 /* system_exec.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85C3194EEB8B00A67B56 /* system_exec.h */; };
+ 43AA86AC194EEB8B00A67B56 /* tape_file_matcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85C4194EEB8B00A67B56 /* tape_file_matcher.h */; };
+ 43AA86AD194EEB8B00A67B56 /* template_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85C5194EEB8B00A67B56 /* template_utils.h */; };
+ 43AA86AE194EEB8B00A67B56 /* tempo_map_importer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85C6194EEB8B00A67B56 /* tempo_map_importer.h */; };
+ 43AA86AF194EEB8B00A67B56 /* tempo.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85C7194EEB8B00A67B56 /* tempo.h */; };
+ 43AA86B0194EEB8B00A67B56 /* thread_buffers.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85C8194EEB8B00A67B56 /* thread_buffers.h */; };
+ 43AA86B1194EEB8B00A67B56 /* ticker.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85C9194EEB8B00A67B56 /* ticker.h */; };
+ 43AA86B2194EEB8B00A67B56 /* timecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85CA194EEB8B00A67B56 /* timecode.h */; };
+ 43AA86B3194EEB8B00A67B56 /* timefx_request.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85CB194EEB8B00A67B56 /* timefx_request.h */; };
+ 43AA86B4194EEB8B00A67B56 /* timestamps.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85CC194EEB8B00A67B56 /* timestamps.h */; };
+ 43AA86B5194EEB8B00A67B56 /* track.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85CD194EEB8B00A67B56 /* track.h */; };
+ 43AA86B6194EEB8B00A67B56 /* transient_detector.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85CE194EEB8B00A67B56 /* transient_detector.h */; };
+ 43AA86B7194EEB8B00A67B56 /* trimmable.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85CF194EEB8B00A67B56 /* trimmable.h */; };
+ 43AA86B8194EEB8B00A67B56 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85D0194EEB8B00A67B56 /* types.h */; };
+ 43AA86B9194EEB8B00A67B56 /* unknown_processor.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85D1194EEB8B00A67B56 /* unknown_processor.h */; };
+ 43AA86BA194EEB8B00A67B56 /* uri_map.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85D2194EEB8B00A67B56 /* uri_map.h */; };
+ 43AA86BB194EEB8B00A67B56 /* user_bundle.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85D3194EEB8B00A67B56 /* user_bundle.h */; };
+ 43AA86BC194EEB8B00A67B56 /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85D4194EEB8B00A67B56 /* utils.h */; };
+ 43AA86BD194EEB8B00A67B56 /* version.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85D5194EEB8B00A67B56 /* version.h */; };
+ 43AA86BE194EEB8B00A67B56 /* vst_info_file.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85D6194EEB8B00A67B56 /* vst_info_file.h */; };
+ 43AA86BF194EEB8B00A67B56 /* vst_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85D7194EEB8B00A67B56 /* vst_plugin.h */; };
+ 43AA86C0194EEB8B00A67B56 /* vst_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85D8194EEB8B00A67B56 /* vst_types.h */; };
+ 43AA86C1194EEB8B00A67B56 /* vumeterdsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85D9194EEB8B00A67B56 /* vumeterdsp.h */; };
+ 43AA86C2194EEB8B00A67B56 /* windows_vst_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85DA194EEB8B00A67B56 /* windows_vst_plugin.h */; };
+ 43AA86C3194EEB8B00A67B56 /* worker.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA85DB194EEB8B00A67B56 /* worker.h */; };
+ 43AA86C6194EEBAF00A67B56 /* aeffectx.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA86C5194EEBAF00A67B56 /* aeffectx.h */; };
+ 43AA86D0194EEC1400A67B56 /* gettext.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA86CD194EEC1400A67B56 /* gettext.h */; };
+ 43AA86D1194EEC1400A67B56 /* lv2_evbuf.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA86CE194EEC1400A67B56 /* lv2_evbuf.h */; };
+ 43AA86D2194EEC1400A67B56 /* rdff.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA86CF194EEC1400A67B56 /* rdff.h */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 432652FC194EF73C00BEFB46 /* amp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = amp.h; sourceTree = "<group>"; };
+ 432652FD194EF73C00BEFB46 /* analyser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = analyser.h; sourceTree = "<group>"; };
+ 432652FE194EF73C00BEFB46 /* ardour.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ardour.h; sourceTree = "<group>"; };
+ 432652FF194EF73C00BEFB46 /* async_midi_port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = async_midi_port.h; sourceTree = "<group>"; };
+ 43265300194EF73C00BEFB46 /* audio_backend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_backend.h; sourceTree = "<group>"; };
+ 43265301194EF73C00BEFB46 /* audio_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_buffer.h; sourceTree = "<group>"; };
+ 43265302194EF73C00BEFB46 /* audio_diskstream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_diskstream.h; sourceTree = "<group>"; };
+ 43265303194EF73C00BEFB46 /* audio_library.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_library.h; sourceTree = "<group>"; };
+ 43265304194EF73C00BEFB46 /* audio_playlist_importer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_playlist_importer.h; sourceTree = "<group>"; };
+ 43265305194EF73C00BEFB46 /* audio_playlist_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_playlist_source.h; sourceTree = "<group>"; };
+ 43265306194EF73C00BEFB46 /* audio_port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_port.h; sourceTree = "<group>"; };
+ 43265307194EF73C00BEFB46 /* audio_region_importer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_region_importer.h; sourceTree = "<group>"; };
+ 43265308194EF73C00BEFB46 /* audio_track.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_track.h; sourceTree = "<group>"; };
+ 43265309194EF73C00BEFB46 /* audio_track_importer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_track_importer.h; sourceTree = "<group>"; };
+ 4326530A194EF73C00BEFB46 /* audio_unit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_unit.h; sourceTree = "<group>"; };
+ 4326530B194EF73C00BEFB46 /* audioanalyser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audioanalyser.h; sourceTree = "<group>"; };
+ 4326530C194EF73C00BEFB46 /* audioengine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audioengine.h; sourceTree = "<group>"; };
+ 4326530D194EF73C00BEFB46 /* audiofile_tagger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audiofile_tagger.h; sourceTree = "<group>"; };
+ 4326530E194EF73C00BEFB46 /* audiofilesource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audiofilesource.h; sourceTree = "<group>"; };
+ 4326530F194EF73C00BEFB46 /* audioplaylist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audioplaylist.h; sourceTree = "<group>"; };
+ 43265310194EF73C00BEFB46 /* audioregion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audioregion.h; sourceTree = "<group>"; };
+ 43265311194EF73C00BEFB46 /* audiosource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audiosource.h; sourceTree = "<group>"; };
+ 43265312194EF73C00BEFB46 /* auditioner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = auditioner.h; sourceTree = "<group>"; };
+ 43265313194EF73C00BEFB46 /* auto_bundle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = auto_bundle.h; sourceTree = "<group>"; };
+ 43265314194EF73C00BEFB46 /* automatable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = automatable.h; sourceTree = "<group>"; };
+ 43265315194EF73C00BEFB46 /* automatable_sequence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = automatable_sequence.h; sourceTree = "<group>"; };
+ 43265316194EF73C00BEFB46 /* automation_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = automation_control.h; sourceTree = "<group>"; };
+ 43265317194EF73C00BEFB46 /* automation_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = automation_list.h; sourceTree = "<group>"; };
+ 43265318194EF73C00BEFB46 /* automation_watch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = automation_watch.h; sourceTree = "<group>"; };
+ 43265319194EF73C00BEFB46 /* beats_frames_converter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = beats_frames_converter.h; sourceTree = "<group>"; };
+ 4326531A194EF73C00BEFB46 /* broadcast_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = broadcast_info.h; sourceTree = "<group>"; };
+ 4326531B194EF73C00BEFB46 /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = "<group>"; };
+ 4326531C194EF73C00BEFB46 /* buffer_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer_manager.h; sourceTree = "<group>"; };
+ 4326531D194EF73C00BEFB46 /* buffer_set.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer_set.h; sourceTree = "<group>"; };
+ 4326531E194EF73C00BEFB46 /* bundle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bundle.h; sourceTree = "<group>"; };
+ 4326531F194EF73C00BEFB46 /* butler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = butler.h; sourceTree = "<group>"; };
+ 43265320194EF73C00BEFB46 /* caimportable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = caimportable.h; sourceTree = "<group>"; };
+ 43265321194EF73C00BEFB46 /* capturing_processor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = capturing_processor.h; sourceTree = "<group>"; };
+ 43265322194EF73C00BEFB46 /* chan_count.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chan_count.h; sourceTree = "<group>"; };
+ 43265323194EF73C00BEFB46 /* chan_mapping.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chan_mapping.h; sourceTree = "<group>"; };
+ 43265324194EF73C00BEFB46 /* click.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = click.h; sourceTree = "<group>"; };
+ 43265325194EF73C00BEFB46 /* comparable_shared_ptr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = comparable_shared_ptr.h; sourceTree = "<group>"; };
+ 43265326194EF73C00BEFB46 /* configuration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = configuration.h; sourceTree = "<group>"; };
+ 43265327194EF73C00BEFB46 /* configuration_variable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = configuration_variable.h; sourceTree = "<group>"; };
+ 43265328194EF73C00BEFB46 /* control_protocol_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = control_protocol_manager.h; sourceTree = "<group>"; };
+ 43265329194EF73C00BEFB46 /* coreaudiosource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = coreaudiosource.h; sourceTree = "<group>"; };
+ 4326532A194EF73C00BEFB46 /* cycle_timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cycle_timer.h; sourceTree = "<group>"; };
+ 4326532B194EF73C00BEFB46 /* cycles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cycles.h; sourceTree = "<group>"; };
+ 4326532C194EF73C00BEFB46 /* data_type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = data_type.h; sourceTree = "<group>"; };
+ 4326532D194EF73C00BEFB46 /* dB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dB.h; sourceTree = "<group>"; };
+ 4326532E194EF73C00BEFB46 /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug.h; sourceTree = "<group>"; };
+ 4326532F194EF73C00BEFB46 /* delivery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delivery.h; sourceTree = "<group>"; };
+ 43265330194EF73C00BEFB46 /* directory_names.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = directory_names.h; sourceTree = "<group>"; };
+ 43265331194EF73C00BEFB46 /* diskstream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = diskstream.h; sourceTree = "<group>"; };
+ 43265332194EF73C00BEFB46 /* element_import_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = element_import_handler.h; sourceTree = "<group>"; };
+ 43265333194EF73C00BEFB46 /* element_importer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = element_importer.h; sourceTree = "<group>"; };
+ 43265334194EF73C00BEFB46 /* engine_state_controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engine_state_controller.h; sourceTree = "<group>"; };
+ 43265335194EF73C00BEFB46 /* event_type_map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = event_type_map.h; sourceTree = "<group>"; };
+ 43265336194EF73C00BEFB46 /* export_channel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_channel.h; sourceTree = "<group>"; };
+ 43265337194EF73C00BEFB46 /* export_channel_configuration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_channel_configuration.h; sourceTree = "<group>"; };
+ 43265338194EF73C00BEFB46 /* export_failed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_failed.h; sourceTree = "<group>"; };
+ 43265339194EF73C00BEFB46 /* export_filename.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_filename.h; sourceTree = "<group>"; };
+ 4326533A194EF73C00BEFB46 /* export_format_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_format_base.h; sourceTree = "<group>"; };
+ 4326533B194EF73C00BEFB46 /* export_format_compatibility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_format_compatibility.h; sourceTree = "<group>"; };
+ 4326533C194EF73C00BEFB46 /* export_format_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_format_manager.h; sourceTree = "<group>"; };
+ 4326533D194EF73C00BEFB46 /* export_format_specification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_format_specification.h; sourceTree = "<group>"; };
+ 4326533E194EF73C00BEFB46 /* export_formats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_formats.h; sourceTree = "<group>"; };
+ 4326533F194EF73C00BEFB46 /* export_graph_builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_graph_builder.h; sourceTree = "<group>"; };
+ 43265340194EF73C00BEFB46 /* export_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_handler.h; sourceTree = "<group>"; };
+ 43265341194EF73C00BEFB46 /* export_multiplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_multiplication.h; sourceTree = "<group>"; };
+ 43265342194EF73C00BEFB46 /* export_pointers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_pointers.h; sourceTree = "<group>"; };
+ 43265343194EF73C00BEFB46 /* export_preset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_preset.h; sourceTree = "<group>"; };
+ 43265344194EF73C00BEFB46 /* export_profile_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_profile_manager.h; sourceTree = "<group>"; };
+ 43265345194EF73C00BEFB46 /* export_status.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_status.h; sourceTree = "<group>"; };
+ 43265346194EF73C00BEFB46 /* export_timespan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_timespan.h; sourceTree = "<group>"; };
+ 43265347194EF73C00BEFB46 /* file_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file_source.h; sourceTree = "<group>"; };
+ 43265348194EF73C00BEFB46 /* filename_extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filename_extensions.h; sourceTree = "<group>"; };
+ 43265349194EF73C00BEFB46 /* filesystem_paths.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filesystem_paths.h; sourceTree = "<group>"; };
+ 4326534A194EF73C00BEFB46 /* filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filter.h; sourceTree = "<group>"; };
+ 4326534B194EF73C00BEFB46 /* graph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = graph.h; sourceTree = "<group>"; };
+ 4326534C194EF73C00BEFB46 /* graphnode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = graphnode.h; sourceTree = "<group>"; };
+ 4326534D194EF73C00BEFB46 /* iec1ppmdsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iec1ppmdsp.h; sourceTree = "<group>"; };
+ 4326534E194EF73C00BEFB46 /* iec2ppmdsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iec2ppmdsp.h; sourceTree = "<group>"; };
+ 4326534F194EF73C00BEFB46 /* import_status.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = import_status.h; sourceTree = "<group>"; };
+ 43265350194EF73C00BEFB46 /* importable_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = importable_source.h; sourceTree = "<group>"; };
+ 43265351194EF73C00BEFB46 /* instrument_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instrument_info.h; sourceTree = "<group>"; };
+ 43265352194EF73C00BEFB46 /* internal_return.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal_return.h; sourceTree = "<group>"; };
+ 43265353194EF73C00BEFB46 /* internal_send.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal_send.h; sourceTree = "<group>"; };
+ 43265354194EF73C00BEFB46 /* interpolation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interpolation.h; sourceTree = "<group>"; };
+ 43265355194EF73C00BEFB46 /* interthread_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interthread_info.h; sourceTree = "<group>"; };
+ 43265356194EF73C00BEFB46 /* io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = io.h; sourceTree = "<group>"; };
+ 43265357194EF73C00BEFB46 /* io_processor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = io_processor.h; sourceTree = "<group>"; };
+ 43265358194EF73C00BEFB46 /* jack_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jack_utils.h; sourceTree = "<group>"; };
+ 43265359194EF73C00BEFB46 /* kmeterdsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kmeterdsp.h; sourceTree = "<group>"; };
+ 4326535A194EF73C00BEFB46 /* ladspa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ladspa.h; sourceTree = "<group>"; };
+ 4326535B194EF73C00BEFB46 /* ladspa_plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ladspa_plugin.h; sourceTree = "<group>"; };
+ 4326535C194EF73C00BEFB46 /* latent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = latent.h; sourceTree = "<group>"; };
+ 4326535D194EF73C00BEFB46 /* libardour_visibility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libardour_visibility.h; sourceTree = "<group>"; };
+ 4326535E194EF73C00BEFB46 /* linux_vst_support.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linux_vst_support.h; sourceTree = "<group>"; };
+ 4326535F194EF73C00BEFB46 /* location.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = location.h; sourceTree = "<group>"; };
+ 43265360194EF73C00BEFB46 /* location_importer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = location_importer.h; sourceTree = "<group>"; };
+ 43265361194EF73C00BEFB46 /* logcurve.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logcurve.h; sourceTree = "<group>"; };
+ 43265362194EF73C00BEFB46 /* lv2_plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lv2_plugin.h; sourceTree = "<group>"; };
+ 43265363194EF73C00BEFB46 /* lxvst_plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lxvst_plugin.h; sourceTree = "<group>"; };
+ 43265364194EF73C00BEFB46 /* meter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = meter.h; sourceTree = "<group>"; };
+ 43265365194EF73C00BEFB46 /* midi_automation_list_binder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_automation_list_binder.h; sourceTree = "<group>"; };
+ 43265366194EF73C00BEFB46 /* midi_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_buffer.h; sourceTree = "<group>"; };
+ 43265367194EF73C00BEFB46 /* midi_diskstream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_diskstream.h; sourceTree = "<group>"; };
+ 43265368194EF73C00BEFB46 /* midi_model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_model.h; sourceTree = "<group>"; };
+ 43265369194EF73C00BEFB46 /* midi_operator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_operator.h; sourceTree = "<group>"; };
+ 4326536A194EF73C00BEFB46 /* midi_patch_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_patch_manager.h; sourceTree = "<group>"; };
+ 4326536B194EF73C00BEFB46 /* midi_playlist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_playlist.h; sourceTree = "<group>"; };
+ 4326536C194EF73C00BEFB46 /* midi_playlist_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_playlist_source.h; sourceTree = "<group>"; };
+ 4326536D194EF73C00BEFB46 /* midi_port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_port.h; sourceTree = "<group>"; };
+ 4326536E194EF73C00BEFB46 /* midi_region.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_region.h; sourceTree = "<group>"; };
+ 4326536F194EF73C00BEFB46 /* midi_ring_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_ring_buffer.h; sourceTree = "<group>"; };
+ 43265370194EF73C00BEFB46 /* midi_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_source.h; sourceTree = "<group>"; };
+ 43265371194EF73C00BEFB46 /* midi_state_tracker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_state_tracker.h; sourceTree = "<group>"; };
+ 43265372194EF73C00BEFB46 /* midi_stretch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_stretch.h; sourceTree = "<group>"; };
+ 43265373194EF73C00BEFB46 /* midi_track.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_track.h; sourceTree = "<group>"; };
+ 43265374194EF73C00BEFB46 /* midi_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midi_ui.h; sourceTree = "<group>"; };
+ 43265375194EF73C00BEFB46 /* midiport_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midiport_manager.h; sourceTree = "<group>"; };
+ 43265376194EF73C00BEFB46 /* mix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mix.h; sourceTree = "<group>"; };
+ 43265377194EF73C00BEFB46 /* monitor_processor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = monitor_processor.h; sourceTree = "<group>"; };
+ 43265378194EF73C00BEFB46 /* movable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = movable.h; sourceTree = "<group>"; };
+ 43265379194EF73C00BEFB46 /* msvc_libardour.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = msvc_libardour.h; sourceTree = "<group>"; };
+ 4326537A194EF73C00BEFB46 /* mtdm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mtdm.h; sourceTree = "<group>"; };
+ 4326537B194EF73C00BEFB46 /* mute_master.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mute_master.h; sourceTree = "<group>"; };
+ 4326537C194EF73C00BEFB46 /* noise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise.h; sourceTree = "<group>"; };
+ 4326537D194EF73C00BEFB46 /* onset_detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = onset_detector.h; sourceTree = "<group>"; };
+ 4326537E194EF73C00BEFB46 /* operations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operations.h; sourceTree = "<group>"; };
+ 4326537F194EF73C00BEFB46 /* pan_controllable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pan_controllable.h; sourceTree = "<group>"; };
+ 43265380194EF73C00BEFB46 /* pannable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pannable.h; sourceTree = "<group>"; };
+ 43265381194EF73C00BEFB46 /* panner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = panner.h; sourceTree = "<group>"; };
+ 43265382194EF73C00BEFB46 /* panner_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = panner_manager.h; sourceTree = "<group>"; };
+ 43265383194EF73C00BEFB46 /* panner_shell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = panner_shell.h; sourceTree = "<group>"; };
+ 43265384194EF73C00BEFB46 /* pcm_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pcm_utils.h; sourceTree = "<group>"; };
+ 43265385194EF73C00BEFB46 /* peak.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = peak.h; sourceTree = "<group>"; };
+ 43265386194EF73C00BEFB46 /* pi_controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pi_controller.h; sourceTree = "<group>"; };
+ 43265387194EF73C00BEFB46 /* pitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pitch.h; sourceTree = "<group>"; };
+ 43265388194EF73C00BEFB46 /* playlist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = playlist.h; sourceTree = "<group>"; };
+ 43265389194EF73C00BEFB46 /* playlist_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = playlist_factory.h; sourceTree = "<group>"; };
+ 4326538A194EF73C00BEFB46 /* playlist_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = playlist_source.h; sourceTree = "<group>"; };
+ 4326538B194EF73C00BEFB46 /* plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = plugin.h; sourceTree = "<group>"; };
+ 4326538C194EF73C00BEFB46 /* plugin_insert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = plugin_insert.h; sourceTree = "<group>"; };
+ 4326538D194EF73C00BEFB46 /* plugin_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = plugin_manager.h; sourceTree = "<group>"; };
+ 4326538E194EF73C00BEFB46 /* plugin_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = plugin_types.h; sourceTree = "<group>"; };
+ 4326538F194EF73C00BEFB46 /* port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = port.h; sourceTree = "<group>"; };
+ 43265390194EF73C00BEFB46 /* port_engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = port_engine.h; sourceTree = "<group>"; };
+ 43265391194EF73C00BEFB46 /* port_insert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = port_insert.h; sourceTree = "<group>"; };
+ 43265392194EF73C00BEFB46 /* port_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = port_manager.h; sourceTree = "<group>"; };
+ 43265393194EF73C00BEFB46 /* port_set.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = port_set.h; sourceTree = "<group>"; };
+ 43265394194EF73C00BEFB46 /* process_thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = process_thread.h; sourceTree = "<group>"; };
+ 43265395194EF73C00BEFB46 /* processor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = processor.h; sourceTree = "<group>"; };
+ 43265396194EF73C00BEFB46 /* profile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = profile.h; sourceTree = "<group>"; };
+ 43265397194EF73C00BEFB46 /* progress.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = progress.h; sourceTree = "<group>"; };
+ 43265398194EF73C00BEFB46 /* proxy_controllable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = proxy_controllable.h; sourceTree = "<group>"; };
+ 43265399194EF73C00BEFB46 /* public_diskstream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = public_diskstream.h; sourceTree = "<group>"; };
+ 4326539A194EF73C00BEFB46 /* quantize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quantize.h; sourceTree = "<group>"; };
+ 4326539B194EF73C00BEFB46 /* rb_effect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rb_effect.h; sourceTree = "<group>"; };
+ 4326539C194EF73C00BEFB46 /* rc_configuration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rc_configuration.h; sourceTree = "<group>"; };
+ 4326539D194EF73C00BEFB46 /* rc_configuration_vars.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rc_configuration_vars.h; sourceTree = "<group>"; };
+ 4326539E194EF73C00BEFB46 /* readable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = readable.h; sourceTree = "<group>"; };
+ 4326539F194EF73C00BEFB46 /* recent_sessions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = recent_sessions.h; sourceTree = "<group>"; };
+ 432653A0194EF73C00BEFB46 /* region.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = region.h; sourceTree = "<group>"; };
+ 432653A1194EF73C00BEFB46 /* region_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = region_factory.h; sourceTree = "<group>"; };
+ 432653A2194EF73C00BEFB46 /* region_sorters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = region_sorters.h; sourceTree = "<group>"; };
+ 432653A3194EF73C00BEFB46 /* resampled_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resampled_source.h; sourceTree = "<group>"; };
+ 432653A4194EF73C00BEFB46 /* return.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = return.h; sourceTree = "<group>"; };
+ 432653A5194EF73C00BEFB46 /* reverse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reverse.h; sourceTree = "<group>"; };
+ 432653A6194EF73C00BEFB46 /* revision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = revision.h; sourceTree = "<group>"; };
+ 432653A7194EF73C00BEFB46 /* route.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = route.h; sourceTree = "<group>"; };
+ 432653A8194EF73C00BEFB46 /* route_graph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = route_graph.h; sourceTree = "<group>"; };
+ 432653A9194EF73C00BEFB46 /* route_group.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = route_group.h; sourceTree = "<group>"; };
+ 432653AA194EF73C00BEFB46 /* route_group_member.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = route_group_member.h; sourceTree = "<group>"; };
+ 432653AB194EF73C00BEFB46 /* route_group_specialized.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = route_group_specialized.h; sourceTree = "<group>"; };
+ 432653AC194EF73C00BEFB46 /* runtime_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = runtime_functions.h; sourceTree = "<group>"; };
+ 432653AD194EF73C00BEFB46 /* search_paths.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = search_paths.h; sourceTree = "<group>"; };
+ 432653AE194EF73C00BEFB46 /* send.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = send.h; sourceTree = "<group>"; };
+ 432653AF194EF73C00BEFB46 /* session.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = session.h; sourceTree = "<group>"; };
+ 432653B0194EF73C00BEFB46 /* session_configuration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = session_configuration.h; sourceTree = "<group>"; };
+ 432653B1194EF73C00BEFB46 /* session_configuration_vars.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = session_configuration_vars.h; sourceTree = "<group>"; };
+ 432653B2194EF73C00BEFB46 /* session_directory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = session_directory.h; sourceTree = "<group>"; };
+ 432653B3194EF73C00BEFB46 /* session_event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = session_event.h; sourceTree = "<group>"; };
+ 432653B4194EF73C00BEFB46 /* session_handle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = session_handle.h; sourceTree = "<group>"; };
+ 432653B5194EF73C00BEFB46 /* session_metadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = session_metadata.h; sourceTree = "<group>"; };
+ 432653B6194EF73C00BEFB46 /* session_object.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = session_object.h; sourceTree = "<group>"; };
+ 432653B7194EF73C00BEFB46 /* session_playlist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = session_playlist.h; sourceTree = "<group>"; };
+ 432653B8194EF73C00BEFB46 /* session_playlists.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = session_playlists.h; sourceTree = "<group>"; };
+ 432653B9194EF73C00BEFB46 /* session_route.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = session_route.h; sourceTree = "<group>"; };
+ 432653BA194EF73C00BEFB46 /* session_state_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = session_state_utils.h; sourceTree = "<group>"; };
+ 432653BB194EF73C00BEFB46 /* session_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = session_utils.h; sourceTree = "<group>"; };
+ 432653BC194EF73C00BEFB46 /* silentfilesource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = silentfilesource.h; sourceTree = "<group>"; };
+ 432653BD194EF73C00BEFB46 /* slave.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = slave.h; sourceTree = "<group>"; };
+ 432653BE194EF73C00BEFB46 /* smf_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smf_source.h; sourceTree = "<group>"; };
+ 432653BF194EF73C00BEFB46 /* sndfile_helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sndfile_helpers.h; sourceTree = "<group>"; };
+ 432653C0194EF73C00BEFB46 /* sndfileimportable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sndfileimportable.h; sourceTree = "<group>"; };
+ 432653C1194EF73C00BEFB46 /* sndfilesource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sndfilesource.h; sourceTree = "<group>"; };
+ 432653C2194EF73C00BEFB46 /* soundseq.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = soundseq.h; sourceTree = "<group>"; };
+ 432653C3194EF73C00BEFB46 /* source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = source.h; sourceTree = "<group>"; };
+ 432653C4194EF73C00BEFB46 /* source_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = source_factory.h; sourceTree = "<group>"; };
+ 432653C5194EF73C00BEFB46 /* speaker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = speaker.h; sourceTree = "<group>"; };
+ 432653C6194EF73C00BEFB46 /* speakers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = speakers.h; sourceTree = "<group>"; };
+ 432653C7194EF73C00BEFB46 /* spline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spline.h; sourceTree = "<group>"; };
+ 432653C8194EF73C00BEFB46 /* srcfilesource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = srcfilesource.h; sourceTree = "<group>"; };
+ 432653C9194EF73C00BEFB46 /* stretch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stretch.h; sourceTree = "<group>"; };
+ 432653CA194EF73C00BEFB46 /* strip_silence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = strip_silence.h; sourceTree = "<group>"; };
+ 432653CB194EF73C00BEFB46 /* system_exec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = system_exec.h; sourceTree = "<group>"; };
+ 432653CC194EF73C00BEFB46 /* tape_file_matcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tape_file_matcher.h; sourceTree = "<group>"; };
+ 432653CD194EF73C00BEFB46 /* template_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = template_utils.h; sourceTree = "<group>"; };
+ 432653CE194EF73C00BEFB46 /* tempo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tempo.h; sourceTree = "<group>"; };
+ 432653CF194EF73C00BEFB46 /* tempo_map_importer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tempo_map_importer.h; sourceTree = "<group>"; };
+ 432653D0194EF73C00BEFB46 /* thread_buffers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread_buffers.h; sourceTree = "<group>"; };
+ 432653D1194EF73C00BEFB46 /* ticker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ticker.h; sourceTree = "<group>"; };
+ 432653D2194EF73C00BEFB46 /* timecode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timecode.h; sourceTree = "<group>"; };
+ 432653D3194EF73C00BEFB46 /* timefx_request.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timefx_request.h; sourceTree = "<group>"; };
+ 432653D4194EF73C00BEFB46 /* timestamps.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timestamps.h; sourceTree = "<group>"; };
+ 432653D5194EF73C00BEFB46 /* track.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = track.h; sourceTree = "<group>"; };
+ 432653D6194EF73C00BEFB46 /* transient_detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transient_detector.h; sourceTree = "<group>"; };
+ 432653D7194EF73C00BEFB46 /* trimmable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = trimmable.h; sourceTree = "<group>"; };
+ 432653D8194EF73C00BEFB46 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = "<group>"; };
+ 432653D9194EF73C00BEFB46 /* unknown_processor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unknown_processor.h; sourceTree = "<group>"; };
+ 432653DA194EF73C00BEFB46 /* uri_map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = uri_map.h; sourceTree = "<group>"; };
+ 432653DB194EF73C00BEFB46 /* user_bundle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = user_bundle.h; sourceTree = "<group>"; };
+ 432653DC194EF73C00BEFB46 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = "<group>"; };
+ 432653DD194EF73C00BEFB46 /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = version.h; sourceTree = "<group>"; };
+ 432653DF194EF73C00BEFB46 /* aeffectx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aeffectx.h; sourceTree = "<group>"; };
+ 432653E0194EF73C00BEFB46 /* vst_info_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vst_info_file.h; sourceTree = "<group>"; };
+ 432653E1194EF73C00BEFB46 /* vst_plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vst_plugin.h; sourceTree = "<group>"; };
+ 432653E2194EF73C00BEFB46 /* vst_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vst_types.h; sourceTree = "<group>"; };
+ 432653E3194EF73C00BEFB46 /* vumeterdsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vumeterdsp.h; sourceTree = "<group>"; };
+ 432653E4194EF73C00BEFB46 /* windows_vst_plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = windows_vst_plugin.h; sourceTree = "<group>"; };
+ 432653E5194EF73C00BEFB46 /* worker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = worker.h; sourceTree = "<group>"; };
+ 432859E21A10F415006C3E03 /* midi_scene_change.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_scene_change.h; path = ../ardour/midi_scene_change.h; sourceTree = "<group>"; };
+ 432859E31A10F415006C3E03 /* midi_scene_changer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_scene_changer.h; path = ../ardour/midi_scene_changer.h; sourceTree = "<group>"; };
+ 432859E41A10F415006C3E03 /* mididm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mididm.h; path = ../ardour/mididm.h; sourceTree = "<group>"; };
+ 432859E51A10F415006C3E03 /* soundcloud_upload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = soundcloud_upload.h; path = ../ardour/soundcloud_upload.h; sourceTree = "<group>"; };
+ 432859EB1A10F436006C3E03 /* libardour.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libardour.xcodeproj; sourceTree = "<group>"; };
+ 432859EE1A10F436006C3E03 /* midi_scene_change.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_scene_change.cc; path = ../midi_scene_change.cc; sourceTree = "<group>"; };
+ 432859EF1A10F436006C3E03 /* midi_scene_changer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_scene_changer.cc; path = ../midi_scene_changer.cc; sourceTree = "<group>"; };
+ 432859F01A10F436006C3E03 /* mididm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mididm.cc; path = ../mididm.cc; sourceTree = "<group>"; };
+ 432859F11A10F436006C3E03 /* scene_change.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = scene_change.cc; path = ../scene_change.cc; sourceTree = "<group>"; };
+ 432859F21A10F436006C3E03 /* soundcloud_upload.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = soundcloud_upload.cc; path = ../soundcloud_upload.cc; sourceTree = "<group>"; };
+ 43AA82A9194EEAAF00A67B56 /* liblibardour.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = liblibardour.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 43AA82AE194EEB2600A67B56 /* amp.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = amp.cc; path = ../amp.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82AF194EEB2600A67B56 /* analyser.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = analyser.cc; path = ../analyser.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82B0194EEB2600A67B56 /* async_midi_port.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = async_midi_port.cc; path = ../async_midi_port.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82B1194EEB2600A67B56 /* audio_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audio_buffer.cc; path = ../audio_buffer.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82B2194EEB2600A67B56 /* audio_diskstream.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audio_diskstream.cc; path = ../audio_diskstream.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82B3194EEB2600A67B56 /* audio_library.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audio_library.cc; path = ../audio_library.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82B4194EEB2600A67B56 /* audio_playlist_importer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audio_playlist_importer.cc; path = ../audio_playlist_importer.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82B5194EEB2600A67B56 /* audio_playlist_source.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audio_playlist_source.cc; path = ../audio_playlist_source.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82B6194EEB2600A67B56 /* audio_playlist.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audio_playlist.cc; path = ../audio_playlist.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82B7194EEB2600A67B56 /* audio_port.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audio_port.cc; path = ../audio_port.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82B8194EEB2600A67B56 /* audio_region_importer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audio_region_importer.cc; path = ../audio_region_importer.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82B9194EEB2600A67B56 /* audio_track_importer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audio_track_importer.cc; path = ../audio_track_importer.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82BA194EEB2600A67B56 /* audio_track.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audio_track.cc; path = ../audio_track.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82BB194EEB2600A67B56 /* audio_unit.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audio_unit.cc; path = ../audio_unit.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82BC194EEB2600A67B56 /* audioanalyser.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audioanalyser.cc; path = ../audioanalyser.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82BD194EEB2600A67B56 /* audioengine.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audioengine.cc; path = ../audioengine.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82BE194EEB2600A67B56 /* audiofile_tagger.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audiofile_tagger.cc; path = ../audiofile_tagger.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82BF194EEB2600A67B56 /* audiofilesource.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audiofilesource.cc; path = ../audiofilesource.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82C0194EEB2600A67B56 /* audioregion.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audioregion.cc; path = ../audioregion.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82C1194EEB2600A67B56 /* audiosource.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audiosource.cc; path = ../audiosource.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82C2194EEB2600A67B56 /* auditioner.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = auditioner.cc; path = ../auditioner.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82C3194EEB2600A67B56 /* auto_bundle.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = auto_bundle.cc; path = ../auto_bundle.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82C4194EEB2600A67B56 /* automatable.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = automatable.cc; path = ../automatable.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82C5194EEB2600A67B56 /* automation_control.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = automation_control.cc; path = ../automation_control.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82C6194EEB2600A67B56 /* automation_list.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = automation_list.cc; path = ../automation_list.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82C7194EEB2600A67B56 /* automation_watch.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = automation_watch.cc; path = ../automation_watch.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82C8194EEB2600A67B56 /* automation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = automation.cc; path = ../automation.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82C9194EEB2600A67B56 /* beats_frames_converter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = beats_frames_converter.cc; path = ../beats_frames_converter.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82CA194EEB2600A67B56 /* broadcast_info.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = broadcast_info.cc; path = ../broadcast_info.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82CB194EEB2600A67B56 /* buffer_manager.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = buffer_manager.cc; path = ../buffer_manager.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82CC194EEB2600A67B56 /* buffer_set.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = buffer_set.cc; path = ../buffer_set.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82CD194EEB2600A67B56 /* buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = buffer.cc; path = ../buffer.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82CE194EEB2600A67B56 /* bundle.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bundle.cc; path = ../bundle.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82CF194EEB2600A67B56 /* butler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = butler.cc; path = ../butler.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82D0194EEB2600A67B56 /* caimportable.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = caimportable.cc; path = ../caimportable.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82D1194EEB2600A67B56 /* capturing_processor.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = capturing_processor.cc; path = ../capturing_processor.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82D2194EEB2600A67B56 /* chan_count.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = chan_count.cc; path = ../chan_count.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82D3194EEB2600A67B56 /* chan_mapping.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = chan_mapping.cc; path = ../chan_mapping.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82D4194EEB2600A67B56 /* config_text.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = config_text.cc; path = ../config_text.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82D5194EEB2600A67B56 /* configuration.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = configuration.cc; path = ../configuration.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82D6194EEB2600A67B56 /* control_protocol_manager.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = control_protocol_manager.cc; path = ../control_protocol_manager.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82D7194EEB2600A67B56 /* coreaudiosource.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = coreaudiosource.cc; path = ../coreaudiosource.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82D8194EEB2600A67B56 /* cycle_timer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cycle_timer.cc; path = ../cycle_timer.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82D9194EEB2600A67B56 /* data_type.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = data_type.cc; path = ../data_type.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82DA194EEB2600A67B56 /* debug.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = debug.cc; path = ../debug.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82DB194EEB2600A67B56 /* default_click.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = default_click.cc; path = ../default_click.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82DC194EEB2600A67B56 /* delivery.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = delivery.cc; path = ../delivery.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82DD194EEB2600A67B56 /* directory_names.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = directory_names.cc; path = ../directory_names.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82DE194EEB2600A67B56 /* diskstream.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = diskstream.cc; path = ../diskstream.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82DF194EEB2600A67B56 /* element_import_handler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = element_import_handler.cc; path = ../element_import_handler.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82E0194EEB2600A67B56 /* element_importer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = element_importer.cc; path = ../element_importer.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82E1194EEB2600A67B56 /* engine_slave.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = engine_slave.cc; path = ../engine_slave.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82E2194EEB2600A67B56 /* engine_state_controller.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = engine_state_controller.cc; path = ../engine_state_controller.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82E3194EEB2600A67B56 /* enums.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = enums.cc; path = ../enums.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82E4194EEB2600A67B56 /* event_type_map.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = event_type_map.cc; path = ../event_type_map.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82E5194EEB2600A67B56 /* export_channel_configuration.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = export_channel_configuration.cc; path = ../export_channel_configuration.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82E6194EEB2600A67B56 /* export_channel.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = export_channel.cc; path = ../export_channel.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82E7194EEB2600A67B56 /* export_failed.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = export_failed.cc; path = ../export_failed.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82E8194EEB2600A67B56 /* export_filename.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = export_filename.cc; path = ../export_filename.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82E9194EEB2600A67B56 /* export_format_base.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = export_format_base.cc; path = ../export_format_base.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82EA194EEB2600A67B56 /* export_format_manager.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = export_format_manager.cc; path = ../export_format_manager.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82EB194EEB2600A67B56 /* export_format_specification.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = export_format_specification.cc; path = ../export_format_specification.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82EC194EEB2600A67B56 /* export_formats.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = export_formats.cc; path = ../export_formats.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82ED194EEB2600A67B56 /* export_graph_builder.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = export_graph_builder.cc; path = ../export_graph_builder.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82EE194EEB2600A67B56 /* export_handler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = export_handler.cc; path = ../export_handler.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82EF194EEB2600A67B56 /* export_multiplication.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = export_multiplication.cc; path = ../export_multiplication.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82F0194EEB2600A67B56 /* export_preset.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = export_preset.cc; path = ../export_preset.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82F1194EEB2600A67B56 /* export_profile_manager.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = export_profile_manager.cc; path = ../export_profile_manager.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82F2194EEB2600A67B56 /* export_status.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = export_status.cc; path = ../export_status.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82F3194EEB2600A67B56 /* export_timespan.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = export_timespan.cc; path = ../export_timespan.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82F4194EEB2600A67B56 /* file_source.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = file_source.cc; path = ../file_source.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82F5194EEB2600A67B56 /* filename_extensions.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = filename_extensions.cc; path = ../filename_extensions.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82F6194EEB2600A67B56 /* filesystem_paths.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = filesystem_paths.cc; path = ../filesystem_paths.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82F7194EEB2600A67B56 /* filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = filter.cc; path = ../filter.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82F8194EEB2600A67B56 /* find_session.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = find_session.cc; path = ../find_session.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82F9194EEB2600A67B56 /* globals.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = globals.cc; path = ../globals.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82FA194EEB2600A67B56 /* graph.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = graph.cc; path = ../graph.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82FB194EEB2600A67B56 /* graphnode.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = graphnode.cc; path = ../graphnode.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82FC194EEB2600A67B56 /* iec1ppmdsp.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = iec1ppmdsp.cc; path = ../iec1ppmdsp.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82FD194EEB2600A67B56 /* iec2ppmdsp.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = iec2ppmdsp.cc; path = ../iec2ppmdsp.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82FE194EEB2600A67B56 /* import.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = import.cc; path = ../import.cc; sourceTree = SOURCE_ROOT; };
+ 43AA82FF194EEB2600A67B56 /* instrument_info.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = instrument_info.cc; path = ../instrument_info.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8300194EEB2600A67B56 /* internal_return.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = internal_return.cc; path = ../internal_return.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8301194EEB2600A67B56 /* internal_send.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = internal_send.cc; path = ../internal_send.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8302194EEB2600A67B56 /* interpolation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = interpolation.cc; path = ../interpolation.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8303194EEB2600A67B56 /* io_processor.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = io_processor.cc; path = ../io_processor.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8304194EEB2600A67B56 /* io.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = io.cc; path = ../io.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8305194EEB2600A67B56 /* kmeterdsp.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = kmeterdsp.cc; path = ../kmeterdsp.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8306194EEB2600A67B56 /* ladspa_plugin.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ladspa_plugin.cc; path = ../ladspa_plugin.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8307194EEB2600A67B56 /* linux_vst_support.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = linux_vst_support.cc; path = ../linux_vst_support.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8308194EEB2600A67B56 /* location_importer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = location_importer.cc; path = ../location_importer.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8309194EEB2600A67B56 /* location.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = location.cc; path = ../location.cc; sourceTree = SOURCE_ROOT; };
+ 43AA830A194EEB2600A67B56 /* ltc_slave.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ltc_slave.cc; path = ../ltc_slave.cc; sourceTree = SOURCE_ROOT; };
+ 43AA830B194EEB2600A67B56 /* lv2_evbuf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lv2_evbuf.c; path = ../lv2_evbuf.c; sourceTree = SOURCE_ROOT; };
+ 43AA830C194EEB2600A67B56 /* lv2_plugin.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = lv2_plugin.cc; path = ../lv2_plugin.cc; sourceTree = SOURCE_ROOT; };
+ 43AA830D194EEB2600A67B56 /* lxvst_plugin.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = lxvst_plugin.cc; path = ../lxvst_plugin.cc; sourceTree = SOURCE_ROOT; };
+ 43AA830E194EEB2600A67B56 /* meter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = meter.cc; path = ../meter.cc; sourceTree = SOURCE_ROOT; };
+ 43AA830F194EEB2600A67B56 /* midi_automation_list_binder.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_automation_list_binder.cc; path = ../midi_automation_list_binder.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8310194EEB2600A67B56 /* midi_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_buffer.cc; path = ../midi_buffer.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8311194EEB2600A67B56 /* midi_clock_slave.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_clock_slave.cc; path = ../midi_clock_slave.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8312194EEB2600A67B56 /* midi_diskstream.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_diskstream.cc; path = ../midi_diskstream.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8313194EEB2600A67B56 /* midi_model.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_model.cc; path = ../midi_model.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8314194EEB2600A67B56 /* midi_patch_manager.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_patch_manager.cc; path = ../midi_patch_manager.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8315194EEB2600A67B56 /* midi_playlist_source.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_playlist_source.cc; path = ../midi_playlist_source.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8316194EEB2600A67B56 /* midi_playlist.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_playlist.cc; path = ../midi_playlist.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8317194EEB2600A67B56 /* midi_port.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_port.cc; path = ../midi_port.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8318194EEB2600A67B56 /* midi_region.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_region.cc; path = ../midi_region.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8319194EEB2600A67B56 /* midi_ring_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_ring_buffer.cc; path = ../midi_ring_buffer.cc; sourceTree = SOURCE_ROOT; };
+ 43AA831A194EEB2600A67B56 /* midi_source.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_source.cc; path = ../midi_source.cc; sourceTree = SOURCE_ROOT; };
+ 43AA831B194EEB2600A67B56 /* midi_state_tracker.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_state_tracker.cc; path = ../midi_state_tracker.cc; sourceTree = SOURCE_ROOT; };
+ 43AA831C194EEB2600A67B56 /* midi_stretch.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_stretch.cc; path = ../midi_stretch.cc; sourceTree = SOURCE_ROOT; };
+ 43AA831D194EEB2600A67B56 /* midi_track.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_track.cc; path = ../midi_track.cc; sourceTree = SOURCE_ROOT; };
+ 43AA831E194EEB2600A67B56 /* midi_ui.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_ui.cc; path = ../midi_ui.cc; sourceTree = SOURCE_ROOT; };
+ 43AA831F194EEB2600A67B56 /* midiport_manager.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midiport_manager.cc; path = ../midiport_manager.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8320194EEB2600A67B56 /* mix.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mix.cc; path = ../mix.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8321194EEB2600A67B56 /* monitor_processor.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = monitor_processor.cc; path = ../monitor_processor.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8322194EEB2600A67B56 /* mtc_slave.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mtc_slave.cc; path = ../mtc_slave.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8323194EEB2600A67B56 /* mtdm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mtdm.cc; path = ../mtdm.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8324194EEB2600A67B56 /* mute_master.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mute_master.cc; path = ../mute_master.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8325194EEB2600A67B56 /* onset_detector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = onset_detector.cc; path = ../onset_detector.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8326194EEB2600A67B56 /* operations.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = operations.cc; path = ../operations.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8327194EEB2600A67B56 /* pan_controllable.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pan_controllable.cc; path = ../pan_controllable.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8328194EEB2600A67B56 /* pannable.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pannable.cc; path = ../pannable.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8329194EEB2600A67B56 /* panner_manager.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = panner_manager.cc; path = ../panner_manager.cc; sourceTree = SOURCE_ROOT; };
+ 43AA832A194EEB2600A67B56 /* panner_shell.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = panner_shell.cc; path = ../panner_shell.cc; sourceTree = SOURCE_ROOT; };
+ 43AA832B194EEB2600A67B56 /* panner.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = panner.cc; path = ../panner.cc; sourceTree = SOURCE_ROOT; };
+ 43AA832C194EEB2600A67B56 /* pcm_utils.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pcm_utils.cc; path = ../pcm_utils.cc; sourceTree = SOURCE_ROOT; };
+ 43AA832D194EEB2600A67B56 /* pi_controller.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pi_controller.cc; path = ../pi_controller.cc; sourceTree = SOURCE_ROOT; };
+ 43AA832E194EEB2600A67B56 /* playlist_factory.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = playlist_factory.cc; path = ../playlist_factory.cc; sourceTree = SOURCE_ROOT; };
+ 43AA832F194EEB2600A67B56 /* playlist_source.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = playlist_source.cc; path = ../playlist_source.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8330194EEB2600A67B56 /* playlist.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = playlist.cc; path = ../playlist.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8331194EEB2600A67B56 /* plugin_insert.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = plugin_insert.cc; path = ../plugin_insert.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8332194EEB2600A67B56 /* plugin_manager.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = plugin_manager.cc; path = ../plugin_manager.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8333194EEB2600A67B56 /* plugin.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = plugin.cc; path = ../plugin.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8334194EEB2600A67B56 /* port_insert.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = port_insert.cc; path = ../port_insert.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8335194EEB2600A67B56 /* port_manager.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = port_manager.cc; path = ../port_manager.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8336194EEB2600A67B56 /* port_set.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = port_set.cc; path = ../port_set.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8337194EEB2600A67B56 /* port.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = port.cc; path = ../port.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8338194EEB2600A67B56 /* process_thread.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = process_thread.cc; path = ../process_thread.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8339194EEB2600A67B56 /* processor.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = processor.cc; path = ../processor.cc; sourceTree = SOURCE_ROOT; };
+ 43AA833A194EEB2600A67B56 /* progress.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = progress.cc; path = ../progress.cc; sourceTree = SOURCE_ROOT; };
+ 43AA833B194EEB2600A67B56 /* quantize.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = quantize.cc; path = ../quantize.cc; sourceTree = SOURCE_ROOT; };
+ 43AA833C194EEB2600A67B56 /* rb_effect.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rb_effect.cc; path = ../rb_effect.cc; sourceTree = SOURCE_ROOT; };
+ 43AA833D194EEB2600A67B56 /* rc_configuration.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rc_configuration.cc; path = ../rc_configuration.cc; sourceTree = SOURCE_ROOT; };
+ 43AA833E194EEB2600A67B56 /* rdff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rdff.c; path = ../rdff.c; sourceTree = SOURCE_ROOT; };
+ 43AA833F194EEB2600A67B56 /* recent_sessions.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = recent_sessions.cc; path = ../recent_sessions.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8340194EEB2600A67B56 /* region_factory.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = region_factory.cc; path = ../region_factory.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8341194EEB2600A67B56 /* region.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = region.cc; path = ../region.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8342194EEB2600A67B56 /* resampled_source.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = resampled_source.cc; path = ../resampled_source.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8343194EEB2600A67B56 /* return.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = return.cc; path = ../return.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8344194EEB2600A67B56 /* reverse.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = reverse.cc; path = ../reverse.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8345194EEB2600A67B56 /* revision.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = revision.cc; path = ../revision.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8346194EEB2600A67B56 /* route_graph.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = route_graph.cc; path = ../route_graph.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8347194EEB2600A67B56 /* route_group_member.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = route_group_member.cc; path = ../route_group_member.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8348194EEB2600A67B56 /* route_group.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = route_group.cc; path = ../route_group.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8349194EEB2600A67B56 /* route.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = route.cc; path = ../route.cc; sourceTree = SOURCE_ROOT; };
+ 43AA834A194EEB2600A67B56 /* search_paths.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = search_paths.cc; path = ../search_paths.cc; sourceTree = SOURCE_ROOT; };
+ 43AA834B194EEB2600A67B56 /* send.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = send.cc; path = ../send.cc; sourceTree = SOURCE_ROOT; };
+ 43AA834C194EEB2600A67B56 /* session_butler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_butler.cc; path = ../session_butler.cc; sourceTree = SOURCE_ROOT; };
+ 43AA834D194EEB2600A67B56 /* session_click.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_click.cc; path = ../session_click.cc; sourceTree = SOURCE_ROOT; };
+ 43AA834E194EEB2600A67B56 /* session_command.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_command.cc; path = ../session_command.cc; sourceTree = SOURCE_ROOT; };
+ 43AA834F194EEB2600A67B56 /* session_configuration.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_configuration.cc; path = ../session_configuration.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8350194EEB2600A67B56 /* session_directory.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_directory.cc; path = ../session_directory.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8351194EEB2600A67B56 /* session_events.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_events.cc; path = ../session_events.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8352194EEB2600A67B56 /* session_export.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_export.cc; path = ../session_export.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8353194EEB2600A67B56 /* session_handle.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_handle.cc; path = ../session_handle.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8354194EEB2600A67B56 /* session_ltc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_ltc.cc; path = ../session_ltc.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8355194EEB2600A67B56 /* session_metadata.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_metadata.cc; path = ../session_metadata.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8356194EEB2600A67B56 /* session_midi.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_midi.cc; path = ../session_midi.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8357194EEB2600A67B56 /* session_object.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_object.cc; path = ../session_object.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8358194EEB2600A67B56 /* session_playlists.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_playlists.cc; path = ../session_playlists.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8359194EEB2600A67B56 /* session_process.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_process.cc; path = ../session_process.cc; sourceTree = SOURCE_ROOT; };
+ 43AA835A194EEB2600A67B56 /* session_rtevents.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_rtevents.cc; path = ../session_rtevents.cc; sourceTree = SOURCE_ROOT; };
+ 43AA835B194EEB2600A67B56 /* session_state_utils.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_state_utils.cc; path = ../session_state_utils.cc; sourceTree = SOURCE_ROOT; };
+ 43AA835C194EEB2600A67B56 /* session_state.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_state.cc; path = ../session_state.cc; sourceTree = SOURCE_ROOT; };
+ 43AA835D194EEB2600A67B56 /* session_time.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_time.cc; path = ../session_time.cc; sourceTree = SOURCE_ROOT; };
+ 43AA835E194EEB2600A67B56 /* session_transport.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_transport.cc; path = ../session_transport.cc; sourceTree = SOURCE_ROOT; };
+ 43AA835F194EEB2600A67B56 /* session_vst.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_vst.cc; path = ../session_vst.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8360194EEB2600A67B56 /* session.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session.cc; path = ../session.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8361194EEB2600A67B56 /* slave.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = slave.cc; path = ../slave.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8362194EEB2600A67B56 /* smf_source.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = smf_source.cc; path = ../smf_source.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8363194EEB2600A67B56 /* sndfile_helpers.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sndfile_helpers.cc; path = ../sndfile_helpers.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8364194EEB2600A67B56 /* sndfileimportable.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sndfileimportable.cc; path = ../sndfileimportable.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8365194EEB2600A67B56 /* sndfilesource.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sndfilesource.cc; path = ../sndfilesource.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8366194EEB2600A67B56 /* source_factory.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = source_factory.cc; path = ../source_factory.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8367194EEB2600A67B56 /* source.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = source.cc; path = ../source.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8368194EEB2600A67B56 /* speakers.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = speakers.cc; path = ../speakers.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8369194EEB2600A67B56 /* srcfilesource.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srcfilesource.cc; path = ../srcfilesource.cc; sourceTree = SOURCE_ROOT; };
+ 43AA836A194EEB2600A67B56 /* sse_functions_64bit.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = sse_functions_64bit.s; path = ../sse_functions_64bit.s; sourceTree = SOURCE_ROOT; };
+ 43AA836B194EEB2600A67B56 /* sse_functions_xmm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sse_functions_xmm.cc; path = ../sse_functions_xmm.cc; sourceTree = SOURCE_ROOT; };
+ 43AA836C194EEB2600A67B56 /* sse_functions.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = sse_functions.s; path = ../sse_functions.s; sourceTree = SOURCE_ROOT; };
+ 43AA836D194EEB2600A67B56 /* st_pitch.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = st_pitch.cc; path = ../st_pitch.cc; sourceTree = SOURCE_ROOT; };
+ 43AA836E194EEB2600A67B56 /* st_stretch.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = st_stretch.cc; path = ../st_stretch.cc; sourceTree = SOURCE_ROOT; };
+ 43AA836F194EEB2600A67B56 /* strip_silence.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = strip_silence.cc; path = ../strip_silence.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8370194EEB2600A67B56 /* system_exec.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = system_exec.cc; path = ../system_exec.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8371194EEB2600A67B56 /* tape_file_matcher.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tape_file_matcher.cc; path = ../tape_file_matcher.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8372194EEB2600A67B56 /* template_utils.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = template_utils.cc; path = ../template_utils.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8373194EEB2600A67B56 /* tempo_map_importer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tempo_map_importer.cc; path = ../tempo_map_importer.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8374194EEB2600A67B56 /* tempo.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tempo.cc; path = ../tempo.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8375194EEB2600A67B56 /* thread_buffers.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = thread_buffers.cc; path = ../thread_buffers.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8376194EEB2600A67B56 /* ticker.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ticker.cc; path = ../ticker.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8377194EEB2600A67B56 /* track.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = track.cc; path = ../track.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8378194EEB2600A67B56 /* transient_detector.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = transient_detector.cc; path = ../transient_detector.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8379194EEB2600A67B56 /* unknown_processor.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = unknown_processor.cc; path = ../unknown_processor.cc; sourceTree = SOURCE_ROOT; };
+ 43AA837A194EEB2600A67B56 /* uri_map.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = uri_map.cc; path = ../uri_map.cc; sourceTree = SOURCE_ROOT; };
+ 43AA837B194EEB2600A67B56 /* user_bundle.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = user_bundle.cc; path = ../user_bundle.cc; sourceTree = SOURCE_ROOT; };
+ 43AA837C194EEB2600A67B56 /* utils.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = utils.cc; path = ../utils.cc; sourceTree = SOURCE_ROOT; };
+ 43AA837D194EEB2600A67B56 /* version.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = version.cc; path = ../version.cc; sourceTree = SOURCE_ROOT; };
+ 43AA837E194EEB2600A67B56 /* vst_info_file.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = vst_info_file.cc; path = ../vst_info_file.cc; sourceTree = SOURCE_ROOT; };
+ 43AA837F194EEB2600A67B56 /* vst_plugin.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = vst_plugin.cc; path = ../vst_plugin.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8380194EEB2600A67B56 /* vumeterdsp.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = vumeterdsp.cc; path = ../vumeterdsp.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8381194EEB2600A67B56 /* windows_vst_plugin.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = windows_vst_plugin.cc; path = ../windows_vst_plugin.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8382194EEB2600A67B56 /* worker.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = worker.cc; path = ../worker.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8459194EEB5F00A67B56 /* audio_engine_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audio_engine_test.cc; path = ../test/audio_engine_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA845A194EEB5F00A67B56 /* audio_engine_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_engine_test.h; path = ../test/audio_engine_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA845B194EEB5F00A67B56 /* audio_region_read_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audio_region_read_test.cc; path = ../test/audio_region_read_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA845C194EEB5F00A67B56 /* audio_region_read_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_region_read_test.h; path = ../test/audio_region_read_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA845D194EEB5F00A67B56 /* audio_region_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audio_region_test.cc; path = ../test/audio_region_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA845E194EEB5F00A67B56 /* audio_region_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_region_test.h; path = ../test/audio_region_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA845F194EEB5F00A67B56 /* automation_list_property_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = automation_list_property_test.cc; path = ../test/automation_list_property_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8460194EEB5F00A67B56 /* automation_list_property_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = automation_list_property_test.h; path = ../test/automation_list_property_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA8461194EEB5F00A67B56 /* bbt_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bbt_test.cc; path = ../test/bbt_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8462194EEB5F00A67B56 /* bbt_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bbt_test.h; path = ../test/bbt_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA8463194EEB5F00A67B56 /* combine_regions_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = combine_regions_test.cc; path = ../test/combine_regions_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8464194EEB5F00A67B56 /* combine_regions_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = combine_regions_test.h; path = ../test/combine_regions_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA8465194EEB5F00A67B56 /* control_surfaces_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = control_surfaces_test.cc; path = ../test/control_surfaces_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8466194EEB5F00A67B56 /* control_surfaces_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = control_surfaces_test.h; path = ../test/control_surfaces_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA8469194EEB5F00A67B56 = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; sourceTree = "<group>"; };
+ 43AA846A194EEB5F00A67B56 /* automation_list_property_test1.ref */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = automation_list_property_test1.ref; path = ../test/data/automation_list_property_test1.ref; sourceTree = SOURCE_ROOT; };
+ 43AA846B194EEB5F00A67B56 /* automation_list_property_test2.ref */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = automation_list_property_test2.ref; path = ../test/data/automation_list_property_test2.ref; sourceTree = SOURCE_ROOT; };
+ 43AA846C194EEB5F00A67B56 /* automation_list_property_test3.ref */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = automation_list_property_test3.ref; path = ../test/data/automation_list_property_test3.ref; sourceTree = SOURCE_ROOT; };
+ 43AA846D194EEB5F00A67B56 /* automation_list_property_test4.ref */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = automation_list_property_test4.ref; path = ../test/data/automation_list_property_test4.ref; sourceTree = SOURCE_ROOT; };
+ 43AA846F194EEB5F00A67B56 /* instant.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = instant.xml; path = ../test/data/mantis_3356/instant.xml; sourceTree = SOURCE_ROOT; };
+ 43AA8473194EEB5F00A67B56 /* Midi 1-1.mid */ = {isa = PBXFileReference; lastKnownFileType = audio.midi; path = "Midi 1-1.mid"; sourceTree = "<group>"; };
+ 43AA8474194EEB5F00A67B56 /* mantis_3356.ardour */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = mantis_3356.ardour; path = ../test/data/mantis_3356/mantis_3356.ardour; sourceTree = SOURCE_ROOT; };
+ 43AA8475194EEB5F00A67B56 /* mantis_3356.ref */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = mantis_3356.ref; path = ../test/data/mantis_3356.ref; sourceTree = SOURCE_ROOT; };
+ 43AA8478194EEB5F00A67B56 /* instant.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = instant.xml; sourceTree = "<group>"; };
+ 43AA8479194EEB5F00A67B56 /* rec_enabled.ardour */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = rec_enabled.ardour; sourceTree = "<group>"; };
+ 43AA847A194EEB5F00A67B56 /* rec_enabled.history */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = rec_enabled.history; sourceTree = "<group>"; };
+ 43AA847B194EEB5F00A67B56 /* test.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = test.wav; sourceTree = "<group>"; };
+ 43AA847C194EEB5F00A67B56 /* dummy_lxvst.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dummy_lxvst.cc; path = ../test/dummy_lxvst.cc; sourceTree = SOURCE_ROOT; };
+ 43AA847D194EEB5F00A67B56 /* framepos_minus_beats_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = framepos_minus_beats_test.cc; path = ../test/framepos_minus_beats_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA847E194EEB5F00A67B56 /* framepos_minus_beats_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = framepos_minus_beats_test.h; path = ../test/framepos_minus_beats_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA847F194EEB5F00A67B56 /* framepos_plus_beats_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = framepos_plus_beats_test.cc; path = ../test/framepos_plus_beats_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8480194EEB5F00A67B56 /* framepos_plus_beats_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = framepos_plus_beats_test.h; path = ../test/framepos_plus_beats_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA8481194EEB5F00A67B56 /* framewalk_to_beats_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = framewalk_to_beats_test.cc; path = ../test/framewalk_to_beats_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8482194EEB5F00A67B56 /* framewalk_to_beats_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = framewalk_to_beats_test.h; path = ../test/framewalk_to_beats_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA8483194EEB5F00A67B56 /* interpolation_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = interpolation_test.cc; path = ../test/interpolation_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8484194EEB5F00A67B56 /* interpolation_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = interpolation_test.h; path = ../test/interpolation_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA8485194EEB5F00A67B56 /* jack_utils_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = jack_utils_test.cc; path = ../test/jack_utils_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8486194EEB5F00A67B56 /* jack_utils_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jack_utils_test.h; path = ../test/jack_utils_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA8487194EEB5F00A67B56 /* load_session.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = load_session.cc; path = ../test/load_session.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8488194EEB5F00A67B56 /* load_sessions_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = load_sessions_test.cc; path = ../test/load_sessions_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8489194EEB5F00A67B56 /* load_sessions_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = load_sessions_test.h; path = ../test/load_sessions_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA848A194EEB5F00A67B56 /* midi_clock_slave_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midi_clock_slave_test.cc; path = ../test/midi_clock_slave_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA848B194EEB5F00A67B56 /* midi_clock_slave_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_clock_slave_test.h; path = ../test/midi_clock_slave_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA848C194EEB5F00A67B56 /* mtdm_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mtdm_test.cc; path = ../test/mtdm_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA848D194EEB5F00A67B56 /* mtdm_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mtdm_test.h; path = ../test/mtdm_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA848E194EEB5F00A67B56 /* playlist_equivalent_regions_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = playlist_equivalent_regions_test.cc; path = ../test/playlist_equivalent_regions_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA848F194EEB5F00A67B56 /* playlist_equivalent_regions_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = playlist_equivalent_regions_test.h; path = ../test/playlist_equivalent_regions_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA8490194EEB5F00A67B56 /* playlist_layering_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = playlist_layering_test.cc; path = ../test/playlist_layering_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8491194EEB5F00A67B56 /* playlist_layering_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = playlist_layering_test.h; path = ../test/playlist_layering_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA8492194EEB5F00A67B56 /* playlist_read_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = playlist_read_test.cc; path = ../test/playlist_read_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8493194EEB5F00A67B56 /* playlist_read_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = playlist_read_test.h; path = ../test/playlist_read_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA8494194EEB5F00A67B56 /* plugins_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = plugins_test.cc; path = ../test/plugins_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA8495194EEB5F00A67B56 /* plugins_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = plugins_test.h; path = ../test/plugins_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA8497194EEB5F00A67B56 /* load_session.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = load_session.cc; sourceTree = "<group>"; };
+ 43AA8498194EEB5F00A67B56 /* lots_of_regions.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lots_of_regions.cc; sourceTree = "<group>"; };
+ 43AA8499194EEB5F00A67B56 /* runpc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = runpc.cc; sourceTree = "<group>"; };
+ 43AA849C194EEB5F00A67B56 /* 0tracks.ardour */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = 0tracks.ardour; sourceTree = "<group>"; };
+ 43AA849D194EEB5F00A67B56 /* 0tracks.history */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = 0tracks.history; sourceTree = "<group>"; };
+ 43AA849F194EEB5F00A67B56 /* 1region.ardour */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = 1region.ardour; sourceTree = "<group>"; };
+ 43AA84A0194EEB5F00A67B56 /* 1region.history */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = 1region.history; sourceTree = "<group>"; };
+ 43AA84A1194EEB5F00A67B56 /* instant.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = instant.xml; sourceTree = "<group>"; };
+ 43AA84A5194EEB5F00A67B56 /* MIDI 1-1.mid */ = {isa = PBXFileReference; lastKnownFileType = audio.midi; path = "MIDI 1-1.mid"; sourceTree = "<group>"; };
+ 43AA84A7194EEB5F00A67B56 /* 32tracks.ardour */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = 32tracks.ardour; sourceTree = "<group>"; };
+ 43AA84A8194EEB5F00A67B56 /* 32tracks.history */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = 32tracks.history; sourceTree = "<group>"; };
+ 43AA84A9194EEB5F00A67B56 /* instant.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = instant.xml; sourceTree = "<group>"; };
+ 43AA84AA194EEB5F00A67B56 /* region_naming_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = region_naming_test.cc; path = ../test/region_naming_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA84AB194EEB5F00A67B56 /* region_naming_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = region_naming_test.h; path = ../test/region_naming_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA84AC194EEB5F00A67B56 /* resampled_source_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = resampled_source_test.cc; path = ../test/resampled_source_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA84AD194EEB5F00A67B56 /* resampled_source_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resampled_source_test.h; path = ../test/resampled_source_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA84AE194EEB5F00A67B56 /* session_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = session_test.cc; path = ../test/session_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA84AF194EEB5F00A67B56 /* session_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_test.h; path = ../test/session_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA84B0194EEB5F00A67B56 /* tempo_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tempo_test.cc; path = ../test/tempo_test.cc; sourceTree = SOURCE_ROOT; };
+ 43AA84B1194EEB5F00A67B56 /* tempo_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tempo_test.h; path = ../test/tempo_test.h; sourceTree = SOURCE_ROOT; };
+ 43AA84B2194EEB5F00A67B56 /* test_common.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = test_common.cc; path = ../test/test_common.cc; sourceTree = SOURCE_ROOT; };
+ 43AA84B3194EEB5F00A67B56 /* test_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = test_common.h; path = ../test/test_common.h; sourceTree = SOURCE_ROOT; };
+ 43AA84B4194EEB5F00A67B56 /* test_needing_session.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = test_needing_session.cc; path = ../test/test_needing_session.cc; sourceTree = SOURCE_ROOT; };
+ 43AA84B5194EEB5F00A67B56 /* test_needing_session.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = test_needing_session.h; path = ../test/test_needing_session.h; sourceTree = SOURCE_ROOT; };
+ 43AA84B6194EEB5F00A67B56 /* test_util.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = test_util.cc; path = ../test/test_util.cc; sourceTree = SOURCE_ROOT; };
+ 43AA84B7194EEB5F00A67B56 /* test_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = test_util.h; path = ../test/test_util.h; sourceTree = SOURCE_ROOT; };
+ 43AA84B8194EEB5F00A67B56 /* testrunner.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = testrunner.cc; path = ../test/testrunner.cc; sourceTree = SOURCE_ROOT; };
+ 43AA84F4194EEB8B00A67B56 /* amp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = amp.h; path = ../ardour/amp.h; sourceTree = SOURCE_ROOT; };
+ 43AA84F5194EEB8B00A67B56 /* analyser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = analyser.h; path = ../ardour/analyser.h; sourceTree = SOURCE_ROOT; };
+ 43AA84F6194EEB8B00A67B56 /* ardour.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ardour.h; path = ../ardour/ardour.h; sourceTree = SOURCE_ROOT; };
+ 43AA84F7194EEB8B00A67B56 /* async_midi_port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = async_midi_port.h; path = ../ardour/async_midi_port.h; sourceTree = SOURCE_ROOT; };
+ 43AA84F8194EEB8B00A67B56 /* audio_backend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_backend.h; path = ../ardour/audio_backend.h; sourceTree = SOURCE_ROOT; };
+ 43AA84F9194EEB8B00A67B56 /* audio_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_buffer.h; path = ../ardour/audio_buffer.h; sourceTree = SOURCE_ROOT; };
+ 43AA84FA194EEB8B00A67B56 /* audio_diskstream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_diskstream.h; path = ../ardour/audio_diskstream.h; sourceTree = SOURCE_ROOT; };
+ 43AA84FB194EEB8B00A67B56 /* audio_library.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_library.h; path = ../ardour/audio_library.h; sourceTree = SOURCE_ROOT; };
+ 43AA84FC194EEB8B00A67B56 /* audio_playlist_importer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_playlist_importer.h; path = ../ardour/audio_playlist_importer.h; sourceTree = SOURCE_ROOT; };
+ 43AA84FD194EEB8B00A67B56 /* audio_playlist_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_playlist_source.h; path = ../ardour/audio_playlist_source.h; sourceTree = SOURCE_ROOT; };
+ 43AA84FE194EEB8B00A67B56 /* audio_port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_port.h; path = ../ardour/audio_port.h; sourceTree = SOURCE_ROOT; };
+ 43AA84FF194EEB8B00A67B56 /* audio_region_importer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_region_importer.h; path = ../ardour/audio_region_importer.h; sourceTree = SOURCE_ROOT; };
+ 43AA8500194EEB8B00A67B56 /* audio_track_importer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_track_importer.h; path = ../ardour/audio_track_importer.h; sourceTree = SOURCE_ROOT; };
+ 43AA8501194EEB8B00A67B56 /* audio_track.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_track.h; path = ../ardour/audio_track.h; sourceTree = SOURCE_ROOT; };
+ 43AA8502194EEB8B00A67B56 /* audio_unit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_unit.h; path = ../ardour/audio_unit.h; sourceTree = SOURCE_ROOT; };
+ 43AA8503194EEB8B00A67B56 /* audioanalyser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audioanalyser.h; path = ../ardour/audioanalyser.h; sourceTree = SOURCE_ROOT; };
+ 43AA8504194EEB8B00A67B56 /* audioengine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audioengine.h; path = ../ardour/audioengine.h; sourceTree = SOURCE_ROOT; };
+ 43AA8505194EEB8B00A67B56 /* audiofile_tagger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audiofile_tagger.h; path = ../ardour/audiofile_tagger.h; sourceTree = SOURCE_ROOT; };
+ 43AA8506194EEB8B00A67B56 /* audiofilesource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audiofilesource.h; path = ../ardour/audiofilesource.h; sourceTree = SOURCE_ROOT; };
+ 43AA8507194EEB8B00A67B56 /* audioplaylist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audioplaylist.h; path = ../ardour/audioplaylist.h; sourceTree = SOURCE_ROOT; };
+ 43AA8508194EEB8B00A67B56 /* audioregion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audioregion.h; path = ../ardour/audioregion.h; sourceTree = SOURCE_ROOT; };
+ 43AA8509194EEB8B00A67B56 /* audiosource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audiosource.h; path = ../ardour/audiosource.h; sourceTree = SOURCE_ROOT; };
+ 43AA850A194EEB8B00A67B56 /* auditioner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = auditioner.h; path = ../ardour/auditioner.h; sourceTree = SOURCE_ROOT; };
+ 43AA850B194EEB8B00A67B56 /* auto_bundle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = auto_bundle.h; path = ../ardour/auto_bundle.h; sourceTree = SOURCE_ROOT; };
+ 43AA850C194EEB8B00A67B56 /* automatable_sequence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = automatable_sequence.h; path = ../ardour/automatable_sequence.h; sourceTree = SOURCE_ROOT; };
+ 43AA850D194EEB8B00A67B56 /* automatable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = automatable.h; path = ../ardour/automatable.h; sourceTree = SOURCE_ROOT; };
+ 43AA850E194EEB8B00A67B56 /* automation_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = automation_control.h; path = ../ardour/automation_control.h; sourceTree = SOURCE_ROOT; };
+ 43AA850F194EEB8B00A67B56 /* automation_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = automation_list.h; path = ../ardour/automation_list.h; sourceTree = SOURCE_ROOT; };
+ 43AA8510194EEB8B00A67B56 /* automation_watch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = automation_watch.h; path = ../ardour/automation_watch.h; sourceTree = SOURCE_ROOT; };
+ 43AA8511194EEB8B00A67B56 /* beats_frames_converter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = beats_frames_converter.h; path = ../ardour/beats_frames_converter.h; sourceTree = SOURCE_ROOT; };
+ 43AA8512194EEB8B00A67B56 /* broadcast_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = broadcast_info.h; path = ../ardour/broadcast_info.h; sourceTree = SOURCE_ROOT; };
+ 43AA8513194EEB8B00A67B56 /* buffer_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = buffer_manager.h; path = ../ardour/buffer_manager.h; sourceTree = SOURCE_ROOT; };
+ 43AA8514194EEB8B00A67B56 /* buffer_set.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = buffer_set.h; path = ../ardour/buffer_set.h; sourceTree = SOURCE_ROOT; };
+ 43AA8515194EEB8B00A67B56 /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = buffer.h; path = ../ardour/buffer.h; sourceTree = SOURCE_ROOT; };
+ 43AA8516194EEB8B00A67B56 /* bundle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bundle.h; path = ../ardour/bundle.h; sourceTree = SOURCE_ROOT; };
+ 43AA8517194EEB8B00A67B56 /* butler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = butler.h; path = ../ardour/butler.h; sourceTree = SOURCE_ROOT; };
+ 43AA8518194EEB8B00A67B56 /* caimportable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = caimportable.h; path = ../ardour/caimportable.h; sourceTree = SOURCE_ROOT; };
+ 43AA8519194EEB8B00A67B56 /* capturing_processor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = capturing_processor.h; path = ../ardour/capturing_processor.h; sourceTree = SOURCE_ROOT; };
+ 43AA851A194EEB8B00A67B56 /* chan_count.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = chan_count.h; path = ../ardour/chan_count.h; sourceTree = SOURCE_ROOT; };
+ 43AA851B194EEB8B00A67B56 /* chan_mapping.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = chan_mapping.h; path = ../ardour/chan_mapping.h; sourceTree = SOURCE_ROOT; };
+ 43AA851C194EEB8B00A67B56 /* click.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = click.h; path = ../ardour/click.h; sourceTree = SOURCE_ROOT; };
+ 43AA851D194EEB8B00A67B56 /* comparable_shared_ptr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = comparable_shared_ptr.h; path = ../ardour/comparable_shared_ptr.h; sourceTree = SOURCE_ROOT; };
+ 43AA851E194EEB8B00A67B56 /* configuration_variable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = configuration_variable.h; path = ../ardour/configuration_variable.h; sourceTree = SOURCE_ROOT; };
+ 43AA851F194EEB8B00A67B56 /* configuration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = configuration.h; path = ../ardour/configuration.h; sourceTree = SOURCE_ROOT; };
+ 43AA8520194EEB8B00A67B56 /* control_protocol_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = control_protocol_manager.h; path = ../ardour/control_protocol_manager.h; sourceTree = SOURCE_ROOT; };
+ 43AA8521194EEB8B00A67B56 /* coreaudiosource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = coreaudiosource.h; path = ../ardour/coreaudiosource.h; sourceTree = SOURCE_ROOT; };
+ 43AA8522194EEB8B00A67B56 /* cycle_timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cycle_timer.h; path = ../ardour/cycle_timer.h; sourceTree = SOURCE_ROOT; };
+ 43AA8523194EEB8B00A67B56 /* cycles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cycles.h; path = ../ardour/cycles.h; sourceTree = SOURCE_ROOT; };
+ 43AA8524194EEB8B00A67B56 /* data_type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = data_type.h; path = ../ardour/data_type.h; sourceTree = SOURCE_ROOT; };
+ 43AA8525194EEB8B00A67B56 /* dB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dB.h; path = ../ardour/dB.h; sourceTree = SOURCE_ROOT; };
+ 43AA8526194EEB8B00A67B56 /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = debug.h; path = ../ardour/debug.h; sourceTree = SOURCE_ROOT; };
+ 43AA8527194EEB8B00A67B56 /* delivery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = delivery.h; path = ../ardour/delivery.h; sourceTree = SOURCE_ROOT; };
+ 43AA8528194EEB8B00A67B56 /* directory_names.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = directory_names.h; path = ../ardour/directory_names.h; sourceTree = SOURCE_ROOT; };
+ 43AA8529194EEB8B00A67B56 /* diskstream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = diskstream.h; path = ../ardour/diskstream.h; sourceTree = SOURCE_ROOT; };
+ 43AA852A194EEB8B00A67B56 /* element_import_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = element_import_handler.h; path = ../ardour/element_import_handler.h; sourceTree = SOURCE_ROOT; };
+ 43AA852B194EEB8B00A67B56 /* element_importer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = element_importer.h; path = ../ardour/element_importer.h; sourceTree = SOURCE_ROOT; };
+ 43AA852C194EEB8B00A67B56 /* engine_state_controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = engine_state_controller.h; path = ../ardour/engine_state_controller.h; sourceTree = SOURCE_ROOT; };
+ 43AA852D194EEB8B00A67B56 /* event_type_map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = event_type_map.h; path = ../ardour/event_type_map.h; sourceTree = SOURCE_ROOT; };
+ 43AA852E194EEB8B00A67B56 /* export_channel_configuration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_channel_configuration.h; path = ../ardour/export_channel_configuration.h; sourceTree = SOURCE_ROOT; };
+ 43AA852F194EEB8B00A67B56 /* export_channel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_channel.h; path = ../ardour/export_channel.h; sourceTree = SOURCE_ROOT; };
+ 43AA8530194EEB8B00A67B56 /* export_failed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_failed.h; path = ../ardour/export_failed.h; sourceTree = SOURCE_ROOT; };
+ 43AA8531194EEB8B00A67B56 /* export_filename.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_filename.h; path = ../ardour/export_filename.h; sourceTree = SOURCE_ROOT; };
+ 43AA8532194EEB8B00A67B56 /* export_format_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_format_base.h; path = ../ardour/export_format_base.h; sourceTree = SOURCE_ROOT; };
+ 43AA8533194EEB8B00A67B56 /* export_format_compatibility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_format_compatibility.h; path = ../ardour/export_format_compatibility.h; sourceTree = SOURCE_ROOT; };
+ 43AA8534194EEB8B00A67B56 /* export_format_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_format_manager.h; path = ../ardour/export_format_manager.h; sourceTree = SOURCE_ROOT; };
+ 43AA8535194EEB8B00A67B56 /* export_format_specification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_format_specification.h; path = ../ardour/export_format_specification.h; sourceTree = SOURCE_ROOT; };
+ 43AA8536194EEB8B00A67B56 /* export_formats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_formats.h; path = ../ardour/export_formats.h; sourceTree = SOURCE_ROOT; };
+ 43AA8537194EEB8B00A67B56 /* export_graph_builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_graph_builder.h; path = ../ardour/export_graph_builder.h; sourceTree = SOURCE_ROOT; };
+ 43AA8538194EEB8B00A67B56 /* export_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_handler.h; path = ../ardour/export_handler.h; sourceTree = SOURCE_ROOT; };
+ 43AA8539194EEB8B00A67B56 /* export_multiplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_multiplication.h; path = ../ardour/export_multiplication.h; sourceTree = SOURCE_ROOT; };
+ 43AA853A194EEB8B00A67B56 /* export_pointers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_pointers.h; path = ../ardour/export_pointers.h; sourceTree = SOURCE_ROOT; };
+ 43AA853B194EEB8B00A67B56 /* export_preset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_preset.h; path = ../ardour/export_preset.h; sourceTree = SOURCE_ROOT; };
+ 43AA853C194EEB8B00A67B56 /* export_profile_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_profile_manager.h; path = ../ardour/export_profile_manager.h; sourceTree = SOURCE_ROOT; };
+ 43AA853D194EEB8B00A67B56 /* export_status.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_status.h; path = ../ardour/export_status.h; sourceTree = SOURCE_ROOT; };
+ 43AA853E194EEB8B00A67B56 /* export_timespan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = export_timespan.h; path = ../ardour/export_timespan.h; sourceTree = SOURCE_ROOT; };
+ 43AA853F194EEB8B00A67B56 /* file_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = file_source.h; path = ../ardour/file_source.h; sourceTree = SOURCE_ROOT; };
+ 43AA8540194EEB8B00A67B56 /* filename_extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = filename_extensions.h; path = ../ardour/filename_extensions.h; sourceTree = SOURCE_ROOT; };
+ 43AA8541194EEB8B00A67B56 /* filesystem_paths.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = filesystem_paths.h; path = ../ardour/filesystem_paths.h; sourceTree = SOURCE_ROOT; };
+ 43AA8542194EEB8B00A67B56 /* filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = filter.h; path = ../ardour/filter.h; sourceTree = SOURCE_ROOT; };
+ 43AA8543194EEB8B00A67B56 /* graph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = graph.h; path = ../ardour/graph.h; sourceTree = SOURCE_ROOT; };
+ 43AA8544194EEB8B00A67B56 /* graphnode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = graphnode.h; path = ../ardour/graphnode.h; sourceTree = SOURCE_ROOT; };
+ 43AA8545194EEB8B00A67B56 /* iec1ppmdsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iec1ppmdsp.h; path = ../ardour/iec1ppmdsp.h; sourceTree = SOURCE_ROOT; };
+ 43AA8546194EEB8B00A67B56 /* iec2ppmdsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iec2ppmdsp.h; path = ../ardour/iec2ppmdsp.h; sourceTree = SOURCE_ROOT; };
+ 43AA8547194EEB8B00A67B56 /* import_status.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = import_status.h; path = ../ardour/import_status.h; sourceTree = SOURCE_ROOT; };
+ 43AA8548194EEB8B00A67B56 /* importable_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = importable_source.h; path = ../ardour/importable_source.h; sourceTree = SOURCE_ROOT; };
+ 43AA8549194EEB8B00A67B56 /* instrument_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = instrument_info.h; path = ../ardour/instrument_info.h; sourceTree = SOURCE_ROOT; };
+ 43AA854A194EEB8B00A67B56 /* internal_return.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = internal_return.h; path = ../ardour/internal_return.h; sourceTree = SOURCE_ROOT; };
+ 43AA854B194EEB8B00A67B56 /* internal_send.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = internal_send.h; path = ../ardour/internal_send.h; sourceTree = SOURCE_ROOT; };
+ 43AA854C194EEB8B00A67B56 /* interpolation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = interpolation.h; path = ../ardour/interpolation.h; sourceTree = SOURCE_ROOT; };
+ 43AA854D194EEB8B00A67B56 /* interthread_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = interthread_info.h; path = ../ardour/interthread_info.h; sourceTree = SOURCE_ROOT; };
+ 43AA854E194EEB8B00A67B56 /* io_processor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = io_processor.h; path = ../ardour/io_processor.h; sourceTree = SOURCE_ROOT; };
+ 43AA854F194EEB8B00A67B56 /* io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = io.h; path = ../ardour/io.h; sourceTree = SOURCE_ROOT; };
+ 43AA8550194EEB8B00A67B56 /* jack_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jack_utils.h; path = ../ardour/jack_utils.h; sourceTree = SOURCE_ROOT; };
+ 43AA8551194EEB8B00A67B56 /* kmeterdsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = kmeterdsp.h; path = ../ardour/kmeterdsp.h; sourceTree = SOURCE_ROOT; };
+ 43AA8552194EEB8B00A67B56 /* ladspa_plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ladspa_plugin.h; path = ../ardour/ladspa_plugin.h; sourceTree = SOURCE_ROOT; };
+ 43AA8553194EEB8B00A67B56 /* ladspa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ladspa.h; path = ../ardour/ladspa.h; sourceTree = SOURCE_ROOT; };
+ 43AA8554194EEB8B00A67B56 /* latent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = latent.h; path = ../ardour/latent.h; sourceTree = SOURCE_ROOT; };
+ 43AA8555194EEB8B00A67B56 /* libardour_visibility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libardour_visibility.h; path = ../ardour/libardour_visibility.h; sourceTree = SOURCE_ROOT; };
+ 43AA8556194EEB8B00A67B56 /* linux_vst_support.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = linux_vst_support.h; path = ../ardour/linux_vst_support.h; sourceTree = SOURCE_ROOT; };
+ 43AA8557194EEB8B00A67B56 /* location_importer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = location_importer.h; path = ../ardour/location_importer.h; sourceTree = SOURCE_ROOT; };
+ 43AA8558194EEB8B00A67B56 /* location.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = location.h; path = ../ardour/location.h; sourceTree = SOURCE_ROOT; };
+ 43AA8559194EEB8B00A67B56 /* logcurve.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = logcurve.h; path = ../ardour/logcurve.h; sourceTree = SOURCE_ROOT; };
+ 43AA855A194EEB8B00A67B56 /* lv2_plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lv2_plugin.h; path = ../ardour/lv2_plugin.h; sourceTree = SOURCE_ROOT; };
+ 43AA855B194EEB8B00A67B56 /* lxvst_plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lxvst_plugin.h; path = ../ardour/lxvst_plugin.h; sourceTree = SOURCE_ROOT; };
+ 43AA855C194EEB8B00A67B56 /* meter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = meter.h; path = ../ardour/meter.h; sourceTree = SOURCE_ROOT; };
+ 43AA855D194EEB8B00A67B56 /* midi_automation_list_binder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_automation_list_binder.h; path = ../ardour/midi_automation_list_binder.h; sourceTree = SOURCE_ROOT; };
+ 43AA855E194EEB8B00A67B56 /* midi_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_buffer.h; path = ../ardour/midi_buffer.h; sourceTree = SOURCE_ROOT; };
+ 43AA855F194EEB8B00A67B56 /* midi_diskstream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_diskstream.h; path = ../ardour/midi_diskstream.h; sourceTree = SOURCE_ROOT; };
+ 43AA8560194EEB8B00A67B56 /* midi_model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_model.h; path = ../ardour/midi_model.h; sourceTree = SOURCE_ROOT; };
+ 43AA8561194EEB8B00A67B56 /* midi_operator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_operator.h; path = ../ardour/midi_operator.h; sourceTree = SOURCE_ROOT; };
+ 43AA8562194EEB8B00A67B56 /* midi_patch_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_patch_manager.h; path = ../ardour/midi_patch_manager.h; sourceTree = SOURCE_ROOT; };
+ 43AA8563194EEB8B00A67B56 /* midi_playlist_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_playlist_source.h; path = ../ardour/midi_playlist_source.h; sourceTree = SOURCE_ROOT; };
+ 43AA8564194EEB8B00A67B56 /* midi_playlist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_playlist.h; path = ../ardour/midi_playlist.h; sourceTree = SOURCE_ROOT; };
+ 43AA8565194EEB8B00A67B56 /* midi_port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_port.h; path = ../ardour/midi_port.h; sourceTree = SOURCE_ROOT; };
+ 43AA8566194EEB8B00A67B56 /* midi_region.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_region.h; path = ../ardour/midi_region.h; sourceTree = SOURCE_ROOT; };
+ 43AA8567194EEB8B00A67B56 /* midi_ring_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_ring_buffer.h; path = ../ardour/midi_ring_buffer.h; sourceTree = SOURCE_ROOT; };
+ 43AA8568194EEB8B00A67B56 /* midi_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_source.h; path = ../ardour/midi_source.h; sourceTree = SOURCE_ROOT; };
+ 43AA8569194EEB8B00A67B56 /* midi_state_tracker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_state_tracker.h; path = ../ardour/midi_state_tracker.h; sourceTree = SOURCE_ROOT; };
+ 43AA856A194EEB8B00A67B56 /* midi_stretch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_stretch.h; path = ../ardour/midi_stretch.h; sourceTree = SOURCE_ROOT; };
+ 43AA856B194EEB8B00A67B56 /* midi_track.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_track.h; path = ../ardour/midi_track.h; sourceTree = SOURCE_ROOT; };
+ 43AA856C194EEB8B00A67B56 /* midi_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midi_ui.h; path = ../ardour/midi_ui.h; sourceTree = SOURCE_ROOT; };
+ 43AA856D194EEB8B00A67B56 /* midiport_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midiport_manager.h; path = ../ardour/midiport_manager.h; sourceTree = SOURCE_ROOT; };
+ 43AA856E194EEB8B00A67B56 /* mix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mix.h; path = ../ardour/mix.h; sourceTree = SOURCE_ROOT; };
+ 43AA856F194EEB8B00A67B56 /* monitor_processor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = monitor_processor.h; path = ../ardour/monitor_processor.h; sourceTree = SOURCE_ROOT; };
+ 43AA8570194EEB8B00A67B56 /* movable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = movable.h; path = ../ardour/movable.h; sourceTree = SOURCE_ROOT; };
+ 43AA8571194EEB8B00A67B56 /* msvc_libardour.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = msvc_libardour.h; path = ../ardour/msvc_libardour.h; sourceTree = SOURCE_ROOT; };
+ 43AA8572194EEB8B00A67B56 /* mtdm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mtdm.h; path = ../ardour/mtdm.h; sourceTree = SOURCE_ROOT; };
+ 43AA8573194EEB8B00A67B56 /* mute_master.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mute_master.h; path = ../ardour/mute_master.h; sourceTree = SOURCE_ROOT; };
+ 43AA8574194EEB8B00A67B56 /* noise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = noise.h; path = ../ardour/noise.h; sourceTree = SOURCE_ROOT; };
+ 43AA8575194EEB8B00A67B56 /* onset_detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = onset_detector.h; path = ../ardour/onset_detector.h; sourceTree = SOURCE_ROOT; };
+ 43AA8576194EEB8B00A67B56 /* operations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = operations.h; path = ../ardour/operations.h; sourceTree = SOURCE_ROOT; };
+ 43AA8577194EEB8B00A67B56 /* pan_controllable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pan_controllable.h; path = ../ardour/pan_controllable.h; sourceTree = SOURCE_ROOT; };
+ 43AA8578194EEB8B00A67B56 /* pannable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pannable.h; path = ../ardour/pannable.h; sourceTree = SOURCE_ROOT; };
+ 43AA8579194EEB8B00A67B56 /* panner_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = panner_manager.h; path = ../ardour/panner_manager.h; sourceTree = SOURCE_ROOT; };
+ 43AA857A194EEB8B00A67B56 /* panner_shell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = panner_shell.h; path = ../ardour/panner_shell.h; sourceTree = SOURCE_ROOT; };
+ 43AA857B194EEB8B00A67B56 /* panner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = panner.h; path = ../ardour/panner.h; sourceTree = SOURCE_ROOT; };
+ 43AA857C194EEB8B00A67B56 /* pcm_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pcm_utils.h; path = ../ardour/pcm_utils.h; sourceTree = SOURCE_ROOT; };
+ 43AA857D194EEB8B00A67B56 /* peak.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = peak.h; path = ../ardour/peak.h; sourceTree = SOURCE_ROOT; };
+ 43AA857E194EEB8B00A67B56 /* pi_controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pi_controller.h; path = ../ardour/pi_controller.h; sourceTree = SOURCE_ROOT; };
+ 43AA857F194EEB8B00A67B56 /* pitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pitch.h; path = ../ardour/pitch.h; sourceTree = SOURCE_ROOT; };
+ 43AA8580194EEB8B00A67B56 /* playlist_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = playlist_factory.h; path = ../ardour/playlist_factory.h; sourceTree = SOURCE_ROOT; };
+ 43AA8581194EEB8B00A67B56 /* playlist_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = playlist_source.h; path = ../ardour/playlist_source.h; sourceTree = SOURCE_ROOT; };
+ 43AA8582194EEB8B00A67B56 /* playlist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = playlist.h; path = ../ardour/playlist.h; sourceTree = SOURCE_ROOT; };
+ 43AA8583194EEB8B00A67B56 /* plugin_insert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = plugin_insert.h; path = ../ardour/plugin_insert.h; sourceTree = SOURCE_ROOT; };
+ 43AA8584194EEB8B00A67B56 /* plugin_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = plugin_manager.h; path = ../ardour/plugin_manager.h; sourceTree = SOURCE_ROOT; };
+ 43AA8585194EEB8B00A67B56 /* plugin_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = plugin_types.h; path = ../ardour/plugin_types.h; sourceTree = SOURCE_ROOT; };
+ 43AA8586194EEB8B00A67B56 /* plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = plugin.h; path = ../ardour/plugin.h; sourceTree = SOURCE_ROOT; };
+ 43AA8587194EEB8B00A67B56 /* port_engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = port_engine.h; path = ../ardour/port_engine.h; sourceTree = SOURCE_ROOT; };
+ 43AA8588194EEB8B00A67B56 /* port_insert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = port_insert.h; path = ../ardour/port_insert.h; sourceTree = SOURCE_ROOT; };
+ 43AA8589194EEB8B00A67B56 /* port_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = port_manager.h; path = ../ardour/port_manager.h; sourceTree = SOURCE_ROOT; };
+ 43AA858A194EEB8B00A67B56 /* port_set.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = port_set.h; path = ../ardour/port_set.h; sourceTree = SOURCE_ROOT; };
+ 43AA858B194EEB8B00A67B56 /* port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = port.h; path = ../ardour/port.h; sourceTree = SOURCE_ROOT; };
+ 43AA858C194EEB8B00A67B56 /* process_thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = process_thread.h; path = ../ardour/process_thread.h; sourceTree = SOURCE_ROOT; };
+ 43AA858D194EEB8B00A67B56 /* processor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = processor.h; path = ../ardour/processor.h; sourceTree = SOURCE_ROOT; };
+ 43AA858E194EEB8B00A67B56 /* profile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = profile.h; path = ../ardour/profile.h; sourceTree = SOURCE_ROOT; };
+ 43AA858F194EEB8B00A67B56 /* progress.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = progress.h; path = ../ardour/progress.h; sourceTree = SOURCE_ROOT; };
+ 43AA8590194EEB8B00A67B56 /* proxy_controllable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = proxy_controllable.h; path = ../ardour/proxy_controllable.h; sourceTree = SOURCE_ROOT; };
+ 43AA8591194EEB8B00A67B56 /* public_diskstream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = public_diskstream.h; path = ../ardour/public_diskstream.h; sourceTree = SOURCE_ROOT; };
+ 43AA8592194EEB8B00A67B56 /* quantize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = quantize.h; path = ../ardour/quantize.h; sourceTree = SOURCE_ROOT; };
+ 43AA8593194EEB8B00A67B56 /* rb_effect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rb_effect.h; path = ../ardour/rb_effect.h; sourceTree = SOURCE_ROOT; };
+ 43AA8594194EEB8B00A67B56 /* rc_configuration_vars.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rc_configuration_vars.h; path = ../ardour/rc_configuration_vars.h; sourceTree = SOURCE_ROOT; };
+ 43AA8595194EEB8B00A67B56 /* rc_configuration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rc_configuration.h; path = ../ardour/rc_configuration.h; sourceTree = SOURCE_ROOT; };
+ 43AA8596194EEB8B00A67B56 /* readable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = readable.h; path = ../ardour/readable.h; sourceTree = SOURCE_ROOT; };
+ 43AA8597194EEB8B00A67B56 /* recent_sessions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = recent_sessions.h; path = ../ardour/recent_sessions.h; sourceTree = SOURCE_ROOT; };
+ 43AA8598194EEB8B00A67B56 /* region_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = region_factory.h; path = ../ardour/region_factory.h; sourceTree = SOURCE_ROOT; };
+ 43AA8599194EEB8B00A67B56 /* region_sorters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = region_sorters.h; path = ../ardour/region_sorters.h; sourceTree = SOURCE_ROOT; };
+ 43AA859A194EEB8B00A67B56 /* region.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = region.h; path = ../ardour/region.h; sourceTree = SOURCE_ROOT; };
+ 43AA859B194EEB8B00A67B56 /* resampled_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resampled_source.h; path = ../ardour/resampled_source.h; sourceTree = SOURCE_ROOT; };
+ 43AA859C194EEB8B00A67B56 /* return.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = return.h; path = ../ardour/return.h; sourceTree = SOURCE_ROOT; };
+ 43AA859D194EEB8B00A67B56 /* reverse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = reverse.h; path = ../ardour/reverse.h; sourceTree = SOURCE_ROOT; };
+ 43AA859E194EEB8B00A67B56 /* revision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = revision.h; path = ../ardour/revision.h; sourceTree = SOURCE_ROOT; };
+ 43AA859F194EEB8B00A67B56 /* route_graph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = route_graph.h; path = ../ardour/route_graph.h; sourceTree = SOURCE_ROOT; };
+ 43AA85A0194EEB8B00A67B56 /* route_group_member.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = route_group_member.h; path = ../ardour/route_group_member.h; sourceTree = SOURCE_ROOT; };
+ 43AA85A1194EEB8B00A67B56 /* route_group_specialized.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = route_group_specialized.h; path = ../ardour/route_group_specialized.h; sourceTree = SOURCE_ROOT; };
+ 43AA85A2194EEB8B00A67B56 /* route_group.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = route_group.h; path = ../ardour/route_group.h; sourceTree = SOURCE_ROOT; };
+ 43AA85A3194EEB8B00A67B56 /* route.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = route.h; path = ../ardour/route.h; sourceTree = SOURCE_ROOT; };
+ 43AA85A4194EEB8B00A67B56 /* runtime_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = runtime_functions.h; path = ../ardour/runtime_functions.h; sourceTree = SOURCE_ROOT; };
+ 43AA85A5194EEB8B00A67B56 /* search_paths.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = search_paths.h; path = ../ardour/search_paths.h; sourceTree = SOURCE_ROOT; };
+ 43AA85A6194EEB8B00A67B56 /* send.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = send.h; path = ../ardour/send.h; sourceTree = SOURCE_ROOT; };
+ 43AA85A7194EEB8B00A67B56 /* session_configuration_vars.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_configuration_vars.h; path = ../ardour/session_configuration_vars.h; sourceTree = SOURCE_ROOT; };
+ 43AA85A8194EEB8B00A67B56 /* session_configuration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_configuration.h; path = ../ardour/session_configuration.h; sourceTree = SOURCE_ROOT; };
+ 43AA85A9194EEB8B00A67B56 /* session_directory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_directory.h; path = ../ardour/session_directory.h; sourceTree = SOURCE_ROOT; };
+ 43AA85AA194EEB8B00A67B56 /* session_event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_event.h; path = ../ardour/session_event.h; sourceTree = SOURCE_ROOT; };
+ 43AA85AB194EEB8B00A67B56 /* session_handle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_handle.h; path = ../ardour/session_handle.h; sourceTree = SOURCE_ROOT; };
+ 43AA85AC194EEB8B00A67B56 /* session_metadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_metadata.h; path = ../ardour/session_metadata.h; sourceTree = SOURCE_ROOT; };
+ 43AA85AD194EEB8B00A67B56 /* session_object.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_object.h; path = ../ardour/session_object.h; sourceTree = SOURCE_ROOT; };
+ 43AA85AE194EEB8B00A67B56 /* session_playlist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_playlist.h; path = ../ardour/session_playlist.h; sourceTree = SOURCE_ROOT; };
+ 43AA85AF194EEB8B00A67B56 /* session_playlists.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_playlists.h; path = ../ardour/session_playlists.h; sourceTree = SOURCE_ROOT; };
+ 43AA85B0194EEB8B00A67B56 /* session_route.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_route.h; path = ../ardour/session_route.h; sourceTree = SOURCE_ROOT; };
+ 43AA85B1194EEB8B00A67B56 /* session_state_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_state_utils.h; path = ../ardour/session_state_utils.h; sourceTree = SOURCE_ROOT; };
+ 43AA85B2194EEB8B00A67B56 /* session_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session_utils.h; path = ../ardour/session_utils.h; sourceTree = SOURCE_ROOT; };
+ 43AA85B3194EEB8B00A67B56 /* session.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = session.h; path = ../ardour/session.h; sourceTree = SOURCE_ROOT; };
+ 43AA85B4194EEB8B00A67B56 /* silentfilesource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = silentfilesource.h; path = ../ardour/silentfilesource.h; sourceTree = SOURCE_ROOT; };
+ 43AA85B5194EEB8B00A67B56 /* slave.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = slave.h; path = ../ardour/slave.h; sourceTree = SOURCE_ROOT; };
+ 43AA85B6194EEB8B00A67B56 /* smf_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = smf_source.h; path = ../ardour/smf_source.h; sourceTree = SOURCE_ROOT; };
+ 43AA85B7194EEB8B00A67B56 /* sndfile_helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sndfile_helpers.h; path = ../ardour/sndfile_helpers.h; sourceTree = SOURCE_ROOT; };
+ 43AA85B8194EEB8B00A67B56 /* sndfileimportable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sndfileimportable.h; path = ../ardour/sndfileimportable.h; sourceTree = SOURCE_ROOT; };
+ 43AA85B9194EEB8B00A67B56 /* sndfilesource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sndfilesource.h; path = ../ardour/sndfilesource.h; sourceTree = SOURCE_ROOT; };
+ 43AA85BA194EEB8B00A67B56 /* soundseq.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = soundseq.h; path = ../ardour/soundseq.h; sourceTree = SOURCE_ROOT; };
+ 43AA85BB194EEB8B00A67B56 /* source_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = source_factory.h; path = ../ardour/source_factory.h; sourceTree = SOURCE_ROOT; };
+ 43AA85BC194EEB8B00A67B56 /* source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = source.h; path = ../ardour/source.h; sourceTree = SOURCE_ROOT; };
+ 43AA85BD194EEB8B00A67B56 /* speaker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = speaker.h; path = ../ardour/speaker.h; sourceTree = SOURCE_ROOT; };
+ 43AA85BE194EEB8B00A67B56 /* speakers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = speakers.h; path = ../ardour/speakers.h; sourceTree = SOURCE_ROOT; };
+ 43AA85BF194EEB8B00A67B56 /* spline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = spline.h; path = ../ardour/spline.h; sourceTree = SOURCE_ROOT; };
+ 43AA85C0194EEB8B00A67B56 /* srcfilesource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = srcfilesource.h; path = ../ardour/srcfilesource.h; sourceTree = SOURCE_ROOT; };
+ 43AA85C1194EEB8B00A67B56 /* stretch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stretch.h; path = ../ardour/stretch.h; sourceTree = SOURCE_ROOT; };
+ 43AA85C2194EEB8B00A67B56 /* strip_silence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = strip_silence.h; path = ../ardour/strip_silence.h; sourceTree = SOURCE_ROOT; };
+ 43AA85C3194EEB8B00A67B56 /* system_exec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = system_exec.h; path = ../ardour/system_exec.h; sourceTree = SOURCE_ROOT; };
+ 43AA85C4194EEB8B00A67B56 /* tape_file_matcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tape_file_matcher.h; path = ../ardour/tape_file_matcher.h; sourceTree = SOURCE_ROOT; };
+ 43AA85C5194EEB8B00A67B56 /* template_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = template_utils.h; path = ../ardour/template_utils.h; sourceTree = SOURCE_ROOT; };
+ 43AA85C6194EEB8B00A67B56 /* tempo_map_importer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tempo_map_importer.h; path = ../ardour/tempo_map_importer.h; sourceTree = SOURCE_ROOT; };
+ 43AA85C7194EEB8B00A67B56 /* tempo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tempo.h; path = ../ardour/tempo.h; sourceTree = SOURCE_ROOT; };
+ 43AA85C8194EEB8B00A67B56 /* thread_buffers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = thread_buffers.h; path = ../ardour/thread_buffers.h; sourceTree = SOURCE_ROOT; };
+ 43AA85C9194EEB8B00A67B56 /* ticker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ticker.h; path = ../ardour/ticker.h; sourceTree = SOURCE_ROOT; };
+ 43AA85CA194EEB8B00A67B56 /* timecode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = timecode.h; path = ../ardour/timecode.h; sourceTree = SOURCE_ROOT; };
+ 43AA85CB194EEB8B00A67B56 /* timefx_request.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = timefx_request.h; path = ../ardour/timefx_request.h; sourceTree = SOURCE_ROOT; };
+ 43AA85CC194EEB8B00A67B56 /* timestamps.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = timestamps.h; path = ../ardour/timestamps.h; sourceTree = SOURCE_ROOT; };
+ 43AA85CD194EEB8B00A67B56 /* track.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = track.h; path = ../ardour/track.h; sourceTree = SOURCE_ROOT; };
+ 43AA85CE194EEB8B00A67B56 /* transient_detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = transient_detector.h; path = ../ardour/transient_detector.h; sourceTree = SOURCE_ROOT; };
+ 43AA85CF194EEB8B00A67B56 /* trimmable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = trimmable.h; path = ../ardour/trimmable.h; sourceTree = SOURCE_ROOT; };
+ 43AA85D0194EEB8B00A67B56 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../ardour/types.h; sourceTree = SOURCE_ROOT; };
+ 43AA85D1194EEB8B00A67B56 /* unknown_processor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = unknown_processor.h; path = ../ardour/unknown_processor.h; sourceTree = SOURCE_ROOT; };
+ 43AA85D2194EEB8B00A67B56 /* uri_map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = uri_map.h; path = ../ardour/uri_map.h; sourceTree = SOURCE_ROOT; };
+ 43AA85D3194EEB8B00A67B56 /* user_bundle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = user_bundle.h; path = ../ardour/user_bundle.h; sourceTree = SOURCE_ROOT; };
+ 43AA85D4194EEB8B00A67B56 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../ardour/utils.h; sourceTree = SOURCE_ROOT; };
+ 43AA85D5194EEB8B00A67B56 /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = version.h; path = ../ardour/version.h; sourceTree = SOURCE_ROOT; };
+ 43AA85D6194EEB8B00A67B56 /* vst_info_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vst_info_file.h; path = ../ardour/vst_info_file.h; sourceTree = SOURCE_ROOT; };
+ 43AA85D7194EEB8B00A67B56 /* vst_plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vst_plugin.h; path = ../ardour/vst_plugin.h; sourceTree = SOURCE_ROOT; };
+ 43AA85D8194EEB8B00A67B56 /* vst_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vst_types.h; path = ../ardour/vst_types.h; sourceTree = SOURCE_ROOT; };
+ 43AA85D9194EEB8B00A67B56 /* vumeterdsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vumeterdsp.h; path = ../ardour/vumeterdsp.h; sourceTree = SOURCE_ROOT; };
+ 43AA85DA194EEB8B00A67B56 /* windows_vst_plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = windows_vst_plugin.h; path = ../ardour/windows_vst_plugin.h; sourceTree = SOURCE_ROOT; };
+ 43AA85DB194EEB8B00A67B56 /* worker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = worker.h; path = ../ardour/worker.h; sourceTree = SOURCE_ROOT; };
+ 43AA86C5194EEBAF00A67B56 /* aeffectx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aeffectx.h; path = ../ardour/vestige/aeffectx.h; sourceTree = SOURCE_ROOT; };
+ 43AA86C8194EEBF100A67B56 /* run-profiling.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "run-profiling.sh"; path = "../run-profiling.sh"; sourceTree = SOURCE_ROOT; };
+ 43AA86C9194EEBF100A67B56 /* run-session-tests.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "run-session-tests.sh"; path = "../run-session-tests.sh"; sourceTree = SOURCE_ROOT; };
+ 43AA86CA194EEBF100A67B56 /* run-tests.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "run-tests.sh"; path = "../run-tests.sh"; sourceTree = SOURCE_ROOT; };
+ 43AA86CB194EEBF100A67B56 /* test-env.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "test-env.sh"; path = "../test-env.sh"; sourceTree = SOURCE_ROOT; };
+ 43AA86CC194EEBF100A67B56 /* wscript */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = wscript; path = ../wscript; sourceTree = SOURCE_ROOT; };
+ 43AA86CD194EEC1400A67B56 /* gettext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gettext.h; path = ../gettext.h; sourceTree = SOURCE_ROOT; };
+ 43AA86CE194EEC1400A67B56 /* lv2_evbuf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lv2_evbuf.h; path = ../lv2_evbuf.h; sourceTree = SOURCE_ROOT; };
+ 43AA86CF194EEC1400A67B56 /* rdff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rdff.h; path = ../rdff.h; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 43AA82A6194EEAAF00A67B56 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 432652FB194EF72700BEFB46 /* ardour */ = {
+ isa = PBXGroup;
+ children = (
+ 432652FC194EF73C00BEFB46 /* amp.h */,
+ 432652FD194EF73C00BEFB46 /* analyser.h */,
+ 432652FE194EF73C00BEFB46 /* ardour.h */,
+ 432652FF194EF73C00BEFB46 /* async_midi_port.h */,
+ 43265300194EF73C00BEFB46 /* audio_backend.h */,
+ 43265301194EF73C00BEFB46 /* audio_buffer.h */,
+ 43265302194EF73C00BEFB46 /* audio_diskstream.h */,
+ 43265303194EF73C00BEFB46 /* audio_library.h */,
+ 43265304194EF73C00BEFB46 /* audio_playlist_importer.h */,
+ 43265305194EF73C00BEFB46 /* audio_playlist_source.h */,
+ 43265306194EF73C00BEFB46 /* audio_port.h */,
+ 43265307194EF73C00BEFB46 /* audio_region_importer.h */,
+ 43265308194EF73C00BEFB46 /* audio_track.h */,
+ 43265309194EF73C00BEFB46 /* audio_track_importer.h */,
+ 4326530A194EF73C00BEFB46 /* audio_unit.h */,
+ 4326530B194EF73C00BEFB46 /* audioanalyser.h */,
+ 4326530C194EF73C00BEFB46 /* audioengine.h */,
+ 4326530D194EF73C00BEFB46 /* audiofile_tagger.h */,
+ 4326530E194EF73C00BEFB46 /* audiofilesource.h */,
+ 4326530F194EF73C00BEFB46 /* audioplaylist.h */,
+ 43265310194EF73C00BEFB46 /* audioregion.h */,
+ 43265311194EF73C00BEFB46 /* audiosource.h */,
+ 43265312194EF73C00BEFB46 /* auditioner.h */,
+ 43265313194EF73C00BEFB46 /* auto_bundle.h */,
+ 43265314194EF73C00BEFB46 /* automatable.h */,
+ 43265315194EF73C00BEFB46 /* automatable_sequence.h */,
+ 43265316194EF73C00BEFB46 /* automation_control.h */,
+ 43265317194EF73C00BEFB46 /* automation_list.h */,
+ 43265318194EF73C00BEFB46 /* automation_watch.h */,
+ 43265319194EF73C00BEFB46 /* beats_frames_converter.h */,
+ 4326531A194EF73C00BEFB46 /* broadcast_info.h */,
+ 4326531B194EF73C00BEFB46 /* buffer.h */,
+ 4326531C194EF73C00BEFB46 /* buffer_manager.h */,
+ 4326531D194EF73C00BEFB46 /* buffer_set.h */,
+ 4326531E194EF73C00BEFB46 /* bundle.h */,
+ 4326531F194EF73C00BEFB46 /* butler.h */,
+ 43265320194EF73C00BEFB46 /* caimportable.h */,
+ 43265321194EF73C00BEFB46 /* capturing_processor.h */,
+ 43265322194EF73C00BEFB46 /* chan_count.h */,
+ 43265323194EF73C00BEFB46 /* chan_mapping.h */,
+ 43265324194EF73C00BEFB46 /* click.h */,
+ 43265325194EF73C00BEFB46 /* comparable_shared_ptr.h */,
+ 43265326194EF73C00BEFB46 /* configuration.h */,
+ 43265327194EF73C00BEFB46 /* configuration_variable.h */,
+ 43265328194EF73C00BEFB46 /* control_protocol_manager.h */,
+ 43265329194EF73C00BEFB46 /* coreaudiosource.h */,
+ 4326532A194EF73C00BEFB46 /* cycle_timer.h */,
+ 4326532B194EF73C00BEFB46 /* cycles.h */,
+ 4326532C194EF73C00BEFB46 /* data_type.h */,
+ 4326532D194EF73C00BEFB46 /* dB.h */,
+ 4326532E194EF73C00BEFB46 /* debug.h */,
+ 4326532F194EF73C00BEFB46 /* delivery.h */,
+ 43265330194EF73C00BEFB46 /* directory_names.h */,
+ 43265331194EF73C00BEFB46 /* diskstream.h */,
+ 43265332194EF73C00BEFB46 /* element_import_handler.h */,
+ 43265333194EF73C00BEFB46 /* element_importer.h */,
+ 43265334194EF73C00BEFB46 /* engine_state_controller.h */,
+ 43265335194EF73C00BEFB46 /* event_type_map.h */,
+ 43265336194EF73C00BEFB46 /* export_channel.h */,
+ 43265337194EF73C00BEFB46 /* export_channel_configuration.h */,
+ 43265338194EF73C00BEFB46 /* export_failed.h */,
+ 43265339194EF73C00BEFB46 /* export_filename.h */,
+ 4326533A194EF73C00BEFB46 /* export_format_base.h */,
+ 4326533B194EF73C00BEFB46 /* export_format_compatibility.h */,
+ 4326533C194EF73C00BEFB46 /* export_format_manager.h */,
+ 4326533D194EF73C00BEFB46 /* export_format_specification.h */,
+ 4326533E194EF73C00BEFB46 /* export_formats.h */,
+ 4326533F194EF73C00BEFB46 /* export_graph_builder.h */,
+ 43265340194EF73C00BEFB46 /* export_handler.h */,
+ 43265341194EF73C00BEFB46 /* export_multiplication.h */,
+ 43265342194EF73C00BEFB46 /* export_pointers.h */,
+ 43265343194EF73C00BEFB46 /* export_preset.h */,
+ 43265344194EF73C00BEFB46 /* export_profile_manager.h */,
+ 43265345194EF73C00BEFB46 /* export_status.h */,
+ 43265346194EF73C00BEFB46 /* export_timespan.h */,
+ 43265347194EF73C00BEFB46 /* file_source.h */,
+ 43265348194EF73C00BEFB46 /* filename_extensions.h */,
+ 43265349194EF73C00BEFB46 /* filesystem_paths.h */,
+ 4326534A194EF73C00BEFB46 /* filter.h */,
+ 4326534B194EF73C00BEFB46 /* graph.h */,
+ 4326534C194EF73C00BEFB46 /* graphnode.h */,
+ 4326534D194EF73C00BEFB46 /* iec1ppmdsp.h */,
+ 4326534E194EF73C00BEFB46 /* iec2ppmdsp.h */,
+ 4326534F194EF73C00BEFB46 /* import_status.h */,
+ 43265350194EF73C00BEFB46 /* importable_source.h */,
+ 43265351194EF73C00BEFB46 /* instrument_info.h */,
+ 43265352194EF73C00BEFB46 /* internal_return.h */,
+ 43265353194EF73C00BEFB46 /* internal_send.h */,
+ 43265354194EF73C00BEFB46 /* interpolation.h */,
+ 43265355194EF73C00BEFB46 /* interthread_info.h */,
+ 43265356194EF73C00BEFB46 /* io.h */,
+ 43265357194EF73C00BEFB46 /* io_processor.h */,
+ 43265358194EF73C00BEFB46 /* jack_utils.h */,
+ 43265359194EF73C00BEFB46 /* kmeterdsp.h */,
+ 4326535A194EF73C00BEFB46 /* ladspa.h */,
+ 4326535B194EF73C00BEFB46 /* ladspa_plugin.h */,
+ 4326535C194EF73C00BEFB46 /* latent.h */,
+ 4326535D194EF73C00BEFB46 /* libardour_visibility.h */,
+ 4326535E194EF73C00BEFB46 /* linux_vst_support.h */,
+ 4326535F194EF73C00BEFB46 /* location.h */,
+ 43265360194EF73C00BEFB46 /* location_importer.h */,
+ 43265361194EF73C00BEFB46 /* logcurve.h */,
+ 43265362194EF73C00BEFB46 /* lv2_plugin.h */,
+ 43265363194EF73C00BEFB46 /* lxvst_plugin.h */,
+ 43265364194EF73C00BEFB46 /* meter.h */,
+ 43265365194EF73C00BEFB46 /* midi_automation_list_binder.h */,
+ 43265366194EF73C00BEFB46 /* midi_buffer.h */,
+ 43265367194EF73C00BEFB46 /* midi_diskstream.h */,
+ 43265368194EF73C00BEFB46 /* midi_model.h */,
+ 43265369194EF73C00BEFB46 /* midi_operator.h */,
+ 4326536A194EF73C00BEFB46 /* midi_patch_manager.h */,
+ 4326536B194EF73C00BEFB46 /* midi_playlist.h */,
+ 4326536C194EF73C00BEFB46 /* midi_playlist_source.h */,
+ 4326536D194EF73C00BEFB46 /* midi_port.h */,
+ 4326536E194EF73C00BEFB46 /* midi_region.h */,
+ 4326536F194EF73C00BEFB46 /* midi_ring_buffer.h */,
+ 43265370194EF73C00BEFB46 /* midi_source.h */,
+ 43265371194EF73C00BEFB46 /* midi_state_tracker.h */,
+ 43265372194EF73C00BEFB46 /* midi_stretch.h */,
+ 43265373194EF73C00BEFB46 /* midi_track.h */,
+ 43265374194EF73C00BEFB46 /* midi_ui.h */,
+ 43265375194EF73C00BEFB46 /* midiport_manager.h */,
+ 43265376194EF73C00BEFB46 /* mix.h */,
+ 43265377194EF73C00BEFB46 /* monitor_processor.h */,
+ 43265378194EF73C00BEFB46 /* movable.h */,
+ 43265379194EF73C00BEFB46 /* msvc_libardour.h */,
+ 4326537A194EF73C00BEFB46 /* mtdm.h */,
+ 4326537B194EF73C00BEFB46 /* mute_master.h */,
+ 4326537C194EF73C00BEFB46 /* noise.h */,
+ 4326537D194EF73C00BEFB46 /* onset_detector.h */,
+ 4326537E194EF73C00BEFB46 /* operations.h */,
+ 4326537F194EF73C00BEFB46 /* pan_controllable.h */,
+ 43265380194EF73C00BEFB46 /* pannable.h */,
+ 43265381194EF73C00BEFB46 /* panner.h */,
+ 43265382194EF73C00BEFB46 /* panner_manager.h */,
+ 43265383194EF73C00BEFB46 /* panner_shell.h */,
+ 43265384194EF73C00BEFB46 /* pcm_utils.h */,
+ 43265385194EF73C00BEFB46 /* peak.h */,
+ 43265386194EF73C00BEFB46 /* pi_controller.h */,
+ 43265387194EF73C00BEFB46 /* pitch.h */,
+ 43265388194EF73C00BEFB46 /* playlist.h */,
+ 43265389194EF73C00BEFB46 /* playlist_factory.h */,
+ 4326538A194EF73C00BEFB46 /* playlist_source.h */,
+ 4326538B194EF73C00BEFB46 /* plugin.h */,
+ 4326538C194EF73C00BEFB46 /* plugin_insert.h */,
+ 4326538D194EF73C00BEFB46 /* plugin_manager.h */,
+ 4326538E194EF73C00BEFB46 /* plugin_types.h */,
+ 4326538F194EF73C00BEFB46 /* port.h */,
+ 43265390194EF73C00BEFB46 /* port_engine.h */,
+ 43265391194EF73C00BEFB46 /* port_insert.h */,
+ 43265392194EF73C00BEFB46 /* port_manager.h */,
+ 43265393194EF73C00BEFB46 /* port_set.h */,
+ 43265394194EF73C00BEFB46 /* process_thread.h */,
+ 43265395194EF73C00BEFB46 /* processor.h */,
+ 43265396194EF73C00BEFB46 /* profile.h */,
+ 43265397194EF73C00BEFB46 /* progress.h */,
+ 43265398194EF73C00BEFB46 /* proxy_controllable.h */,
+ 43265399194EF73C00BEFB46 /* public_diskstream.h */,
+ 4326539A194EF73C00BEFB46 /* quantize.h */,
+ 4326539B194EF73C00BEFB46 /* rb_effect.h */,
+ 4326539C194EF73C00BEFB46 /* rc_configuration.h */,
+ 4326539D194EF73C00BEFB46 /* rc_configuration_vars.h */,
+ 4326539E194EF73C00BEFB46 /* readable.h */,
+ 4326539F194EF73C00BEFB46 /* recent_sessions.h */,
+ 432653A0194EF73C00BEFB46 /* region.h */,
+ 432653A1194EF73C00BEFB46 /* region_factory.h */,
+ 432653A2194EF73C00BEFB46 /* region_sorters.h */,
+ 432653A3194EF73C00BEFB46 /* resampled_source.h */,
+ 432653A4194EF73C00BEFB46 /* return.h */,
+ 432653A5194EF73C00BEFB46 /* reverse.h */,
+ 432653A6194EF73C00BEFB46 /* revision.h */,
+ 432653A7194EF73C00BEFB46 /* route.h */,
+ 432653A8194EF73C00BEFB46 /* route_graph.h */,
+ 432653A9194EF73C00BEFB46 /* route_group.h */,
+ 432653AA194EF73C00BEFB46 /* route_group_member.h */,
+ 432653AB194EF73C00BEFB46 /* route_group_specialized.h */,
+ 432653AC194EF73C00BEFB46 /* runtime_functions.h */,
+ 432653AD194EF73C00BEFB46 /* search_paths.h */,
+ 432653AE194EF73C00BEFB46 /* send.h */,
+ 432653AF194EF73C00BEFB46 /* session.h */,
+ 432653B0194EF73C00BEFB46 /* session_configuration.h */,
+ 432653B1194EF73C00BEFB46 /* session_configuration_vars.h */,
+ 432653B2194EF73C00BEFB46 /* session_directory.h */,
+ 432653B3194EF73C00BEFB46 /* session_event.h */,
+ 432653B4194EF73C00BEFB46 /* session_handle.h */,
+ 432653B5194EF73C00BEFB46 /* session_metadata.h */,
+ 432653B6194EF73C00BEFB46 /* session_object.h */,
+ 432653B7194EF73C00BEFB46 /* session_playlist.h */,
+ 432653B8194EF73C00BEFB46 /* session_playlists.h */,
+ 432653B9194EF73C00BEFB46 /* session_route.h */,
+ 432653BA194EF73C00BEFB46 /* session_state_utils.h */,
+ 432653BB194EF73C00BEFB46 /* session_utils.h */,
+ 432653BC194EF73C00BEFB46 /* silentfilesource.h */,
+ 432653BD194EF73C00BEFB46 /* slave.h */,
+ 432653BE194EF73C00BEFB46 /* smf_source.h */,
+ 432653BF194EF73C00BEFB46 /* sndfile_helpers.h */,
+ 432653C0194EF73C00BEFB46 /* sndfileimportable.h */,
+ 432653C1194EF73C00BEFB46 /* sndfilesource.h */,
+ 432653C2194EF73C00BEFB46 /* soundseq.h */,
+ 432653C3194EF73C00BEFB46 /* source.h */,
+ 432653C4194EF73C00BEFB46 /* source_factory.h */,
+ 432653C5194EF73C00BEFB46 /* speaker.h */,
+ 432653C6194EF73C00BEFB46 /* speakers.h */,
+ 432653C7194EF73C00BEFB46 /* spline.h */,
+ 432653C8194EF73C00BEFB46 /* srcfilesource.h */,
+ 432653C9194EF73C00BEFB46 /* stretch.h */,
+ 432653CA194EF73C00BEFB46 /* strip_silence.h */,
+ 432653CB194EF73C00BEFB46 /* system_exec.h */,
+ 432653CC194EF73C00BEFB46 /* tape_file_matcher.h */,
+ 432653CD194EF73C00BEFB46 /* template_utils.h */,
+ 432653CE194EF73C00BEFB46 /* tempo.h */,
+ 432653CF194EF73C00BEFB46 /* tempo_map_importer.h */,
+ 432653D0194EF73C00BEFB46 /* thread_buffers.h */,
+ 432653D1194EF73C00BEFB46 /* ticker.h */,
+ 432653D2194EF73C00BEFB46 /* timecode.h */,
+ 432653D3194EF73C00BEFB46 /* timefx_request.h */,
+ 432653D4194EF73C00BEFB46 /* timestamps.h */,
+ 432653D5194EF73C00BEFB46 /* track.h */,
+ 432653D6194EF73C00BEFB46 /* transient_detector.h */,
+ 432653D7194EF73C00BEFB46 /* trimmable.h */,
+ 432653D8194EF73C00BEFB46 /* types.h */,
+ 432653D9194EF73C00BEFB46 /* unknown_processor.h */,
+ 432653DA194EF73C00BEFB46 /* uri_map.h */,
+ 432653DB194EF73C00BEFB46 /* user_bundle.h */,
+ 432653DC194EF73C00BEFB46 /* utils.h */,
+ 432653DD194EF73C00BEFB46 /* version.h */,
+ 432653DE194EF73C00BEFB46 /* vestige */,
+ 432653E0194EF73C00BEFB46 /* vst_info_file.h */,
+ 432653E1194EF73C00BEFB46 /* vst_plugin.h */,
+ 432653E2194EF73C00BEFB46 /* vst_types.h */,
+ 432653E3194EF73C00BEFB46 /* vumeterdsp.h */,
+ 432653E4194EF73C00BEFB46 /* windows_vst_plugin.h */,
+ 432653E5194EF73C00BEFB46 /* worker.h */,
+ );
+ name = ardour;
+ path = ../ardour;
+ sourceTree = "<group>";
+ };
+ 432653DE194EF73C00BEFB46 /* vestige */ = {
+ isa = PBXGroup;
+ children = (
+ 432653DF194EF73C00BEFB46 /* aeffectx.h */,
+ );
+ path = vestige;
+ sourceTree = "<group>";
+ };
+ 432859EA1A10F436006C3E03 /* macosx */ = {
+ isa = PBXGroup;
+ children = (
+ 432859EB1A10F436006C3E03 /* libardour.xcodeproj */,
+ );
+ name = macosx;
+ sourceTree = "<group>";
+ };
+ 432859EC1A10F436006C3E03 /* Products */ = {
+ isa = PBXGroup;
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 43AA8295194EEA6F00A67B56 = {
+ isa = PBXGroup;
+ children = (
+ 43AA86C7194EEBC300A67B56 /* scripts */,
+ 43AA84F3194EEB6F00A67B56 /* headers */,
+ 43AA8458194EEB5F00A67B56 /* test */,
+ 43AA82AD194EEACB00A67B56 /* source */,
+ 43AA829F194EEA6F00A67B56 /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ 43AA829F194EEA6F00A67B56 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA82A9194EEAAF00A67B56 /* liblibardour.dylib */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 43AA82AD194EEACB00A67B56 /* source */ = {
+ isa = PBXGroup;
+ children = (
+ 432859EA1A10F436006C3E03 /* macosx */,
+ 432859EE1A10F436006C3E03 /* midi_scene_change.cc */,
+ 432859EF1A10F436006C3E03 /* midi_scene_changer.cc */,
+ 432859F01A10F436006C3E03 /* mididm.cc */,
+ 432859F11A10F436006C3E03 /* scene_change.cc */,
+ 432859F21A10F436006C3E03 /* soundcloud_upload.cc */,
+ 43AA82AE194EEB2600A67B56 /* amp.cc */,
+ 43AA82AF194EEB2600A67B56 /* analyser.cc */,
+ 43AA82B0194EEB2600A67B56 /* async_midi_port.cc */,
+ 43AA82B1194EEB2600A67B56 /* audio_buffer.cc */,
+ 43AA82B2194EEB2600A67B56 /* audio_diskstream.cc */,
+ 43AA82B3194EEB2600A67B56 /* audio_library.cc */,
+ 43AA82B4194EEB2600A67B56 /* audio_playlist_importer.cc */,
+ 43AA82B5194EEB2600A67B56 /* audio_playlist_source.cc */,
+ 43AA82B6194EEB2600A67B56 /* audio_playlist.cc */,
+ 43AA82B7194EEB2600A67B56 /* audio_port.cc */,
+ 43AA82B8194EEB2600A67B56 /* audio_region_importer.cc */,
+ 43AA82B9194EEB2600A67B56 /* audio_track_importer.cc */,
+ 43AA82BA194EEB2600A67B56 /* audio_track.cc */,
+ 43AA82BB194EEB2600A67B56 /* audio_unit.cc */,
+ 43AA82BC194EEB2600A67B56 /* audioanalyser.cc */,
+ 43AA82BD194EEB2600A67B56 /* audioengine.cc */,
+ 43AA82BE194EEB2600A67B56 /* audiofile_tagger.cc */,
+ 43AA82BF194EEB2600A67B56 /* audiofilesource.cc */,
+ 43AA82C0194EEB2600A67B56 /* audioregion.cc */,
+ 43AA82C1194EEB2600A67B56 /* audiosource.cc */,
+ 43AA82C2194EEB2600A67B56 /* auditioner.cc */,
+ 43AA82C3194EEB2600A67B56 /* auto_bundle.cc */,
+ 43AA82C4194EEB2600A67B56 /* automatable.cc */,
+ 43AA82C5194EEB2600A67B56 /* automation_control.cc */,
+ 43AA82C6194EEB2600A67B56 /* automation_list.cc */,
+ 43AA82C7194EEB2600A67B56 /* automation_watch.cc */,
+ 43AA82C8194EEB2600A67B56 /* automation.cc */,
+ 43AA82C9194EEB2600A67B56 /* beats_frames_converter.cc */,
+ 43AA82CA194EEB2600A67B56 /* broadcast_info.cc */,
+ 43AA82CB194EEB2600A67B56 /* buffer_manager.cc */,
+ 43AA82CC194EEB2600A67B56 /* buffer_set.cc */,
+ 43AA82CD194EEB2600A67B56 /* buffer.cc */,
+ 43AA82CE194EEB2600A67B56 /* bundle.cc */,
+ 43AA82CF194EEB2600A67B56 /* butler.cc */,
+ 43AA82D0194EEB2600A67B56 /* caimportable.cc */,
+ 43AA82D1194EEB2600A67B56 /* capturing_processor.cc */,
+ 43AA82D2194EEB2600A67B56 /* chan_count.cc */,
+ 43AA82D3194EEB2600A67B56 /* chan_mapping.cc */,
+ 43AA82D4194EEB2600A67B56 /* config_text.cc */,
+ 43AA82D5194EEB2600A67B56 /* configuration.cc */,
+ 43AA82D6194EEB2600A67B56 /* control_protocol_manager.cc */,
+ 43AA82D7194EEB2600A67B56 /* coreaudiosource.cc */,
+ 43AA82D8194EEB2600A67B56 /* cycle_timer.cc */,
+ 43AA82D9194EEB2600A67B56 /* data_type.cc */,
+ 43AA82DA194EEB2600A67B56 /* debug.cc */,
+ 43AA82DB194EEB2600A67B56 /* default_click.cc */,
+ 43AA82DC194EEB2600A67B56 /* delivery.cc */,
+ 43AA82DD194EEB2600A67B56 /* directory_names.cc */,
+ 43AA82DE194EEB2600A67B56 /* diskstream.cc */,
+ 43AA82DF194EEB2600A67B56 /* element_import_handler.cc */,
+ 43AA82E0194EEB2600A67B56 /* element_importer.cc */,
+ 43AA82E1194EEB2600A67B56 /* engine_slave.cc */,
+ 43AA82E2194EEB2600A67B56 /* engine_state_controller.cc */,
+ 43AA82E3194EEB2600A67B56 /* enums.cc */,
+ 43AA82E4194EEB2600A67B56 /* event_type_map.cc */,
+ 43AA82E5194EEB2600A67B56 /* export_channel_configuration.cc */,
+ 43AA82E6194EEB2600A67B56 /* export_channel.cc */,
+ 43AA82E7194EEB2600A67B56 /* export_failed.cc */,
+ 43AA82E8194EEB2600A67B56 /* export_filename.cc */,
+ 43AA82E9194EEB2600A67B56 /* export_format_base.cc */,
+ 43AA82EA194EEB2600A67B56 /* export_format_manager.cc */,
+ 43AA82EB194EEB2600A67B56 /* export_format_specification.cc */,
+ 43AA82EC194EEB2600A67B56 /* export_formats.cc */,
+ 43AA82ED194EEB2600A67B56 /* export_graph_builder.cc */,
+ 43AA82EE194EEB2600A67B56 /* export_handler.cc */,
+ 43AA82EF194EEB2600A67B56 /* export_multiplication.cc */,
+ 43AA82F0194EEB2600A67B56 /* export_preset.cc */,
+ 43AA82F1194EEB2600A67B56 /* export_profile_manager.cc */,
+ 43AA82F2194EEB2600A67B56 /* export_status.cc */,
+ 43AA82F3194EEB2600A67B56 /* export_timespan.cc */,
+ 43AA82F4194EEB2600A67B56 /* file_source.cc */,
+ 43AA82F5194EEB2600A67B56 /* filename_extensions.cc */,
+ 43AA82F6194EEB2600A67B56 /* filesystem_paths.cc */,
+ 43AA82F7194EEB2600A67B56 /* filter.cc */,
+ 43AA82F8194EEB2600A67B56 /* find_session.cc */,
+ 43AA82F9194EEB2600A67B56 /* globals.cc */,
+ 43AA82FA194EEB2600A67B56 /* graph.cc */,
+ 43AA82FB194EEB2600A67B56 /* graphnode.cc */,
+ 43AA82FC194EEB2600A67B56 /* iec1ppmdsp.cc */,
+ 43AA82FD194EEB2600A67B56 /* iec2ppmdsp.cc */,
+ 43AA82FE194EEB2600A67B56 /* import.cc */,
+ 43AA82FF194EEB2600A67B56 /* instrument_info.cc */,
+ 43AA8300194EEB2600A67B56 /* internal_return.cc */,
+ 43AA8301194EEB2600A67B56 /* internal_send.cc */,
+ 43AA8302194EEB2600A67B56 /* interpolation.cc */,
+ 43AA8303194EEB2600A67B56 /* io_processor.cc */,
+ 43AA8304194EEB2600A67B56 /* io.cc */,
+ 43AA8305194EEB2600A67B56 /* kmeterdsp.cc */,
+ 43AA8306194EEB2600A67B56 /* ladspa_plugin.cc */,
+ 43AA8307194EEB2600A67B56 /* linux_vst_support.cc */,
+ 43AA8308194EEB2600A67B56 /* location_importer.cc */,
+ 43AA8309194EEB2600A67B56 /* location.cc */,
+ 43AA830A194EEB2600A67B56 /* ltc_slave.cc */,
+ 43AA830B194EEB2600A67B56 /* lv2_evbuf.c */,
+ 43AA830C194EEB2600A67B56 /* lv2_plugin.cc */,
+ 43AA830D194EEB2600A67B56 /* lxvst_plugin.cc */,
+ 43AA830E194EEB2600A67B56 /* meter.cc */,
+ 43AA830F194EEB2600A67B56 /* midi_automation_list_binder.cc */,
+ 43AA8310194EEB2600A67B56 /* midi_buffer.cc */,
+ 43AA8311194EEB2600A67B56 /* midi_clock_slave.cc */,
+ 43AA8312194EEB2600A67B56 /* midi_diskstream.cc */,
+ 43AA8313194EEB2600A67B56 /* midi_model.cc */,
+ 43AA8314194EEB2600A67B56 /* midi_patch_manager.cc */,
+ 43AA8315194EEB2600A67B56 /* midi_playlist_source.cc */,
+ 43AA8316194EEB2600A67B56 /* midi_playlist.cc */,
+ 43AA8317194EEB2600A67B56 /* midi_port.cc */,
+ 43AA8318194EEB2600A67B56 /* midi_region.cc */,
+ 43AA8319194EEB2600A67B56 /* midi_ring_buffer.cc */,
+ 43AA831A194EEB2600A67B56 /* midi_source.cc */,
+ 43AA831B194EEB2600A67B56 /* midi_state_tracker.cc */,
+ 43AA831C194EEB2600A67B56 /* midi_stretch.cc */,
+ 43AA831D194EEB2600A67B56 /* midi_track.cc */,
+ 43AA831E194EEB2600A67B56 /* midi_ui.cc */,
+ 43AA831F194EEB2600A67B56 /* midiport_manager.cc */,
+ 43AA8320194EEB2600A67B56 /* mix.cc */,
+ 43AA8321194EEB2600A67B56 /* monitor_processor.cc */,
+ 43AA8322194EEB2600A67B56 /* mtc_slave.cc */,
+ 43AA8323194EEB2600A67B56 /* mtdm.cc */,
+ 43AA8324194EEB2600A67B56 /* mute_master.cc */,
+ 43AA8325194EEB2600A67B56 /* onset_detector.cc */,
+ 43AA8326194EEB2600A67B56 /* operations.cc */,
+ 43AA8327194EEB2600A67B56 /* pan_controllable.cc */,
+ 43AA8328194EEB2600A67B56 /* pannable.cc */,
+ 43AA8329194EEB2600A67B56 /* panner_manager.cc */,
+ 43AA832A194EEB2600A67B56 /* panner_shell.cc */,
+ 43AA832B194EEB2600A67B56 /* panner.cc */,
+ 43AA832C194EEB2600A67B56 /* pcm_utils.cc */,
+ 43AA832D194EEB2600A67B56 /* pi_controller.cc */,
+ 43AA832E194EEB2600A67B56 /* playlist_factory.cc */,
+ 43AA832F194EEB2600A67B56 /* playlist_source.cc */,
+ 43AA8330194EEB2600A67B56 /* playlist.cc */,
+ 43AA8331194EEB2600A67B56 /* plugin_insert.cc */,
+ 43AA8332194EEB2600A67B56 /* plugin_manager.cc */,
+ 43AA8333194EEB2600A67B56 /* plugin.cc */,
+ 43AA8334194EEB2600A67B56 /* port_insert.cc */,
+ 43AA8335194EEB2600A67B56 /* port_manager.cc */,
+ 43AA8336194EEB2600A67B56 /* port_set.cc */,
+ 43AA8337194EEB2600A67B56 /* port.cc */,
+ 43AA8338194EEB2600A67B56 /* process_thread.cc */,
+ 43AA8339194EEB2600A67B56 /* processor.cc */,
+ 43AA833A194EEB2600A67B56 /* progress.cc */,
+ 43AA833B194EEB2600A67B56 /* quantize.cc */,
+ 43AA833C194EEB2600A67B56 /* rb_effect.cc */,
+ 43AA833D194EEB2600A67B56 /* rc_configuration.cc */,
+ 43AA833E194EEB2600A67B56 /* rdff.c */,
+ 43AA833F194EEB2600A67B56 /* recent_sessions.cc */,
+ 43AA8340194EEB2600A67B56 /* region_factory.cc */,
+ 43AA8341194EEB2600A67B56 /* region.cc */,
+ 43AA8342194EEB2600A67B56 /* resampled_source.cc */,
+ 43AA8343194EEB2600A67B56 /* return.cc */,
+ 43AA8344194EEB2600A67B56 /* reverse.cc */,
+ 43AA8345194EEB2600A67B56 /* revision.cc */,
+ 43AA8346194EEB2600A67B56 /* route_graph.cc */,
+ 43AA8347194EEB2600A67B56 /* route_group_member.cc */,
+ 43AA8348194EEB2600A67B56 /* route_group.cc */,
+ 43AA8349194EEB2600A67B56 /* route.cc */,
+ 43AA834A194EEB2600A67B56 /* search_paths.cc */,
+ 43AA834B194EEB2600A67B56 /* send.cc */,
+ 43AA834C194EEB2600A67B56 /* session_butler.cc */,
+ 43AA834D194EEB2600A67B56 /* session_click.cc */,
+ 43AA834E194EEB2600A67B56 /* session_command.cc */,
+ 43AA834F194EEB2600A67B56 /* session_configuration.cc */,
+ 43AA8350194EEB2600A67B56 /* session_directory.cc */,
+ 43AA8351194EEB2600A67B56 /* session_events.cc */,
+ 43AA8352194EEB2600A67B56 /* session_export.cc */,
+ 43AA8353194EEB2600A67B56 /* session_handle.cc */,
+ 43AA8354194EEB2600A67B56 /* session_ltc.cc */,
+ 43AA8355194EEB2600A67B56 /* session_metadata.cc */,
+ 43AA8356194EEB2600A67B56 /* session_midi.cc */,
+ 43AA8357194EEB2600A67B56 /* session_object.cc */,
+ 43AA8358194EEB2600A67B56 /* session_playlists.cc */,
+ 43AA8359194EEB2600A67B56 /* session_process.cc */,
+ 43AA835A194EEB2600A67B56 /* session_rtevents.cc */,
+ 43AA835B194EEB2600A67B56 /* session_state_utils.cc */,
+ 43AA835C194EEB2600A67B56 /* session_state.cc */,
+ 43AA835D194EEB2600A67B56 /* session_time.cc */,
+ 43AA835E194EEB2600A67B56 /* session_transport.cc */,
+ 43AA835F194EEB2600A67B56 /* session_vst.cc */,
+ 43AA8360194EEB2600A67B56 /* session.cc */,
+ 43AA8361194EEB2600A67B56 /* slave.cc */,
+ 43AA8362194EEB2600A67B56 /* smf_source.cc */,
+ 43AA8363194EEB2600A67B56 /* sndfile_helpers.cc */,
+ 43AA8364194EEB2600A67B56 /* sndfileimportable.cc */,
+ 43AA8365194EEB2600A67B56 /* sndfilesource.cc */,
+ 43AA8366194EEB2600A67B56 /* source_factory.cc */,
+ 43AA8367194EEB2600A67B56 /* source.cc */,
+ 43AA8368194EEB2600A67B56 /* speakers.cc */,
+ 43AA8369194EEB2600A67B56 /* srcfilesource.cc */,
+ 43AA836A194EEB2600A67B56 /* sse_functions_64bit.s */,
+ 43AA836B194EEB2600A67B56 /* sse_functions_xmm.cc */,
+ 43AA836C194EEB2600A67B56 /* sse_functions.s */,
+ 43AA836D194EEB2600A67B56 /* st_pitch.cc */,
+ 43AA836E194EEB2600A67B56 /* st_stretch.cc */,
+ 43AA836F194EEB2600A67B56 /* strip_silence.cc */,
+ 43AA8370194EEB2600A67B56 /* system_exec.cc */,
+ 43AA8371194EEB2600A67B56 /* tape_file_matcher.cc */,
+ 43AA8372194EEB2600A67B56 /* template_utils.cc */,
+ 43AA8373194EEB2600A67B56 /* tempo_map_importer.cc */,
+ 43AA8374194EEB2600A67B56 /* tempo.cc */,
+ 43AA8375194EEB2600A67B56 /* thread_buffers.cc */,
+ 43AA8376194EEB2600A67B56 /* ticker.cc */,
+ 43AA8377194EEB2600A67B56 /* track.cc */,
+ 43AA8378194EEB2600A67B56 /* transient_detector.cc */,
+ 43AA8379194EEB2600A67B56 /* unknown_processor.cc */,
+ 43AA837A194EEB2600A67B56 /* uri_map.cc */,
+ 43AA837B194EEB2600A67B56 /* user_bundle.cc */,
+ 43AA837C194EEB2600A67B56 /* utils.cc */,
+ 43AA837D194EEB2600A67B56 /* version.cc */,
+ 43AA837E194EEB2600A67B56 /* vst_info_file.cc */,
+ 43AA837F194EEB2600A67B56 /* vst_plugin.cc */,
+ 43AA8380194EEB2600A67B56 /* vumeterdsp.cc */,
+ 43AA8381194EEB2600A67B56 /* windows_vst_plugin.cc */,
+ 43AA8382194EEB2600A67B56 /* worker.cc */,
+ );
+ name = source;
+ sourceTree = "<group>";
+ };
+ 43AA8458194EEB5F00A67B56 /* test */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA8459194EEB5F00A67B56 /* audio_engine_test.cc */,
+ 43AA845A194EEB5F00A67B56 /* audio_engine_test.h */,
+ 43AA845B194EEB5F00A67B56 /* audio_region_read_test.cc */,
+ 43AA845C194EEB5F00A67B56 /* audio_region_read_test.h */,
+ 43AA845D194EEB5F00A67B56 /* audio_region_test.cc */,
+ 43AA845E194EEB5F00A67B56 /* audio_region_test.h */,
+ 43AA845F194EEB5F00A67B56 /* automation_list_property_test.cc */,
+ 43AA8460194EEB5F00A67B56 /* automation_list_property_test.h */,
+ 43AA8461194EEB5F00A67B56 /* bbt_test.cc */,
+ 43AA8462194EEB5F00A67B56 /* bbt_test.h */,
+ 43AA8463194EEB5F00A67B56 /* combine_regions_test.cc */,
+ 43AA8464194EEB5F00A67B56 /* combine_regions_test.h */,
+ 43AA8465194EEB5F00A67B56 /* control_surfaces_test.cc */,
+ 43AA8466194EEB5F00A67B56 /* control_surfaces_test.h */,
+ 43AA8467194EEB5F00A67B56 /* data */,
+ 43AA847C194EEB5F00A67B56 /* dummy_lxvst.cc */,
+ 43AA847D194EEB5F00A67B56 /* framepos_minus_beats_test.cc */,
+ 43AA847E194EEB5F00A67B56 /* framepos_minus_beats_test.h */,
+ 43AA847F194EEB5F00A67B56 /* framepos_plus_beats_test.cc */,
+ 43AA8480194EEB5F00A67B56 /* framepos_plus_beats_test.h */,
+ 43AA8481194EEB5F00A67B56 /* framewalk_to_beats_test.cc */,
+ 43AA8482194EEB5F00A67B56 /* framewalk_to_beats_test.h */,
+ 43AA8483194EEB5F00A67B56 /* interpolation_test.cc */,
+ 43AA8484194EEB5F00A67B56 /* interpolation_test.h */,
+ 43AA8485194EEB5F00A67B56 /* jack_utils_test.cc */,
+ 43AA8486194EEB5F00A67B56 /* jack_utils_test.h */,
+ 43AA8487194EEB5F00A67B56 /* load_session.cc */,
+ 43AA8488194EEB5F00A67B56 /* load_sessions_test.cc */,
+ 43AA8489194EEB5F00A67B56 /* load_sessions_test.h */,
+ 43AA848A194EEB5F00A67B56 /* midi_clock_slave_test.cc */,
+ 43AA848B194EEB5F00A67B56 /* midi_clock_slave_test.h */,
+ 43AA848C194EEB5F00A67B56 /* mtdm_test.cc */,
+ 43AA848D194EEB5F00A67B56 /* mtdm_test.h */,
+ 43AA848E194EEB5F00A67B56 /* playlist_equivalent_regions_test.cc */,
+ 43AA848F194EEB5F00A67B56 /* playlist_equivalent_regions_test.h */,
+ 43AA8490194EEB5F00A67B56 /* playlist_layering_test.cc */,
+ 43AA8491194EEB5F00A67B56 /* playlist_layering_test.h */,
+ 43AA8492194EEB5F00A67B56 /* playlist_read_test.cc */,
+ 43AA8493194EEB5F00A67B56 /* playlist_read_test.h */,
+ 43AA8494194EEB5F00A67B56 /* plugins_test.cc */,
+ 43AA8495194EEB5F00A67B56 /* plugins_test.h */,
+ 43AA8496194EEB5F00A67B56 /* profiling */,
+ 43AA84AA194EEB5F00A67B56 /* region_naming_test.cc */,
+ 43AA84AB194EEB5F00A67B56 /* region_naming_test.h */,
+ 43AA84AC194EEB5F00A67B56 /* resampled_source_test.cc */,
+ 43AA84AD194EEB5F00A67B56 /* resampled_source_test.h */,
+ 43AA84AE194EEB5F00A67B56 /* session_test.cc */,
+ 43AA84AF194EEB5F00A67B56 /* session_test.h */,
+ 43AA84B0194EEB5F00A67B56 /* tempo_test.cc */,
+ 43AA84B1194EEB5F00A67B56 /* tempo_test.h */,
+ 43AA84B2194EEB5F00A67B56 /* test_common.cc */,
+ 43AA84B3194EEB5F00A67B56 /* test_common.h */,
+ 43AA84B4194EEB5F00A67B56 /* test_needing_session.cc */,
+ 43AA84B5194EEB5F00A67B56 /* test_needing_session.h */,
+ 43AA84B6194EEB5F00A67B56 /* test_util.cc */,
+ 43AA84B7194EEB5F00A67B56 /* test_util.h */,
+ 43AA84B8194EEB5F00A67B56 /* testrunner.cc */,
+ );
+ name = test;
+ path = ../../../libs/ardour/test;
+ sourceTree = "<group>";
+ };
+ 43AA8467194EEB5F00A67B56 /* data */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA8468194EEB5F00A67B56 /* 2 Track-template */,
+ 43AA846A194EEB5F00A67B56 /* automation_list_property_test1.ref */,
+ 43AA846B194EEB5F00A67B56 /* automation_list_property_test2.ref */,
+ 43AA846C194EEB5F00A67B56 /* automation_list_property_test3.ref */,
+ 43AA846D194EEB5F00A67B56 /* automation_list_property_test4.ref */,
+ 43AA846E194EEB5F00A67B56 /* mantis_3356 */,
+ 43AA8475194EEB5F00A67B56 /* mantis_3356.ref */,
+ 43AA8476194EEB5F00A67B56 /* sessions */,
+ 43AA847B194EEB5F00A67B56 /* test.wav */,
+ );
+ path = data;
+ sourceTree = "<group>";
+ };
+ 43AA8468194EEB5F00A67B56 /* 2 Track-template */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA8469194EEB5F00A67B56,
+ );
+ path = "2 Track-template";
+ sourceTree = "<group>";
+ };
+ 43AA846E194EEB5F00A67B56 /* mantis_3356 */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA846F194EEB5F00A67B56 /* instant.xml */,
+ 43AA8470194EEB5F00A67B56 /* interchange */,
+ 43AA8474194EEB5F00A67B56 /* mantis_3356.ardour */,
+ );
+ path = mantis_3356;
+ sourceTree = "<group>";
+ };
+ 43AA8470194EEB5F00A67B56 /* interchange */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA8471194EEB5F00A67B56 /* mantis_3356 */,
+ );
+ path = interchange;
+ sourceTree = "<group>";
+ };
+ 43AA8471194EEB5F00A67B56 /* mantis_3356 */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA8472194EEB5F00A67B56 /* midifiles */,
+ );
+ path = mantis_3356;
+ sourceTree = "<group>";
+ };
+ 43AA8472194EEB5F00A67B56 /* midifiles */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA8473194EEB5F00A67B56 /* Midi 1-1.mid */,
+ );
+ path = midifiles;
+ sourceTree = "<group>";
+ };
+ 43AA8476194EEB5F00A67B56 /* sessions */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA8477194EEB5F00A67B56 /* rec_enabled */,
+ );
+ path = sessions;
+ sourceTree = "<group>";
+ };
+ 43AA8477194EEB5F00A67B56 /* rec_enabled */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA8478194EEB5F00A67B56 /* instant.xml */,
+ 43AA8479194EEB5F00A67B56 /* rec_enabled.ardour */,
+ 43AA847A194EEB5F00A67B56 /* rec_enabled.history */,
+ );
+ path = rec_enabled;
+ sourceTree = "<group>";
+ };
+ 43AA8496194EEB5F00A67B56 /* profiling */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA8497194EEB5F00A67B56 /* load_session.cc */,
+ 43AA8498194EEB5F00A67B56 /* lots_of_regions.cc */,
+ 43AA8499194EEB5F00A67B56 /* runpc.cc */,
+ 43AA849A194EEB5F00A67B56 /* sessions */,
+ );
+ path = profiling;
+ sourceTree = "<group>";
+ };
+ 43AA849A194EEB5F00A67B56 /* sessions */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA849B194EEB5F00A67B56 /* 0tracks */,
+ 43AA849E194EEB5F00A67B56 /* 1region */,
+ 43AA84A6194EEB5F00A67B56 /* 32tracks */,
+ );
+ path = sessions;
+ sourceTree = "<group>";
+ };
+ 43AA849B194EEB5F00A67B56 /* 0tracks */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA849C194EEB5F00A67B56 /* 0tracks.ardour */,
+ 43AA849D194EEB5F00A67B56 /* 0tracks.history */,
+ );
+ path = 0tracks;
+ sourceTree = "<group>";
+ };
+ 43AA849E194EEB5F00A67B56 /* 1region */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA849F194EEB5F00A67B56 /* 1region.ardour */,
+ 43AA84A0194EEB5F00A67B56 /* 1region.history */,
+ 43AA84A1194EEB5F00A67B56 /* instant.xml */,
+ 43AA84A2194EEB5F00A67B56 /* interchange */,
+ );
+ path = 1region;
+ sourceTree = "<group>";
+ };
+ 43AA84A2194EEB5F00A67B56 /* interchange */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA84A3194EEB5F00A67B56 /* 1region */,
+ );
+ path = interchange;
+ sourceTree = "<group>";
+ };
+ 43AA84A3194EEB5F00A67B56 /* 1region */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA84A4194EEB5F00A67B56 /* midifiles */,
+ );
+ path = 1region;
+ sourceTree = "<group>";
+ };
+ 43AA84A4194EEB5F00A67B56 /* midifiles */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA84A5194EEB5F00A67B56 /* MIDI 1-1.mid */,
+ );
+ path = midifiles;
+ sourceTree = "<group>";
+ };
+ 43AA84A6194EEB5F00A67B56 /* 32tracks */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA84A7194EEB5F00A67B56 /* 32tracks.ardour */,
+ 43AA84A8194EEB5F00A67B56 /* 32tracks.history */,
+ 43AA84A9194EEB5F00A67B56 /* instant.xml */,
+ );
+ path = 32tracks;
+ sourceTree = "<group>";
+ };
+ 43AA84F3194EEB6F00A67B56 /* headers */ = {
+ isa = PBXGroup;
+ children = (
+ 432859E21A10F415006C3E03 /* midi_scene_change.h */,
+ 432859E31A10F415006C3E03 /* midi_scene_changer.h */,
+ 432859E41A10F415006C3E03 /* mididm.h */,
+ 432859E51A10F415006C3E03 /* soundcloud_upload.h */,
+ 43AA86CD194EEC1400A67B56 /* gettext.h */,
+ 43AA86CE194EEC1400A67B56 /* lv2_evbuf.h */,
+ 43AA86CF194EEC1400A67B56 /* rdff.h */,
+ 43AA86C4194EEBAF00A67B56 /* vestige */,
+ 43AA84F4194EEB8B00A67B56 /* amp.h */,
+ 43AA84F5194EEB8B00A67B56 /* analyser.h */,
+ 43AA84F6194EEB8B00A67B56 /* ardour.h */,
+ 43AA84F7194EEB8B00A67B56 /* async_midi_port.h */,
+ 43AA84F8194EEB8B00A67B56 /* audio_backend.h */,
+ 43AA84F9194EEB8B00A67B56 /* audio_buffer.h */,
+ 432652FB194EF72700BEFB46 /* ardour */,
+ 43AA84FA194EEB8B00A67B56 /* audio_diskstream.h */,
+ 43AA84FB194EEB8B00A67B56 /* audio_library.h */,
+ 43AA84FC194EEB8B00A67B56 /* audio_playlist_importer.h */,
+ 43AA84FD194EEB8B00A67B56 /* audio_playlist_source.h */,
+ 43AA84FE194EEB8B00A67B56 /* audio_port.h */,
+ 43AA84FF194EEB8B00A67B56 /* audio_region_importer.h */,
+ 43AA8500194EEB8B00A67B56 /* audio_track_importer.h */,
+ 43AA8501194EEB8B00A67B56 /* audio_track.h */,
+ 43AA8502194EEB8B00A67B56 /* audio_unit.h */,
+ 43AA8503194EEB8B00A67B56 /* audioanalyser.h */,
+ 43AA8504194EEB8B00A67B56 /* audioengine.h */,
+ 43AA8505194EEB8B00A67B56 /* audiofile_tagger.h */,
+ 43AA8506194EEB8B00A67B56 /* audiofilesource.h */,
+ 43AA8507194EEB8B00A67B56 /* audioplaylist.h */,
+ 43AA8508194EEB8B00A67B56 /* audioregion.h */,
+ 43AA8509194EEB8B00A67B56 /* audiosource.h */,
+ 43AA850A194EEB8B00A67B56 /* auditioner.h */,
+ 43AA850B194EEB8B00A67B56 /* auto_bundle.h */,
+ 43AA850C194EEB8B00A67B56 /* automatable_sequence.h */,
+ 43AA850D194EEB8B00A67B56 /* automatable.h */,
+ 43AA850E194EEB8B00A67B56 /* automation_control.h */,
+ 43AA850F194EEB8B00A67B56 /* automation_list.h */,
+ 43AA8510194EEB8B00A67B56 /* automation_watch.h */,
+ 43AA8511194EEB8B00A67B56 /* beats_frames_converter.h */,
+ 43AA8512194EEB8B00A67B56 /* broadcast_info.h */,
+ 43AA8513194EEB8B00A67B56 /* buffer_manager.h */,
+ 43AA8514194EEB8B00A67B56 /* buffer_set.h */,
+ 43AA8515194EEB8B00A67B56 /* buffer.h */,
+ 43AA8516194EEB8B00A67B56 /* bundle.h */,
+ 43AA8517194EEB8B00A67B56 /* butler.h */,
+ 43AA8518194EEB8B00A67B56 /* caimportable.h */,
+ 43AA8519194EEB8B00A67B56 /* capturing_processor.h */,
+ 43AA851A194EEB8B00A67B56 /* chan_count.h */,
+ 43AA851B194EEB8B00A67B56 /* chan_mapping.h */,
+ 43AA851C194EEB8B00A67B56 /* click.h */,
+ 43AA851D194EEB8B00A67B56 /* comparable_shared_ptr.h */,
+ 43AA851E194EEB8B00A67B56 /* configuration_variable.h */,
+ 43AA851F194EEB8B00A67B56 /* configuration.h */,
+ 43AA8520194EEB8B00A67B56 /* control_protocol_manager.h */,
+ 43AA8521194EEB8B00A67B56 /* coreaudiosource.h */,
+ 43AA8522194EEB8B00A67B56 /* cycle_timer.h */,
+ 43AA8523194EEB8B00A67B56 /* cycles.h */,
+ 43AA8524194EEB8B00A67B56 /* data_type.h */,
+ 43AA8525194EEB8B00A67B56 /* dB.h */,
+ 43AA8526194EEB8B00A67B56 /* debug.h */,
+ 43AA8527194EEB8B00A67B56 /* delivery.h */,
+ 43AA8528194EEB8B00A67B56 /* directory_names.h */,
+ 43AA8529194EEB8B00A67B56 /* diskstream.h */,
+ 43AA852A194EEB8B00A67B56 /* element_import_handler.h */,
+ 43AA852B194EEB8B00A67B56 /* element_importer.h */,
+ 43AA852C194EEB8B00A67B56 /* engine_state_controller.h */,
+ 43AA852D194EEB8B00A67B56 /* event_type_map.h */,
+ 43AA852E194EEB8B00A67B56 /* export_channel_configuration.h */,
+ 43AA852F194EEB8B00A67B56 /* export_channel.h */,
+ 43AA8530194EEB8B00A67B56 /* export_failed.h */,
+ 43AA8531194EEB8B00A67B56 /* export_filename.h */,
+ 43AA8532194EEB8B00A67B56 /* export_format_base.h */,
+ 43AA8533194EEB8B00A67B56 /* export_format_compatibility.h */,
+ 43AA8534194EEB8B00A67B56 /* export_format_manager.h */,
+ 43AA8535194EEB8B00A67B56 /* export_format_specification.h */,
+ 43AA8536194EEB8B00A67B56 /* export_formats.h */,
+ 43AA8537194EEB8B00A67B56 /* export_graph_builder.h */,
+ 43AA8538194EEB8B00A67B56 /* export_handler.h */,
+ 43AA8539194EEB8B00A67B56 /* export_multiplication.h */,
+ 43AA853A194EEB8B00A67B56 /* export_pointers.h */,
+ 43AA853B194EEB8B00A67B56 /* export_preset.h */,
+ 43AA853C194EEB8B00A67B56 /* export_profile_manager.h */,
+ 43AA853D194EEB8B00A67B56 /* export_status.h */,
+ 43AA853E194EEB8B00A67B56 /* export_timespan.h */,
+ 43AA853F194EEB8B00A67B56 /* file_source.h */,
+ 43AA8540194EEB8B00A67B56 /* filename_extensions.h */,
+ 43AA8541194EEB8B00A67B56 /* filesystem_paths.h */,
+ 43AA8542194EEB8B00A67B56 /* filter.h */,
+ 43AA8543194EEB8B00A67B56 /* graph.h */,
+ 43AA8544194EEB8B00A67B56 /* graphnode.h */,
+ 43AA8545194EEB8B00A67B56 /* iec1ppmdsp.h */,
+ 43AA8546194EEB8B00A67B56 /* iec2ppmdsp.h */,
+ 43AA8547194EEB8B00A67B56 /* import_status.h */,
+ 43AA8548194EEB8B00A67B56 /* importable_source.h */,
+ 43AA8549194EEB8B00A67B56 /* instrument_info.h */,
+ 43AA854A194EEB8B00A67B56 /* internal_return.h */,
+ 43AA854B194EEB8B00A67B56 /* internal_send.h */,
+ 43AA854C194EEB8B00A67B56 /* interpolation.h */,
+ 43AA854D194EEB8B00A67B56 /* interthread_info.h */,
+ 43AA854E194EEB8B00A67B56 /* io_processor.h */,
+ 43AA854F194EEB8B00A67B56 /* io.h */,
+ 43AA8550194EEB8B00A67B56 /* jack_utils.h */,
+ 43AA8551194EEB8B00A67B56 /* kmeterdsp.h */,
+ 43AA8552194EEB8B00A67B56 /* ladspa_plugin.h */,
+ 43AA8553194EEB8B00A67B56 /* ladspa.h */,
+ 43AA8554194EEB8B00A67B56 /* latent.h */,
+ 43AA8555194EEB8B00A67B56 /* libardour_visibility.h */,
+ 43AA8556194EEB8B00A67B56 /* linux_vst_support.h */,
+ 43AA8557194EEB8B00A67B56 /* location_importer.h */,
+ 43AA8558194EEB8B00A67B56 /* location.h */,
+ 43AA8559194EEB8B00A67B56 /* logcurve.h */,
+ 43AA855A194EEB8B00A67B56 /* lv2_plugin.h */,
+ 43AA855B194EEB8B00A67B56 /* lxvst_plugin.h */,
+ 43AA855C194EEB8B00A67B56 /* meter.h */,
+ 43AA855D194EEB8B00A67B56 /* midi_automation_list_binder.h */,
+ 43AA855E194EEB8B00A67B56 /* midi_buffer.h */,
+ 43AA855F194EEB8B00A67B56 /* midi_diskstream.h */,
+ 43AA8560194EEB8B00A67B56 /* midi_model.h */,
+ 43AA8561194EEB8B00A67B56 /* midi_operator.h */,
+ 43AA8562194EEB8B00A67B56 /* midi_patch_manager.h */,
+ 43AA8563194EEB8B00A67B56 /* midi_playlist_source.h */,
+ 43AA8564194EEB8B00A67B56 /* midi_playlist.h */,
+ 43AA8565194EEB8B00A67B56 /* midi_port.h */,
+ 43AA8566194EEB8B00A67B56 /* midi_region.h */,
+ 43AA8567194EEB8B00A67B56 /* midi_ring_buffer.h */,
+ 43AA8568194EEB8B00A67B56 /* midi_source.h */,
+ 43AA8569194EEB8B00A67B56 /* midi_state_tracker.h */,
+ 43AA856A194EEB8B00A67B56 /* midi_stretch.h */,
+ 43AA856B194EEB8B00A67B56 /* midi_track.h */,
+ 43AA856C194EEB8B00A67B56 /* midi_ui.h */,
+ 43AA856D194EEB8B00A67B56 /* midiport_manager.h */,
+ 43AA856E194EEB8B00A67B56 /* mix.h */,
+ 43AA856F194EEB8B00A67B56 /* monitor_processor.h */,
+ 43AA8570194EEB8B00A67B56 /* movable.h */,
+ 43AA8571194EEB8B00A67B56 /* msvc_libardour.h */,
+ 43AA8572194EEB8B00A67B56 /* mtdm.h */,
+ 43AA8573194EEB8B00A67B56 /* mute_master.h */,
+ 43AA8574194EEB8B00A67B56 /* noise.h */,
+ 43AA8575194EEB8B00A67B56 /* onset_detector.h */,
+ 43AA8576194EEB8B00A67B56 /* operations.h */,
+ 43AA8577194EEB8B00A67B56 /* pan_controllable.h */,
+ 43AA8578194EEB8B00A67B56 /* pannable.h */,
+ 43AA8579194EEB8B00A67B56 /* panner_manager.h */,
+ 43AA857A194EEB8B00A67B56 /* panner_shell.h */,
+ 43AA857B194EEB8B00A67B56 /* panner.h */,
+ 43AA857C194EEB8B00A67B56 /* pcm_utils.h */,
+ 43AA857D194EEB8B00A67B56 /* peak.h */,
+ 43AA857E194EEB8B00A67B56 /* pi_controller.h */,
+ 43AA857F194EEB8B00A67B56 /* pitch.h */,
+ 43AA8580194EEB8B00A67B56 /* playlist_factory.h */,
+ 43AA8581194EEB8B00A67B56 /* playlist_source.h */,
+ 43AA8582194EEB8B00A67B56 /* playlist.h */,
+ 43AA8583194EEB8B00A67B56 /* plugin_insert.h */,
+ 43AA8584194EEB8B00A67B56 /* plugin_manager.h */,
+ 43AA8585194EEB8B00A67B56 /* plugin_types.h */,
+ 43AA8586194EEB8B00A67B56 /* plugin.h */,
+ 43AA8587194EEB8B00A67B56 /* port_engine.h */,
+ 43AA8588194EEB8B00A67B56 /* port_insert.h */,
+ 43AA8589194EEB8B00A67B56 /* port_manager.h */,
+ 43AA858A194EEB8B00A67B56 /* port_set.h */,
+ 43AA858B194EEB8B00A67B56 /* port.h */,
+ 43AA858C194EEB8B00A67B56 /* process_thread.h */,
+ 43AA858D194EEB8B00A67B56 /* processor.h */,
+ 43AA858E194EEB8B00A67B56 /* profile.h */,
+ 43AA858F194EEB8B00A67B56 /* progress.h */,
+ 43AA8590194EEB8B00A67B56 /* proxy_controllable.h */,
+ 43AA8591194EEB8B00A67B56 /* public_diskstream.h */,
+ 43AA8592194EEB8B00A67B56 /* quantize.h */,
+ 43AA8593194EEB8B00A67B56 /* rb_effect.h */,
+ 43AA8594194EEB8B00A67B56 /* rc_configuration_vars.h */,
+ 43AA8595194EEB8B00A67B56 /* rc_configuration.h */,
+ 43AA8596194EEB8B00A67B56 /* readable.h */,
+ 43AA8597194EEB8B00A67B56 /* recent_sessions.h */,
+ 43AA8598194EEB8B00A67B56 /* region_factory.h */,
+ 43AA8599194EEB8B00A67B56 /* region_sorters.h */,
+ 43AA859A194EEB8B00A67B56 /* region.h */,
+ 43AA859B194EEB8B00A67B56 /* resampled_source.h */,
+ 43AA859C194EEB8B00A67B56 /* return.h */,
+ 43AA859D194EEB8B00A67B56 /* reverse.h */,
+ 43AA859E194EEB8B00A67B56 /* revision.h */,
+ 43AA859F194EEB8B00A67B56 /* route_graph.h */,
+ 43AA85A0194EEB8B00A67B56 /* route_group_member.h */,
+ 43AA85A1194EEB8B00A67B56 /* route_group_specialized.h */,
+ 43AA85A2194EEB8B00A67B56 /* route_group.h */,
+ 43AA85A3194EEB8B00A67B56 /* route.h */,
+ 43AA85A4194EEB8B00A67B56 /* runtime_functions.h */,
+ 43AA85A5194EEB8B00A67B56 /* search_paths.h */,
+ 43AA85A6194EEB8B00A67B56 /* send.h */,
+ 43AA85A7194EEB8B00A67B56 /* session_configuration_vars.h */,
+ 43AA85A8194EEB8B00A67B56 /* session_configuration.h */,
+ 43AA85A9194EEB8B00A67B56 /* session_directory.h */,
+ 43AA85AA194EEB8B00A67B56 /* session_event.h */,
+ 43AA85AB194EEB8B00A67B56 /* session_handle.h */,
+ 43AA85AC194EEB8B00A67B56 /* session_metadata.h */,
+ 43AA85AD194EEB8B00A67B56 /* session_object.h */,
+ 43AA85AE194EEB8B00A67B56 /* session_playlist.h */,
+ 43AA85AF194EEB8B00A67B56 /* session_playlists.h */,
+ 43AA85B0194EEB8B00A67B56 /* session_route.h */,
+ 43AA85B1194EEB8B00A67B56 /* session_state_utils.h */,
+ 43AA85B2194EEB8B00A67B56 /* session_utils.h */,
+ 43AA85B3194EEB8B00A67B56 /* session.h */,
+ 43AA85B4194EEB8B00A67B56 /* silentfilesource.h */,
+ 43AA85B5194EEB8B00A67B56 /* slave.h */,
+ 43AA85B6194EEB8B00A67B56 /* smf_source.h */,
+ 43AA85B7194EEB8B00A67B56 /* sndfile_helpers.h */,
+ 43AA85B8194EEB8B00A67B56 /* sndfileimportable.h */,
+ 43AA85B9194EEB8B00A67B56 /* sndfilesource.h */,
+ 43AA85BA194EEB8B00A67B56 /* soundseq.h */,
+ 43AA85BB194EEB8B00A67B56 /* source_factory.h */,
+ 43AA85BC194EEB8B00A67B56 /* source.h */,
+ 43AA85BD194EEB8B00A67B56 /* speaker.h */,
+ 43AA85BE194EEB8B00A67B56 /* speakers.h */,
+ 43AA85BF194EEB8B00A67B56 /* spline.h */,
+ 43AA85C0194EEB8B00A67B56 /* srcfilesource.h */,
+ 43AA85C1194EEB8B00A67B56 /* stretch.h */,
+ 43AA85C2194EEB8B00A67B56 /* strip_silence.h */,
+ 43AA85C3194EEB8B00A67B56 /* system_exec.h */,
+ 43AA85C4194EEB8B00A67B56 /* tape_file_matcher.h */,
+ 43AA85C5194EEB8B00A67B56 /* template_utils.h */,
+ 43AA85C6194EEB8B00A67B56 /* tempo_map_importer.h */,
+ 43AA85C7194EEB8B00A67B56 /* tempo.h */,
+ 43AA85C8194EEB8B00A67B56 /* thread_buffers.h */,
+ 43AA85C9194EEB8B00A67B56 /* ticker.h */,
+ 43AA85CA194EEB8B00A67B56 /* timecode.h */,
+ 43AA85CB194EEB8B00A67B56 /* timefx_request.h */,
+ 43AA85CC194EEB8B00A67B56 /* timestamps.h */,
+ 43AA85CD194EEB8B00A67B56 /* track.h */,
+ 43AA85CE194EEB8B00A67B56 /* transient_detector.h */,
+ 43AA85CF194EEB8B00A67B56 /* trimmable.h */,
+ 43AA85D0194EEB8B00A67B56 /* types.h */,
+ 43AA85D1194EEB8B00A67B56 /* unknown_processor.h */,
+ 43AA85D2194EEB8B00A67B56 /* uri_map.h */,
+ 43AA85D3194EEB8B00A67B56 /* user_bundle.h */,
+ 43AA85D4194EEB8B00A67B56 /* utils.h */,
+ 43AA85D5194EEB8B00A67B56 /* version.h */,
+ 43AA85D6194EEB8B00A67B56 /* vst_info_file.h */,
+ 43AA85D7194EEB8B00A67B56 /* vst_plugin.h */,
+ 43AA85D8194EEB8B00A67B56 /* vst_types.h */,
+ 43AA85D9194EEB8B00A67B56 /* vumeterdsp.h */,
+ 43AA85DA194EEB8B00A67B56 /* windows_vst_plugin.h */,
+ 43AA85DB194EEB8B00A67B56 /* worker.h */,
+ );
+ name = headers;
+ sourceTree = "<group>";
+ };
+ 43AA86C4194EEBAF00A67B56 /* vestige */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA86C5194EEBAF00A67B56 /* aeffectx.h */,
+ );
+ name = vestige;
+ path = ../../../libs/ardour/ardour/vestige;
+ sourceTree = "<group>";
+ };
+ 43AA86C7194EEBC300A67B56 /* scripts */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA86C8194EEBF100A67B56 /* run-profiling.sh */,
+ 43AA86C9194EEBF100A67B56 /* run-session-tests.sh */,
+ 43AA86CA194EEBF100A67B56 /* run-tests.sh */,
+ 43AA86CB194EEBF100A67B56 /* test-env.sh */,
+ 43AA86CC194EEBF100A67B56 /* wscript */,
+ );
+ name = scripts;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 43AA82A7194EEAAF00A67B56 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 43AA84BA194EEB5F00A67B56 /* audio_engine_test.h in Headers */,
+ 43AA84BC194EEB5F00A67B56 /* audio_region_read_test.h in Headers */,
+ 43AA84BE194EEB5F00A67B56 /* audio_region_test.h in Headers */,
+ 43AA84C0194EEB5F00A67B56 /* automation_list_property_test.h in Headers */,
+ 43AA84C2194EEB5F00A67B56 /* bbt_test.h in Headers */,
+ 43AA84C4194EEB5F00A67B56 /* combine_regions_test.h in Headers */,
+ 43AA84C6194EEB5F00A67B56 /* control_surfaces_test.h in Headers */,
+ 43AA84C9194EEB5F00A67B56 /* framepos_minus_beats_test.h in Headers */,
+ 43AA84CB194EEB5F00A67B56 /* framepos_plus_beats_test.h in Headers */,
+ 43AA84CD194EEB5F00A67B56 /* framewalk_to_beats_test.h in Headers */,
+ 43AA84CF194EEB5F00A67B56 /* interpolation_test.h in Headers */,
+ 43AA84D1194EEB5F00A67B56 /* jack_utils_test.h in Headers */,
+ 43AA84D4194EEB5F00A67B56 /* load_sessions_test.h in Headers */,
+ 43AA84D6194EEB5F00A67B56 /* midi_clock_slave_test.h in Headers */,
+ 43AA84D8194EEB5F00A67B56 /* mtdm_test.h in Headers */,
+ 43AA84DA194EEB5F00A67B56 /* playlist_equivalent_regions_test.h in Headers */,
+ 43AA84DC194EEB5F00A67B56 /* playlist_layering_test.h in Headers */,
+ 43AA84DE194EEB5F00A67B56 /* playlist_read_test.h in Headers */,
+ 43AA84E0194EEB5F00A67B56 /* plugins_test.h in Headers */,
+ 43AA84E5194EEB5F00A67B56 /* region_naming_test.h in Headers */,
+ 43AA84E7194EEB5F00A67B56 /* resampled_source_test.h in Headers */,
+ 43AA84E9194EEB5F00A67B56 /* session_test.h in Headers */,
+ 43AA84EB194EEB5F00A67B56 /* tempo_test.h in Headers */,
+ 43AA84ED194EEB5F00A67B56 /* test_common.h in Headers */,
+ 43AA84EF194EEB5F00A67B56 /* test_needing_session.h in Headers */,
+ 43AA84F1194EEB5F00A67B56 /* test_util.h in Headers */,
+ 43AA85DC194EEB8B00A67B56 /* amp.h in Headers */,
+ 43AA85DD194EEB8B00A67B56 /* analyser.h in Headers */,
+ 43AA85DE194EEB8B00A67B56 /* ardour.h in Headers */,
+ 43AA85DF194EEB8B00A67B56 /* async_midi_port.h in Headers */,
+ 43AA85E0194EEB8B00A67B56 /* audio_backend.h in Headers */,
+ 43AA85E1194EEB8B00A67B56 /* audio_buffer.h in Headers */,
+ 43AA85E2194EEB8B00A67B56 /* audio_diskstream.h in Headers */,
+ 43AA85E3194EEB8B00A67B56 /* audio_library.h in Headers */,
+ 43AA85E4194EEB8B00A67B56 /* audio_playlist_importer.h in Headers */,
+ 43AA85E5194EEB8B00A67B56 /* audio_playlist_source.h in Headers */,
+ 43AA85E6194EEB8B00A67B56 /* audio_port.h in Headers */,
+ 43AA85E7194EEB8B00A67B56 /* audio_region_importer.h in Headers */,
+ 43AA85E8194EEB8B00A67B56 /* audio_track_importer.h in Headers */,
+ 43AA85E9194EEB8B00A67B56 /* audio_track.h in Headers */,
+ 43AA85EA194EEB8B00A67B56 /* audio_unit.h in Headers */,
+ 43AA85EB194EEB8B00A67B56 /* audioanalyser.h in Headers */,
+ 43AA85EC194EEB8B00A67B56 /* audioengine.h in Headers */,
+ 43AA85ED194EEB8B00A67B56 /* audiofile_tagger.h in Headers */,
+ 43AA85EE194EEB8B00A67B56 /* audiofilesource.h in Headers */,
+ 43AA85EF194EEB8B00A67B56 /* audioplaylist.h in Headers */,
+ 43AA85F0194EEB8B00A67B56 /* audioregion.h in Headers */,
+ 43AA85F1194EEB8B00A67B56 /* audiosource.h in Headers */,
+ 43AA85F2194EEB8B00A67B56 /* auditioner.h in Headers */,
+ 43AA85F3194EEB8B00A67B56 /* auto_bundle.h in Headers */,
+ 43AA85F4194EEB8B00A67B56 /* automatable_sequence.h in Headers */,
+ 43AA85F5194EEB8B00A67B56 /* automatable.h in Headers */,
+ 43AA85F6194EEB8B00A67B56 /* automation_control.h in Headers */,
+ 43AA85F7194EEB8B00A67B56 /* automation_list.h in Headers */,
+ 43AA85F8194EEB8B00A67B56 /* automation_watch.h in Headers */,
+ 43AA85F9194EEB8B00A67B56 /* beats_frames_converter.h in Headers */,
+ 43AA85FA194EEB8B00A67B56 /* broadcast_info.h in Headers */,
+ 43AA85FB194EEB8B00A67B56 /* buffer_manager.h in Headers */,
+ 43AA85FC194EEB8B00A67B56 /* buffer_set.h in Headers */,
+ 43AA85FD194EEB8B00A67B56 /* buffer.h in Headers */,
+ 43AA85FE194EEB8B00A67B56 /* bundle.h in Headers */,
+ 43AA85FF194EEB8B00A67B56 /* butler.h in Headers */,
+ 43AA8600194EEB8B00A67B56 /* caimportable.h in Headers */,
+ 43AA8601194EEB8B00A67B56 /* capturing_processor.h in Headers */,
+ 43AA8602194EEB8B00A67B56 /* chan_count.h in Headers */,
+ 43AA8603194EEB8B00A67B56 /* chan_mapping.h in Headers */,
+ 43AA8604194EEB8B00A67B56 /* click.h in Headers */,
+ 43AA8605194EEB8B00A67B56 /* comparable_shared_ptr.h in Headers */,
+ 43AA8606194EEB8B00A67B56 /* configuration_variable.h in Headers */,
+ 43AA8607194EEB8B00A67B56 /* configuration.h in Headers */,
+ 43AA8608194EEB8B00A67B56 /* control_protocol_manager.h in Headers */,
+ 43AA8609194EEB8B00A67B56 /* coreaudiosource.h in Headers */,
+ 43AA860A194EEB8B00A67B56 /* cycle_timer.h in Headers */,
+ 43AA860B194EEB8B00A67B56 /* cycles.h in Headers */,
+ 43AA860C194EEB8B00A67B56 /* data_type.h in Headers */,
+ 43AA860D194EEB8B00A67B56 /* dB.h in Headers */,
+ 43AA860E194EEB8B00A67B56 /* debug.h in Headers */,
+ 43AA860F194EEB8B00A67B56 /* delivery.h in Headers */,
+ 43AA8610194EEB8B00A67B56 /* directory_names.h in Headers */,
+ 43AA8611194EEB8B00A67B56 /* diskstream.h in Headers */,
+ 43AA8612194EEB8B00A67B56 /* element_import_handler.h in Headers */,
+ 43AA8613194EEB8B00A67B56 /* element_importer.h in Headers */,
+ 43AA8614194EEB8B00A67B56 /* engine_state_controller.h in Headers */,
+ 43AA8615194EEB8B00A67B56 /* event_type_map.h in Headers */,
+ 43AA8616194EEB8B00A67B56 /* export_channel_configuration.h in Headers */,
+ 43AA8617194EEB8B00A67B56 /* export_channel.h in Headers */,
+ 43AA8618194EEB8B00A67B56 /* export_failed.h in Headers */,
+ 43AA8619194EEB8B00A67B56 /* export_filename.h in Headers */,
+ 43AA861A194EEB8B00A67B56 /* export_format_base.h in Headers */,
+ 43AA861B194EEB8B00A67B56 /* export_format_compatibility.h in Headers */,
+ 43AA861C194EEB8B00A67B56 /* export_format_manager.h in Headers */,
+ 43AA861D194EEB8B00A67B56 /* export_format_specification.h in Headers */,
+ 43AA861E194EEB8B00A67B56 /* export_formats.h in Headers */,
+ 43AA861F194EEB8B00A67B56 /* export_graph_builder.h in Headers */,
+ 43AA8620194EEB8B00A67B56 /* export_handler.h in Headers */,
+ 43AA8621194EEB8B00A67B56 /* export_multiplication.h in Headers */,
+ 43AA8622194EEB8B00A67B56 /* export_pointers.h in Headers */,
+ 43AA8623194EEB8B00A67B56 /* export_preset.h in Headers */,
+ 43AA8624194EEB8B00A67B56 /* export_profile_manager.h in Headers */,
+ 43AA8625194EEB8B00A67B56 /* export_status.h in Headers */,
+ 43AA8626194EEB8B00A67B56 /* export_timespan.h in Headers */,
+ 43AA8627194EEB8B00A67B56 /* file_source.h in Headers */,
+ 43AA8628194EEB8B00A67B56 /* filename_extensions.h in Headers */,
+ 43AA8629194EEB8B00A67B56 /* filesystem_paths.h in Headers */,
+ 43AA862A194EEB8B00A67B56 /* filter.h in Headers */,
+ 43AA862B194EEB8B00A67B56 /* graph.h in Headers */,
+ 43AA862C194EEB8B00A67B56 /* graphnode.h in Headers */,
+ 43AA862D194EEB8B00A67B56 /* iec1ppmdsp.h in Headers */,
+ 43AA862E194EEB8B00A67B56 /* iec2ppmdsp.h in Headers */,
+ 43AA862F194EEB8B00A67B56 /* import_status.h in Headers */,
+ 432859E61A10F415006C3E03 /* midi_scene_change.h in Headers */,
+ 43AA8630194EEB8B00A67B56 /* importable_source.h in Headers */,
+ 43AA8631194EEB8B00A67B56 /* instrument_info.h in Headers */,
+ 43AA8632194EEB8B00A67B56 /* internal_return.h in Headers */,
+ 432859E81A10F415006C3E03 /* mididm.h in Headers */,
+ 43AA8633194EEB8B00A67B56 /* internal_send.h in Headers */,
+ 43AA8634194EEB8B00A67B56 /* interpolation.h in Headers */,
+ 43AA8635194EEB8B00A67B56 /* interthread_info.h in Headers */,
+ 43AA8636194EEB8B00A67B56 /* io_processor.h in Headers */,
+ 43AA8637194EEB8B00A67B56 /* io.h in Headers */,
+ 43AA8638194EEB8B00A67B56 /* jack_utils.h in Headers */,
+ 43AA8639194EEB8B00A67B56 /* kmeterdsp.h in Headers */,
+ 43AA863A194EEB8B00A67B56 /* ladspa_plugin.h in Headers */,
+ 43AA863B194EEB8B00A67B56 /* ladspa.h in Headers */,
+ 43AA863C194EEB8B00A67B56 /* latent.h in Headers */,
+ 43AA863D194EEB8B00A67B56 /* libardour_visibility.h in Headers */,
+ 43AA863E194EEB8B00A67B56 /* linux_vst_support.h in Headers */,
+ 43AA863F194EEB8B00A67B56 /* location_importer.h in Headers */,
+ 43AA8640194EEB8B00A67B56 /* location.h in Headers */,
+ 43AA8641194EEB8B00A67B56 /* logcurve.h in Headers */,
+ 43AA8642194EEB8B00A67B56 /* lv2_plugin.h in Headers */,
+ 43AA8643194EEB8B00A67B56 /* lxvst_plugin.h in Headers */,
+ 43AA8644194EEB8B00A67B56 /* meter.h in Headers */,
+ 43AA8645194EEB8B00A67B56 /* midi_automation_list_binder.h in Headers */,
+ 43AA8646194EEB8B00A67B56 /* midi_buffer.h in Headers */,
+ 43AA8647194EEB8B00A67B56 /* midi_diskstream.h in Headers */,
+ 43AA8648194EEB8B00A67B56 /* midi_model.h in Headers */,
+ 43AA8649194EEB8B00A67B56 /* midi_operator.h in Headers */,
+ 43AA864A194EEB8B00A67B56 /* midi_patch_manager.h in Headers */,
+ 43AA864B194EEB8B00A67B56 /* midi_playlist_source.h in Headers */,
+ 43AA864C194EEB8B00A67B56 /* midi_playlist.h in Headers */,
+ 43AA864D194EEB8B00A67B56 /* midi_port.h in Headers */,
+ 43AA864E194EEB8B00A67B56 /* midi_region.h in Headers */,
+ 43AA864F194EEB8B00A67B56 /* midi_ring_buffer.h in Headers */,
+ 43AA8650194EEB8B00A67B56 /* midi_source.h in Headers */,
+ 43AA8651194EEB8B00A67B56 /* midi_state_tracker.h in Headers */,
+ 43AA8652194EEB8B00A67B56 /* midi_stretch.h in Headers */,
+ 43AA8653194EEB8B00A67B56 /* midi_track.h in Headers */,
+ 43AA8654194EEB8B00A67B56 /* midi_ui.h in Headers */,
+ 43AA8655194EEB8B00A67B56 /* midiport_manager.h in Headers */,
+ 43AA8656194EEB8B00A67B56 /* mix.h in Headers */,
+ 43AA8657194EEB8B00A67B56 /* monitor_processor.h in Headers */,
+ 43AA8658194EEB8B00A67B56 /* movable.h in Headers */,
+ 43AA8659194EEB8B00A67B56 /* msvc_libardour.h in Headers */,
+ 43AA865A194EEB8B00A67B56 /* mtdm.h in Headers */,
+ 43AA865B194EEB8B00A67B56 /* mute_master.h in Headers */,
+ 43AA865C194EEB8B00A67B56 /* noise.h in Headers */,
+ 43AA865D194EEB8B00A67B56 /* onset_detector.h in Headers */,
+ 43AA865E194EEB8B00A67B56 /* operations.h in Headers */,
+ 43AA865F194EEB8B00A67B56 /* pan_controllable.h in Headers */,
+ 432859E71A10F415006C3E03 /* midi_scene_changer.h in Headers */,
+ 43AA8660194EEB8B00A67B56 /* pannable.h in Headers */,
+ 43AA8661194EEB8B00A67B56 /* panner_manager.h in Headers */,
+ 43AA8662194EEB8B00A67B56 /* panner_shell.h in Headers */,
+ 43AA8663194EEB8B00A67B56 /* panner.h in Headers */,
+ 43AA8664194EEB8B00A67B56 /* pcm_utils.h in Headers */,
+ 43AA8665194EEB8B00A67B56 /* peak.h in Headers */,
+ 43AA8666194EEB8B00A67B56 /* pi_controller.h in Headers */,
+ 43AA8667194EEB8B00A67B56 /* pitch.h in Headers */,
+ 43AA8668194EEB8B00A67B56 /* playlist_factory.h in Headers */,
+ 43AA8669194EEB8B00A67B56 /* playlist_source.h in Headers */,
+ 43AA866A194EEB8B00A67B56 /* playlist.h in Headers */,
+ 43AA866B194EEB8B00A67B56 /* plugin_insert.h in Headers */,
+ 43AA866C194EEB8B00A67B56 /* plugin_manager.h in Headers */,
+ 43AA866D194EEB8B00A67B56 /* plugin_types.h in Headers */,
+ 43AA866E194EEB8B00A67B56 /* plugin.h in Headers */,
+ 43AA866F194EEB8B00A67B56 /* port_engine.h in Headers */,
+ 43AA8670194EEB8B00A67B56 /* port_insert.h in Headers */,
+ 43AA8671194EEB8B00A67B56 /* port_manager.h in Headers */,
+ 43AA8672194EEB8B00A67B56 /* port_set.h in Headers */,
+ 43AA8673194EEB8B00A67B56 /* port.h in Headers */,
+ 43AA8674194EEB8B00A67B56 /* process_thread.h in Headers */,
+ 43AA8675194EEB8B00A67B56 /* processor.h in Headers */,
+ 43AA8676194EEB8B00A67B56 /* profile.h in Headers */,
+ 43AA8677194EEB8B00A67B56 /* progress.h in Headers */,
+ 43AA8678194EEB8B00A67B56 /* proxy_controllable.h in Headers */,
+ 43AA8679194EEB8B00A67B56 /* public_diskstream.h in Headers */,
+ 43AA867A194EEB8B00A67B56 /* quantize.h in Headers */,
+ 43AA867B194EEB8B00A67B56 /* rb_effect.h in Headers */,
+ 43AA867C194EEB8B00A67B56 /* rc_configuration_vars.h in Headers */,
+ 43AA867D194EEB8B00A67B56 /* rc_configuration.h in Headers */,
+ 43AA867E194EEB8B00A67B56 /* readable.h in Headers */,
+ 43AA867F194EEB8B00A67B56 /* recent_sessions.h in Headers */,
+ 43AA8680194EEB8B00A67B56 /* region_factory.h in Headers */,
+ 43AA8681194EEB8B00A67B56 /* region_sorters.h in Headers */,
+ 43AA8682194EEB8B00A67B56 /* region.h in Headers */,
+ 43AA8683194EEB8B00A67B56 /* resampled_source.h in Headers */,
+ 43AA8684194EEB8B00A67B56 /* return.h in Headers */,
+ 43AA8685194EEB8B00A67B56 /* reverse.h in Headers */,
+ 43AA8686194EEB8B00A67B56 /* revision.h in Headers */,
+ 43AA8687194EEB8B00A67B56 /* route_graph.h in Headers */,
+ 43AA8688194EEB8B00A67B56 /* route_group_member.h in Headers */,
+ 43AA8689194EEB8B00A67B56 /* route_group_specialized.h in Headers */,
+ 43AA868A194EEB8B00A67B56 /* route_group.h in Headers */,
+ 43AA868B194EEB8B00A67B56 /* route.h in Headers */,
+ 43AA868C194EEB8B00A67B56 /* runtime_functions.h in Headers */,
+ 43AA868D194EEB8B00A67B56 /* search_paths.h in Headers */,
+ 43AA868E194EEB8B00A67B56 /* send.h in Headers */,
+ 43AA868F194EEB8B00A67B56 /* session_configuration_vars.h in Headers */,
+ 43AA8690194EEB8B00A67B56 /* session_configuration.h in Headers */,
+ 43AA8691194EEB8B00A67B56 /* session_directory.h in Headers */,
+ 43AA8692194EEB8B00A67B56 /* session_event.h in Headers */,
+ 43AA8693194EEB8B00A67B56 /* session_handle.h in Headers */,
+ 43AA8694194EEB8B00A67B56 /* session_metadata.h in Headers */,
+ 43AA8695194EEB8B00A67B56 /* session_object.h in Headers */,
+ 43AA8696194EEB8B00A67B56 /* session_playlist.h in Headers */,
+ 43AA8697194EEB8B00A67B56 /* session_playlists.h in Headers */,
+ 43AA8698194EEB8B00A67B56 /* session_route.h in Headers */,
+ 43AA8699194EEB8B00A67B56 /* session_state_utils.h in Headers */,
+ 43AA869A194EEB8B00A67B56 /* session_utils.h in Headers */,
+ 43AA869B194EEB8B00A67B56 /* session.h in Headers */,
+ 43AA869C194EEB8B00A67B56 /* silentfilesource.h in Headers */,
+ 43AA869D194EEB8B00A67B56 /* slave.h in Headers */,
+ 43AA869E194EEB8B00A67B56 /* smf_source.h in Headers */,
+ 43AA869F194EEB8B00A67B56 /* sndfile_helpers.h in Headers */,
+ 43AA86A0194EEB8B00A67B56 /* sndfileimportable.h in Headers */,
+ 43AA86A1194EEB8B00A67B56 /* sndfilesource.h in Headers */,
+ 43AA86A2194EEB8B00A67B56 /* soundseq.h in Headers */,
+ 43AA86A3194EEB8B00A67B56 /* source_factory.h in Headers */,
+ 43AA86A4194EEB8B00A67B56 /* source.h in Headers */,
+ 43AA86A5194EEB8B00A67B56 /* speaker.h in Headers */,
+ 43AA86A6194EEB8B00A67B56 /* speakers.h in Headers */,
+ 43AA86A7194EEB8B00A67B56 /* spline.h in Headers */,
+ 43AA86A8194EEB8B00A67B56 /* srcfilesource.h in Headers */,
+ 43AA86A9194EEB8B00A67B56 /* stretch.h in Headers */,
+ 43AA86AA194EEB8B00A67B56 /* strip_silence.h in Headers */,
+ 43AA86AB194EEB8B00A67B56 /* system_exec.h in Headers */,
+ 43AA86AC194EEB8B00A67B56 /* tape_file_matcher.h in Headers */,
+ 43AA86AD194EEB8B00A67B56 /* template_utils.h in Headers */,
+ 43AA86AE194EEB8B00A67B56 /* tempo_map_importer.h in Headers */,
+ 43AA86AF194EEB8B00A67B56 /* tempo.h in Headers */,
+ 43AA86B0194EEB8B00A67B56 /* thread_buffers.h in Headers */,
+ 43AA86B1194EEB8B00A67B56 /* ticker.h in Headers */,
+ 43AA86B2194EEB8B00A67B56 /* timecode.h in Headers */,
+ 43AA86B3194EEB8B00A67B56 /* timefx_request.h in Headers */,
+ 43AA86B4194EEB8B00A67B56 /* timestamps.h in Headers */,
+ 43AA86B5194EEB8B00A67B56 /* track.h in Headers */,
+ 43AA86B6194EEB8B00A67B56 /* transient_detector.h in Headers */,
+ 43AA86B7194EEB8B00A67B56 /* trimmable.h in Headers */,
+ 43AA86B8194EEB8B00A67B56 /* types.h in Headers */,
+ 43AA86B9194EEB8B00A67B56 /* unknown_processor.h in Headers */,
+ 43AA86BA194EEB8B00A67B56 /* uri_map.h in Headers */,
+ 43AA86BB194EEB8B00A67B56 /* user_bundle.h in Headers */,
+ 43AA86BC194EEB8B00A67B56 /* utils.h in Headers */,
+ 43AA86BD194EEB8B00A67B56 /* version.h in Headers */,
+ 43AA86BE194EEB8B00A67B56 /* vst_info_file.h in Headers */,
+ 43AA86BF194EEB8B00A67B56 /* vst_plugin.h in Headers */,
+ 43AA86C0194EEB8B00A67B56 /* vst_types.h in Headers */,
+ 43AA86C1194EEB8B00A67B56 /* vumeterdsp.h in Headers */,
+ 43AA86C2194EEB8B00A67B56 /* windows_vst_plugin.h in Headers */,
+ 43AA86C3194EEB8B00A67B56 /* worker.h in Headers */,
+ 43AA86C6194EEBAF00A67B56 /* aeffectx.h in Headers */,
+ 43AA86D0194EEC1400A67B56 /* gettext.h in Headers */,
+ 43AA86D1194EEC1400A67B56 /* lv2_evbuf.h in Headers */,
+ 43AA86D2194EEC1400A67B56 /* rdff.h in Headers */,
+ 432653E6194EF73C00BEFB46 /* amp.h in Headers */,
+ 432653E7194EF73C00BEFB46 /* analyser.h in Headers */,
+ 432653E8194EF73C00BEFB46 /* ardour.h in Headers */,
+ 432653E9194EF73C00BEFB46 /* async_midi_port.h in Headers */,
+ 432653EA194EF73C00BEFB46 /* audio_backend.h in Headers */,
+ 432653EB194EF73C00BEFB46 /* audio_buffer.h in Headers */,
+ 432653EC194EF73C00BEFB46 /* audio_diskstream.h in Headers */,
+ 432653ED194EF73C00BEFB46 /* audio_library.h in Headers */,
+ 432653EE194EF73C00BEFB46 /* audio_playlist_importer.h in Headers */,
+ 432653EF194EF73C00BEFB46 /* audio_playlist_source.h in Headers */,
+ 432653F0194EF73C00BEFB46 /* audio_port.h in Headers */,
+ 432653F1194EF73C00BEFB46 /* audio_region_importer.h in Headers */,
+ 432653F2194EF73C00BEFB46 /* audio_track.h in Headers */,
+ 432653F3194EF73C00BEFB46 /* audio_track_importer.h in Headers */,
+ 432653F4194EF73C00BEFB46 /* audio_unit.h in Headers */,
+ 432653F5194EF73C00BEFB46 /* audioanalyser.h in Headers */,
+ 432653F6194EF73C00BEFB46 /* audioengine.h in Headers */,
+ 432653F7194EF73C00BEFB46 /* audiofile_tagger.h in Headers */,
+ 432653F8194EF73C00BEFB46 /* audiofilesource.h in Headers */,
+ 432653F9194EF73C00BEFB46 /* audioplaylist.h in Headers */,
+ 432653FA194EF73C00BEFB46 /* audioregion.h in Headers */,
+ 432653FB194EF73C00BEFB46 /* audiosource.h in Headers */,
+ 432653FC194EF73C00BEFB46 /* auditioner.h in Headers */,
+ 432653FD194EF73C00BEFB46 /* auto_bundle.h in Headers */,
+ 432653FE194EF73C00BEFB46 /* automatable.h in Headers */,
+ 432653FF194EF73C00BEFB46 /* automatable_sequence.h in Headers */,
+ 43265400194EF73C00BEFB46 /* automation_control.h in Headers */,
+ 43265401194EF73C00BEFB46 /* automation_list.h in Headers */,
+ 43265402194EF73C00BEFB46 /* automation_watch.h in Headers */,
+ 43265403194EF73C00BEFB46 /* beats_frames_converter.h in Headers */,
+ 43265404194EF73C00BEFB46 /* broadcast_info.h in Headers */,
+ 43265405194EF73C00BEFB46 /* buffer.h in Headers */,
+ 43265406194EF73C00BEFB46 /* buffer_manager.h in Headers */,
+ 43265407194EF73C00BEFB46 /* buffer_set.h in Headers */,
+ 43265408194EF73C00BEFB46 /* bundle.h in Headers */,
+ 43265409194EF73C00BEFB46 /* butler.h in Headers */,
+ 4326540A194EF73C00BEFB46 /* caimportable.h in Headers */,
+ 4326540B194EF73C00BEFB46 /* capturing_processor.h in Headers */,
+ 4326540C194EF73C00BEFB46 /* chan_count.h in Headers */,
+ 4326540D194EF73D00BEFB46 /* chan_mapping.h in Headers */,
+ 4326540E194EF73D00BEFB46 /* click.h in Headers */,
+ 4326540F194EF73D00BEFB46 /* comparable_shared_ptr.h in Headers */,
+ 43265410194EF73D00BEFB46 /* configuration.h in Headers */,
+ 43265411194EF73D00BEFB46 /* configuration_variable.h in Headers */,
+ 43265412194EF73D00BEFB46 /* control_protocol_manager.h in Headers */,
+ 43265413194EF73D00BEFB46 /* coreaudiosource.h in Headers */,
+ 43265414194EF73D00BEFB46 /* cycle_timer.h in Headers */,
+ 43265415194EF73D00BEFB46 /* cycles.h in Headers */,
+ 43265416194EF73D00BEFB46 /* data_type.h in Headers */,
+ 43265417194EF73D00BEFB46 /* dB.h in Headers */,
+ 43265418194EF73D00BEFB46 /* debug.h in Headers */,
+ 43265419194EF73D00BEFB46 /* delivery.h in Headers */,
+ 4326541A194EF73D00BEFB46 /* directory_names.h in Headers */,
+ 4326541B194EF73D00BEFB46 /* diskstream.h in Headers */,
+ 4326541C194EF73D00BEFB46 /* element_import_handler.h in Headers */,
+ 4326541D194EF73D00BEFB46 /* element_importer.h in Headers */,
+ 4326541E194EF73D00BEFB46 /* engine_state_controller.h in Headers */,
+ 4326541F194EF73D00BEFB46 /* event_type_map.h in Headers */,
+ 43265420194EF73D00BEFB46 /* export_channel.h in Headers */,
+ 43265421194EF73D00BEFB46 /* export_channel_configuration.h in Headers */,
+ 43265422194EF73D00BEFB46 /* export_failed.h in Headers */,
+ 43265423194EF73D00BEFB46 /* export_filename.h in Headers */,
+ 43265424194EF73D00BEFB46 /* export_format_base.h in Headers */,
+ 43265425194EF73D00BEFB46 /* export_format_compatibility.h in Headers */,
+ 43265426194EF73D00BEFB46 /* export_format_manager.h in Headers */,
+ 43265427194EF73D00BEFB46 /* export_format_specification.h in Headers */,
+ 43265428194EF73D00BEFB46 /* export_formats.h in Headers */,
+ 43265429194EF73D00BEFB46 /* export_graph_builder.h in Headers */,
+ 4326542A194EF73D00BEFB46 /* export_handler.h in Headers */,
+ 4326542B194EF73D00BEFB46 /* export_multiplication.h in Headers */,
+ 4326542C194EF73D00BEFB46 /* export_pointers.h in Headers */,
+ 4326542D194EF73D00BEFB46 /* export_preset.h in Headers */,
+ 4326542E194EF73D00BEFB46 /* export_profile_manager.h in Headers */,
+ 4326542F194EF73D00BEFB46 /* export_status.h in Headers */,
+ 43265430194EF73D00BEFB46 /* export_timespan.h in Headers */,
+ 43265431194EF73D00BEFB46 /* file_source.h in Headers */,
+ 43265432194EF73D00BEFB46 /* filename_extensions.h in Headers */,
+ 43265433194EF73D00BEFB46 /* filesystem_paths.h in Headers */,
+ 43265434194EF73D00BEFB46 /* filter.h in Headers */,
+ 43265435194EF73D00BEFB46 /* graph.h in Headers */,
+ 43265436194EF73D00BEFB46 /* graphnode.h in Headers */,
+ 43265437194EF73D00BEFB46 /* iec1ppmdsp.h in Headers */,
+ 43265438194EF73D00BEFB46 /* iec2ppmdsp.h in Headers */,
+ 43265439194EF73D00BEFB46 /* import_status.h in Headers */,
+ 4326543A194EF73D00BEFB46 /* importable_source.h in Headers */,
+ 4326543B194EF73D00BEFB46 /* instrument_info.h in Headers */,
+ 4326543C194EF73D00BEFB46 /* internal_return.h in Headers */,
+ 4326543D194EF73D00BEFB46 /* internal_send.h in Headers */,
+ 4326543E194EF73D00BEFB46 /* interpolation.h in Headers */,
+ 4326543F194EF73D00BEFB46 /* interthread_info.h in Headers */,
+ 43265440194EF73D00BEFB46 /* io.h in Headers */,
+ 43265441194EF73D00BEFB46 /* io_processor.h in Headers */,
+ 43265442194EF73D00BEFB46 /* jack_utils.h in Headers */,
+ 43265443194EF73D00BEFB46 /* kmeterdsp.h in Headers */,
+ 43265444194EF73D00BEFB46 /* ladspa.h in Headers */,
+ 43265445194EF73D00BEFB46 /* ladspa_plugin.h in Headers */,
+ 43265446194EF73D00BEFB46 /* latent.h in Headers */,
+ 43265447194EF73D00BEFB46 /* libardour_visibility.h in Headers */,
+ 43265448194EF73D00BEFB46 /* linux_vst_support.h in Headers */,
+ 43265449194EF73D00BEFB46 /* location.h in Headers */,
+ 4326544A194EF73D00BEFB46 /* location_importer.h in Headers */,
+ 4326544B194EF73D00BEFB46 /* logcurve.h in Headers */,
+ 4326544C194EF73D00BEFB46 /* lv2_plugin.h in Headers */,
+ 4326544D194EF73D00BEFB46 /* lxvst_plugin.h in Headers */,
+ 4326544E194EF73D00BEFB46 /* meter.h in Headers */,
+ 4326544F194EF73D00BEFB46 /* midi_automation_list_binder.h in Headers */,
+ 43265450194EF73D00BEFB46 /* midi_buffer.h in Headers */,
+ 43265451194EF73D00BEFB46 /* midi_diskstream.h in Headers */,
+ 43265452194EF73D00BEFB46 /* midi_model.h in Headers */,
+ 43265453194EF73D00BEFB46 /* midi_operator.h in Headers */,
+ 43265454194EF73D00BEFB46 /* midi_patch_manager.h in Headers */,
+ 43265455194EF73D00BEFB46 /* midi_playlist.h in Headers */,
+ 43265456194EF73D00BEFB46 /* midi_playlist_source.h in Headers */,
+ 43265457194EF73D00BEFB46 /* midi_port.h in Headers */,
+ 43265458194EF73D00BEFB46 /* midi_region.h in Headers */,
+ 43265459194EF73D00BEFB46 /* midi_ring_buffer.h in Headers */,
+ 4326545A194EF73D00BEFB46 /* midi_source.h in Headers */,
+ 4326545B194EF73D00BEFB46 /* midi_state_tracker.h in Headers */,
+ 4326545C194EF73D00BEFB46 /* midi_stretch.h in Headers */,
+ 4326545D194EF73D00BEFB46 /* midi_track.h in Headers */,
+ 4326545E194EF73D00BEFB46 /* midi_ui.h in Headers */,
+ 4326545F194EF73D00BEFB46 /* midiport_manager.h in Headers */,
+ 43265460194EF73D00BEFB46 /* mix.h in Headers */,
+ 43265461194EF73D00BEFB46 /* monitor_processor.h in Headers */,
+ 43265462194EF73D00BEFB46 /* movable.h in Headers */,
+ 43265463194EF73D00BEFB46 /* msvc_libardour.h in Headers */,
+ 43265464194EF73D00BEFB46 /* mtdm.h in Headers */,
+ 43265465194EF73D00BEFB46 /* mute_master.h in Headers */,
+ 43265466194EF73D00BEFB46 /* noise.h in Headers */,
+ 43265467194EF73D00BEFB46 /* onset_detector.h in Headers */,
+ 43265468194EF73D00BEFB46 /* operations.h in Headers */,
+ 43265469194EF73D00BEFB46 /* pan_controllable.h in Headers */,
+ 4326546A194EF73D00BEFB46 /* pannable.h in Headers */,
+ 4326546B194EF73D00BEFB46 /* panner.h in Headers */,
+ 4326546C194EF73D00BEFB46 /* panner_manager.h in Headers */,
+ 4326546D194EF73D00BEFB46 /* panner_shell.h in Headers */,
+ 4326546E194EF73D00BEFB46 /* pcm_utils.h in Headers */,
+ 4326546F194EF73D00BEFB46 /* peak.h in Headers */,
+ 43265470194EF73D00BEFB46 /* pi_controller.h in Headers */,
+ 43265471194EF73D00BEFB46 /* pitch.h in Headers */,
+ 43265472194EF73D00BEFB46 /* playlist.h in Headers */,
+ 43265473194EF73D00BEFB46 /* playlist_factory.h in Headers */,
+ 43265474194EF73D00BEFB46 /* playlist_source.h in Headers */,
+ 43265475194EF73D00BEFB46 /* plugin.h in Headers */,
+ 43265476194EF73D00BEFB46 /* plugin_insert.h in Headers */,
+ 43265477194EF73D00BEFB46 /* plugin_manager.h in Headers */,
+ 43265478194EF73D00BEFB46 /* plugin_types.h in Headers */,
+ 43265479194EF73D00BEFB46 /* port.h in Headers */,
+ 4326547A194EF73D00BEFB46 /* port_engine.h in Headers */,
+ 4326547B194EF73D00BEFB46 /* port_insert.h in Headers */,
+ 4326547C194EF73D00BEFB46 /* port_manager.h in Headers */,
+ 4326547D194EF73D00BEFB46 /* port_set.h in Headers */,
+ 4326547E194EF73D00BEFB46 /* process_thread.h in Headers */,
+ 4326547F194EF73D00BEFB46 /* processor.h in Headers */,
+ 43265480194EF73D00BEFB46 /* profile.h in Headers */,
+ 43265481194EF73D00BEFB46 /* progress.h in Headers */,
+ 43265482194EF73D00BEFB46 /* proxy_controllable.h in Headers */,
+ 43265483194EF73D00BEFB46 /* public_diskstream.h in Headers */,
+ 43265484194EF73D00BEFB46 /* quantize.h in Headers */,
+ 43265485194EF73D00BEFB46 /* rb_effect.h in Headers */,
+ 43265486194EF73D00BEFB46 /* rc_configuration.h in Headers */,
+ 43265487194EF73D00BEFB46 /* rc_configuration_vars.h in Headers */,
+ 43265488194EF73D00BEFB46 /* readable.h in Headers */,
+ 43265489194EF73D00BEFB46 /* recent_sessions.h in Headers */,
+ 4326548A194EF73D00BEFB46 /* region.h in Headers */,
+ 4326548B194EF73D00BEFB46 /* region_factory.h in Headers */,
+ 4326548C194EF73D00BEFB46 /* region_sorters.h in Headers */,
+ 4326548D194EF73D00BEFB46 /* resampled_source.h in Headers */,
+ 4326548E194EF73D00BEFB46 /* return.h in Headers */,
+ 4326548F194EF73D00BEFB46 /* reverse.h in Headers */,
+ 43265490194EF73D00BEFB46 /* revision.h in Headers */,
+ 43265491194EF73D00BEFB46 /* route.h in Headers */,
+ 43265492194EF73D00BEFB46 /* route_graph.h in Headers */,
+ 43265493194EF73D00BEFB46 /* route_group.h in Headers */,
+ 43265494194EF73D00BEFB46 /* route_group_member.h in Headers */,
+ 43265495194EF73D00BEFB46 /* route_group_specialized.h in Headers */,
+ 43265496194EF73D00BEFB46 /* runtime_functions.h in Headers */,
+ 43265497194EF73D00BEFB46 /* search_paths.h in Headers */,
+ 43265498194EF73D00BEFB46 /* send.h in Headers */,
+ 43265499194EF73D00BEFB46 /* session.h in Headers */,
+ 4326549A194EF73D00BEFB46 /* session_configuration.h in Headers */,
+ 4326549B194EF73D00BEFB46 /* session_configuration_vars.h in Headers */,
+ 4326549C194EF73D00BEFB46 /* session_directory.h in Headers */,
+ 4326549D194EF73D00BEFB46 /* session_event.h in Headers */,
+ 4326549E194EF73D00BEFB46 /* session_handle.h in Headers */,
+ 4326549F194EF73D00BEFB46 /* session_metadata.h in Headers */,
+ 432654A0194EF73D00BEFB46 /* session_object.h in Headers */,
+ 432859E91A10F415006C3E03 /* soundcloud_upload.h in Headers */,
+ 432654A1194EF73D00BEFB46 /* session_playlist.h in Headers */,
+ 432654A2194EF73D00BEFB46 /* session_playlists.h in Headers */,
+ 432654A3194EF73D00BEFB46 /* session_route.h in Headers */,
+ 432654A4194EF73D00BEFB46 /* session_state_utils.h in Headers */,
+ 432654A5194EF73D00BEFB46 /* session_utils.h in Headers */,
+ 432654A6194EF73D00BEFB46 /* silentfilesource.h in Headers */,
+ 432654A7194EF73D00BEFB46 /* slave.h in Headers */,
+ 432654A8194EF73D00BEFB46 /* smf_source.h in Headers */,
+ 432654A9194EF73D00BEFB46 /* sndfile_helpers.h in Headers */,
+ 432654AA194EF73D00BEFB46 /* sndfileimportable.h in Headers */,
+ 432654AB194EF73D00BEFB46 /* sndfilesource.h in Headers */,
+ 432654AC194EF73D00BEFB46 /* soundseq.h in Headers */,
+ 432654AD194EF73D00BEFB46 /* source.h in Headers */,
+ 432654AE194EF73D00BEFB46 /* source_factory.h in Headers */,
+ 432654AF194EF73D00BEFB46 /* speaker.h in Headers */,
+ 432654B0194EF73D00BEFB46 /* speakers.h in Headers */,
+ 432654B1194EF73D00BEFB46 /* spline.h in Headers */,
+ 432654B2194EF73D00BEFB46 /* srcfilesource.h in Headers */,
+ 432654B3194EF73D00BEFB46 /* stretch.h in Headers */,
+ 432654B4194EF73D00BEFB46 /* strip_silence.h in Headers */,
+ 432654B5194EF73D00BEFB46 /* system_exec.h in Headers */,
+ 432654B6194EF73D00BEFB46 /* tape_file_matcher.h in Headers */,
+ 432654B7194EF73D00BEFB46 /* template_utils.h in Headers */,
+ 432654B8194EF73D00BEFB46 /* tempo.h in Headers */,
+ 432654B9194EF73D00BEFB46 /* tempo_map_importer.h in Headers */,
+ 432654BA194EF73D00BEFB46 /* thread_buffers.h in Headers */,
+ 432654BB194EF73D00BEFB46 /* ticker.h in Headers */,
+ 432654BC194EF73D00BEFB46 /* timecode.h in Headers */,
+ 432654BD194EF73D00BEFB46 /* timefx_request.h in Headers */,
+ 432654BE194EF73D00BEFB46 /* timestamps.h in Headers */,
+ 432654BF194EF73D00BEFB46 /* track.h in Headers */,
+ 432654C0194EF73D00BEFB46 /* transient_detector.h in Headers */,
+ 432654C1194EF73D00BEFB46 /* trimmable.h in Headers */,
+ 432654C2194EF73D00BEFB46 /* types.h in Headers */,
+ 432654C3194EF73D00BEFB46 /* unknown_processor.h in Headers */,
+ 432654C4194EF73D00BEFB46 /* uri_map.h in Headers */,
+ 432654C5194EF73D00BEFB46 /* user_bundle.h in Headers */,
+ 432654C6194EF73D00BEFB46 /* utils.h in Headers */,
+ 432654C7194EF73D00BEFB46 /* version.h in Headers */,
+ 432654C8194EF73D00BEFB46 /* aeffectx.h in Headers */,
+ 432654C9194EF73D00BEFB46 /* vst_info_file.h in Headers */,
+ 432654CA194EF73D00BEFB46 /* vst_plugin.h in Headers */,
+ 432654CB194EF73D00BEFB46 /* vst_types.h in Headers */,
+ 432654CC194EF73D00BEFB46 /* vumeterdsp.h in Headers */,
+ 432654CD194EF73D00BEFB46 /* windows_vst_plugin.h in Headers */,
+ 432654CE194EF73D00BEFB46 /* worker.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 43AA82A8194EEAAF00A67B56 /* libardour */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 43AA82AA194EEAAF00A67B56 /* Build configuration list for PBXNativeTarget "libardour" */;
+ buildPhases = (
+ 43AA82A5194EEAAF00A67B56 /* Sources */,
+ 43AA82A6194EEAAF00A67B56 /* Frameworks */,
+ 43AA82A7194EEAAF00A67B56 /* Headers */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = libardour;
+ productName = ardour;
+ productReference = 43AA82A9194EEAAF00A67B56 /* liblibardour.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 43AA8296194EEA6F00A67B56 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0460;
+ ORGANIZATIONNAME = Waves;
+ };
+ buildConfigurationList = 43AA8299194EEA6F00A67B56 /* Build configuration list for PBXProject "libardour" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 43AA8295194EEA6F00A67B56;
+ productRefGroup = 43AA829F194EEA6F00A67B56 /* Products */;
+ projectDirPath = "";
+ projectReferences = (
+ {
+ ProductGroup = 432859EC1A10F436006C3E03 /* Products */;
+ ProjectRef = 432859EB1A10F436006C3E03 /* libardour.xcodeproj */;
+ },
+ );
+ projectRoot = "";
+ targets = (
+ 43AA82A8194EEAAF00A67B56 /* libardour */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 43AA82A5194EEAAF00A67B56 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 43AA8383194EEB2600A67B56 /* amp.cc in Sources */,
+ 43AA8384194EEB2600A67B56 /* analyser.cc in Sources */,
+ 43AA8385194EEB2600A67B56 /* async_midi_port.cc in Sources */,
+ 43AA8386194EEB2600A67B56 /* audio_buffer.cc in Sources */,
+ 43AA8387194EEB2600A67B56 /* audio_diskstream.cc in Sources */,
+ 43AA8388194EEB2600A67B56 /* audio_library.cc in Sources */,
+ 43AA8389194EEB2600A67B56 /* audio_playlist_importer.cc in Sources */,
+ 43AA838A194EEB2600A67B56 /* audio_playlist_source.cc in Sources */,
+ 43AA838B194EEB2600A67B56 /* audio_playlist.cc in Sources */,
+ 43AA838C194EEB2600A67B56 /* audio_port.cc in Sources */,
+ 43AA838D194EEB2600A67B56 /* audio_region_importer.cc in Sources */,
+ 43AA838E194EEB2600A67B56 /* audio_track_importer.cc in Sources */,
+ 43AA838F194EEB2600A67B56 /* audio_track.cc in Sources */,
+ 43AA8390194EEB2600A67B56 /* audio_unit.cc in Sources */,
+ 43AA8391194EEB2600A67B56 /* audioanalyser.cc in Sources */,
+ 43AA8392194EEB2600A67B56 /* audioengine.cc in Sources */,
+ 43AA8393194EEB2600A67B56 /* audiofile_tagger.cc in Sources */,
+ 43AA8394194EEB2600A67B56 /* audiofilesource.cc in Sources */,
+ 43AA8395194EEB2600A67B56 /* audioregion.cc in Sources */,
+ 43AA8396194EEB2600A67B56 /* audiosource.cc in Sources */,
+ 43AA8397194EEB2600A67B56 /* auditioner.cc in Sources */,
+ 43AA8398194EEB2600A67B56 /* auto_bundle.cc in Sources */,
+ 43AA8399194EEB2600A67B56 /* automatable.cc in Sources */,
+ 43AA839A194EEB2600A67B56 /* automation_control.cc in Sources */,
+ 43AA839B194EEB2600A67B56 /* automation_list.cc in Sources */,
+ 43AA839C194EEB2600A67B56 /* automation_watch.cc in Sources */,
+ 43AA839D194EEB2600A67B56 /* automation.cc in Sources */,
+ 43AA839E194EEB2600A67B56 /* beats_frames_converter.cc in Sources */,
+ 43AA839F194EEB2600A67B56 /* broadcast_info.cc in Sources */,
+ 43AA83A0194EEB2600A67B56 /* buffer_manager.cc in Sources */,
+ 43AA83A1194EEB2600A67B56 /* buffer_set.cc in Sources */,
+ 43AA83A2194EEB2600A67B56 /* buffer.cc in Sources */,
+ 43AA83A3194EEB2600A67B56 /* bundle.cc in Sources */,
+ 43AA83A4194EEB2600A67B56 /* butler.cc in Sources */,
+ 43AA83A5194EEB2600A67B56 /* caimportable.cc in Sources */,
+ 43AA83A6194EEB2600A67B56 /* capturing_processor.cc in Sources */,
+ 43AA83A7194EEB2600A67B56 /* chan_count.cc in Sources */,
+ 43AA83A8194EEB2600A67B56 /* chan_mapping.cc in Sources */,
+ 43AA83A9194EEB2600A67B56 /* config_text.cc in Sources */,
+ 43AA83AA194EEB2600A67B56 /* configuration.cc in Sources */,
+ 43AA83AB194EEB2600A67B56 /* control_protocol_manager.cc in Sources */,
+ 43AA83AC194EEB2600A67B56 /* coreaudiosource.cc in Sources */,
+ 43AA83AD194EEB2600A67B56 /* cycle_timer.cc in Sources */,
+ 43AA83AE194EEB2600A67B56 /* data_type.cc in Sources */,
+ 43AA83AF194EEB2600A67B56 /* debug.cc in Sources */,
+ 43AA83B0194EEB2600A67B56 /* default_click.cc in Sources */,
+ 43AA83B1194EEB2600A67B56 /* delivery.cc in Sources */,
+ 43AA83B2194EEB2600A67B56 /* directory_names.cc in Sources */,
+ 43AA83B3194EEB2600A67B56 /* diskstream.cc in Sources */,
+ 43AA83B4194EEB2600A67B56 /* element_import_handler.cc in Sources */,
+ 43AA83B5194EEB2600A67B56 /* element_importer.cc in Sources */,
+ 43AA83B6194EEB2600A67B56 /* engine_slave.cc in Sources */,
+ 43AA83B7194EEB2600A67B56 /* engine_state_controller.cc in Sources */,
+ 43AA83B8194EEB2600A67B56 /* enums.cc in Sources */,
+ 43AA83B9194EEB2600A67B56 /* event_type_map.cc in Sources */,
+ 43AA83BA194EEB2600A67B56 /* export_channel_configuration.cc in Sources */,
+ 43AA83BB194EEB2600A67B56 /* export_channel.cc in Sources */,
+ 43AA83BC194EEB2600A67B56 /* export_failed.cc in Sources */,
+ 43AA83BD194EEB2600A67B56 /* export_filename.cc in Sources */,
+ 43AA83BE194EEB2600A67B56 /* export_format_base.cc in Sources */,
+ 43AA83BF194EEB2600A67B56 /* export_format_manager.cc in Sources */,
+ 43AA83C0194EEB2600A67B56 /* export_format_specification.cc in Sources */,
+ 43AA83C1194EEB2600A67B56 /* export_formats.cc in Sources */,
+ 43AA83C2194EEB2600A67B56 /* export_graph_builder.cc in Sources */,
+ 43AA83C3194EEB2600A67B56 /* export_handler.cc in Sources */,
+ 43AA83C4194EEB2600A67B56 /* export_multiplication.cc in Sources */,
+ 43AA83C5194EEB2600A67B56 /* export_preset.cc in Sources */,
+ 43AA83C6194EEB2600A67B56 /* export_profile_manager.cc in Sources */,
+ 432859F71A10F436006C3E03 /* soundcloud_upload.cc in Sources */,
+ 43AA83C7194EEB2600A67B56 /* export_status.cc in Sources */,
+ 43AA83C8194EEB2600A67B56 /* export_timespan.cc in Sources */,
+ 43AA83C9194EEB2600A67B56 /* file_source.cc in Sources */,
+ 432859F31A10F436006C3E03 /* midi_scene_change.cc in Sources */,
+ 43AA83CA194EEB2600A67B56 /* filename_extensions.cc in Sources */,
+ 43AA83CB194EEB2600A67B56 /* filesystem_paths.cc in Sources */,
+ 43AA83CC194EEB2600A67B56 /* filter.cc in Sources */,
+ 43AA83CD194EEB2600A67B56 /* find_session.cc in Sources */,
+ 43AA83CE194EEB2600A67B56 /* globals.cc in Sources */,
+ 43AA83CF194EEB2600A67B56 /* graph.cc in Sources */,
+ 43AA83D0194EEB2600A67B56 /* graphnode.cc in Sources */,
+ 43AA83D1194EEB2600A67B56 /* iec1ppmdsp.cc in Sources */,
+ 43AA83D2194EEB2600A67B56 /* iec2ppmdsp.cc in Sources */,
+ 43AA83D3194EEB2600A67B56 /* import.cc in Sources */,
+ 43AA83D4194EEB2600A67B56 /* instrument_info.cc in Sources */,
+ 43AA83D5194EEB2600A67B56 /* internal_return.cc in Sources */,
+ 43AA83D6194EEB2600A67B56 /* internal_send.cc in Sources */,
+ 43AA83D7194EEB2600A67B56 /* interpolation.cc in Sources */,
+ 43AA83D8194EEB2600A67B56 /* io_processor.cc in Sources */,
+ 43AA83D9194EEB2600A67B56 /* io.cc in Sources */,
+ 43AA83DA194EEB2600A67B56 /* kmeterdsp.cc in Sources */,
+ 43AA83DB194EEB2600A67B56 /* ladspa_plugin.cc in Sources */,
+ 43AA83DC194EEB2600A67B56 /* linux_vst_support.cc in Sources */,
+ 43AA83DD194EEB2600A67B56 /* location_importer.cc in Sources */,
+ 43AA83DE194EEB2600A67B56 /* location.cc in Sources */,
+ 43AA83DF194EEB2600A67B56 /* ltc_slave.cc in Sources */,
+ 43AA83E0194EEB2600A67B56 /* lv2_evbuf.c in Sources */,
+ 43AA83E1194EEB2600A67B56 /* lv2_plugin.cc in Sources */,
+ 43AA83E2194EEB2600A67B56 /* lxvst_plugin.cc in Sources */,
+ 43AA83E3194EEB2600A67B56 /* meter.cc in Sources */,
+ 43AA83E4194EEB2600A67B56 /* midi_automation_list_binder.cc in Sources */,
+ 43AA83E5194EEB2600A67B56 /* midi_buffer.cc in Sources */,
+ 43AA83E6194EEB2600A67B56 /* midi_clock_slave.cc in Sources */,
+ 43AA83E7194EEB2600A67B56 /* midi_diskstream.cc in Sources */,
+ 43AA83E8194EEB2600A67B56 /* midi_model.cc in Sources */,
+ 43AA83E9194EEB2600A67B56 /* midi_patch_manager.cc in Sources */,
+ 43AA83EA194EEB2600A67B56 /* midi_playlist_source.cc in Sources */,
+ 43AA83EB194EEB2600A67B56 /* midi_playlist.cc in Sources */,
+ 43AA83EC194EEB2600A67B56 /* midi_port.cc in Sources */,
+ 43AA83ED194EEB2600A67B56 /* midi_region.cc in Sources */,
+ 43AA83EE194EEB2600A67B56 /* midi_ring_buffer.cc in Sources */,
+ 43AA83EF194EEB2600A67B56 /* midi_source.cc in Sources */,
+ 43AA83F0194EEB2600A67B56 /* midi_state_tracker.cc in Sources */,
+ 43AA83F1194EEB2600A67B56 /* midi_stretch.cc in Sources */,
+ 43AA83F2194EEB2600A67B56 /* midi_track.cc in Sources */,
+ 43AA83F3194EEB2600A67B56 /* midi_ui.cc in Sources */,
+ 43AA83F4194EEB2600A67B56 /* midiport_manager.cc in Sources */,
+ 43AA83F5194EEB2600A67B56 /* mix.cc in Sources */,
+ 43AA83F6194EEB2600A67B56 /* monitor_processor.cc in Sources */,
+ 43AA83F7194EEB2600A67B56 /* mtc_slave.cc in Sources */,
+ 43AA83F8194EEB2600A67B56 /* mtdm.cc in Sources */,
+ 43AA83F9194EEB2600A67B56 /* mute_master.cc in Sources */,
+ 43AA83FA194EEB2600A67B56 /* onset_detector.cc in Sources */,
+ 43AA83FB194EEB2600A67B56 /* operations.cc in Sources */,
+ 43AA83FC194EEB2600A67B56 /* pan_controllable.cc in Sources */,
+ 43AA83FD194EEB2600A67B56 /* pannable.cc in Sources */,
+ 43AA83FE194EEB2600A67B56 /* panner_manager.cc in Sources */,
+ 43AA83FF194EEB2600A67B56 /* panner_shell.cc in Sources */,
+ 43AA8400194EEB2600A67B56 /* panner.cc in Sources */,
+ 43AA8401194EEB2600A67B56 /* pcm_utils.cc in Sources */,
+ 43AA8402194EEB2600A67B56 /* pi_controller.cc in Sources */,
+ 43AA8403194EEB2600A67B56 /* playlist_factory.cc in Sources */,
+ 43AA8404194EEB2600A67B56 /* playlist_source.cc in Sources */,
+ 43AA8405194EEB2600A67B56 /* playlist.cc in Sources */,
+ 43AA8406194EEB2600A67B56 /* plugin_insert.cc in Sources */,
+ 43AA8407194EEB2600A67B56 /* plugin_manager.cc in Sources */,
+ 43AA8408194EEB2600A67B56 /* plugin.cc in Sources */,
+ 43AA8409194EEB2600A67B56 /* port_insert.cc in Sources */,
+ 43AA840A194EEB2600A67B56 /* port_manager.cc in Sources */,
+ 43AA840B194EEB2600A67B56 /* port_set.cc in Sources */,
+ 43AA840C194EEB2600A67B56 /* port.cc in Sources */,
+ 43AA840D194EEB2600A67B56 /* process_thread.cc in Sources */,
+ 43AA840E194EEB2600A67B56 /* processor.cc in Sources */,
+ 43AA840F194EEB2600A67B56 /* progress.cc in Sources */,
+ 43AA8410194EEB2600A67B56 /* quantize.cc in Sources */,
+ 43AA8411194EEB2600A67B56 /* rb_effect.cc in Sources */,
+ 43AA8412194EEB2600A67B56 /* rc_configuration.cc in Sources */,
+ 43AA8413194EEB2600A67B56 /* rdff.c in Sources */,
+ 43AA8414194EEB2600A67B56 /* recent_sessions.cc in Sources */,
+ 43AA8415194EEB2600A67B56 /* region_factory.cc in Sources */,
+ 43AA8416194EEB2600A67B56 /* region.cc in Sources */,
+ 43AA8417194EEB2600A67B56 /* resampled_source.cc in Sources */,
+ 43AA8418194EEB2600A67B56 /* return.cc in Sources */,
+ 43AA8419194EEB2600A67B56 /* reverse.cc in Sources */,
+ 43AA841A194EEB2600A67B56 /* revision.cc in Sources */,
+ 43AA841B194EEB2600A67B56 /* route_graph.cc in Sources */,
+ 43AA841C194EEB2600A67B56 /* route_group_member.cc in Sources */,
+ 43AA841D194EEB2600A67B56 /* route_group.cc in Sources */,
+ 43AA841E194EEB2600A67B56 /* route.cc in Sources */,
+ 43AA841F194EEB2600A67B56 /* search_paths.cc in Sources */,
+ 43AA8420194EEB2600A67B56 /* send.cc in Sources */,
+ 43AA8421194EEB2600A67B56 /* session_butler.cc in Sources */,
+ 43AA8422194EEB2600A67B56 /* session_click.cc in Sources */,
+ 43AA8423194EEB2600A67B56 /* session_command.cc in Sources */,
+ 43AA8424194EEB2600A67B56 /* session_configuration.cc in Sources */,
+ 43AA8425194EEB2600A67B56 /* session_directory.cc in Sources */,
+ 43AA8426194EEB2600A67B56 /* session_events.cc in Sources */,
+ 43AA8427194EEB2600A67B56 /* session_export.cc in Sources */,
+ 43AA8428194EEB2600A67B56 /* session_handle.cc in Sources */,
+ 43AA8429194EEB2600A67B56 /* session_ltc.cc in Sources */,
+ 43AA842A194EEB2600A67B56 /* session_metadata.cc in Sources */,
+ 43AA842B194EEB2600A67B56 /* session_midi.cc in Sources */,
+ 43AA842C194EEB2600A67B56 /* session_object.cc in Sources */,
+ 43AA842D194EEB2600A67B56 /* session_playlists.cc in Sources */,
+ 43AA842E194EEB2600A67B56 /* session_process.cc in Sources */,
+ 43AA842F194EEB2600A67B56 /* session_rtevents.cc in Sources */,
+ 43AA8430194EEB2600A67B56 /* session_state_utils.cc in Sources */,
+ 43AA8431194EEB2600A67B56 /* session_state.cc in Sources */,
+ 43AA8432194EEB2600A67B56 /* session_time.cc in Sources */,
+ 43AA8433194EEB2600A67B56 /* session_transport.cc in Sources */,
+ 43AA8434194EEB2600A67B56 /* session_vst.cc in Sources */,
+ 43AA8435194EEB2600A67B56 /* session.cc in Sources */,
+ 43AA8436194EEB2600A67B56 /* slave.cc in Sources */,
+ 43AA8437194EEB2600A67B56 /* smf_source.cc in Sources */,
+ 43AA8438194EEB2600A67B56 /* sndfile_helpers.cc in Sources */,
+ 43AA8439194EEB2600A67B56 /* sndfileimportable.cc in Sources */,
+ 43AA843A194EEB2600A67B56 /* sndfilesource.cc in Sources */,
+ 43AA843B194EEB2600A67B56 /* source_factory.cc in Sources */,
+ 43AA843C194EEB2600A67B56 /* source.cc in Sources */,
+ 43AA843D194EEB2600A67B56 /* speakers.cc in Sources */,
+ 432859F61A10F436006C3E03 /* scene_change.cc in Sources */,
+ 43AA843E194EEB2600A67B56 /* srcfilesource.cc in Sources */,
+ 43AA843F194EEB2600A67B56 /* sse_functions_64bit.s in Sources */,
+ 43AA8440194EEB2600A67B56 /* sse_functions_xmm.cc in Sources */,
+ 43AA8441194EEB2600A67B56 /* sse_functions.s in Sources */,
+ 43AA8442194EEB2600A67B56 /* st_pitch.cc in Sources */,
+ 43AA8443194EEB2600A67B56 /* st_stretch.cc in Sources */,
+ 43AA8444194EEB2600A67B56 /* strip_silence.cc in Sources */,
+ 43AA8445194EEB2600A67B56 /* system_exec.cc in Sources */,
+ 43AA8446194EEB2600A67B56 /* tape_file_matcher.cc in Sources */,
+ 43AA8447194EEB2600A67B56 /* template_utils.cc in Sources */,
+ 43AA8448194EEB2600A67B56 /* tempo_map_importer.cc in Sources */,
+ 43AA8449194EEB2600A67B56 /* tempo.cc in Sources */,
+ 43AA844A194EEB2600A67B56 /* thread_buffers.cc in Sources */,
+ 43AA844B194EEB2600A67B56 /* ticker.cc in Sources */,
+ 43AA844C194EEB2600A67B56 /* track.cc in Sources */,
+ 43AA844D194EEB2600A67B56 /* transient_detector.cc in Sources */,
+ 43AA844E194EEB2600A67B56 /* unknown_processor.cc in Sources */,
+ 43AA844F194EEB2600A67B56 /* uri_map.cc in Sources */,
+ 43AA8450194EEB2600A67B56 /* user_bundle.cc in Sources */,
+ 43AA8451194EEB2600A67B56 /* utils.cc in Sources */,
+ 43AA8452194EEB2600A67B56 /* version.cc in Sources */,
+ 43AA8453194EEB2600A67B56 /* vst_info_file.cc in Sources */,
+ 43AA8454194EEB2600A67B56 /* vst_plugin.cc in Sources */,
+ 43AA8455194EEB2600A67B56 /* vumeterdsp.cc in Sources */,
+ 43AA8456194EEB2600A67B56 /* windows_vst_plugin.cc in Sources */,
+ 43AA8457194EEB2600A67B56 /* worker.cc in Sources */,
+ 43AA84B9194EEB5F00A67B56 /* audio_engine_test.cc in Sources */,
+ 43AA84BB194EEB5F00A67B56 /* audio_region_read_test.cc in Sources */,
+ 43AA84BD194EEB5F00A67B56 /* audio_region_test.cc in Sources */,
+ 432859F51A10F436006C3E03 /* mididm.cc in Sources */,
+ 43AA84BF194EEB5F00A67B56 /* automation_list_property_test.cc in Sources */,
+ 43AA84C1194EEB5F00A67B56 /* bbt_test.cc in Sources */,
+ 43AA84C3194EEB5F00A67B56 /* combine_regions_test.cc in Sources */,
+ 43AA84C5194EEB5F00A67B56 /* control_surfaces_test.cc in Sources */,
+ 43AA84C7194EEB5F00A67B56 /* dummy_lxvst.cc in Sources */,
+ 43AA84C8194EEB5F00A67B56 /* framepos_minus_beats_test.cc in Sources */,
+ 43AA84CA194EEB5F00A67B56 /* framepos_plus_beats_test.cc in Sources */,
+ 43AA84CC194EEB5F00A67B56 /* framewalk_to_beats_test.cc in Sources */,
+ 43AA84CE194EEB5F00A67B56 /* interpolation_test.cc in Sources */,
+ 43AA84D0194EEB5F00A67B56 /* jack_utils_test.cc in Sources */,
+ 43AA84D2194EEB5F00A67B56 /* load_session.cc in Sources */,
+ 43AA84D3194EEB5F00A67B56 /* load_sessions_test.cc in Sources */,
+ 43AA84D5194EEB5F00A67B56 /* midi_clock_slave_test.cc in Sources */,
+ 43AA84D7194EEB5F00A67B56 /* mtdm_test.cc in Sources */,
+ 43AA84D9194EEB5F00A67B56 /* playlist_equivalent_regions_test.cc in Sources */,
+ 43AA84DB194EEB5F00A67B56 /* playlist_layering_test.cc in Sources */,
+ 43AA84DD194EEB5F00A67B56 /* playlist_read_test.cc in Sources */,
+ 43AA84DF194EEB5F00A67B56 /* plugins_test.cc in Sources */,
+ 43AA84E1194EEB5F00A67B56 /* load_session.cc in Sources */,
+ 43AA84E2194EEB5F00A67B56 /* lots_of_regions.cc in Sources */,
+ 432859F41A10F436006C3E03 /* midi_scene_changer.cc in Sources */,
+ 43AA84E3194EEB5F00A67B56 /* runpc.cc in Sources */,
+ 43AA84E4194EEB5F00A67B56 /* region_naming_test.cc in Sources */,
+ 43AA84E6194EEB5F00A67B56 /* resampled_source_test.cc in Sources */,
+ 43AA84E8194EEB5F00A67B56 /* session_test.cc in Sources */,
+ 43AA84EA194EEB5F00A67B56 /* tempo_test.cc in Sources */,
+ 43AA84EC194EEB5F00A67B56 /* test_common.cc in Sources */,
+ 43AA84EE194EEB5F00A67B56 /* test_needing_session.cc in Sources */,
+ 43AA84F0194EEB5F00A67B56 /* test_util.cc in Sources */,
+ 43AA84F2194EEB5F00A67B56 /* testrunner.cc in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 43AA82A0194EEA6F00A67B56 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.8;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ 43AA82A1194EEA6F00A67B56 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.8;
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+ 43AA82AB194EEAAF00A67B56 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ EXECUTABLE_PREFIX = lib;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 43AA82AC194EEAAF00A67B56 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ EXECUTABLE_PREFIX = lib;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 43AA8299194EEA6F00A67B56 /* Build configuration list for PBXProject "libardour" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 43AA82A0194EEA6F00A67B56 /* Debug */,
+ 43AA82A1194EEA6F00A67B56 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 43AA82AA194EEAAF00A67B56 /* Build configuration list for PBXNativeTarget "libardour" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 43AA82AB194EEAAF00A67B56 /* Debug */,
+ 43AA82AC194EEAAF00A67B56 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 43AA8296194EEA6F00A67B56 /* Project object */;
+}
diff --git a/libs/ardour/midi_buffer.cc b/libs/ardour/midi_buffer.cc
index b1b09e4..50ff7b7 100644
--- a/libs/ardour/midi_buffer.cc
+++ b/libs/ardour/midi_buffer.cc
@@ -44,7 +44,7 @@ MidiBuffer::MidiBuffer(size_t capacity)
MidiBuffer::~MidiBuffer()
{
- free(_data);
+ cache_aligned_free(_data);
}
void
@@ -60,7 +60,7 @@ MidiBuffer::resize(size_t size)
return;
}
- free (_data);
+ cache_aligned_free (_data);
cache_aligned_malloc ((void**) &_data, size);
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc
index a2a80f7..229c0ad 100644
--- a/libs/ardour/midi_diskstream.cc
+++ b/libs/ardour/midi_diskstream.cc
@@ -784,7 +784,7 @@ MidiDiskstream::read (framepos_t& start, framecnt_t dur, bool reversed)
}
int
-MidiDiskstream::do_refill_with_alloc ()
+MidiDiskstream::_do_refill_with_alloc (bool /* partial_fill */)
{
return do_refill();
}
diff --git a/libs/ardour/midi_scene_change.cc b/libs/ardour/midi_scene_change.cc
index 5e9394d..c10ca74 100644
--- a/libs/ardour/midi_scene_change.cc
+++ b/libs/ardour/midi_scene_change.cc
@@ -156,3 +156,23 @@ MIDISceneChange::operator==(const MIDISceneChange& other) const
_bank == other._bank &&
_channel == other._channel;
}
+
+void
+MIDISceneChange::set_channel (int channel)
+{
+ _channel = channel;
+}
+
+void
+MIDISceneChange::set_program (int program)
+{
+ _program = program;
+}
+
+void
+MIDISceneChange::set_bank (int bank)
+{
+ _bank = bank;
+}
+
+
diff --git a/libs/ardour/midi_scene_changer.cc b/libs/ardour/midi_scene_changer.cc
index 8e2347a..75d5581 100644
--- a/libs/ardour/midi_scene_changer.cc
+++ b/libs/ardour/midi_scene_changer.cc
@@ -96,6 +96,10 @@ MIDISceneChanger::gather (const Locations::LocationList& locations)
void
MIDISceneChanger::rt_deliver (MidiBuffer& mbuf, framepos_t when, boost::shared_ptr<MIDISceneChange> msc)
{
+ if (!msc->active()) {
+ return;
+ }
+
uint8_t buf[4];
size_t cnt;
@@ -121,6 +125,10 @@ MIDISceneChanger::rt_deliver (MidiBuffer& mbuf, framepos_t when, boost::shared_p
void
MIDISceneChanger::non_rt_deliver (boost::shared_ptr<MIDISceneChange> msc)
{
+ if (!msc->active()) {
+ return;
+ }
+
uint8_t buf[4];
size_t cnt;
boost::shared_ptr<AsyncMIDIPort> aport = boost::dynamic_pointer_cast<AsyncMIDIPort>(output_port);
@@ -273,19 +281,25 @@ MIDISceneChanger::program_change_input (MIDI::Parser& parser, MIDI::byte program
last_program_message_time = time;
if (!recording()) {
+
MIDIInputActivity (); /* EMIT SIGNAL */
- jump_to (input_port->channel (channel)->bank(), program);
+
+ int bank = -1;
+ if (have_seen_bank_changes) {
+ bank = input_port->channel (channel)->bank();
+ }
+
+ jump_to (bank, program);
return;
}
Locations* locations (_session.locations ());
Location* loc;
bool new_mark = false;
- framecnt_t slop = (framecnt_t) floor ((Config->get_inter_scene_gap_msecs() / 1000.0) * _session.frame_rate());
/* check for marker at current location */
- loc = locations->mark_at (time, slop);
+ loc = locations->mark_at (time, Config->get_inter_scene_gap_frames());
if (!loc) {
/* create a new marker at the desired position */
@@ -301,12 +315,9 @@ MIDISceneChanger::program_change_input (MIDI::Parser& parser, MIDI::byte program
new_mark = true;
}
- unsigned short bank;
-
+ int bank = -1;
if (have_seen_bank_changes) {
bank = input_port->channel (channel)->bank();
- } else {
- bank = -1;
}
MIDISceneChange* msc =new MIDISceneChange (channel, bank, program & 0x7f);
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc
index 487eb20..e48d516 100644
--- a/libs/ardour/midi_track.cc
+++ b/libs/ardour/midi_track.cc
@@ -47,6 +47,7 @@
#include "ardour/parameter_types.h"
#include "ardour/port.h"
#include "ardour/processor.h"
+#include "ardour/profile.h"
#include "ardour/session.h"
#include "ardour/session_playlists.h"
#include "ardour/utils.h"
@@ -135,7 +136,11 @@ MidiTrack::set_diskstream (boost::shared_ptr<Diskstream> ds)
mds->reset_tracker ();
_diskstream->set_track (this);
- _diskstream->set_destructive (_mode == Destructive);
+ if (Profile->get_trx()) {
+ _diskstream->set_destructive (false);
+ } else {
+ _diskstream->set_destructive (_mode == Destructive);
+ }
_diskstream->set_record_enabled (false);
_diskstream_data_recorded_connection.disconnect ();
@@ -351,7 +356,7 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
if (!lm.locked()) {
boost::shared_ptr<MidiDiskstream> diskstream = midi_diskstream();
framecnt_t playback_distance = diskstream->calculate_playback_distance(nframes);
- if (can_internal_playback_seek(llabs(playback_distance))) {
+ if (can_internal_playback_seek(::llabs(playback_distance))) {
/* TODO should declick, and/or note-off */
internal_playback_seek(playback_distance);
}
diff --git a/libs/ardour/mix.cc b/libs/ardour/mix.cc
index adae68a..96ae624 100644
--- a/libs/ardour/mix.cc
+++ b/libs/ardour/mix.cc
@@ -136,6 +136,12 @@ default_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, p
}
}
+void
+default_copy_vector (ARDOUR::Sample * dst, const ARDOUR::Sample * src, pframes_t nframes)
+{
+ memcpy(dst, src, nframes*sizeof(ARDOUR::Sample));
+}
+
#if defined (__APPLE__) && defined (BUILD_VECLIB_OPTIMIZATIONS)
#include <Accelerate/Accelerate.h>
diff --git a/libs/ardour/mtc_slave.cc b/libs/ardour/mtc_slave.cc
index 1a1c5f2..83d6116 100644
--- a/libs/ardour/mtc_slave.cc
+++ b/libs/ardour/mtc_slave.cc
@@ -213,6 +213,7 @@ MTC_Slave::reset (bool with_position)
window_end = 0;
transport_direction = 1;
current_delta = 0;
+ ActiveChanged(false);
}
void
@@ -468,6 +469,7 @@ MTC_Slave::update_mtc_time (const MIDI::byte *msg, bool was_full, framepos_t now
first_mtc_timestamp = now;
init_mtc_dll(mtc_frame, qtr);
mtc_frame_dll = mtc_frame;
+ ActiveChanged (true); // emit signal
}
current.guard1++;
current.position = mtc_frame;
@@ -626,6 +628,7 @@ MTC_Slave::speed_and_position (double& speed, framepos_t& pos)
session.request_transport_speed (0);
engine_dll_initstate = 0;
queue_reset (false);
+ ActiveChanged (false);
DEBUG_TRACE (DEBUG::MTC, "MTC not seen for 2 frames - reset pending\n");
return false;
}
diff --git a/libs/ardour/parameter_descriptor.cc b/libs/ardour/parameter_descriptor.cc
index 67ea267..9a6f550 100644
--- a/libs/ardour/parameter_descriptor.cc
+++ b/libs/ardour/parameter_descriptor.cc
@@ -149,7 +149,7 @@ ParameterDescriptor::update_steps()
step = step / logf(30.0f);
largestep = largestep / logf(30.0f);
} else if (integer_step) {
- smallstep = std::max(1.0, rint(smallstep));
+ smallstep = 1.0;
step = std::max(1.0, rint(step));
largestep = std::max(1.0, rint(largestep));
}
diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc
index 20a2ef0..8862c63 100644
--- a/libs/ardour/playlist.cc
+++ b/libs/ardour/playlist.cc
@@ -1642,6 +1642,8 @@ Playlist::region_bounds_changed (const PropertyChange& what_changed, boost::shar
save = true;
}
+ mark_session_dirty ();
+
return save;
}
diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc
index 8da0abb..910b2cd 100644
--- a/libs/ardour/plugin_insert.cc
+++ b/libs/ardour/plugin_insert.cc
@@ -715,18 +715,14 @@ PluginInsert::configure_io (ChanCount in, ChanCount out)
ChanCount old_in = input_streams ();
ChanCount old_out = output_streams ();
+ _configured_in = in;
+ _configured_out = out;
+
/* set the matching method and number of plugins that we will use to meet this configuration */
_match = private_can_support_io_configuration (in, out);
if (set_count (_match.plugins) == false) {
- return false;
- }
-
- if ( (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
- || old_in != in
- || old_out != out
- )
- {
PluginIoReConfigure (); /* EMIT SIGNAL */
+ return false;
}
/* configure plugins */
@@ -734,17 +730,27 @@ PluginInsert::configure_io (ChanCount in, ChanCount out)
case Split:
case Hide:
if (_plugins.front()->configure_io (_plugins.front()->get_info()->n_inputs, out)) {
+ PluginIoReConfigure (); /* EMIT SIGNAL */
return false;
}
break;
default:
if (_plugins.front()->configure_io (in, out) == false) {
+ PluginIoReConfigure (); /* EMIT SIGNAL */
return false;
}
break;
}
+ if ( (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
+ || old_in != in
+ || old_out != out
+ )
+ {
+ PluginIoReConfigure (); /* EMIT SIGNAL */
+ }
+
// we don't know the analysis window size, so we must work with the
// current buffer size here. each request for data fills in these
// buffers and the analyser makes sure it gets enough data for the
@@ -1146,6 +1152,15 @@ PluginInsert::set_state(const XMLNode& node, int version)
}
void
+PluginInsert::update_id (PBD::ID id)
+{
+ set_id (id.to_s());
+ for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
+ (*i)->set_insert_id (id);
+ }
+}
+
+void
PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
{
XMLNodeList nlist = node.children();
@@ -1378,6 +1393,7 @@ PluginInsert::get_impulse_analysis_plugin()
boost::shared_ptr<Plugin> ret;
if (_impulseAnalysisPlugin.expired()) {
ret = plugin_factory(_plugins[0]);
+ ret->configure_io (input_streams (), output_streams ());
_impulseAnalysisPlugin = ret;
} else {
ret = _impulseAnalysisPlugin.lock();
diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc
index 37eb61e..4eb67db 100644
--- a/libs/ardour/plugin_manager.cc
+++ b/libs/ardour/plugin_manager.cc
@@ -225,6 +225,12 @@ PluginManager::~PluginManager()
void
PluginManager::refresh (bool cache_only)
{
+ Glib::Threads::Mutex::Lock lm (_lock, Glib::Threads::TRY_LOCK);
+
+ if (!lm.locked()) {
+ return;
+ }
+
DEBUG_TRACE (DEBUG::PluginManager, "PluginManager::refresh\n");
_cancel_scan = false;
@@ -236,20 +242,44 @@ PluginManager::refresh (bool cache_only)
#endif
#ifdef WINDOWS_VST_SUPPORT
if (Config->get_use_windows_vst()) {
- BootMessage (_("Scanning Windows VST Plugins"));
+ if (cache_only) {
+ BootMessage (_("Scanning Windows VST Plugins"));
+ } else {
+ BootMessage (_("Discovering Windows VST Plugins"));
+ }
windows_vst_refresh (cache_only);
}
#endif // WINDOWS_VST_SUPPORT
#ifdef LXVST_SUPPORT
if(Config->get_use_lxvst()) {
- BootMessage (_("Scanning Linux VST Plugins"));
+ if (cache_only) {
+ BootMessage (_("Scanning Linux VST Plugins"));
+ } else {
+ BootMessage (_("Discovering Linux VST Plugins"));
+ }
lxvst_refresh(cache_only);
}
#endif //Native linuxVST SUPPORT
+#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
+ if (!cache_only) {
+ string fn = Glib::build_filename (ARDOUR::user_cache_directory(), VST_BLACKLIST);
+ if (Glib::file_test (fn, Glib::FILE_TEST_EXISTS)) {
+ std::string bl;
+ std::ifstream ifs (fn.c_str ());
+ bl.assign ((std::istreambuf_iterator<char> (ifs)), (std::istreambuf_iterator<char> ()));
+ PBD::info << _("VST Blacklist:") << "\n" << bl << "-----" << endmsg;
+ }
+ }
+#endif
+
#ifdef AUDIOUNIT_SUPPORT
- BootMessage (_("Scanning AU Plugins"));
+ if (cache_only) {
+ BootMessage (_("Scanning AU Plugins"));
+ } else {
+ BootMessage (_("Discovering AU Plugins"));
+ }
au_refresh (cache_only);
#endif
@@ -274,32 +304,69 @@ PluginManager::cancel_plugin_timeout ()
void
PluginManager::clear_vst_cache ()
{
- // see also libs/ardour/vst_info_file.cc - vstfx_infofile_path()
+#if 1 // clean old cache and error files. (remove this code after 4.3 or 5.0)
#ifdef WINDOWS_VST_SUPPORT
{
vector<string> fsi_files;
+ find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\" VST_EXT_INFOFILE "$", true);
+ for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
+ ::g_unlink(i->c_str());
+ }
+ }
+ {
+ vector<string> fsi_files;
find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\.fsi$", true);
for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
::g_unlink(i->c_str());
}
}
+ {
+ vector<string> fsi_files;
+ find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\.err$", true);
+ for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
+ ::g_unlink(i->c_str());
+ }
+ }
#endif
#ifdef LXVST_SUPPORT
{
vector<string> fsi_files;
+ find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\" VST_EXT_INFOFILE "$", true);
+ for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
+ ::g_unlink(i->c_str());
+ }
+ }
+ {
+ vector<string> fsi_files;
find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\.fsi$", true);
for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
::g_unlink(i->c_str());
}
}
+ {
+ vector<string> fsi_files;
+ find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\.err$", true);
+ for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
+ ::g_unlink(i->c_str());
+ }
+ }
#endif
+#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
+ {
+ string dir = Glib::build_filename (ARDOUR::user_cache_directory(), "fst_info");
+ if (Glib::file_test (dir, Glib::FILE_TEST_IS_DIR)) {
+ PBD::remove_directory (dir);
+ }
+ }
+#endif
+#endif // old cache cleanup
#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
{
- string personal = get_personal_vst_info_cache_dir();
+ string dn = Glib::build_filename (ARDOUR::user_cache_directory(), "vst");
vector<string> fsi_files;
- find_files_matching_regex (fsi_files, personal, "\\.fsi$", /* user cache is flat, no recursion */ false);
+ find_files_matching_regex (fsi_files, dn, "\\" VST_EXT_INFOFILE "$", /* user cache is flat, no recursion */ false);
for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
::g_unlink(i->c_str());
}
@@ -310,10 +377,12 @@ PluginManager::clear_vst_cache ()
void
PluginManager::clear_vst_blacklist ()
{
+#if 1 // remove old blacklist files. (remove this code after 4.3 or 5.0)
+
#ifdef WINDOWS_VST_SUPPORT
{
vector<string> fsi_files;
- find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\.fsb$", true);
+ find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\" VST_EXT_BLACKLIST "$", true);
for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
::g_unlink(i->c_str());
}
@@ -323,24 +392,32 @@ PluginManager::clear_vst_blacklist ()
#ifdef LXVST_SUPPORT
{
vector<string> fsi_files;
- find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\.fsb$", true);
+ find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\" VST_EXT_BLACKLIST "$", true);
for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
::g_unlink(i->c_str());
}
}
#endif
-
#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
{
- string personal = get_personal_vst_blacklist_dir();
+ string dir = Glib::build_filename (ARDOUR::user_cache_directory(), "fst_blacklist");
+ if (Glib::file_test (dir, Glib::FILE_TEST_IS_DIR)) {
+ PBD::remove_directory (dir);
+ }
+ }
+#endif
- vector<string> fsi_files;
- find_files_matching_regex (fsi_files, personal, "\\.fsb$", /* flat user cache */ false);
- for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
- ::g_unlink(i->c_str());
+#endif // old blacklist cleanup
+
+#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
+ {
+ string fn = Glib::build_filename (ARDOUR::user_cache_directory(), VST_BLACKLIST);
+ if (Glib::file_test (fn, Glib::FILE_TEST_EXISTS)) {
+ ::g_unlink (fn.c_str());
}
}
#endif
+
}
void
@@ -639,31 +716,17 @@ void
PluginManager::au_refresh (bool cache_only)
{
DEBUG_TRACE (DEBUG::PluginManager, "AU: refresh\n");
- if (cache_only && !Config->get_discover_audio_units ()) {
- return;
- }
- delete _au_plugin_info;
- _au_plugin_info = AUPluginInfo::discover();
- // disable automatic scan in case we crash
+ // disable automatic discovery in case we crash
+ bool discover_at_start = Config->get_discover_audio_units ();
Config->set_discover_audio_units (false);
Config->save_state();
- /* note: AU require a CAComponentDescription pointer provided by the OS.
- * Ardour only caches port and i/o config. It can't just 'scan' without
- * 'discovering' (like we do for VST).
- *
- * So in case discovery fails, we assume the worst: the Description
- * is broken (malicious plugins) and even a simple 'scan' would always
- * crash ardour on startup. Hence we disable Auto-Scan on start.
- *
- * If the crash happens at any later time (description is available),
- * Ardour will blacklist the plugin in question -- unless
- * the crash happens during realtime-run.
- */
+ delete _au_plugin_info;
+ _au_plugin_info = AUPluginInfo::discover(cache_only && !discover_at_start);
- // successful scan re-enabled automatic discovery
- Config->set_discover_audio_units (true);
+ // successful scan re-enabled automatic discovery if it was set
+ Config->set_discover_audio_units (discover_at_start);
Config->save_state();
}
@@ -696,7 +759,11 @@ PluginManager::windows_vst_discover_from_path (string path, bool cache_only)
vector<string>::iterator x;
int ret = 0;
- DEBUG_TRACE (DEBUG::PluginManager, string_compose ("detecting Windows VST plugins along %1\n", path));
+ DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Discovering Windows VST plugins along %1\n", path));
+
+ if (Config->get_verbose_plugin_scan()) {
+ info << string_compose (_("--- Windows VST plugins Scan: %1"), path) << endmsg;
+ }
find_files_matching_filter (plugin_objects, Config->get_plugin_path_vst(), windows_vst_filter, 0, false, true, true);
@@ -705,6 +772,10 @@ PluginManager::windows_vst_discover_from_path (string path, bool cache_only)
windows_vst_discover (*x, cache_only || cancelled());
}
+ if (Config->get_verbose_plugin_scan()) {
+ info << _("--- Windows VST plugins Scan Done") << endmsg;
+ }
+
return ret;
}
@@ -713,12 +784,22 @@ PluginManager::windows_vst_discover (string path, bool cache_only)
{
DEBUG_TRACE (DEBUG::PluginManager, string_compose ("windows_vst_discover '%1'\n", path));
+ if (Config->get_verbose_plugin_scan()) {
+ info << string_compose (_(" * %1 %2"), path, (cache_only ? _(" (cache only)") : "")) << endmsg;
+ }
+
_cancel_timeout = false;
vector<VSTInfo*> * finfos = vstfx_get_info_fst (const_cast<char *> (path.c_str()),
cache_only ? VST_SCAN_CACHE_ONLY : VST_SCAN_USE_APP);
+ // TODO get extended error messae from vstfx_get_info_fst() e.g blacklisted, 32/64bit compat,
+ // .err file scanner output etc.
+
if (finfos->empty()) {
DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Cannot get Windows VST information from '%1'\n", path));
+ if (Config->get_verbose_plugin_scan()) {
+ info << _(" -> Cannot get Windows VST information, plugin ignored.") << endmsg;
+ }
return -1;
}
@@ -728,7 +809,7 @@ PluginManager::windows_vst_discover (string path, bool cache_only)
char buf[32];
if (!finfo->canProcessReplacing) {
- warning << string_compose (_("VST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"),
+ warning << string_compose (_("VST plugin %1 does not support processReplacing, and cannot be used in %2 at this time"),
finfo->name, PROGRAM_NAME)
<< endl;
continue;
@@ -762,8 +843,8 @@ PluginManager::windows_vst_discover (string path, bool cache_only)
if (!_windows_vst_plugin_info->empty()) {
for (PluginInfoList::iterator i =_windows_vst_plugin_info->begin(); i != _windows_vst_plugin_info->end(); ++i) {
- if ((info->type == (*i)->type)&&(info->unique_id == (*i)->unique_id)) {
- warning << "Ignoring duplicate Windows VST plugin " << info->name << "\n";
+ if ((info->type == (*i)->type) && (info->unique_id == (*i)->unique_id)) {
+ warning << string_compose (_("Ignoring duplicate Windows VST plugin \"%1\""), info->name) << endmsg;
duplicate = true;
break;
}
@@ -774,6 +855,9 @@ PluginManager::windows_vst_discover (string path, bool cache_only)
DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Windows VST plugin ID '%1'\n", info->unique_id));
_windows_vst_plugin_info->push_back (info);
discovered++;
+ if (Config->get_verbose_plugin_scan()) {
+ PBD::info << string_compose (_(" -> OK (VST Plugin \"%1\" was added)."), info->name) << endmsg;
+ }
}
}
diff --git a/libs/ardour/po/de.po b/libs/ardour/po/de.po
index 26c21a3..06d8dcf 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: 2015-03-31 20:13-0400\n"
-"PO-Revision-Date: 2015-03-18 16:57+0100\n"
+"POT-Creation-Date: 2015-08-13 10:38+0200\n"
+"PO-Revision-Date: 2015-08-13 10:39+0200\n"
"Last-Translator: Edgar Aichinger <edogawa at aon.at>\n"
"Language-Team: German <ardour-dev at lists.ardour.org>\n"
"Language: de\n"
@@ -17,86 +17,96 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 1.5\n"
-#: amp.cc:57 automatable.cc:165
+#: amp.cc:62 automatable.cc:165
msgid "Fader"
msgstr "Fader"
-#: analyser.cc:117 audioregion.cc:1729
+#: amp.cc:445
+#, c-format
+msgid "%3.1f dB"
+msgstr "%3.1f dB"
+
+#: amp.cc:486
+#, c-format
+msgid "%.2fdB"
+msgstr "%.2fdB"
+
+#: analyser.cc:117 audioregion.cc:1764
msgid "Transient Analysis failed for %1."
-msgstr ""
+msgstr "Transientenanalyse für %1 fehlgeschlagen."
#: analyser.cc:117
msgid "Audio File Source"
-msgstr ""
+msgstr "Audiodateiquelle"
-#: audio_diskstream.cc:249
+#: audio_diskstream.cc:257
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr ""
"AudioDiskstream: Wiedergabeliste \"%1\" ist keine Audio-Wiedergabeliste"
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
"AudioDiskstream %1: es gibt keine Wiedergabeliste, die kopiert werden kann!"
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:879 audio_diskstream.cc:889
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
"AudioDiskstream %1: Kann während des Befüllens %2 nicht aus Wiedergabeliste "
"bei Frame %3 lesen"
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1052
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
"AudioDiskstream %1: Kann %2 nicht aus Wiedergabeliste bei Frame %3 lesen"
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1468 audio_diskstream.cc:1487
msgid "AudioDiskstream %1: cannot write to disk"
msgstr "AudioDiskstream %1: Kann nicht auf Disk schreiben"
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1530
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr "AudioDiskstream %1: Kann aufgenommene Daten nicht auf Disk schreiben!"
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1624
msgid "%1: could not create region for complete audio file"
msgstr "%1: konnte keine Region für die komplette Audiodatei erzeugen"
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1656
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr ""
"AudioDiskstream: konnte keine Region für das aufgenommene Audiomaterial "
"erzeugen!"
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1764
msgid "programmer error: %1"
msgstr "Programmierfehler: %1"
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2021
msgid "AudioDiskstream: channel %1 out of range"
msgstr "AudioDiskstream: Kanal %1 Bereichsüberschreitung"
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2035 midi_diskstream.cc:1296
msgid "%1:%2 new capture file not initialized correctly"
msgstr "%1:%2 neue Aufnahmedatei nicht korrekt initialisiert"
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2314
msgid "%1: cannot restore pending capture source file %2"
msgstr "%1: kann vorläufige Aufnahme-Quelldatei %2 nicht wiederherstellen"
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2336
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr ""
"%1: Liste enthält falsche Anzahl vorläufiger Quellen - alle werden ignoriert"
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2370
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
"%1: kann aus vorläufigen Aufnahmequellen keine Region für die komplette "
"Datei erzeugen"
-#: audio_library.cc:81
+#: audio_library.cc:82
msgid "Could not open %1. Audio Library not saved"
msgstr "Konnte %1 nicht öffnen. Die Audio-Bibliothek wurde nicht gesichert"
@@ -142,10 +152,11 @@ msgstr "schlecht geformtes XML in importierter Wiedergabeliste"
msgid "Audio Playlists (unused)"
msgstr "Audio-Wiedergabelisten (unbenutzt)"
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1002
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:356 plugin_insert.cc:704
+#: rb_effect.cc:327 session.cc:3475 session.cc:3508 session.cc:4905
+#: session_handle.cc:87 sndfilesource.cc:156
msgid "programming error: %1"
msgstr "Programmierfehler: %1"
@@ -173,26 +184,32 @@ msgstr ""
"\n"
"Kanäle: "
-#: audio_track.cc:161
+#: audio_track.cc:173
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr "Unbekanntes Bündel \"%1\" für Eingang von %2 genannt"
-#: audio_track.cc:163
+#: audio_track.cc:175
msgid "in 1"
msgstr "in 1"
-#: audio_track.cc:164
+#: audio_track.cc:176
msgid "No input bundles available as a replacement"
msgstr "Es gibt keine als Ersatz geeigneten Eingangs-Bündel"
-#: audio_track.cc:168
+#: audio_track.cc:180
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr "Bündel %1 war nicht verfügbar - verwende statt dessen \"in 1\""
-#: audio_track.cc:177
+#: audio_track.cc:189
msgid "improper input channel list in XML node (%1)"
msgstr "XML-Knoten (%1) enthält ungeeignete Liste der Eingangskanäle"
+#: audio_track.cc:212 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+"%1: dieses Projekt benutzt destruktive Spuren, was aber nicht unterstützt "
+"wird"
+
#: audio_track_importer.cc:68
msgid "Audio Tracks"
msgstr "Audiospuren"
@@ -213,19 +230,23 @@ 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:696
+#: audioengine.cc:731
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr "AudioEngine: kann Modul \"%1\" nicht laden (%2)"
-#: audioengine.cc:702
+#: audioengine.cc:737
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr "AudioEngine: Backend an \"%1\" hat keine Beschreibungsfunktion."
-#: audioengine.cc:779
+#: audioengine.cc:814
msgid "Could not create backend for %1: %2"
msgstr "Konnte Backend für %1 nicht erzeugen: %2"
-#: audioregion.cc:1685
+#: audiofilesource.cc:176
+msgid "Odd audio file path: %1"
+msgstr "Seltsamer Audiodateipfad: %1"
+
+#: audioregion.cc:1720
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -250,91 +271,104 @@ msgstr ""
"und zukünftigen Operation(en) zur Transienten-Erkennung eine leichte "
"Verzögerung bemerken.\n"
-#: audioregion.cc:1729
+#: audioregion.cc:1764
msgid "Audio Region"
-msgstr ""
+msgstr "Audioregion"
-#: audiosource.cc:228
+#: audiosource.cc:227
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr "kann Peakfile für %1 nicht von %2 auf %3 umbenennen (%4)"
-#: audiosource.cc:257
+#: audiosource.cc:256
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr "AudioSource: Peakfile \"%1\" nicht auffindbar"
-#: audiosource.cc:361
+#: audiosource.cc:362
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr "Kann Peakdatei @ %1 nicht zur Größenermittung öffnen (%2)"
+
+#: audiosource.cc:383
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr "Peakdateei %1 ist von %2 zu %3 "
+
+#: audiosource.cc:386
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+"Kann Peakdatei @ %1 nach Neuerstellung nicht zur Größenermittung öffnen (%2)"
+
+#: audiosource.cc:398
msgid "Cannot open peakfile @ %1 for reading (%2)"
-msgstr "Kannot Peakdatei @ %1 for reading (%2)"
+msgstr "Kann Peakdatei @ %1 nicht zum Lesen öffnen (%2)"
-#: audiosource.cc:394
+#: audiosource.cc:432
msgid "cannot read sample data for unscaled peak computation"
msgstr "kann Sampledaten für unskalierte Peaks-Berechnung nicht lesen"
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:467 audiosource.cc:562
msgid "map failed - could not create file mapping for peakfile %1."
msgstr ""
"map ist gescheitert - konnte Dateimapping für Peakfile %1 nicht erzeugen."
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:473 audiosource.cc:568
msgid "map failed - could not map peakfile %1."
msgstr "map ist gescheitert - konnte Peakfile %1 nicht mappen."
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:484 audiosource.cc:579
msgid "unmap failed - could not unmap peakfile %1."
msgstr "unmap ist gescheitert - konnte Peakfile %1 nicht unmappen."
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:490 audiosource.cc:585
msgid "map failed - could not mmap peakfile %1."
msgstr "map ist gescheitert - konnte Peakfile %1 nicht mmap()pen."
-#: audiosource.cc:638
+#: audiosource.cc:675
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.cc:705
+#: audiosource.cc:742
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr "%1: konnte Rohdaten für Peakberechnung nicht lesen/schreiben (%2)"
-#: audiosource.cc:742
+#: audiosource.cc:779
msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
msgstr "AudioSource: kann Pfad für Peaks (c) \"%1\" nicht öffnen (%2)"
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:850 audiosource.cc:972
msgid "%1: could not seek in peak file data (%2)"
msgstr "%1: konnte in den Daten der Peakdatei nicht suchen (%2)"
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:855 audiosource.cc:981
msgid "%1: could not write peak file data (%2)"
msgstr "%1: konnte Peak-Daten nicht in Datei schreiben (%2)"
-#: audiosource.cc:975
+#: audiosource.cc:1014
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr "konnte Peakdatei %1 nicht auf %2 kürzen (Fehler: %3)"
-#: auditioner.cc:100
+#: auditioner.cc:101
msgid "Falling back to Reasonable Synth for Midi Audition"
msgstr "Greife fürs MIDI-Vorhören auf Reasonable Synth zurück"
-#: auditioner.cc:102
+#: auditioner.cc:103
msgid "No synth for midi-audition found."
msgstr "Keinen Synth zum MIDI-Vorhören gefunden."
-#: auditioner.cc:158
+#: auditioner.cc:159
msgid "no outputs available for auditioner - manual connection required"
msgstr "Keine Ausgänge für Abhöre verfügbar - manuelle Verbindung erforderlich"
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:404 auditioner.cc:451
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr "Kann den Abhör-Signalfluss für %1 Kanäle nicht einrichten"
-#: auditioner.cc:434
+#: auditioner.cc:439
msgid "Failed to load synth for MIDI-Audition."
msgstr "Konnte Synth zum MIDI-Vorhören nicht laden."
-#: auditioner.cc:453
+#: auditioner.cc:458
msgid "Auditioning of regions other than Audio or Midi is not supported."
msgstr "Vorhören anderer Regionen als Audio oder MIDI wird nicht unterstützt."
@@ -351,44 +385,56 @@ msgid "cannot load automation data from %2"
msgstr "kann Automationsdaten von %2 nicht laden"
#: automatable.cc:167
+msgid "Trim"
+msgstr "Anpassen"
+
+#: automatable.cc:169
msgid "Mute"
msgstr "Stumm"
-#: automation_list.cc:356
+#: automation_control.cc:148
+msgid "write %1 automation"
+msgstr "schreibe %1 Automation"
+
+#: automation_control.cc:159
+msgid "touch %1 automation"
+msgstr "ändere %1 Automation"
+
+#: automation_list.cc:361
msgid "automation list: cannot load coordinates from XML, all points ignored"
msgstr ""
"Automationsliste: kann Koordinaten aus XML nicht laden, alle Punkte ignoriert"
-#: automation_list.cc:402
+#: automation_list.cc:407
msgid ""
"automation list: no x-coordinate stored for control point (point ignored)"
msgstr ""
"Automationsliste: Keine X-Koordinate für Kontrollpunkt gespeichert (Punkt "
"ignoriert)"
-#: automation_list.cc:408
+#: automation_list.cc:413
msgid ""
"automation list: no y-coordinate stored for control point (point ignored)"
msgstr ""
"Automationsliste: Keine Y-Koordinate für Kontrollpunkt gespeichert (Punkt "
"ignoriert)"
-#: automation_list.cc:422
+#: automation_list.cc:427
msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
"AutomationList: XML-Knoten mit Namen %1, nicht \"AutomationList\" übergeben "
"- ignoriert"
-#: butler.cc:100
+#: butler.cc:126
msgid "Session: could not create butler thread"
msgstr "Projekt: konnte Butler-Thread nicht erzeugen"
-#: butler.cc:222 butler.cc:223
+#: butler.cc:253 butler.cc:254
msgid "Butler read ahead failure on dstream %1"
msgstr "Butler-Lesefehler bei dstream %1"
-#: butler.cc:270 butler.cc:271
+#: butler.cc:301 butler.cc:302
msgid "Butler write-behind failure on dstream %1"
msgstr "Butler-Schreibfehler bei dstream %1"
@@ -441,7 +487,7 @@ msgstr "kann CPU-Takt in /proc/cpuinfo nicht finden"
msgid "audio"
msgstr "Audio"
-#: data_type.cc:28 session.cc:1995 session.cc:1998
+#: data_type.cc:28 session.cc:2271
msgid "MIDI"
msgstr "MIDI"
@@ -457,7 +503,7 @@ msgstr "Hauptausgänge"
msgid "listen"
msgstr "hören"
-#: diskstream.cc:309
+#: diskstream.cc:312
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr "Zeitpunkt \"%1\" für Spurschleife ungültig (Start >= Ende)"
@@ -524,23 +570,23 @@ msgstr "Verlustbehaftete Kompression"
msgid "Lossless compression"
msgstr "Verlustfreie Kompression"
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:601
msgid "Session rate"
msgstr "Projektrate"
-#: export_format_specification.cc:549
+#: export_format_specification.cc:556
msgid "normalize"
msgstr "normalisiere"
-#: export_format_specification.cc:553
+#: export_format_specification.cc:560
msgid "trim"
msgstr "anpassen"
-#: export_format_specification.cc:555
+#: export_format_specification.cc:562
msgid "trim start"
msgstr "Anfang anpassen"
-#: export_format_specification.cc:557
+#: export_format_specification.cc:564
msgid "trim end"
msgstr "Ende anpassen"
@@ -556,7 +602,7 @@ msgstr "Dreieck"
msgid "Rectangular"
msgstr "Rechteck"
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
+#: export_formats.cc:52 session.cc:6245 session.cc:6265
msgid "None"
msgstr "Kein"
@@ -596,92 +642,92 @@ msgstr "Vorbis-Sampleformat"
msgid "No sample format"
msgstr "Kein Sampleformat"
-#: export_handler.cc:360
+#: export_handler.cc:371
msgid "File %1 uploaded to %2"
msgstr "Datei %1 nach %2 hochgeladen"
-#: export_handler.cc:366
+#: export_handler.cc:377
msgid ""
"upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
"das Hochladen nach Soundcloud ist gescheitert. Vielleicht sind E-mail-"
"Adresse oder Passwort falsch?"
-#: export_handler.cc:413
+#: export_handler.cc:429
msgid "Editor: cannot open \"%1\" as export file for CD marker file"
msgstr "Editor: kann \"%1\" als Export-Datei für CD-Marker nicht öffnen"
-#: export_handler.cc:492 export_handler.cc:495
+#: export_handler.cc:508 export_handler.cc:511
msgid "an error occured while writing a TOC/CUE file: %1"
msgstr "beim Schreiben einer TOC/CUE Datei trat ein Fehler auf:%1"
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:801 export_handler.cc:859
msgid "Cannot convert %1 to Latin-1 text"
msgstr "Kann %1 nicht zu Latin-1 Kodierung konvertieren"
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
msgid "Searching for export formats in %1"
msgstr "Suche in %1 nach Exportformaten"
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
msgid "Unable to create export format directory %1: %2"
msgstr "Kann Verzeichnis %1 für Exportformate nicht erzeugen: %2"
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:263
msgid "Unable to remove export preset %1: %2"
msgstr "Kann Export-Preset %1 nicht entfernen: %2"
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:352
msgid "Selection"
msgstr "Auswahl"
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:613
msgid "Unable to rename export format %1 to %2: %3"
msgstr "Kann Export-Format %1 nicht nach %2 umbenennen: %3"
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:645
msgid "Unable to remove export profile %1: %2"
msgstr "Kann Export-Profil %1 nicht entfernen: %2"
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:663
msgid "empty format"
msgstr "leeres Format"
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:744
msgid "Cannot load export format from %1"
msgstr "Kann Exportformat aus %1 nicht laden"
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:750
msgid "Cannot export format read from %1"
msgstr "Kann Exportformat aus %1 nicht lesen"
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:844
msgid "No timespan has been selected!"
msgstr "Keine Zeitspanne ausgewählt!"
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:848
msgid "No channels have been selected!"
msgstr "Keine Kanäle ausgewählt!"
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:852
msgid "Some channels are empty"
msgstr "Einige Kanäle sind leer"
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:885
msgid "No format selected!"
msgstr "Kein Format ausgewählt!"
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:887
msgid "All channels are empty!"
msgstr "Alle Kanäle sind leer!"
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:889
msgid "One or more of the selected formats is not compatible with this system!"
msgstr ""
"Eines oder mehrere der gewählten Formate sind mit diesem Sytem nicht "
"kompatibel!"
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:892
msgid ""
"%1 supports only %2 channels, but you have %3 channels in your channel "
"configuration"
@@ -689,7 +735,7 @@ msgstr ""
"% unterstützt nur %2 Kanäle, in Ihrer Kanalkonfiguration befinden sich "
"jedoch %3 Kanäle"
-#: file_source.cc:201 session_state.cc:2857
+#: file_source.cc:201 session_state.cc:2987
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@@ -699,11 +745,11 @@ msgstr ""
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr "Kann Quelldatei nicht von %1 nach %2 umbenennen (%3)"
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
msgid "FileSource: search path not set"
msgstr "Dateiquelle: Suchpfad nicht gesetzt"
-#: file_source.cc:435
+#: file_source.cc:434
msgid ""
"FileSource: \"%1\" is ambigous when searching\n"
"\t"
@@ -711,15 +757,15 @@ msgstr ""
"FileSource: \"%1\" ist während der Suche doppeldeutig\n"
"\t"
-#: file_source.cc:442
+#: file_source.cc:441
msgid "Filesource: cannot find required file (%1)"
msgstr "Filesource: kann benötigte Datei (%1) nicht finden"
-#: file_source.cc:487
+#: file_source.cc:486
msgid "Filesource: cannot find required file (%1): %2"
msgstr "Dateiquelle: kann benötigte Datei (%1) nicht finden: %2"
-#: file_source.cc:495
+#: file_source.cc:494
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr "Dateiquelle: kann Datei (%1) nicht auf Existenz überprüfen: %2"
@@ -736,11 +782,11 @@ msgstr ""
msgid "cannot rename file %1 to %2 (%3)"
msgstr "kann Datei %1 nicht nach %2 umbenennen (%3)"
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
msgid "Cannot create Configuration directory %1 - cannot run"
msgstr "Kann Konfigurationsverzeichnis %1 nicht erzeugen - kann nicht starten"
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
msgid ""
"Configuration directory %1 already exists and is not a directory/folder - "
"cannot run"
@@ -748,26 +794,26 @@ msgstr ""
"Konfigurationsverzeichnis %1 existiert bereits, ist aber kein Verzeichnis/"
"Ordner - kann nicht starten"
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
msgid "Cannot create cache directory %1 - cannot run"
msgstr "Kann Cacheverzeichnis %1 nicht erzeugen - kann nicht starten"
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
msgid ""
"Cache directory %1 already exists and is not a directory/folder - cannot run"
msgstr ""
"Cacheverzeichnis %1 existiert bereits, ist aber kein Verzeichnis/Ordner - "
"kann nicht starten"
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr "Umgebungsvariable ARDOUR_DLL_PATH ist nicht gesetzt - beende\n"
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:260
msgid "ARDOUR_CONFIG_PATH not set in environment\n"
msgstr "Umgebungsvariable ARDOUR_CONFIG_PATH ist nicht gesetzt\n"
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:281
msgid "ARDOUR_DATA_PATH not set in environment\n"
msgstr "Umgebungsvariable ARDOUR_DATA_PATH ist nicht gesetzt\n"
@@ -775,7 +821,7 @@ msgstr "Umgebungsvariable ARDOUR_DATA_PATH ist nicht gesetzt\n"
msgid "filter: error creating name for new file based on %1"
msgstr "Filter: Fehler beim Erzeugen des neuen Dateinamens aus %1"
-#: filter.cc:79
+#: filter.cc:92
msgid "filter: error creating new file %1 (%2)"
msgstr "Filter: Fehler beim Erzeugen der neuen Datei %1 (%2)"
@@ -787,36 +833,36 @@ msgstr "Kann Projektpfad %1 nicht überprüfen (%2)"
msgid "cannot check statefile %1 (%2)"
msgstr "Kann die Projektdatei %1 nicht überprüfen (%2)"
-#: find_session.cc:121
+#: find_session.cc:124
msgid "%1 is not a snapshot file"
msgstr "%1 ist keine Schnappschussdatei"
-#: find_session.cc:138
+#: find_session.cc:141
msgid "cannot determine current working directory (%1)"
msgstr "kann momentanes Arbeitsverzeichnis nicht bestimmen (%1)"
-#: find_session.cc:155
+#: find_session.cc:158
msgid "unknown file type for session %1"
msgstr "Unbekannter Dateityp für Projekt %1"
-#: globals.cc:234
+#: globals.cc:262
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:236
+#: globals.cc:264
msgid "Could not set system open files limit to %1"
msgstr "Konnte die Systemgrenze für offene Dateien nicht auf %1 setzen"
-#: globals.cc:240
+#: globals.cc:268
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:244
+#: globals.cc:272
msgid "Could not get system open files limit (%1)"
msgstr "Konnte die Grenze für offene Dateien nicht erhalten (%1)"
-#: globals.cc:415
+#: globals.cc:454
msgid "Loading configuration"
msgstr "Lade Konfiguration"
@@ -845,8 +891,8 @@ msgid "Track %1 of %2 contained no usable MIDI data"
msgstr "Spur %1 von %2 beinhaltet keine brauchbaren MIDI-Daten"
#: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
-msgstr "MIDI-Datei %1 war unlesbar (keine Ursache ermittelbar)"
+msgid "MIDI file could not be written (best guess: %1)"
+msgstr "MIDI-Datei konnte nicht geschrieben werden (vermutlich: %1)"
#: import.cc:475
msgid "Import: cannot open input sound file \"%1\""
@@ -878,102 +924,102 @@ msgstr "Unbekannt"
msgid "preset %1 (bank %2)"
msgstr "Preset %1 (Bank %2)"
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:315 internal_send.cc:316
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr "%1 - kann Spur/Bus mit der ID %2 zum Verbinden finden"
-#: io.cc:209
+#: io.cc:210
msgid "IO: cannot disconnect port %1 from %2"
msgstr "IO: kann Port %1 nicht von %2 trennen"
-#: io.cc:344 io.cc:431
+#: io.cc:345 io.cc:432
msgid "IO: cannot register input port %1"
msgstr "IO: kann Eingangsport %1 nicht registrieren"
-#: io.cc:349 io.cc:436
+#: io.cc:350 io.cc:437
msgid "IO: cannot register output port %1"
msgstr "IO: kann Ausgangsport %1 nicht registrieren"
-#: io.cc:598 io.cc:654
+#: io.cc:599 io.cc:655
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr "unkorrekter XML-Knoten \"%1\" an IO Objekt weitergereicht"
-#: io.cc:713
+#: io.cc:717
msgid "in"
msgstr "in"
-#: io.cc:713
+#: io.cc:717
msgid "out"
msgstr "out"
-#: io.cc:714
+#: io.cc:718
msgid "input"
msgstr "Eingang"
-#: io.cc:714
+#: io.cc:718
msgid "output"
msgstr "Ausgang"
-#: io.cc:724
+#: io.cc:728
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr "Unbekanntes Bündel \"%1\" für %2 von %3 genannt"
-#: io.cc:790
+#: io.cc:794
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr "Bündel %1 war nicht verfügbar - verwende stattdessen \"%2\" "
-#: io.cc:793
+#: io.cc:797
msgid "No %1 bundles available as a replacement"
msgstr "%1 Bündel nicht als Ersatz verfügbar"
-#: io.cc:897
+#: io.cc:901
msgid "%1: cannot create I/O ports"
msgstr "%1: kann keine E/A-Ports erzeugen"
-#: io.cc:1025 io.cc:1126
+#: io.cc:1029 io.cc:1130
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr "IO: schlecht geformte Zeichenkette in XML-Knoten für Eingänge \"%1\""
-#: io.cc:1030 io.cc:1131
+#: io.cc:1034 io.cc:1135
msgid "bad input string in XML node \"%1\""
msgstr "IO: schlechte Zeichenkette für Eingang in XML-Knoten \"%1\""
-#: io.cc:1069
+#: io.cc:1073
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr "IO: schlecht geformte Zeichenkette in XML-Knoten für Ausgänge \"%1\""
-#: io.cc:1074
+#: io.cc:1078
msgid "IO: bad output string in XML node \"%1\""
msgstr "IO: schlechte Zeichenkette für Ausgang in XML-Knoten \"%1\""
-#: io.cc:1413
+#: io.cc:1416
#, c-format
msgid "%s %u"
msgstr "%s %u"
-#: io.cc:1460
+#: io.cc:1463
#, c-format
msgid "%s in"
msgstr "%s in"
-#: io.cc:1462
+#: io.cc:1465
#, c-format
msgid "%s out"
msgstr "%s out"
-#: io.cc:1537 session.cc:733 session.cc:767
+#: io.cc:1540 session.cc:823 session.cc:857
msgid "mono"
msgstr "Mono"
-#: io.cc:1539 session.cc:746 session.cc:781
+#: io.cc:1542 session.cc:836 session.cc:871
msgid "L"
msgstr "L"
-#: io.cc:1539 session.cc:748 session.cc:783
+#: io.cc:1542 session.cc:838 session.cc:873
msgid "R"
msgstr "R"
-#: io.cc:1541 io.cc:1547
+#: io.cc:1544 io.cc:1550
#, c-format
msgid "%d"
msgstr "%d"
@@ -1032,49 +1078,49 @@ msgstr "Fehler beim Sichern der Preset-Datei %1."
msgid "Could not locate HOME. Preset not saved."
msgstr "Konnte HOME nicht eruieren. Preset nicht gesichert."
-#: location.cc:456
+#: location.cc:458
msgid "You cannot put a CD marker at this position"
msgstr "An dieser Stelle können Sie keinen CD-Marker ablegen"
-#: location.cc:608
+#: location.cc:610
msgid "incorrect XML node passed to Location::set_state"
msgstr "Unkorrekter XML-Knoten an Location::set_state weitergereicht"
-#: location.cc:613
+#: location.cc:615
msgid "XML node for Location has no ID information"
msgstr "XML-Knoten für Position hat keine ID-Information"
-#: location.cc:617
+#: location.cc:619
msgid "XML node for Location has no name information"
msgstr "XML-Knoten für Position hat keine Namensinformation"
-#: location.cc:624
+#: location.cc:626
msgid "XML node for Location has no start information"
msgstr "XML-Knoten für Position hat keine Start-Information"
-#: location.cc:635
+#: location.cc:637
msgid "XML node for Location has no end information"
msgstr "XML-Knoten für Position hat keine End-Information"
-#: location.cc:642
+#: location.cc:644
msgid "XML node for Location has no flags information"
msgstr "XML-Knoten für Position hat keine Flags-Information"
-#: location.cc:856
+#: location.cc:871
msgid "Locations: attempt to use unknown location as selected location"
msgstr ""
"Locations: Versuch, eine unbekannte Position als ausgewählte Position zu "
"verwenden"
-#: location.cc:1034
+#: location.cc:1049
msgid "incorrect XML mode passed to Locations::set_state"
msgstr "unkorrekter XML-Modus an Locations::set_state weitergereicht"
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1062 session.cc:1520 session.cc:5729 session_state.cc:1128
msgid "session"
msgstr "Projekt"
-#: location.cc:1112
+#: location.cc:1129
msgid "could not load location from session file - ignored"
msgstr "konnte Position nicht aus Projektdatei laden - ignoriert"
@@ -1128,16 +1174,16 @@ msgstr ""
"Es gibt bereits eine Position mit diesem Namen.\n"
"Sie können die importierte Position umbenennen:"
-#: ltc_slave.cc:272
+#: ltc_slave.cc:275
msgid "Session framerate adjusted from %1 to LTC's %2."
msgstr "Projekt-Framerate von %1 auf %2 (von LTC) geändert."
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr ""
"Die Frameraten von Projekt und LTC unterscheiden sich: LTC: %1 Projekt: %2."
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
msgid "flywheel"
msgstr "Schwungrad"
@@ -1196,7 +1242,7 @@ msgstr ""
"Keine SysExID für die Änderung der Eigenschaft \"sys-ex\" gefunden - "
"ignoriert"
-#: midi_model.cc:1994
+#: midi_model.cc:1999
msgid "transpose"
msgstr "transponieren"
@@ -1204,7 +1250,7 @@ msgstr "transponieren"
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr "Doppeltes MIDI-Gerät '%1' in '%2' ignoriert"
-#: midi_scene_changer.cc:295
+#: midi_scene_changer.cc:309
msgid "Scene "
msgstr "Szene"
@@ -1248,27 +1294,27 @@ msgstr "Lautstärke für Monitor dämpfen"
msgid "monitor solo boost level"
msgstr "Lautstärke für Monitor Solo Boost"
-#: monitor_processor.cc:512
+#: monitor_processor.cc:511
msgid "cut control %1"
msgstr "Cut-Regler %1"
-#: monitor_processor.cc:513
+#: monitor_processor.cc:512
msgid "dim control"
msgstr "Dämpfungsschalter"
-#: monitor_processor.cc:514
+#: monitor_processor.cc:513
msgid "polarity control"
msgstr "Polaritätsschalter"
-#: monitor_processor.cc:515
+#: monitor_processor.cc:514
msgid "solo control"
msgstr "Solo-Schalter"
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr "MTC Slave: Fehler beim atomisches Lesen der momentanen Zeit, schlafe!"
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
@@ -1276,11 +1322,11 @@ msgstr ""
"Unbekannter Wert %1 für Rate/Abfall in eingehendem MTC-Datenstrom, verwende "
"Projektwerte"
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
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:396
+#: mtc_slave.cc:397
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr "Framerate von Projekt und MTC stimmen nicht überein: MTC: %1 %2: %3"
@@ -1380,11 +1426,11 @@ msgstr "Unbekanntes Panner-Plugin \"%1\" in Pan-Status gefunden - ignoriert"
msgid "panner plugin node has no type information!"
msgstr "Panner Plugin-Knoten hat keine Typinformation!"
-#: playlist.cc:2138
+#: playlist.cc:2140
msgid "region state node has no ID, ignored"
msgstr "Status-Knoten der Region hat keine ID, ignoriert"
-#: playlist.cc:2156
+#: playlist.cc:2158
msgid "Playlist: cannot create region from XML"
msgstr "Wiedergabeliste: kann Region aus XML nicht erzeugen"
@@ -1418,19 +1464,19 @@ msgstr ""
msgid "programming error: "
msgstr "Programmierfehler:"
-#: plugin_insert.cc:933
+#: plugin_insert.cc:1002
msgid "XML node describing plugin is missing the `type' field"
msgstr "Dem XML-Knoten zur Beschreibung des Plugins fehlt das \"type\"-Feld"
-#: plugin_insert.cc:948
+#: plugin_insert.cc:1017
msgid "unknown plugin type %1 in plugin insert state"
msgstr "Unbekannter Plugintyp %1 im Einfüge-Status des Plugins"
-#: plugin_insert.cc:976
+#: plugin_insert.cc:1045
msgid "Plugin has no unique ID field"
msgstr "Das Plugin hat kein Feld für die eindeutige ID"
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:1070
msgid ""
"Found a reference to a plugin (\"%1\") that is unknown.\n"
"Perhaps it was removed or moved since it was last used."
@@ -1438,15 +1484,15 @@ msgstr ""
"Referenz auf ein unbekanntes Plugin (\"%1\") gefunden.\n"
"Vielleicht wurde es seit der letzten Verwendung entfernt oder verschoben."
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:1193
msgid "PluginInsert: Auto: no ladspa port number"
msgstr "PluginInsert: Auto: keine LADSPA Portnummer"
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:1200
msgid "PluginInsert: Auto: port id out of range"
msgstr "PluginInsert: Auto: Port-ID Bereichsüberschreitung"
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:1236
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
"PluginInsert: automatisierbares Kontrollelement %1 nicht gefunden - ignoriert"
@@ -1455,63 +1501,108 @@ msgstr ""
msgid "Discovering Plugins"
msgstr "Finde Plugins"
-#: plugin_manager.cc:231
+#: plugin_manager.cc:237
msgid "Scanning LADSPA Plugins"
msgstr "Scanne LADSPA Plugins"
-#: plugin_manager.cc:234
+#: plugin_manager.cc:240
msgid "Scanning LV2 Plugins"
msgstr "Scanne LV2 Plugins"
-#: plugin_manager.cc:239
+#: plugin_manager.cc:246
msgid "Scanning Windows VST Plugins"
msgstr "Scanne Windows VST Plugins"
-#: plugin_manager.cc:246
+#: plugin_manager.cc:248
+msgid "Discovering Windows VST Plugins"
+msgstr "Halte Ausschau nach Windows VST Plugins"
+
+#: plugin_manager.cc:257
msgid "Scanning Linux VST Plugins"
msgstr "Scanne Linux VST Plugins"
-#: plugin_manager.cc:252
+#: plugin_manager.cc:259
+msgid "Discovering Linux VST Plugins"
+msgstr "Halte Ausschau nach Linux VST Plugins"
+
+#: plugin_manager.cc:272
+msgid "VST Blacklist:"
+msgstr "VST Schwarzliste:"
+
+#: plugin_manager.cc:279
msgid "Scanning AU Plugins"
msgstr "Scanne AU Plugins"
-#: plugin_manager.cc:256
+#: plugin_manager.cc:281
+msgid "Discovering AU Plugins"
+msgstr "Halte Ausschau nach AU Plugins"
+
+#: plugin_manager.cc:286
msgid "Plugin Scan Complete..."
msgstr "Plugin-Scan abgeschlossen"
-#: plugin_manager.cc:393
+#: plugin_manager.cc:470
msgid "LADSPA"
msgstr "LADSPA"
-#: plugin_manager.cc:445
+#: plugin_manager.cc:522
msgid "Could not parse rdf file: %1"
msgstr "Konnte RDF-Datei: %1 nicht parsen"
-#: plugin_manager.cc:482
+#: plugin_manager.cc:559
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: kann Modul \"%1\" nicht laden (%2)"
-#: plugin_manager.cc:489
+#: plugin_manager.cc:566
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr "LADSPA: Modul \"%1\" hat keine Beschreibungsfunktion."
-#: plugin_manager.cc:705
+#: plugin_manager.cc:765
+msgid "--- Windows VST plugins Scan: %1"
+msgstr "--- Windows VST plugins Scan: %1"
+
+#: plugin_manager.cc:771
msgid "VST"
msgstr "VST"
-#: plugin_manager.cc:732
+#: plugin_manager.cc:776
+msgid "--- Windows VST plugins Scan Done"
+msgstr "--- Windows VST plugins Scan Fertig"
+
+#: plugin_manager.cc:788
+msgid " * %1 %2"
+msgstr " * %1 %2"
+
+#: plugin_manager.cc:788
+msgid " (cache only)"
+msgstr " (nur Cache)"
+
+#: plugin_manager.cc:801
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+"Kann Windows VST Informationen nicht erhalten, Plugin \"%1\" wird ignoriert."
+
+#: plugin_manager.cc:812
msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
msgstr ""
-"VST-Plugin %1 unterstützt kein processReplacing und kann daher zur Zeit "
-"nicht mit %2 benützt werden"
+"VST-Plugin %1 unterstützt kein processReplacing und kann zur Zeit nicht mit "
+"%2 benützt werden"
+
+#: plugin_manager.cc:847
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr "Ignoriere Duplikat des Windows VST Plugins \"%1\""
+
+#: plugin_manager.cc:859
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr " -> OK (VST Plugin \"%1\" hinzugefügt)."
-#: plugin_manager.cc:824
+#: plugin_manager.cc:907
msgid "LXVST"
msgstr "LXVST"
-#: plugin_manager.cc:851
+#: plugin_manager.cc:934
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
@@ -1519,15 +1610,15 @@ msgstr ""
"linuxVST-Plugin %1 unterstützt kein processReplacing und kann daher zur Zeit "
"nicht mit %2 benützt werden"
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1103
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr "unbekannter Plugin-Statustyp \"%1\" - alle Einträge ignoriert"
-#: plugin_manager.cc:1037
+#: plugin_manager.cc:1120
msgid "unknown plugin type \"%1\" - ignored"
msgstr "unbekannter Plugintyp \"%1\" - ignoriert"
-#: port.cc:450
+#: port.cc:455
msgid "could not reregister %1"
msgstr "konnte %1 nicht erneut registrieren"
@@ -1535,16 +1626,16 @@ msgstr "konnte %1 nicht erneut registrieren"
msgid "insert %1"
msgstr "%1 einfügen"
-#: port_insert.cc:197
+#: port_insert.cc:204
msgid "XML node describing port insert is missing the `type' field"
msgstr ""
"Dem XML-Knoten zur Beschreibung des Port-Insert fehlt das Feld \"type\""
-#: port_insert.cc:202
+#: port_insert.cc:209
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:287
+#: port_manager.cc:290
msgid ""
"a port with the name \"%1\" already exists: check for duplicated track/bus "
"names"
@@ -1552,7 +1643,7 @@ msgstr ""
"Ein Port mit Namen \"%1\" existiert bereits: Prüfen Sie auf doppelte Spur/"
"Busnamen"
-#: port_manager.cc:289
+#: port_manager.cc:292
msgid ""
"No more ports are available. You will need to stop %1 and restart with more "
"ports if you need this many tracks."
@@ -1560,19 +1651,19 @@ 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:292
+#: port_manager.cc:295
msgid "AudioEngine: cannot register port \"%1\": %2"
msgstr "AudioEngine: kann Port \"%1\": %2 nicht registrieren"
-#: port_manager.cc:331
+#: port_manager.cc:334
msgid "unable to create port: %1"
msgstr "kann Port: %1 nicht erzeugen"
-#: port_manager.cc:418
+#: port_manager.cc:421
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr "AudioEngine: kann %1 (%2) nicht mit %3 (%4) verbinden"
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:473 port_manager.cc:474
msgid "Re-establising port %1 failed"
msgstr "Portwiederherstellung fehlgeschlagen"
@@ -1584,19 +1675,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:91
+#: rc_configuration.cc:92
msgid "Loading system configuration file %1"
msgstr "Lade Systemkonfigurationsdatei %1"
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
msgid "%1: cannot read system configuration file \"%2\""
msgstr "%1: kann Systemkonfigurationsdatei \"%2\" nicht lesen"
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
msgid "%1: system configuration file \"%2\" not loaded successfully."
msgstr "%1: Systemkonfigurationsdatei \"%2\" konnte nicht geladen werden."
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
msgid ""
"Your system %1 configuration file is empty. This probably means that there "
"was an error installing %1"
@@ -1604,30 +1695,34 @@ msgstr ""
"Ihre %1-Systemkonfigurationsdatei ist leer. Das deutet möglicherweise darauf "
"hin, daß bei der Installation von %1 Fehler auftraten."
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
msgid "Loading user configuration file %1"
msgstr "Lade Benutzerkonfiguration %1"
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
msgid "%1: cannot read configuration file \"%2\""
msgstr "%1: kann Konfigurationsdatei \"%2\" nicht lesen"
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
msgid "%1: user configuration file \"%2\" not loaded successfully."
msgstr "%1: Benutzerkonfiguration \"%2\" konnte nicht geladen werden."
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
msgid "your %1 configuration file is empty. This is not normal."
msgstr "Ihre %1-Konfigurationsdatei ist leer. Das ist nicht normal."
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
msgid "Config file %1 not saved"
msgstr "Konfigurationsdatei %1 nicht gesichert"
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
msgid "cannot open recent session file %1 (%2)"
msgstr "Kann kürzlich geöffnete Datei %1 nicht öffnen (%2)"
+#: recent_sessions.cc:97
+msgid "cannot open recent template file %1 (%2)"
+msgstr "Kann kürzlich verwendete Vorlagendatei %1 (%2) nicht öffnen"
+
#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
#: region_factory.cc:203
msgid ""
@@ -1648,11 +1743,11 @@ msgstr "%1 verbunden-%2.1 (%3)"
msgid "cannot create new name for region \"%1\""
msgstr "kann keinen neuen Namen für Region \"%1\" erzeugen"
-#: resampled_source.cc:102
+#: resampled_source.cc:106
msgid "Import: %1"
msgstr "Import: %1"
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:135 srcfilesource.cc:75
msgid "Import: src_new() failed : %1"
msgstr "Import: Fehler in src_new() : %1"
@@ -1660,29 +1755,29 @@ msgstr "Import: Fehler in src_new() : %1"
msgid "return %1"
msgstr "Rückgabewert: %1"
-#: route.cc:1218 route.cc:2701
+#: route.cc:1311 route.cc:2888
msgid "unknown Processor type \"%1\"; ignored"
msgstr "unbekannter Prozessortyp \"%1\"; ignoriert"
-#: route.cc:1240
+#: route.cc:1333
msgid "processor could not be created. Ignored."
msgstr "Prozessor konnte nicht erzeugt werden. Ignoriert."
-#: route.cc:2126 route.cc:2355
+#: route.cc:2314 route.cc:2539
msgid "Bad node sent to Route::set_state() [%1]"
msgstr "Schlechter Knoten an Route::set_state() gesendet [%1]"
-#: route.cc:2186
+#: route.cc:2374
msgid "Pannable state found for route (%1) without a panner!"
msgstr "Pannerziel-Status für Route (%1) ohne Panner gefunden!"
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
+#: route.cc:2448 route.cc:2452 route.cc:2653 route.cc:2657
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr ""
"schlecht geformte Zeichenkette für den Schlüssel der Sortierreihenfolge in "
"der Projektdatei! [%1] ... ignoriert"
-#: route.cc:2479
+#: route.cc:2663
msgid "Converting deprecated order key for %1 using Editor order %2"
msgstr ""
"Konvertiere veralteten Sortierschlüssel für %1 unter Nutzung der "
@@ -1714,97 +1809,97 @@ msgstr "Send %1"
msgid "programming error: send created using role %1"
msgstr "Programmierfehler: Send erzeugt mittels Rolle %1"
-#: session.cc:357
+#: session.cc:391
msgid "Connect to engine"
msgstr "Verbinde zur Engine"
-#: session.cc:362
+#: session.cc:442
msgid "Session loading complete"
msgstr "Laden des Projektes abgeschlossen"
-#: session.cc:434
+#: session.cc:513
msgid "Set up LTC"
msgstr "LTC einrichten"
-#: session.cc:436
+#: session.cc:515
msgid "Set up Click"
msgstr "Klick einrichten"
-#: session.cc:438
+#: session.cc:517
msgid "Set up standard connections"
msgstr "Richte Standard-Verbindungen ein"
-#: session.cc:664
+#: session.cc:754
msgid "could not setup Click I/O"
msgstr "konnte Metronom-E/A nicht einrichten"
-#: session.cc:727
+#: session.cc:817
#, c-format
msgid "out %s"
msgstr "aus %s"
-#: session.cc:729
+#: session.cc:819
#, c-format
msgid "out %<PRIu32>"
msgstr "out %<PRIu32>"
-#: session.cc:744
+#: session.cc:834
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr "out %<PRIu32>+%<PRIu32>"
-#: session.cc:761
+#: session.cc:851
#, c-format
msgid "in %s"
msgstr "in %s"
-#: session.cc:763
+#: session.cc:853
#, c-format
msgid "in %<PRIu32>"
msgstr "in %<PRIu32>"
-#: session.cc:778
+#: session.cc:868
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr "in %<PRIu32>+%<PRIu32>"
-#: session.cc:852
+#: session.cc:948
msgid "cannot connect master output %1 to %2"
msgstr "kann Master-Ausgang %1 nicht mit %2 verbinden"
-#: session.cc:921
+#: session.cc:1017
msgid "Monitor"
msgstr "Monitor"
-#: session.cc:966
+#: session.cc:1062 session.cc:1188
msgid "cannot connect control input %1 to %2"
msgstr "kann Kontrolleingang %1 nicht mit %2 verbinden"
-#: session.cc:986
+#: session.cc:1082 session.cc:1207
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:1017
+#: session.cc:1113 session.cc:1238
msgid "cannot connect control output %1 to %2"
msgstr "kann Kontrollausgang %1 nicht mit %2 verbinden"
-#: session.cc:1085
+#: session.cc:1296
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:1270
+#: session.cc:1497
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:1297
+#: session.cc:1524
msgid "Session: you can't use that location for session start/end)"
msgstr ""
"Projekt: Sie können diesen Zeitpunkt nicht als Projektanfang/ende benutzen"
-#: session.cc:1329
+#: session.cc:1556
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
@@ -1812,19 +1907,31 @@ msgstr ""
"Sie können diese Position nicht für \"automatische Schleife\" verwenden, da "
"sie keine oder eine negative Länge hat"
-#: session.cc:1497
+#: session.cc:1739
msgid "programming error: session range removed!"
msgstr "Programmierfehler: Projektbereich entfernt!"
-#: session.cc:1751
+#: session.cc:2004
msgid "feedback loop setup between %1 and %2"
msgstr "Feedbackschleife zwischen %1 und %2 erkannt"
-#: session.cc:2047
+#: session.cc:2240
+msgid "Track "
+msgstr "Spur "
+
+#: session.cc:2242
+msgid "Audio "
+msgstr "Audio "
+
+#: session.cc:2247
+msgid "MIDI "
+msgstr "MIDI"
+
+#: session.cc:2322
msgid "Session: could not create new midi track."
msgstr "Session: konnte keine neue MIDI-Spur erzeugen."
-#: session.cc:2053
+#: session.cc:2328
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."
@@ -1832,77 +1939,73 @@ 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:2239 session.cc:2242
-msgid "Audio"
-msgstr "Audio"
-
-#: session.cc:2266 session.cc:2274 session.cc:2352 session.cc:2360
+#: session.cc:2848 session.cc:2856 session.cc:2940 session.cc:2948
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:2297
+#: session.cc:2881
msgid "Session: could not create new audio track."
msgstr "Session: konnte keine neue Audiospur erzeugen"
-#: session.cc:2330 session.cc:2333
+#: session.cc:2918 session.cc:2921
msgid "Bus"
msgstr "Bus"
-#: session.cc:2383
+#: session.cc:2973
msgid "Session: could not create new audio route."
msgstr "Session: konnte keine neueAudio-Route erzeugen"
-#: session.cc:2443 session.cc:2453
+#: session.cc:3037 session.cc:3047
msgid "Session: UINT_MAX routes? impossible!"
msgstr "Session: UINT_MAX Routen? unmöglich!"
-#: session.cc:2475
+#: session.cc:3069
msgid "Session: cannot create track/bus from template description"
msgstr "Session: Kann die Route aus der Vorlagenbeschreibung nicht erzeugen"
-#: session.cc:2501
+#: session.cc:3097
msgid "Session: could not create new route from template"
msgstr "Session: konnte keine neue Route aus der Vorlage erzeugen."
-#: session.cc:2531
+#: session.cc:3131
msgid "Adding new tracks/busses failed"
msgstr "Fehler beim Hinzufügen neuer Spuren/Busse"
-#: session.cc:3671
+#: session.cc:4452
msgid "Merging embedded file %1: name collision AND md5 hash collision!"
msgstr ""
"Zusammenführen der eingebetteten Datei %1: Namenskollision UND md5 hash "
"Kollision!"
-#: session.cc:3801 session.cc:3874
+#: session.cc:4582 session.cc:4655
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:4316
+#: session.cc:5097
msgid "send ID %1 appears to be in use already"
msgstr "Send ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:4328
+#: session.cc:5109
msgid "aux send ID %1 appears to be in use already"
msgstr "Aux-Send ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:4340
+#: session.cc:5121
msgid "return ID %1 appears to be in use already"
msgstr "Return ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:4352
+#: session.cc:5133
msgid "insert ID %1 appears to be in use already"
msgstr "Insert ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:4477
+#: session.cc:5258
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:4486
+#: session.cc:5267
msgid "Cannot write a range with no data."
msgstr "Kann einen Bereich ohne Daten nicht schreiben."
-#: session.cc:4528
+#: session.cc:5309
msgid "cannot create new file \"%1\" for %2"
msgstr "Kann neue Datei \"%1\" für %2 nicht erzeugen"
@@ -1963,7 +2066,7 @@ msgstr "Kann Projektverzeichnis im Pfad %1 nicht erzeugen. Fehler: %2"
msgid "Session subdirectory does not exist at path %1"
msgstr "Projektunterverzeichnis im Pfad %1 existiert nicht"
-#: session_events.cc:234
+#: session_events.cc:229
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr ""
"Session: zwei Ereignisse des Typs %1 können nicht im selben Frame existieren "
@@ -1985,7 +2088,7 @@ msgstr ""
"LTC-Kodierer: ungültige Framerate - das Kodieren von LTC wird für den "
"restlichen Teil dieses Projekts ausgesetzt."
-#: session_midi.cc:520
+#: session_midi.cc:534
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr "Session: kann quarter-frame MTC-Nachricht nicht senden (%1)"
@@ -1993,97 +2096,105 @@ 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:136
+#: session_process.cc:159
msgid "Session: error in no roll for %1"
msgstr "Session: Fehler in no_roll für %1"
-#: session_process.cc:1174
+#: session_process.cc:1199
msgid "Programming error: illegal event type in process_event (%1)"
msgstr "Programmierfehler: illegaler Ereignistyp in process_event (%1)"
-#: session_state.cc:179
+#: session_state.cc:185
msgid "solo cut control (dB)"
msgstr "Solo Cut Einstellung (dB)"
-#: session_state.cc:203
+#: session_state.cc:209
msgid "Set block size and sample rate"
msgstr "Setze Blockgröße und Samplerate"
-#: session_state.cc:208
+#: session_state.cc:214
msgid "Using configuration"
msgstr "Benutze Konfiguration"
-#: session_state.cc:331
+#: session_state.cc:339
msgid "Reset Remote Controls"
msgstr "Fernbedienungen zurücksetzen"
-#: session_state.cc:423
+#: session_state.cc:368 session_state.cc:400
+msgid "Filling playback buffers"
+msgstr "Fülle Wiedergabepuffer"
+
+#: session_state.cc:466
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr "Session: kann den Peakfile Ordner \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:430
+#: session_state.cc:473
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
"Session: kann das Projektverzeichnis für Sounddateien \"%1\" nicht erzeugen "
"(%2)"
-#: session_state.cc:437
+#: session_state.cc:480
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
"Session: kann das Projektverzeichnis für MIDI \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:444
+#: session_state.cc:487
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:451
+#: session_state.cc:494
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr ""
"Session: kann den Projektordner für Exportdateien \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:458
+#: session_state.cc:501
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
"Session: kann den Projektordner für Analysedaten \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:465
+#: session_state.cc:508
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr "Session: kann den Projektordner für Plugins \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:472
+#: session_state.cc:515
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
"Session: kann den Projektordner für Externals \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:486
+#: session_state.cc:529
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr "Session: kann den Projektordner \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:520
+#: session_state.cc:565
msgid "Could not open %1 for writing session template"
msgstr "Konnte %1 nicht zum Schreiben der Projektvorlage öffnen"
-#: session_state.cc:526
+#: session_state.cc:571
msgid "Could not open session template %1 for reading"
msgstr "Konnte Projektvorlage %1 nicht zum Lesen öffnen"
-#: session_state.cc:545
+#: session_state.cc:589
+msgid "Loop"
+msgstr "Schleife"
+
+#: session_state.cc:605
msgid "Master"
msgstr "Master"
-#: session_state.cc:606
+#: session_state.cc:670
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:630
+#: session_state.cc:694
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr "Konnte Schnappschuss %1 nicht auf %2 umbenennen (%3)"
-#: session_state.cc:658
+#: session_state.cc:722
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr "Konnte Projektdatei im Pfad \"%1\" nicht entfernen (%2)"
-#: session_state.cc:685
+#: session_state.cc:749
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
@@ -2091,148 +2202,148 @@ 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:736
+#: session_state.cc:804
msgid "state could not be saved to %1"
msgstr "Status konnte nicht nach %1 gesichert werden"
-#: session_state.cc:738 session_state.cc:749
+#: session_state.cc:806 session_state.cc:819
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:746
+#: session_state.cc:816
msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr "konnte temporäre Projektdatei %1 nicht nach %2 umbenennen(%3)"
-#: session_state.cc:814
+#: session_state.cc:884
msgid "%1: session file \"%2\" doesn't exist!"
msgstr "%1: Projektdatei \"%2\" existiert nicht!"
-#: session_state.cc:826
+#: session_state.cc:896
msgid "Could not understand session file %1"
msgstr "Konnte Projektdatei \"%1\" nicht verstehen"
-#: session_state.cc:835
+#: session_state.cc:905
msgid "Session file %1 is not a session"
msgstr "Projektdatei %1 ist kein Projekt"
-#: session_state.cc:1147
+#: session_state.cc:1232
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
"Programmierfehler: Session: Inkorrekter XML-Knoten an send_state() gesendet"
-#: session_state.cc:1201
+#: session_state.cc:1286
msgid "Session: XML state has no options section"
msgstr "Session: XML hat keinen Abschnitt \"options\""
-#: session_state.cc:1206
+#: session_state.cc:1291
msgid "Session: XML state has no metadata section"
msgstr "Session: XML hat keinen Abschnitt \"metadata\""
-#: session_state.cc:1217
+#: session_state.cc:1302
msgid "Session: XML state has no sources section"
msgstr "Session: XML hat keinen Abschnitt \"sources\""
-#: session_state.cc:1224
+#: session_state.cc:1309
msgid "Session: XML state has no Tempo Map section"
msgstr "Session: XML hat keinen Abschnitt \"Tempo Map\""
-#: session_state.cc:1231
+#: session_state.cc:1316
msgid "Session: XML state has no locations section"
msgstr "Session: XML hat keinen Abschnitt \"locations\""
-#: session_state.cc:1244
+#: session_state.cc:1329
msgid "Session: XML state has no Regions section"
msgstr "Session: XML hat keinen Abschnitt \"Regions\""
-#: session_state.cc:1251
+#: session_state.cc:1336
msgid "Session: XML state has no playlists section"
msgstr "Session: XML hat keinen Abschnitt \"playlists\""
-#: session_state.cc:1271
+#: session_state.cc:1356
msgid "Session: XML state has no bundles section"
msgstr "Session: XML hat keinen Abschnitt \"bundles\""
-#: session_state.cc:1283
+#: session_state.cc:1368
msgid "Session: XML state has no diskstreams section"
msgstr "Session: XML hat keinen Abschnitt \"diskstreams\""
-#: session_state.cc:1291
+#: session_state.cc:1376
msgid "Session: XML state has no routes section"
msgstr "Session: XML hat keinen Abschnitt \"routes\""
-#: session_state.cc:1303
+#: session_state.cc:1388
msgid "Session: XML state has no route groups section"
msgstr "Session: XML hat keinen Abschnitt \"route groups\""
-#: session_state.cc:1312
+#: session_state.cc:1397
msgid "Session: XML state has no edit groups section"
msgstr "Session: XML hat keinen Abschnitt \"edit groups\""
-#: session_state.cc:1319
+#: session_state.cc:1404
msgid "Session: XML state has no mix groups section"
msgstr "Session: XML hat keinen Abschnitt \"mix groups\""
-#: session_state.cc:1327
+#: session_state.cc:1412
msgid "Session: XML state has no click section"
msgstr "Session: XML hat keinen Abschnitt \"click\""
-#: session_state.cc:1373
+#: session_state.cc:1458
msgid "Session: cannot create Route from XML description."
msgstr "Session: Kann die Route aus der XML-Beschreibung nicht erzeugen"
-#: session_state.cc:1377
+#: session_state.cc:1462
msgid "Loaded track/bus %1"
msgstr "Spur/Bus %1 wurde geladen"
-#: session_state.cc:1382
+#: session_state.cc:1467
msgid "Tracks/busses loaded; Adding to Session"
msgstr "Spuren/Busse geladen; Füge sie dem Projekt hinzu"
-#: session_state.cc:1386
+#: session_state.cc:1471
msgid "Finished adding tracks/busses"
msgstr "Hinzufügen der Spuren/Busse abgeschlossen"
-#: session_state.cc:1485
+#: session_state.cc:1570
msgid "Could not find diskstream for route"
msgstr "Konnte Diskstream für Route nicht finden"
-#: session_state.cc:1545
+#: session_state.cc:1630
msgid "Session: cannot create Region from XML description."
msgstr "Session: kann Region nicht aus XML-Beschreibung erzeugen"
-#: session_state.cc:1549
+#: session_state.cc:1634
msgid "Can not load state for region '%1'"
msgstr "Kann Status für Region '%1' nicht laden"
-#: session_state.cc:1585
+#: session_state.cc:1670
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:1613
+#: session_state.cc:1698
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
"Verschachtelte Quelle hat keine ID-Information in Projektdatei! (ignoriert)"
-#: session_state.cc:1625
+#: session_state.cc:1710
msgid "Cannot reconstruct nested source for region %1"
msgstr "Kann verschachtelte Quelle für Region %1 nicht wiederherstellen"
-#: session_state.cc:1687
+#: session_state.cc:1772
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:1695 session_state.cc:1716 session_state.cc:1736
+#: session_state.cc:1780 session_state.cc:1801 session_state.cc:1821
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:1701 session_state.cc:1722 session_state.cc:1742
+#: session_state.cc:1786 session_state.cc:1807 session_state.cc:1827
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
@@ -2240,7 +2351,7 @@ msgstr ""
"Session: XML-Knoten zur Beschreibung einer Audioregion referenziert eine "
"Nicht-Audio Quell-ID =%1"
-#: session_state.cc:1765
+#: session_state.cc:1850
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
@@ -2248,31 +2359,31 @@ msgstr ""
"Session: dem XML-Knoten zur Beschreibung einer Audioregion fehlen einige "
"Hauptquellen; ignoriert"
-#: session_state.cc:1799
+#: session_state.cc:1884
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:1807
+#: session_state.cc:1892
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:1813
+#: session_state.cc:1898
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:1872
+#: session_state.cc:1971
msgid "Session: cannot create Source from XML description."
msgstr "Session: Kann Quelle aus der XML-Beschreibung nicht erzeugen"
-#: session_state.cc:1880
+#: session_state.cc:1979
msgid ""
"A external MIDI file is missing. %1 cannot currently recover from missing "
"external MIDI files"
@@ -2280,105 +2391,134 @@ msgstr ""
"Eine externe MIDI-Datei fehlt, %1 kann zur Zeit mit fehlenden externen MIDI-"
"Dateien nicht umgehen"
-#: session_state.cc:1962
+#: session_state.cc:2061
msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
msgstr ""
"Eine nicht mit %1 benutzbare Audiodatei wurde gefunden. Sprechen Sie mit den "
"Programmierern."
-#: session_state.cc:1979
+#: session_state.cc:2082
msgid "Could not create templates directory \"%1\" (%2)"
msgstr "Konnte Vorlagenverzeichnis \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:1992
+#: session_state.cc:2094
msgid "Template \"%1\" already exists - new version not created"
msgstr "Vorlage \"%1\" existiert bereits - neue Version wurde nicht erzeugt"
-#: session_state.cc:1998
+#: session_state.cc:2100
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr "Konnte kein Verzeichnis für Projektvorlage \"%1\" erzeugen (%2)"
-#: session_state.cc:2008
+#: session_state.cc:2125
msgid "template not saved"
msgstr "Vorlage nicht gesichert"
-#: session_state.cc:2018
+#: session_state.cc:2135
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:2261
+#: session_state.cc:2380
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr "Unbekannter Knoten \"%1\" in Bündelliste der Projektdatei gefunden"
-#: session_state.cc:2834
+#: session_state.cc:2964
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr "Session: kann den Mülleimer \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:2873
+#: session_state.cc:3003
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:2891
+#: session_state.cc:3021
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr "kann Peakdatei %1 für %2 nicht entfernen (%3)"
-#: session_state.cc:3204
+#: session_state.cc:3338
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:3213
+#: session_state.cc:3347
msgid "history could not be saved to %1"
msgstr "Aktionsliste konnte nicht nach %1 gesichert werden"
-#: session_state.cc:3216
+#: session_state.cc:3350
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr "Konnte Aktionslistendatei im Pfad \"%1\" nicht entfernen (%2)"
-#: session_state.cc:3220
+#: session_state.cc:3354
msgid "could not restore history file from backup %1 (%2)"
msgstr "konnte Aktionslistendatei nicht aus dem Backup %1 restaurieren (%2)"
-#: session_state.cc:3245
+#: session_state.cc:3379
msgid "%1: no history file \"%2\" for this session."
msgstr "%1: keine Aktionslistendatei \"%2\" für dieses Projekt."
-#: session_state.cc:3251
+#: session_state.cc:3385
msgid "Could not understand session history file \"%1\""
msgstr "Konnte Projekt-Aktionslistendatei \"%1\" nicht verstehen"
-#: session_state.cc:3293
+#: session_state.cc:3427
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr "MidiSource für NoteDiffCommand nicht auffindbar"
-#: session_state.cc:3304
+#: session_state.cc:3438
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr "MidiSource für SysExDiffCommand nicht auffindbar"
-#: session_state.cc:3315
+#: session_state.cc:3449
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr "MidiSource für PatchChangeDiffCommand nicht auffindbar"
-#: session_state.cc:3323
+#: session_state.cc:3457
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:3559
+#: session_state.cc:3695
msgid "Session: unknown diskstream type in XML"
msgstr "Session: Unbekannter Diskstream im XML"
-#: session_state.cc:3564
+#: session_state.cc:3700
msgid "Session: could not load diskstream via XML state"
msgstr "Session: konnte Diskstream nicht via XML-Status laden"
-#: session_state.cc:3688 session_state.cc:3716 session_state.cc:3729
-#: session_state.cc:3744
+#: session_state.cc:3763
+msgid "Cannot rename read-only session."
+msgstr "Kan Nur-Lese Projekt nicht umbenennen"
+
+#: session_state.cc:3767
+msgid "Cannot rename session while recording"
+msgstr "Kann Projekt während Aufnahme nicht umbenennen"
+
+#: session_state.cc:3852 session_state.cc:3853 session_state.cc:3895
+#: session_state.cc:3899
msgid "renaming %s as %2 failed (%3)"
msgstr "umbenennen von %s in %2 gescheitert (%3)"
+#: session_state.cc:3915 session_state.cc:3916 session_state.cc:3930
+#: session_state.cc:3931
+msgid "renaming %1 as %2 failed (%3)"
+msgstr "umbenennen von %1 in %2 gescheitert (%3)"
+
+#: session_state.cc:4217
+msgid "Cannot create new session folder %1"
+msgstr "Kann den neuen Projektordner \"%1\" nicht erzeugen"
+
+#: session_state.cc:4279 session_state.cc:4354
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+"\n"
+"kopieren von \"%1\" fehlgeschlagen !"
+
+#: session_state.cc:4552
+msgid "unknown reason"
+msgstr "unbekannter Grund"
+
#: session_time.cc:214
msgid "Unknown transport state %1 in sync callback"
msgstr "Unbekannter Transportstatus %1 im Sync-Callback"
@@ -2387,7 +2527,7 @@ msgstr "Unbekannter Transportstatus %1 im Sync-Callback"
msgid "Cannot loop - no loop range defined"
msgstr "Kann nicht loopen - kein Schleifenbereich definieert"
-#: session_transport.cc:833
+#: session_transport.cc:906
msgid ""
"Seamless looping cannot be supported while %1 is using JACK transport.\n"
"Recommend changing the configured options"
@@ -2396,11 +2536,11 @@ msgstr ""
"benutzt.\n"
"Ändern Sie die Konfigurationsoption"
-#: session_transport.cc:915
+#: session_transport.cc:988
msgid "Locate called for negative sample position - ignored"
msgstr "Locate für negative Sample-Position aufgerufen - ignoriert"
-#: session_transport.cc:1272
+#: session_transport.cc:1346
msgid ""
"Global varispeed cannot be supported while %1 is connected to JACK transport "
"control"
@@ -2408,30 +2548,30 @@ msgstr ""
"Globales Varispeed ist nicht möglich, solange %1 mit JACK Transport "
"verbunden ist."
-#: smf_source.cc:344
+#: smf_source.cc:350
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr "Kann Ereignisprefix nicht lesen, korrupter MIDI-Ringbuffer"
-#: smf_source.cc:357
+#: smf_source.cc:363
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr "time/size gelesen, aber nicht buffer, korrupter MIDI-Ringbuffer"
-#: smf_source.cc:363
+#: smf_source.cc:369
msgid "Event time is before MIDI source position"
msgstr "Event-Zeitpunkt befindet sich vor MIDI Quellposition"
-#: smf_source.cc:409
+#: smf_source.cc:415
msgid ""
"Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
msgstr ""
"Überspringe Event mit unsortiertem Schlag-Zeitpunkt %1 < %2(Abweichung %3 "
"Schläge, %4 Ticks)"
-#: smf_source.cc:453
+#: smf_source.cc:459
msgid "Skipping event with unordered frame time %1 < %2"
msgstr "Überspringe Event mit unsortiertem Frame-Zeitpunkt %1 < %2"
-#: smf_source.cc:518
+#: smf_source.cc:524
msgid "cannot open MIDI file %1 for write"
msgstr "kann MIDI-Datei %1 nicht zum Schreiben öffnen"
@@ -2519,18 +2659,22 @@ msgstr "Little-endian (Intel)"
msgid "Big-endian (PowerPC)"
msgstr "Big-endian (PowerPC)"
-#: sndfilesource.cc:260
+#: sndfilesource.cc:264
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr "SndFileSource: kann Datei \"%1\" nicht für %2 öffnen"
+
+#: sndfilesource.cc:282
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr "SndFileSource: kann Datei \"%1\" nicht für %2 öffnen (%3)"
-#: sndfilesource.cc:268
+#: sndfilesource.cc:290
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
"SndFileSource: Datei enthält nur %1 Kanäle, %2 ist eine ungültige Kanalzahl"
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:344 sndfilesource.cc:674
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
@@ -2538,67 +2682,67 @@ msgstr ""
"kann Broadcast-Informationen für die Audiodatei %1 nicht setzen (%2); "
"verwerfe Broadcast-Informationen für diese Datei"
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
-msgstr "konnte Datei %1 nicht zum Lesen allozieren"
+#: sndfilesource.cc:387
+msgid "could not open file %1 for reading."
+msgstr "konnte Datei %1 nicht zum Lesen öffnen"
-#: sndfilesource.cc:403
+#: sndfilesource.cc:422
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr "SndFileSource: Konnte in %2 Frame %1 nicht aufsuchen (%3)"
-#: sndfilesource.cc:412
+#: sndfilesource.cc:431
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
"SndFileSource: @ %1 konnte %2 innerhalb %3 nicht lesen (%4) (len = %5, ret "
"war %6)"
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:473 sndfilesource.cc:502
msgid "attempt to write a non-writable audio file source (%1)"
msgstr "Versuch, in eine schreibgeschützte Audio-Dateiquelle zu schreiben (%1)"
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
+#: sndfilesource.cc:478 utils.cc:563 utils.cc:587 utils.cc:601 utils.cc:620
msgid "programming error: %1 %2"
msgstr "Programmierfehler: %1 %2"
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:605 sndfilesource.cc:623
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr "Versuch, eine schreibgeschützte Audio-Dateiquelle zu leeren (%1)"
-#: sndfilesource.cc:591
+#: sndfilesource.cc:610
msgid "could not allocate file %1 to write header"
msgstr "konnte Datei %1 nicht allozieren, um den Dateikopf zu schreiben"
-#: sndfilesource.cc:609
+#: sndfilesource.cc:628
msgid "could not allocate file %1 to flush contents"
msgstr "konnte Datei %1 nicht allozieren, um Inhalte zu löschen"
-#: sndfilesource.cc:621
+#: sndfilesource.cc:640
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
"Versuch, Broadcast-Informationen in eine schreibgeschützte Audio-Dateiquelle "
"zu schreiben (%1)"
-#: sndfilesource.cc:626
+#: sndfilesource.cc:645
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
"Versuch, BWF-Informationen in einer nicht geöffnete Audio-Dateiquelle zu "
"setzen (%1)"
-#: sndfilesource.cc:670
+#: sndfilesource.cc:689
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr "%1: kann %2 nicht aufsuchen (libsndfile Fehler: %3)"
-#: sndfilesource.cc:780
+#: sndfilesource.cc:799
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr "SndFileSource: \"%1\" schlechter Lese-Rückgabewert: %2 von %5 (%3: %4)"
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:812 sndfilesource.cc:862 sndfilesource.cc:869
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr "SndFileSource: \"%1\" schlechter Schreibvorgang (%2)"
-#: sndfilesource.cc:873
+#: sndfilesource.cc:892
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
@@ -2606,6 +2750,10 @@ msgstr ""
"Filesource: Startzeit für existierende Datei (%1) ist bereits gesetzt: Kann "
"Startzeit nicht ändern."
+#: sndfilesource.cc:947
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr "SndFileSource: kann Datei \"%1\" nicht zum Lesen öffnen"
+
#: soundcloud_upload.cc:129
msgid ""
"Upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
@@ -2630,7 +2778,7 @@ msgstr "Lautsprecher-Information ohne Elevation - Lautsprecher ignoriert"
msgid "Speaker information is missing distance - speaker ignored"
msgstr "Lautsprecher-Information ohne Distanz - Lautsprecher ignoriert"
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
msgid "SrcFileSource: %1"
msgstr "video_server_dialog.cc:140"
@@ -2703,7 +2851,7 @@ msgstr "MeterSection: XML-Knoten hat unzulässigen Wert für \"note-type\""
msgid "MeterSection XML node has no \"movable\" property"
msgstr "MeterSection: XML-Knoten hat keine Eigenschaft \"movable\""
-#: tempo.cc:388
+#: tempo.cc:402
msgid ""
"Meter changes can only be positioned on the first beat of a bar. Moving from "
"%1 to %2"
@@ -2711,38 +2859,38 @@ msgstr ""
"Metrumswechsel können nur am ersten Schlag eines Taktes platziert werden. "
"Verschiebe von%1 nach %2"
-#: tempo.cc:650
+#: tempo.cc:682
msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
msgstr ""
"in der Tempo Map sind keine Tempo-Abschnitte definiert - kann Tempo @ %1 "
"nicht ändern"
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
+#: tempo.cc:712 tempo.cc:730 tempo.cc:748 tempo.cc:764
msgid "programming error: no tempo section in tempo map!"
msgstr "Programmierfehler: kein Tempo-Abschnitt in der Tempo Map"
-#: tempo.cc:846 tempo.cc:1827
+#: tempo.cc:882 tempo.cc:1892
msgid "programming error: unhandled MetricSection type"
msgstr "Programmierfehler: unbehandelter MetricSection Typ"
-#: tempo.cc:1142
+#: tempo.cc:1178
msgid "tempo map asked for BBT time at frame %1\n"
msgstr "Tempo Map fragte nach BBT-Zeit an Frame %1\n"
-#: tempo.cc:1185
+#: tempo.cc:1221
msgid "tempo map asked for frame time at bar < 1 (%1)\n"
msgstr "Tempo Map fragte nach Frame-Zeit an Takt < 1 %1\n"
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:1705 tempo.cc:1719
msgid "Tempo map: could not set new state, restoring old one."
msgstr ""
"Tempo Map: konnte neuen Status nicht setzen, stelle den alten wieder her."
-#: tempo.cc:1677
+#: tempo.cc:1740 tempo.cc:1741
msgid "Multiple meter definitions found at %1"
msgstr "Mehrere Metrumdefinitionen an %1 gefunden"
-#: tempo.cc:1682
+#: tempo.cc:1746 tempo.cc:1747
msgid "Multiple tempo definitions found at %1"
msgstr "Mehrere Tempodefinitionen an %1 gefunden"
@@ -2795,203 +2943,58 @@ msgstr "Knoten für Kanal hat keine Eigenschaft \"type\""
msgid "Node for Port has no \"name\" property"
msgstr "Knoten für Port hat keine Eigenschaft \"name\""
-#: utils.cc:422 utils.cc:451
+#: utils.cc:411 utils.cc:440
msgid "Splice"
msgstr "Schneiden"
-#: utils.cc:424 utils.cc:441
+#: utils.cc:413 utils.cc:430
msgid "Slide"
msgstr "Gleiten"
-#: utils.cc:426 utils.cc:447
+#: utils.cc:415 utils.cc:436
msgid "Ripple"
msgstr "Schieben"
-#: utils.cc:428 utils.cc:444
+#: utils.cc:417 utils.cc:433
msgid "Lock"
msgstr "Sperren"
-#: utils.cc:431
+#: utils.cc:420
msgid "programming error: unknown edit mode string \"%1\""
msgstr "Programmierfehler: unbekannte Zeichenkette für Editiermodus \"%1\""
-#: utils.cc:458 utils.cc:490
+#: utils.cc:447 utils.cc:483
msgid "MIDI Timecode"
msgstr "MIDI Timecode"
-#: utils.cc:458 utils.cc:488
+#: utils.cc:447 utils.cc:481
msgid "MTC"
msgstr "MTC"
-#: utils.cc:462 utils.cc:497
+#: utils.cc:451 utils.cc:490
msgid "MIDI Clock"
msgstr "MIDI Clock"
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:455 utils.cc:477 utils.cc:497
msgid "JACK"
msgstr "JACK"
-#: utils.cc:470
+#: utils.cc:459 utils.cc:494
+msgid "LTC"
+msgstr "LTC"
+
+#: utils.cc:463
msgid "programming error: unknown sync source string \"%1\""
msgstr "Programmierfehler: unbekannte Zeichenkette für Sync-Quelle \"%1\""
-#: utils.cc:495
+#: utils.cc:488
msgid "M-Clock"
msgstr "M-Clock"
-#: utils.cc:501
-msgid "LTC"
-msgstr "LTC"
-
-#: utils.cc:671
+#: utils.cc:655
msgid "programming error: unknown native header format: %1"
msgstr "Programmierfehler: unbekanntes natives Dateikopfformat: %1"
-#: utils.cc:686
+#: utils.cc:670
msgid "cannot open directory %1 (%2)"
msgstr "kann Verzeichnis %1 nicht öffnen (%2)"
-
-#~ msgid ""
-#~ "AudioSource: could not seek to correct location in peak file \"%1\" (%2)"
-#~ msgstr ""
-#~ "AudioSource: konnte in der Peakdatei \"%1\" nicht an die korrekte Stelle "
-#~ "springen (%2)"
-
-#~ msgid "Cannot create transport request signal pipe (%1)"
-#~ msgstr ""
-#~ "Kann die Signalleitung für Transport-Anforderungen nicht erzeugen (%1)"
-
-#~ msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)"
-#~ msgstr ""
-#~ "UI: kann O_NONBLOCK für die Anforderungsleitung des Butlers nicht setzen "
-#~ "(%1)"
-
-#~ msgid "poll on butler request pipe failed (%1)"
-#~ msgstr "poll auf die Anforderungsleitung des Butler fehlgeschlagen (%1)"
-
-#~ msgid "Error on butler thread request pipe: fd=%1 err=%2"
-#~ msgstr "Fehler in der Anforderungsleitung des Butler-Threads: fd=%1 err=%2"
-
-#~ msgid "Error reading from butler request pipe"
-#~ msgstr "Fehler beim Lesen der Butler-Anforderungsleitung"
-
-#~ msgid "Finished loading tracks/busses."
-#~ msgstr "Spuren/Busse laden abgeschlossen."
-
-#~ msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)"
-#~ msgstr "AudioSource: kann Pfad für Peaks (a) \"%1\" nicht öffnen (%2)"
-
-#~ msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)"
-#~ msgstr "AudioSource: kann Pfad für Peaks (b) \"%1\" nicht öffnen (%2)"
-
-#~ msgid "cannot create new audio file \"%1\" for %2"
-#~ msgstr "kann keine neue Audiodatei \"%1\" für %2 erzeugen"
-
-#~ msgid "attempt to flush an un-opened audio file source (%1)"
-#~ msgstr "Versuch, eine nicht geöffnete Audio-Dateiquelle zu leeren (%1)"
-
-#~ msgid "Skipping event with unordered time %1"
-#~ msgstr "Überspringe Event mit Zeitpunkt %1 ausserhalb der Reihenfolge"
-
-#~ msgid ""
-#~ "You have requested an operation that requires audio analysis.\n"
-#~ "\n"
-#~ "You currently have \"auto-analyse-audio\" disabled, which means that "
-#~ "transient data must be generated every time it is required.\n"
-#~ "\n"
-#~ "If you are doing work that will require transient data on a regular "
-#~ "basis, you should probably enable \"auto-analyse-audio\" then quit ardour "
-#~ "and restart.\n"
-#~ "\n"
-#~ "This dialog will not display again. But you may notice a slight delay in "
-#~ "this and future transient-detection operations.\n"
-#~ msgstr ""
-#~ "Sie haben eine Operation ausgelöst, die Audio-Analyse verlangt.\n"
-#~ "\n"
-#~ "Momentan haben Sie \"auto-analyse-audio\" deaktiviert, weshalbTransienten-"
-#~ "Daten bei Bedarf jedesmal neu erzeugt werden müssen.\n"
-#~ "\n"
-#~ "Wenn Sie öfters mit Transienten-Daten arbeiten, sollten Sie "
-#~ "möglicherweise \"auto-analyse-audio\" einschalten und Ardour neu "
-#~ "starten.\n"
-#~ "\n"
-#~ "Dieser Dialog wird nicht wieder erscheinen. Jedoch könnten Sie bei dieser "
-#~ "und zukünftigen Operation(en) zur Transienten-Bestimmung eine leichte "
-#~ "Verzögerung bemerken.\n"
-
-#~ msgid "A sound file is missing. It will be replaced by silence."
-#~ msgstr "Eine Audiodatei fehlt. Sie wird durch Stille ersetzt werden."
-
-#~ 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."
-
-#~ msgid "looking for backends in %1\n"
-#~ msgstr "Suche nach Backends in %1\n"
-
-#~ msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n"
-#~ msgstr "Umgebungsvariable ARDOUR_CONFIG_PATH ist nicht gesetzt - beende\n"
-
-#~ msgid "ARDOUR_DATA_PATH not set in environment - exiting\n"
-#~ msgstr "Umgebungsvariable ARDOUR_DATA_PATH ist nicht gesetzt - beende\n"
-
-#~ msgid "monitor"
-#~ msgstr "Monitor"
-
-#~ 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"
-
-#~ msgid "too many bounced versions of playlist \"%1\""
-#~ msgstr "zu viele gebouncete Versionen der Wiedergabeliste \"%1\""
-
-#~ msgid "master"
-#~ msgstr "Master"
-
-#~ msgid ""
-#~ "cannot create new file from region name \"%1\" with ident = \"%2\": too "
-#~ "many existing files with similar names"
-#~ msgstr ""
-#~ "kann keine neue Datei aus dem Regionennamen \"%1\" mit ident = \"%2\" "
-#~ "erzeugen: zu viele Dateien mit ähnlichen Namen existieren"
-
-#~ msgid "Filesource: cannot find required file (%1): while searching"
-#~ msgstr ""
-#~ "Filesource: kann benötigte Datei (%1) während dieser Suche nicht finden"
-
-#~ msgid "Auditioning of non-audio regions not yet supported"
-#~ msgstr "Abhören von Nicht-Audio Regionen wird noch nicht unterstützt"
-
-#~ msgid "Filesource: cannot find required file (%1): while searching %2"
-#~ msgstr ""
-#~ "Dateiquelle: kann benötigte Datei (%1) auf der Suche nach %2 nicht finden"
-
-#~ msgid ""
-#~ "FileSource: \"%1\" is ambigous when searching %2\n"
-#~ "\t"
-#~ msgstr ""
-#~ "Dateiquelle: \"%1\" ist bei der Suche nach %2 mehrdeutig \n"
-#~ "\t"
-
-#~ msgid "Could not resolve path: %1 (%2)"
-#~ msgstr "Konnte den Pfad: %1 nicht auflösen (%2)"
-
-#~ msgid "LADSPA: cannot load module from \"%1\""
-#~ msgstr "LADSPA: kann Modul nicht aus \"%1\" laden"
-
-#~ msgid "looking for panners in %1"
-#~ msgstr "Suche nach Pannern in %1"
-
-#~ msgid "Panner discovered: \"%1\" in %2"
-#~ msgstr "Panner gefunden: \"%1\" in %2"
-
-#~ msgid "Could not use path %1 (%2)"
-#~ msgstr "Konnte Pfad %1 nicht benutzen (%2)"
-
-#~ msgid "could not rename temporary session file %1 to %2"
-#~ msgstr "Konnte temporäre Projektdatei %1 nicht nach %2 umbenennen"
-
-#~ msgid "Cannot expand path %1 (%2)"
-#~ msgstr "Kann Pfad %1 nicht expandieren (%2)"
diff --git a/libs/ardour/port.cc b/libs/ardour/port.cc
index 3252134..70c6a60 100644
--- a/libs/ardour/port.cc
+++ b/libs/ardour/port.cc
@@ -165,7 +165,12 @@ Port::get_connections (std::vector<std::string> & c) const
return c.size();
}
- return port_engine.get_connections (_port_handle, c);
+ if (_port_handle) {
+ return port_engine.get_connections (_port_handle, c);
+ return c.size();
+ }
+
+ return 0;
}
int
diff --git a/libs/ardour/port_insert.cc b/libs/ardour/port_insert.cc
index fa09ea0..0479699 100644
--- a/libs/ardour/port_insert.cc
+++ b/libs/ardour/port_insert.cc
@@ -60,6 +60,13 @@ PortInsert::~PortInsert ()
}
void
+PortInsert::set_pre_fader (bool p)
+{
+ Processor::set_pre_fader (p);
+ _out->set_pre_fader (p);
+}
+
+void
PortInsert::start_latency_detection ()
{
delete _mtdm;
diff --git a/libs/ardour/port_manager.cc b/libs/ardour/port_manager.cc
index f2f2334..a1a4397 100644
--- a/libs/ardour/port_manager.cc
+++ b/libs/ardour/port_manager.cc
@@ -26,6 +26,7 @@
#include "ardour/midi_port.h"
#include "ardour/midiport_manager.h"
#include "ardour/port_manager.h"
+#include "ardour/profile.h"
#include "i18n.h"
@@ -489,12 +490,14 @@ PortManager::reconnect_ports ()
{
boost::shared_ptr<Ports> p = ports.reader ();
- /* re-establish connections */
-
- DEBUG_TRACE (DEBUG::Ports, string_compose ("reconnect %1 ports\n", p->size()));
-
- for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
- i->second->reconnect ();
+ if (!Profile->get_trx()) {
+ /* re-establish connections */
+
+ DEBUG_TRACE (DEBUG::Ports, string_compose ("reconnect %1 ports\n", p->size()));
+
+ for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
+ i->second->reconnect ();
+ }
}
return 0;
diff --git a/libs/ardour/quantize.cc b/libs/ardour/quantize.cc
index 6604469..bcce41c 100644
--- a/libs/ardour/quantize.cc
+++ b/libs/ardour/quantize.cc
@@ -52,6 +52,63 @@ Quantize::~Quantize ()
{
}
+static double
+swing_position (double pos, double grid, double swing, double offset)
+{
+ /* beats start out numbered at zero.
+ *
+ * every other position on the start-quantize-grid is
+ * optionally swung, meaning that its position is moved
+ * somewhere between its natural position and 2/3 of
+ * the way to the next start-quantize-grid position.
+ *
+ * so, if the _start grid is 0.5, the beat at 0 isn't
+ * swung, but something at 0.5 is, the beat at 1 isn't
+ * swung, but something at 1.5 is.
+ *
+ * if the start grid is 1.0, the beat at 0 isn't swung,
+ * but the beat at 1.0 is. the beat at 2.0 isn't swung,
+ * but the beat at 3.0 is. and so on.
+ *
+ * so the criterion for a position being swung is
+ * whether or not ((possible_grid_position / grid) % 2) != 0
+ */
+
+ const bool swing_quantize_grid_position = pos > 0.0 && fmod ((pos/grid), 2.0) != 0;
+ const bool swing_previous_grid_position = pos > grid && fmod ((pos-grid)/grid, 2.0) != 0;
+
+ /* one of these will not be subject to swing */
+
+ double swung_pos = pos;
+ double swung_previous_grid_position;
+
+ if (pos > grid) {
+ swung_previous_grid_position = pos - grid;
+ } else {
+ swung_previous_grid_position = 0.0;
+ }
+
+ if (swing_previous_grid_position) {
+ swung_previous_grid_position = swung_previous_grid_position + (2.0/3.0 * swing * grid);
+ }
+
+ if (swing_quantize_grid_position) {
+ swung_pos = swung_pos + (2.0/3.0 * swing * grid);
+ }
+
+ /* now correct for start-of-model offset */
+
+ pos += offset;
+
+ if (fabs (pos - swung_pos) > fabs (pos - swung_previous_grid_position)) {
+ pos = swung_previous_grid_position;
+ } else {
+ pos = swung_pos;
+ }
+
+ return pos;
+}
+
Command*
Quantize::operator () (boost::shared_ptr<MidiModel> model,
Evoral::Beats position,
@@ -66,47 +123,38 @@ Quantize::operator () (boost::shared_ptr<MidiModel> model,
const double round_pos = round(position.to_double() / _start_grid) * _start_grid;
const double offset = round_pos - position.to_double();
- bool even;
MidiModel::NoteDiffCommand* cmd = new MidiModel::NoteDiffCommand (model, "quantize");
for (std::vector<Evoral::Sequence<Evoral::Beats>::Notes>::iterator s = seqs.begin(); s != seqs.end(); ++s) {
- even = false;
-
- /* TODO 'swing' probably requires a 2nd iteration:
- * first quantize notes to the grid, then apply beat shift
- */
for (Evoral::Sequence<MidiModel::TimeType>::Notes::iterator i = (*s).begin(); i != (*s).end(); ++i) {
- double new_start = round (((*i)->time().to_double() - offset) / _start_grid) * _start_grid + offset;
- double new_end = round (((*i)->end_time().to_double() - offset) / _end_grid) * _end_grid + offset;
-
- if (_swing > 0.0 && !even) {
-
- double next_grid = new_start + _start_grid;
+ /* compute new start + end points WITHOUT the offset
+ * caused by the start of the model (see above).
+ *
+ * these versions of new_start and new_end are
+ * guaranteed to precisely align with the quantize grid(s).
+ */
+
+ double new_start = round (((*i)->time().to_double() - offset) / _start_grid) * _start_grid;
+ double new_end = round (((*i)->end_time().to_double() - offset) / _end_grid) * _end_grid;
- /* find a spot 2/3 (* swing factor) of the way between the grid point
- we would put this note at, and the nominal position of the next note.
- */
+ if (_swing) {
- new_start = new_start + (2.0/3.0 * _swing * (next_grid - new_start));
- new_end = new_end + (2.0/3.0 * _swing * (next_grid - new_start));
+ new_start = swing_position (new_start, _start_grid, _swing, offset);
+ new_end = swing_position (new_end, _end_grid, _swing, offset);
+
+ } else {
- } else if (_swing < 0.0 && !even) {
-
- double prev_grid = new_start - _start_grid;
-
- /* find a spot 2/3 (* swing factor) of the way between the grid point
- we would put this note at, and the nominal position of the previous note.
- */
-
- new_start = new_start - (2.0/3.0 * _swing * (new_start - prev_grid));
- new_end = new_end - (2.0/3.0 * _swing * (new_start - prev_grid));
+ /* now correct for start-of-model offset */
+ new_start += offset;
+ new_end += offset;
}
-
+
double delta = new_start - (*i)->time().to_double();
+
if (fabs (delta) >= _threshold) {
if (_snap_start) {
delta *= _strength;
@@ -128,8 +176,6 @@ Quantize::operator () (boost::shared_ptr<MidiModel> model,
cmd->change ((*i), MidiModel::NoteDiffCommand::Length, new_dur);
}
}
-
- even = !even;
}
}
diff --git a/libs/ardour/rc_configuration.cc b/libs/ardour/rc_configuration.cc
index 9fdd6aa..452d8eb 100644
--- a/libs/ardour/rc_configuration.cc
+++ b/libs/ardour/rc_configuration.cc
@@ -26,6 +26,7 @@
#include "pbd/xml++.h"
#include "pbd/file_utils.h"
+#include "pbd/replace_all.h"
#include "ardour/audioengine.h"
#include "ardour/control_protocol_manager.h"
diff --git a/libs/ardour/recent_sessions.cc b/libs/ardour/recent_sessions.cc
index 7c22974..7458c32 100644
--- a/libs/ardour/recent_sessions.cc
+++ b/libs/ardour/recent_sessions.cc
@@ -39,6 +39,7 @@ using namespace PBD;
namespace {
const char * const recent_file_name = "recent";
+ const char * const recent_templates_file_name = "recent_templates";
} // anonymous
@@ -85,6 +86,38 @@ ARDOUR::read_recent_sessions (RecentSessions& rs)
}
int
+ARDOUR::read_recent_templates (std::deque<std::string>& rt)
+{
+ std::string path = Glib::build_filename (user_config_directory(), recent_templates_file_name);
+
+ ifstream recent (path.c_str());
+
+ if (!recent) {
+ if (errno != ENOENT) {
+ error << string_compose (_("cannot open recent template file %1 (%2)"), path, strerror (errno)) << endmsg;
+ return -1;
+ } else {
+ return 1;
+ }
+ }
+
+ while (true) {
+
+ std::string session_template_full_name;
+
+ getline(recent, session_template_full_name);
+
+ if (!recent.good()) {
+ break;
+ }
+
+ rt.push_back (session_template_full_name);
+ }
+
+ return 0;
+}
+
+int
ARDOUR::write_recent_sessions (RecentSessions& rs)
{
std::string path = Glib::build_filename (user_config_directory(), recent_file_name);
@@ -103,6 +136,24 @@ ARDOUR::write_recent_sessions (RecentSessions& rs)
}
int
+ARDOUR::write_recent_templates (std::deque<std::string>& rt)
+{
+ std::string path = Glib::build_filename (user_config_directory(), recent_templates_file_name);
+
+ std::ofstream recent (path.c_str());
+
+ if (!recent) {
+ return -1;
+ }
+
+ for (std::deque<std::string>::const_iterator i = rt.begin(); i != rt.end(); ++i) {
+ recent << (*i) << std::endl;
+ }
+
+ return 0;
+}
+
+int
ARDOUR::store_recent_sessions (string name, string path)
{
RecentSessions rs;
@@ -130,6 +181,28 @@ ARDOUR::store_recent_sessions (string name, string path)
}
int
+ARDOUR::store_recent_templates (const std::string& session_template_full_name)
+{
+ std::deque<std::string> rt;
+
+ if (ARDOUR::read_recent_templates (rt) < 0) {
+ return -1;
+ }
+
+ rt.erase(remove (rt.begin(), rt.end(), session_template_full_name), rt.end());
+
+ rt.push_front (session_template_full_name);
+
+ uint32_t max_recent_templates = Config->get_max_recent_templates ();
+
+ if (rt.size() > max_recent_templates) {
+ rt.erase( rt.begin() + max_recent_templates, rt.end ());
+ }
+
+ return ARDOUR::write_recent_templates (rt);
+}
+
+int
ARDOUR::remove_recent_sessions (const string& path)
{
RecentSessions rs;
diff --git a/libs/ardour/resampled_source.cc b/libs/ardour/resampled_source.cc
index 0a81319..5c81170 100644
--- a/libs/ardour/resampled_source.cc
+++ b/libs/ardour/resampled_source.cc
@@ -34,7 +34,7 @@ const uint32_t ResampledImportableSource::blocksize = 16384U;
ResampledImportableSource::ResampledImportableSource (boost::shared_ptr<ImportableSource> src, framecnt_t rate, SrcQuality srcq)
: source (src)
- , src_state (0)
+ , _src_state (0)
{
_src_type = SRC_SINC_BEST_QUALITY;
@@ -56,17 +56,17 @@ ResampledImportableSource::ResampledImportableSource (boost::shared_ptr<Importab
break;
}
- input = new float[blocksize];
+ _input = new float[blocksize];
seek (0);
- src_data.src_ratio = ((float) rate) / source->samplerate();
+ _src_data.src_ratio = ((float) rate) / source->samplerate();
}
ResampledImportableSource::~ResampledImportableSource ()
{
- src_state = src_delete (src_state) ;
- delete [] input;
+ _src_state = src_delete (_src_state) ;
+ delete [] _input;
}
framecnt_t
@@ -75,44 +75,47 @@ ResampledImportableSource::read (Sample* output, framecnt_t nframes)
int err;
/* If the input buffer is empty, refill it. */
+ if (_src_data.input_frames == 0) {
- if (src_data.input_frames == 0) {
-
- src_data.input_frames = source->read (input, blocksize);
+ _src_data.input_frames = source->read (_input, blocksize);
/* The last read will not be a full buffer, so set end_of_input. */
-
- if ((framecnt_t) src_data.input_frames < blocksize) {
- src_data.end_of_input = true;
+ if ((framecnt_t) _src_data.input_frames < blocksize) {
+ _end_of_input = true;
}
- src_data.input_frames /= source->channels();
- src_data.data_in = input;
+ _src_data.input_frames /= source->channels();
+ _src_data.data_in = _input;
}
- src_data.data_out = output;
-
- if (!src_data.end_of_input) {
- src_data.output_frames = nframes / source->channels();
- } else {
- src_data.output_frames = std::min ((framecnt_t) src_data.input_frames, nframes / source->channels());
+ _src_data.data_out = output;
+ _src_data.output_frames = nframes / source->channels();
+
+ if (_end_of_input && _src_data.input_frames * _src_data.src_ratio <= _src_data.output_frames) {
+ /* only set src_data.end_of_input for the last cycle.
+ *
+ * The flag only affects writing out remaining data in the
+ * internal buffer of src_state.
+ * SRC is not aware of data bufered here in _src_data.input
+ * which needs to be processed first.
+ */
+ _src_data.end_of_input = true;
}
- if ((err = src_process (src_state, &src_data))) {
+ if ((err = src_process (_src_state, &_src_data))) {
error << string_compose(_("Import: %1"), src_strerror (err)) << endmsg ;
return 0 ;
}
/* Terminate if at end */
-
- if (src_data.end_of_input && src_data.output_frames_gen == 0) {
+ if (_src_data.end_of_input && _src_data.output_frames_gen == 0) {
return 0;
}
- src_data.data_in += src_data.input_frames_used * source->channels();
- src_data.input_frames -= src_data.input_frames_used ;
+ _src_data.data_in += _src_data.input_frames_used * source->channels();
+ _src_data.input_frames -= _src_data.input_frames_used ;
- return src_data.output_frames_gen * source->channels();
+ return _src_data.output_frames_gen * source->channels();
}
void
@@ -122,20 +125,21 @@ ResampledImportableSource::seek (framepos_t pos)
/* and reset things so that we start from scratch with the conversion */
- if (src_state) {
- src_delete (src_state);
+ if (_src_state) {
+ src_delete (_src_state);
}
int err;
- if ((src_state = src_new (_src_type, source->channels(), &err)) == 0) {
+ if ((_src_state = src_new (_src_type, source->channels(), &err)) == 0) {
error << string_compose(_("Import: src_new() failed : %1"), src_strerror (err)) << endmsg ;
throw failed_constructor ();
}
- src_data.input_frames = 0;
- src_data.data_in = input;
- src_data.end_of_input = 0;
+ _src_data.input_frames = 0;
+ _src_data.data_in = _input;
+ _src_data.end_of_input = 0;
+ _end_of_input = false;
}
framepos_t
diff --git a/libs/ardour/reverse.cc b/libs/ardour/reverse.cc
index 06fafb0..b2189cf 100644
--- a/libs/ardour/reverse.cc
+++ b/libs/ardour/reverse.cc
@@ -56,7 +56,7 @@ Reverse::run (boost::shared_ptr<Region> r, Progress*)
/* create new sources */
- if (make_new_sources (region, nsrcs)) {
+ if (make_new_sources (region, nsrcs, "", false)) {
goto out;
}
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index be7174f..f27bed6 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -60,6 +60,7 @@
#include "ardour/port.h"
#include "ardour/port_insert.h"
#include "ardour/processor.h"
+#include "ardour/profile.h"
#include "ardour/route.h"
#include "ardour/route_group.h"
#include "ardour/send.h"
@@ -95,7 +96,8 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
, _self_solo (false)
, _soloed_by_others_upstream (0)
, _soloed_by_others_downstream (0)
- , _solo_isolated (0)
+ , _solo_isolated (false)
+ , _solo_isolated_by_upstream (0)
, _denormal_protection (false)
, _recordable (true)
, _silent (false)
@@ -112,15 +114,22 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
, _initial_io_setup (false)
, _custom_meter_position_noted (false)
{
- if (is_master()) {
- _meter_type = MeterK20;
- }
processor_max_streams.reset();
}
int
Route::init ()
{
+ /* set default meter type */
+ if (is_master()) {
+ _meter_type = Config->get_meter_type_master ();
+ }
+ else if (dynamic_cast<Track*>(this)) {
+ _meter_type = Config->get_meter_type_track ();
+ } else {
+ _meter_type = Config->get_meter_type_bus ();
+ }
+
/* add standard controls */
_solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
@@ -833,6 +842,14 @@ Route::set_solo (bool yn, void *src)
solo_changed (true, src); /* EMIT SIGNAL */
_solo_control->Changed (); /* EMIT SIGNAL */
}
+
+ /* XXX TRACKS DEVELOPERS: THIS LOGIC SUGGESTS THAT YOU ARE NOT AWARE OF
+ Config->get_solo_mute_overrride().
+ */
+
+ if (yn && Profile->get_trx()) {
+ set_mute (false, src);
+ }
}
void
@@ -936,6 +953,28 @@ Route::set_mute_master_solo ()
}
void
+Route::mod_solo_isolated_by_upstream (bool yn, void* src)
+{
+ bool old = solo_isolated ();
+
+ if (!yn) {
+ if (_solo_isolated_by_upstream >= 1) {
+ _solo_isolated_by_upstream--;
+ } else {
+ _solo_isolated_by_upstream = 0;
+ }
+ } else {
+ _solo_isolated_by_upstream++;
+ }
+
+ if (solo_isolated() != old) {
+ /* solo isolated status changed */
+ _mute_master->set_solo_ignore (yn);
+ solo_isolated_changed (src);
+ }
+}
+
+void
Route::set_solo_isolated (bool yn, void *src)
{
if (is_master() || is_monitor() || is_auditioner()) {
@@ -947,52 +986,53 @@ Route::set_solo_isolated (bool yn, void *src)
return;
}
+ bool changed = false;
+
+ if (yn) {
+ if (_solo_isolated == false) {
+ _mute_master->set_solo_ignore (true);
+ changed = true;
+ }
+ _solo_isolated = true;
+ } else {
+ if (_solo_isolated == true) {
+ _solo_isolated = false;
+ _mute_master->set_solo_ignore (false);
+ changed = true;
+ }
+ }
+
+
+ if (!changed) {
+ return;
+ }
+
/* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
boost::shared_ptr<RouteList> routes = _session.get_routes ();
for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
-
+
if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
continue;
}
-
+
bool sends_only;
- bool does_feed = direct_feeds_according_to_graph (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
-
+ bool does_feed = feeds (*i, &sends_only);
+
if (does_feed && !sends_only) {
- (*i)->set_solo_isolated (yn, (*i)->route_group());
+ (*i)->mod_solo_isolated_by_upstream (yn, src);
}
}
-
+
/* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
- bool changed = false;
-
- if (yn) {
- if (_solo_isolated == 0) {
- _mute_master->set_solo_ignore (true);
- changed = true;
- }
- _solo_isolated++;
- } else {
- if (_solo_isolated > 0) {
- _solo_isolated--;
- if (_solo_isolated == 0) {
- _mute_master->set_solo_ignore (false);
- changed = true;
- }
- }
- }
-
- if (changed) {
- solo_isolated_changed (src);
- }
+ solo_isolated_changed (src);
}
bool
Route::solo_isolated () const
{
- return _solo_isolated > 0;
+ return (_solo_isolated == true) || (_solo_isolated_by_upstream > 0);
}
void
@@ -1199,7 +1239,7 @@ Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<
}
- if (activation_allowed && !_session.get_disable_all_loaded_plugins()) {
+ if (activation_allowed && (!_session.get_disable_all_loaded_plugins () || !processor->display_to_user ())) {
processor->activate ();
}
@@ -1279,7 +1319,7 @@ Route::add_processor_from_xml_2X (const XMLNode& node, int version)
//A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
if (i != children.end()) {
if ((prop = (*i)->property (X_("active"))) != 0) {
- if ( string_is_affirmative (prop->value()) && !_session.get_disable_all_loaded_plugins() )
+ if ( string_is_affirmative (prop->value()) && (!_session.get_disable_all_loaded_plugins () || !processor->display_to_user () ) )
processor->activate();
else
processor->deactivate();
@@ -4159,7 +4199,7 @@ Route::set_processor_positions ()
bool had_amp = false;
for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
(*i)->set_pre_fader (!had_amp);
- if (boost::dynamic_pointer_cast<Amp> (*i)) {
+ if (*i == _amp) {
had_amp = true;
}
}
@@ -4354,7 +4394,7 @@ Route::setup_invisible_processors ()
/* find the amp */
ProcessorList::iterator amp = new_processors.begin ();
- while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
+ while (amp != new_processors.end() && *amp != _amp) {
++amp;
}
@@ -4487,6 +4527,12 @@ Route::setup_invisible_processors ()
_processors = new_processors;
+ for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
+ if (!(*i)->display_to_user () && !(*i)->active ()) {
+ (*i)->activate ();
+ }
+ }
+
DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
diff --git a/libs/ardour/scene_change.cc b/libs/ardour/scene_change.cc
index 6560a7c..322b37a 100644
--- a/libs/ardour/scene_change.cc
+++ b/libs/ardour/scene_change.cc
@@ -41,6 +41,7 @@ SceneChange::factory (const XMLNode& node, int version)
SceneChange::SceneChange ()
: _color (out_of_bound_color)
+ , _active (true)
{
}
@@ -56,3 +57,12 @@ SceneChange::color() const
{
return _color;
}
+
+void
+SceneChange::set_active (bool yn)
+{
+ if (_active != yn) {
+ _active = yn;
+ ActiveChanged (); /* EMIT SIGNAL */
+ }
+}
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index 71ad0bd..6a8a549 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -46,6 +46,7 @@
#include "pbd/search_path.h"
#include "pbd/stacktrace.h"
#include "pbd/stl_delete.h"
+#include "pbd/replace_all.h"
#include "pbd/unwind.h"
#include "ardour/amp.h"
@@ -67,6 +68,9 @@
#include "ardour/data_type.h"
#include "ardour/debug.h"
#include "ardour/directory_names.h"
+#ifdef USE_TRACKS_CODE_FEATURES
+#include "ardour/engine_state_controller.h"
+#endif
#include "ardour/filename_extensions.h"
#include "ardour/graph.h"
#include "ardour/midiport_manager.h"
@@ -78,6 +82,7 @@
#include "ardour/plugin.h"
#include "ardour/plugin_insert.h"
#include "ardour/process_thread.h"
+#include "ardour/profile.h"
#include "ardour/rc_configuration.h"
#include "ardour/recent_sessions.h"
#include "ardour/region.h"
@@ -130,10 +135,17 @@ PBD::Signal0<void> Session::FeedbackDetected;
PBD::Signal0<void> Session::SuccessfulGraphSort;
PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
-const framecnt_t Session::bounce_chunk_size = 65536;
+const framecnt_t Session::bounce_chunk_size = 8192;
static void clean_up_session_event (SessionEvent* ev) { delete ev; }
const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
+// seconds should be added after the region exceeds end marker
+#ifdef USE_TRACKS_CODE_FEATURES
+const uint32_t Session::session_end_shift = 5;
+#else
+const uint32_t Session::session_end_shift = 0;
+#endif
+
/** @param snapshot_name Snapshot name, without .ardour suffix */
Session::Session (AudioEngine &eng,
const string& fullpath,
@@ -179,6 +191,8 @@ Session::Session (AudioEngine &eng,
, average_dir (0)
, have_first_delta_accumulator (false)
, _slave_state (Stopped)
+ , _mtc_active (false)
+ , _ltc_active (false)
, post_export_sync (false)
, post_export_position (0)
, _exporting (false)
@@ -243,6 +257,8 @@ Session::Session (AudioEngine &eng,
, _all_route_group (new RouteGroup (*this, "all"))
, routes (new RouteList)
, _adding_routes_in_progress (false)
+ , _reconnecting_routes_in_progress (false)
+ , _route_deletion_in_progress (false)
, destructive_index (0)
, _track_number_decimals(1)
, solo_update_disabled (false)
@@ -263,11 +279,14 @@ Session::Session (AudioEngine &eng,
, click_emphasis_length (0)
, _clicks_cleared (0)
, _play_range (false)
+ , _range_selection (-1,-1)
+ , _object_selection (-1,-1)
, main_outs (0)
, first_file_data_format_reset (true)
, first_file_header_format_reset (true)
, have_looped (false)
, _have_rec_enabled_track (false)
+ , _have_rec_disabled_track (true)
, _step_editors (0)
, _suspend_timecode_transmission (0)
, _speakers (new Speakers)
@@ -285,6 +304,10 @@ Session::Session (AudioEngine &eng,
pre_engine_init (fullpath);
if (_is_new) {
+
+#ifdef USE_TRACKS_CODE_FEATURES
+ sr = EngineStateController::instance()->get_current_sample_rate();
+#endif
if (ensure_engine (sr)) {
destroy ();
throw failed_constructor ();
@@ -306,8 +329,11 @@ Session::Session (AudioEngine &eng,
* of a template.
*/
- if (!mix_template.empty() && load_state (_current_snapshot_name)) {
- throw failed_constructor ();
+ if (!mix_template.empty()) {
+ if (load_state (_current_snapshot_name)) {
+ throw failed_constructor ();
+ }
+ store_recent_templates (mix_template);
}
/* load default session properties - if any */
@@ -358,8 +384,6 @@ Session::Session (AudioEngine &eng,
StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
- _is_new = false;
-
emit_thread_start ();
/* hook us up to the engine since we are now completely constructed */
@@ -369,8 +393,53 @@ Session::Session (AudioEngine &eng,
_engine.set_session (this);
_engine.reset_timebase ();
- BootMessage (_("Session loading complete"));
+#ifdef USE_TRACKS_CODE_FEATURES
+
+ EngineStateController::instance()->set_session(this);
+
+ if (_is_new ) {
+ if ( ARDOUR::Profile->get_trx () ) {
+ /* Waves Tracks: fill session with tracks basing on the amount of inputs.
+ * each available input must have corresponding track when session starts.
+ */
+
+ uint32_t how_many (0);
+
+ std::vector<std::string> inputs;
+ EngineStateController::instance()->get_physical_audio_inputs(inputs);
+
+ how_many = inputs.size();
+
+ list<boost::shared_ptr<AudioTrack> > tracks;
+
+ // Track names after driver
+ if (Config->get_tracks_auto_naming() == NameAfterDriver) {
+ string track_name = "";
+ for (std::vector<string>::size_type i = 0; i < inputs.size(); ++i) {
+ string track_name;
+ track_name = inputs[i];
+ replace_all (track_name, "system:capture", "");
+
+ list<boost::shared_ptr<AudioTrack> > single_track = new_audio_track (1, 1, Normal, 0, 1, track_name);
+ tracks.insert(tracks.begin(), single_track.front());
+ }
+ } else { // Default track names
+ tracks = new_audio_track (1, 1, Normal, 0, how_many, string());
+ }
+
+ if (tracks.size() != how_many) {
+ destroy ();
+ throw failed_constructor ();
+ }
+ }
+ }
+#endif
+
+ _is_new = false;
+ session_loaded ();
+
+ BootMessage (_("Session loading complete"));
}
Session::~Session ()
@@ -479,6 +548,10 @@ Session::destroy ()
_engine.remove_session ();
+#ifdef USE_TRACKS_CODE_FEATURES
+ EngineStateController::instance()->remove_session();
+#endif
+
/* deregister all ports - there will be no process or any other
* callbacks from the engine any more.
*/
@@ -846,7 +919,13 @@ Session::auto_connect_master_bus ()
if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
return;
}
-
+
+ // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
+ // In this case it means "Multi Out" output mode
+ if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
+ return;
+ }
+
/* if requested auto-connect the outputs to the first N physical ports.
*/
@@ -877,7 +956,7 @@ Session::auto_connect_master_bus ()
void
Session::remove_monitor_section ()
{
- if (!_monitor_out) {
+ if (!_monitor_out || Profile->get_trx()) {
return;
}
@@ -931,7 +1010,7 @@ Session::add_monitor_section ()
{
RouteList rl;
- if (_monitor_out || !_master_out) {
+ if (_monitor_out || !_master_out || Profile->get_trx()) {
return;
}
@@ -1079,7 +1158,7 @@ Session::reset_monitor_section ()
{
/* Process lock should be held by the caller.*/
- if (!_monitor_out) {
+ if (!_monitor_out || Profile->get_trx()) {
return;
}
@@ -1378,6 +1457,19 @@ Session::auto_loop_changed (Location* location)
clear_events (SessionEvent::AutoLoop);
}
+ /* possibly move playhead if not rolling; if we are rolling we'll move
+ to the loop start on stop if that is appropriate.
+ */
+
+ framepos_t pos;
+
+ if (!transport_rolling() && select_playhead_priority_target (pos)) {
+ if (pos == location->start()) {
+ request_locate (pos);
+ }
+ }
+
+
last_loopend = location->end();
set_dirty ();
}
@@ -1472,9 +1564,21 @@ Session::set_auto_loop_location (Location* location)
location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
+ location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
location->set_auto_loop (true, this);
+ if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
+ // set all tracks to use internal looping
+ boost::shared_ptr<RouteList> rl = routes.reader ();
+ for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
+ boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
+ if (tr && !tr->hidden()) {
+ tr->set_loop (location);
+ }
+ }
+ }
+
/* take care of our stuff first */
auto_loop_changed (location);
@@ -1485,12 +1589,6 @@ Session::set_auto_loop_location (Location* location)
}
void
-Session::update_loop (Location*)
-{
- set_dirty ();
-}
-
-void
Session::update_marks (Location*)
{
set_dirty ();
@@ -1499,10 +1597,10 @@ Session::update_marks (Location*)
void
Session::update_skips (Location* loc, bool consolidate)
{
- if (_ignore_skips_updates) {
- return;
- }
-
+ if (_ignore_skips_updates) {
+ return;
+ }
+
Locations::LocationList skips;
if (consolidate) {
@@ -1601,6 +1699,15 @@ Session::location_added (Location *location)
_session_range_location = location;
}
+ if (location->is_mark()) {
+ /* listen for per-location signals that require us to do any * global updates for marks */
+
+ location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
+ location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
+ location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
+ location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
+ }
+
if (location->is_skip()) {
/* listen for per-location signals that require us to update skip-locate events */
@@ -1611,7 +1718,7 @@ Session::location_added (Location *location)
update_skips (location, true);
}
-
+
set_dirty ();
}
@@ -1654,10 +1761,15 @@ Session::_locations_changed (const Locations::LocationList& locations)
We might be re-adding a location here but it doesn't actually matter
for all the locations that the Session takes an interest in.
*/
-
- for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
- location_added (*i);
- }
+
+ {
+ PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
+ for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
+ location_added (*i);
+ }
+ }
+
+ update_skips (NULL, false);
}
void
@@ -1748,6 +1860,11 @@ Session::maybe_enable_record ()
save_state ("", true);
+ if (Config->get_loop_is_mode()) {
+ /* makes no sense to use loop play as mode when recording */
+ request_play_loop (false);
+ }
+
if (_transport_speed) {
if (!config.get_punch_in()) {
enable_record ();
@@ -1835,7 +1952,8 @@ Session::set_frame_rate (framecnt_t frames_per_second)
sync_time_vars();
clear_clicks ();
-
+ reset_write_sources (false);
+
// XXX we need some equivalent to this, somehow
// SndFileSource::setup_standard_crossfades (frames_per_second);
@@ -2073,16 +2191,16 @@ Session::resort_routes_using (boost::shared_ptr<RouteList> r)
* and \a id do not reflect a free route name.
*/
bool
-Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
+Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
{
if (!definitely_add_number && route_by_name (base) == 0) {
/* juse use the base */
- snprintf (name, name_len, "%s", base.c_str());
+ name = base;
return true;
}
do {
- snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
+ name = string_compose ("%1 %2", base, id);
if (route_by_name (name) == 0) {
return true;
@@ -2113,6 +2231,25 @@ Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
}
}
+string
+Session::default_track_name_pattern (DataType t)
+{
+ switch (t) {
+ case DataType::AUDIO:
+ if (Profile->get_trx()) {
+ return _("Track ");
+ } else {
+ return _("Audio ");
+ }
+ break;
+
+ case DataType::MIDI:
+ return _("MIDI ");
+ }
+
+ return "";
+}
+
/** Caller must not hold process lock
* @param name_template string to use for the start of the name, or "" to use "MIDI".
* @param instrument plugin info for the instrument to insert pre-fader, if any
@@ -2121,16 +2258,17 @@ list<boost::shared_ptr<MidiTrack> >
Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
{
- char track_name[32];
+ string track_name;
uint32_t track_id = 0;
string port;
RouteList new_routes;
list<boost::shared_ptr<MidiTrack> > ret;
- bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
+ const string name_pattern = default_track_name_pattern (DataType::MIDI);
+ bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
while (how_many) {
- if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
+ if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
error << "cannot find name for new midi track" << endmsg;
goto failed;
}
@@ -2176,6 +2314,8 @@ Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost:
new_routes.push_back (track);
ret.push_back (track);
+
+ RouteAddedOrRemoved (true); /* EMIT SIGNAL */
}
catch (failed_constructor &err) {
@@ -2195,7 +2335,11 @@ Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost:
failed:
if (!new_routes.empty()) {
StateProtector sp (this);
- add_routes (new_routes, true, true, true);
+ if (Profile->get_trx()) {
+ add_routes (new_routes, false, false, false);
+ } else {
+ add_routes (new_routes, true, true, false);
+ }
if (instrument) {
for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
@@ -2325,6 +2469,17 @@ Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing
for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
string port;
+ /* Waves Tracks:
+ * do not create new connections if we reached the limit of physical outputs
+ * in Multi Out mode
+ */
+
+ if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
+ ARDOUR::Profile->get_trx () &&
+ existing_outputs.get(*t) == nphysical_out ) {
+ break;
+ }
+
if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
} else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
@@ -2350,13 +2505,289 @@ Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing
}
}
+#ifdef USE_TRACKS_CODE_FEATURES
+
+static bool
+compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
+{
+ return route1->remote_control_id() < route2->remote_control_id();
+}
+
void
Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
{
- /* TRX does stuff here, ardour does not (but probably should). This is called after an engine reset (in particular).
- */
+ // it is not allowed to perform connection
+ if (!IO::connecting_legal) {
+ return;
+ }
+
+ // if we are deleting routes we will call this once at the end
+ if (_route_deletion_in_progress) {
+ return;
+ }
+
+ Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
+
+ if (withLock) {
+ lm.acquire ();
+ }
+
+ // We need to disconnect the route's inputs and outputs first
+ // basing on autoconnect configuration
+ bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
+ bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
+
+ ChanCount existing_inputs;
+ ChanCount existing_outputs;
+ count_existing_track_channels (existing_inputs, existing_outputs);
+
+ //ChanCount inputs = ChanCount::ZERO;
+ //ChanCount outputs = ChanCount::ZERO;
+
+ RouteList existing_routes = *routes.reader ();
+ existing_routes.sort (compare_routes_by_remote_id);
+
+ {
+ PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
+
+ vector<string> physinputs;
+ vector<string> physoutputs;
+
+ EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
+ EngineStateController::instance()->get_physical_audio_inputs(physinputs);
+
+ uint32_t input_n = 0;
+ uint32_t output_n = 0;
+ RouteList::iterator rIter = existing_routes.begin();
+ const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
+ const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
+ for (; rIter != existing_routes.end(); ++rIter) {
+ if (*rIter == _master_out || *rIter == _monitor_out ) {
+ continue;
+ }
+
+ if (current_output_auto_connection == AutoConnectPhysical) {
+ (*rIter)->amp()->deactivate();
+ } else if (current_output_auto_connection == AutoConnectMaster) {
+ (*rIter)->amp()->activate();
+ }
+
+ if (reconnectIputs) {
+ (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
+
+ for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
+
+ if (current_input_auto_connection & AutoConnectPhysical) {
+
+ if ( input_n == physinputs.size() ) {
+ break;
+ }
+
+ string port = physinputs[input_n];
+
+ if (port.empty() ) {
+ error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
+ }
+
+ //GZ: check this; could be heavy
+ (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
+ ++input_n;
+ }
+ }
+ }
+
+ if (reconnectOutputs) {
+
+ //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
+ if (current_output_auto_connection & AutoConnectPhysical) {
+
+ //GZ: check this; could be heavy
+ (*rIter)->output()->disconnect (this);
+ size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
+
+ //GZ: check this; could be heavy
+ (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
+
+ } else if (current_output_auto_connection & AutoConnectMaster){
+
+ if (!reconnect_master) {
+ continue;
+ }
+
+ //GZ: check this; could be heavy
+ (*rIter)->output()->disconnect (this);
+
+ if (_master_out) {
+ uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
+ (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
+ } else {
+ error << error << "Master bus is not available" << endmsg;
+ break;
+ }
+ }
+
+ for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
+ if (current_output_auto_connection & AutoConnectPhysical) {
+
+ if ( output_n == physoutputs.size() ) {
+ break;
+ }
+
+ string port = physoutputs[output_n];
+
+ if (port.empty() ) {
+ error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
+ }
+
+ //GZ: check this; could be heavy
+ (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
+ ++output_n;
+
+ } else if (current_output_auto_connection & AutoConnectMaster) {
+
+ if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
+ break;
+ }
+
+ // connect to master bus
+ string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
+
+ if (port.empty() ) {
+ error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
+ }
+
+
+ //GZ: check this; could be heavy
+ (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
+
+ }
+ }
+ }
+
+ //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
+ }
+
+ _master_out->output()->disconnect (this);
+ auto_connect_master_bus ();
+ }
+
+ graph_reordered ();
+
+ session_routes_reconnected (); /* EMIT SIGNAL */
+}
+
+void
+Session::reconnect_midi_scene_ports(bool inputs)
+{
+ if (inputs ) {
+
+ boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
+ if (scene_in_ptr) {
+ scene_in_ptr->disconnect_all ();
+
+ std::vector<EngineStateController::MidiPortState> midi_port_states;
+ EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
+
+ std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
+
+ for (; state_iter != midi_port_states.end(); ++state_iter) {
+ if (state_iter->active && state_iter->available && state_iter->scene_connected) {
+ scene_in_ptr->connect (state_iter->name);
+ }
+ }
+ }
+
+ } else {
+
+ boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
+
+ if (scene_out_ptr ) {
+ scene_out_ptr->disconnect_all ();
+
+ std::vector<EngineStateController::MidiPortState> midi_port_states;
+ EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
+
+ std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
+
+ for (; state_iter != midi_port_states.end(); ++state_iter) {
+ if (state_iter->active && state_iter->available && state_iter->scene_connected) {
+ scene_out_ptr->connect (state_iter->name);
+ }
+ }
+ }
+ }
+}
+
+void
+Session::reconnect_mtc_ports ()
+{
+ boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
+
+ if (!mtc_in_ptr) {
+ return;
+ }
+
+ mtc_in_ptr->disconnect_all ();
+
+ std::vector<EngineStateController::MidiPortState> midi_port_states;
+ EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
+
+ std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
+
+ for (; state_iter != midi_port_states.end(); ++state_iter) {
+ if (state_iter->available && state_iter->mtc_in) {
+ mtc_in_ptr->connect (state_iter->name);
+ }
+ }
+
+ if (!_midi_ports->mtc_input_port ()->connected () &&
+ config.get_external_sync () &&
+ (Config->get_sync_source () == MTC) ) {
+ config.set_external_sync (false);
+ }
+
+ if ( ARDOUR::Profile->get_trx () ) {
+ // Tracks need this signal to update timecode_source_dropdown
+ MtcOrLtcInputPortChanged (); //emit signal
+ }
}
+void
+Session::reconnect_mmc_ports(bool inputs)
+{
+ if (inputs ) { // get all enabled midi input ports
+
+ boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
+ if (mmc_in_ptr) {
+ mmc_in_ptr->disconnect_all ();
+ std::vector<std::string> enabled_midi_inputs;
+ EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
+
+ std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
+
+ for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
+ mmc_in_ptr->connect (*port_iter);
+ }
+
+ }
+ } else { // get all enabled midi output ports
+
+ boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
+ if (mmc_out_ptr ) {
+ mmc_out_ptr->disconnect_all ();
+ std::vector<std::string> enabled_midi_outputs;
+ EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
+
+ std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
+
+ for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
+ mmc_out_ptr->connect (*port_iter);
+ }
+ }
+ }
+}
+
+#endif
/** Caller must not hold process lock
* @param name_template string to use for the start of the name, or "" to use "Audio".
@@ -2365,16 +2796,18 @@ list< boost::shared_ptr<AudioTrack> >
Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
uint32_t how_many, string name_template)
{
- char track_name[32];
+ string track_name;
uint32_t track_id = 0;
string port;
RouteList new_routes;
list<boost::shared_ptr<AudioTrack> > ret;
- bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
-
+ const string name_pattern = default_track_name_pattern (DataType::AUDIO);
+ bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
+
while (how_many) {
- if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
+
+ if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
error << "cannot find name for new audio track" << endmsg;
goto failed;
}
@@ -2388,6 +2821,20 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
goto failed;
}
+ if (ARDOUR::Profile->get_trx ()) {
+ // TRACKS considers it's not a USE CASE, it's
+ // a piece of behavior of the session model:
+ //
+ // Gain for a newly created route depends on
+ // the current output_auto_connect mode:
+ //
+ // 0 for Stereo Out mode
+ // 0 Multi Out mode
+ if (Config->get_output_auto_connect() & AutoConnectMaster) {
+ track->set_gain (dB_to_coefficient (0), 0);
+ }
+ }
+
track->use_new_diskstream();
#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
@@ -2426,6 +2873,8 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
new_routes.push_back (track);
ret.push_back (track);
+
+ RouteAddedOrRemoved (true); /* EMIT SIGNAL */
}
catch (failed_constructor &err) {
@@ -2445,7 +2894,11 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
failed:
if (!new_routes.empty()) {
StateProtector sp (this);
- add_routes (new_routes, true, true, true);
+ if (Profile->get_trx()) {
+ add_routes (new_routes, false, false, false);
+ } else {
+ add_routes (new_routes, true, true, false);
+ }
}
return ret;
@@ -2457,7 +2910,7 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
RouteList
Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
{
- char bus_name[32];
+ string bus_name;
uint32_t bus_id = 0;
string port;
RouteList ret;
@@ -2465,7 +2918,7 @@ Session::new_audio_route (int input_channels, int output_channels, RouteGroup* r
bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
while (how_many) {
- if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
+ if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
error << "cannot find name for new audio bus" << endmsg;
goto failure;
}
@@ -2510,6 +2963,8 @@ Session::new_audio_route (int input_channels, int output_channels, RouteGroup* r
ret.push_back (bus);
+ RouteAddedOrRemoved (true); /* EMIT SIGNAL */
+
ARDOUR::GUIIdle ();
}
@@ -2531,7 +2986,11 @@ Session::new_audio_route (int input_channels, int output_channels, RouteGroup* r
failure:
if (!ret.empty()) {
StateProtector sp (this);
- add_routes (ret, false, true, true); // autoconnect outputs only
+ if (Profile->get_trx()) {
+ add_routes (ret, false, false, false);
+ } else {
+ add_routes (ret, false, true, true); // autoconnect // outputs only
+ }
}
return ret;
@@ -2565,7 +3024,7 @@ Session::new_route_from_template (uint32_t how_many, const std::string& template
node_copy.remove_property_recursively (X_("id"));
try {
- char name[32];
+ string name;
if (!name_base.empty()) {
@@ -2574,7 +3033,7 @@ Session::new_route_from_template (uint32_t how_many, const std::string& template
* numbered, via the final parameter.
*/
- if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
+ if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
/*NOTREACHDE*/
}
@@ -2584,7 +3043,7 @@ Session::new_route_from_template (uint32_t how_many, const std::string& template
string const route_name = node_copy.property(X_("name"))->value ();
/* generate a new name by adding a number to the end of the template name */
- if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
+ if (!find_route_name (route_name.c_str(), ++number, name, true)) {
fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
abort(); /*NOTREACHED*/
}
@@ -2630,6 +3089,8 @@ Session::new_route_from_template (uint32_t how_many, const std::string& template
++control_id;
ret.push_back (route);
+
+ RouteAddedOrRemoved (true); /* EMIT SIGNAL */
}
catch (failed_constructor &err) {
@@ -2648,7 +3109,11 @@ Session::new_route_from_template (uint32_t how_many, const std::string& template
out:
if (!ret.empty()) {
StateProtector sp (this);
- add_routes (ret, true, true, true);
+ if (Profile->get_trx()) {
+ add_routes (ret, false, false, false);
+ } else {
+ add_routes (ret, true, true, false);
+ }
IO::enable_connecting ();
}
@@ -2679,6 +3144,8 @@ Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output
reassign_track_numbers();
+ update_route_record_state ();
+
RouteAdded (new_routes); /* EMIT SIGNAL */
}
@@ -2736,7 +3203,7 @@ Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool
if (tr) {
tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
track_playlist_changed (boost::weak_ptr<Track> (tr));
- tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
+ tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
if (mt) {
@@ -2870,100 +3337,128 @@ Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Pro
graph_reordered ();
}
+
void
-Session::remove_route (boost::shared_ptr<Route> route)
+Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
{
- if (route == _master_out) {
- return;
- }
-
- route->set_solo (false, this);
-
- {
+ { // RCU Writer scope
RCUWriter<RouteList> writer (routes);
boost::shared_ptr<RouteList> rs = writer.get_copy ();
-
- rs->remove (route);
-
- /* deleting the master out seems like a dumb
- idea, but its more of a UI policy issue
- than our concern.
- */
-
- if (route == _master_out) {
- _master_out = boost::shared_ptr<Route> ();
- }
-
- if (route == _monitor_out) {
- _monitor_out.reset ();
- }
-
- /* writer goes out of scope, forces route list update */
- }
-
- update_route_solo_state ();
-
- // We need to disconnect the route's inputs and outputs
-
- route->input()->disconnect (0);
- route->output()->disconnect (0);
-
- /* if the route had internal sends sending to it, remove them */
- if (route->internal_return()) {
-
- boost::shared_ptr<RouteList> r = routes.reader ();
- for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
- boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
- if (s) {
- (*i)->remove_processor (s);
+
+
+ for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
+
+ if (*iter == _master_out) {
+ continue;
+ }
+
+ (*iter)->set_solo (false, this);
+
+ rs->remove (*iter);
+
+ /* deleting the master out seems like a dumb
+ idea, but its more of a UI policy issue
+ than our concern.
+ */
+
+ if (*iter == _master_out) {
+ _master_out = boost::shared_ptr<Route> ();
+ }
+
+ if (*iter == _monitor_out) {
+ _monitor_out.reset ();
}
- }
- }
- /* if the monitoring section had a pointer to this route, remove it */
- if (_monitor_out && !route->is_master() && !route->is_monitor()) {
- Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
- PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
- route->remove_aux_or_listen (_monitor_out);
- }
+ update_route_solo_state ();
+
+ // We need to disconnect the route's inputs and outputs
+
+ (*iter)->input()->disconnect (0);
+ (*iter)->output()->disconnect (0);
+
+ /* if the route had internal sends sending to it, remove them */
+ if ((*iter)->internal_return()) {
+
+ boost::shared_ptr<RouteList> r = routes.reader ();
+ for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+ boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
+ if (s) {
+ (*i)->remove_processor (s);
+ }
+ }
+ }
+
+ /* if the monitoring section had a pointer to this route, remove it */
+ if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
+ Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
+ PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
+ (*iter)->remove_aux_or_listen (_monitor_out);
+ }
+
+ boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
+ if (mt && mt->step_editing()) {
+ if (_step_editors > 0) {
+ _step_editors--;
+ }
+ }
- boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
- if (mt && mt->step_editing()) {
- if (_step_editors > 0) {
- _step_editors--;
+ RouteAddedOrRemoved (false); /* EMIT SIGNAL */
}
- }
+
+ /* writer goes out of scope, forces route list update */
+ } // end of RCU Writer scope
+
update_latency_compensation ();
set_dirty();
-
+
/* Re-sort routes to remove the graph's current references to the one that is
* going away, then flush old references out of the graph.
+ * Wave Tracks: reconnect routes
*/
- resort_routes ();
+#ifdef USE_TRACKS_CODE_FEATURES
+ reconnect_existing_routes(true, false);
+#else
+ resort_routes ();
+#endif
+
if (_process_graph) {
_process_graph->clear_other_chain ();
}
-
+
/* get rid of it from the dead wood collection in the route list manager */
-
/* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
-
+
routes.flush ();
+
+ /* try to cause everyone to drop their references
+ * and unregister ports from the backend
+ */
+ PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
- /* try to cause everyone to drop their references */
-
- route->drop_references ();
-
+ for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
+ (*iter)->drop_references ();
+ }
+
Route::RemoteControlIDChange(); /* EMIT SIGNAL */
-
+
/* save the new state of the world */
-
+
if (save_state (_current_snapshot_name)) {
save_history (_current_snapshot_name);
}
+
reassign_track_numbers();
+ update_route_record_state ();
+}
+
+void
+Session::remove_route (boost::shared_ptr<Route> route)
+{
+ boost::shared_ptr<RouteList> rl (new RouteList);
+ rl->push_back (route);
+ remove_routes (rl);
}
void
@@ -3034,6 +3529,120 @@ Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
}
void
+Session::routes_solo_changed (boost::shared_ptr<RouteList> solo_change_routes)
+{
+ if (solo_update_disabled) {
+ // We know already
+ DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
+ return;
+ }
+
+ if (solo_change_routes->empty() ) {
+ return;
+ }
+
+ boost::shared_ptr<RouteList> non_solo_change_routes (new RouteList);
+ boost::shared_ptr<RouteList> r = routes.reader ();
+ int32_t delta;
+
+ std::set_difference (r->begin(), r->end(),
+ solo_change_routes->begin(), solo_change_routes->end(),
+ std::back_inserter(*non_solo_change_routes) );
+
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
+
+ solo_update_disabled = true;
+ RouteList uninvolved;
+
+ for (RouteList::iterator route = solo_change_routes->begin(); route != solo_change_routes->end(); ++route) {
+
+ if ((*route)->self_soloed() ) {
+ delta = 1;
+ } else {
+ delta = -1;
+ }
+
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", (*route)->name()));
+
+ for (RouteList::iterator i = non_solo_change_routes->begin(); i != non_solo_change_routes->end(); ++i) {
+ bool via_sends_only;
+ bool in_signal_flow;
+
+ if ((*i) == *route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ) {
+ continue;
+ }
+
+ in_signal_flow = false;
+
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
+
+ if ((*i)->feeds (*route, &via_sends_only)) {
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
+ if (!via_sends_only) {
+ if (!(*route)->soloed_by_others_upstream()) {
+ (*i)->mod_solo_by_others_downstream (delta);
+ }
+ } else {
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
+ }
+ in_signal_flow = true;
+ } else {
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
+ }
+
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
+
+ if ((*route)->feeds (*i, &via_sends_only)) {
+ /* propagate solo upstream only if routing other than
+ sends is involved, but do consider the other route
+ (*i) to be part of the signal flow even if only
+ sends are involved.
+ */
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
+ (*route)->name(),
+ (*i)->name(),
+ via_sends_only,
+ (*route)->soloed_by_others_downstream(),
+ (*route)->soloed_by_others_upstream()));
+ if (!via_sends_only) {
+ if (!(*route)->soloed_by_others_downstream()) {
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
+ (*i)->mod_solo_by_others_upstream (delta);
+ } else {
+ DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
+ }
+ } else {
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
+ }
+ in_signal_flow = true;
+ } else {
+ DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
+ }
+
+ if (!in_signal_flow) {
+ uninvolved.push_back (*i);
+ }
+ }
+ }
+ solo_update_disabled = false;
+ DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
+
+ update_route_solo_state ();
+
+ /* now notify that the mute state of the routes not involved in the signal
+ pathway of the just-solo-changed route may have altered.
+ */
+
+ for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name() ));
+ (*i)->mute_changed (this);
+ }
+
+ SoloChanged (); /* EMIT SIGNAL */
+ set_dirty();
+}
+
+void
Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
{
DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
@@ -3468,9 +4077,11 @@ Session::maybe_update_session_range (framepos_t a, framepos_t b)
return;
}
+ framepos_t session_end_marker_shift_samples = session_end_shift * _nominal_frame_rate;
+
if (_session_range_location == 0) {
- add_session_range_location (a, b);
+ set_session_range_location (a, b + session_end_marker_shift_samples);
} else {
@@ -3907,7 +4518,7 @@ Session::format_audio_source_name (const string& legalized_base, uint32_t nchan,
ostringstream sstr;
const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
- if (destructive) {
+ if (Profile->get_trx() && destructive) {
sstr << 'T';
sstr << setfill ('0') << setw (4) << cnt;
sstr << legalized_base;
@@ -4237,7 +4848,7 @@ Session::graph_reordered ()
from a set_state() call or creating new tracks. Ditto for deletion.
*/
- if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
+ if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress) {
return;
}
@@ -4560,12 +5171,12 @@ void
Session::reset_native_file_format ()
{
boost::shared_ptr<RouteList> rl = routes.reader ();
+
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
if (tr) {
/* don't save state as we do this, there's no point
*/
-
_state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
tr->reset_write_sources (false);
_state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
@@ -4948,9 +5559,15 @@ Session::have_rec_enabled_track () const
return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
}
+bool
+Session::have_rec_disabled_track () const
+{
+ return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
+}
+
/** Update the state of our rec-enabled tracks flag */
void
-Session::update_have_rec_enabled_track ()
+Session::update_route_record_state ()
{
boost::shared_ptr<RouteList> rl = routes.reader ();
RouteList::iterator i = rl->begin();
@@ -4971,6 +5588,22 @@ Session::update_have_rec_enabled_track ()
if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
RecordStateChanged (); /* EMIT SIGNAL */
}
+
+ for (i = rl->begin(); i != rl->end (); ++i) {
+ boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
+ if (tr && !tr->record_enabled ()) {
+ break;
+ }
+ }
+
+ g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
+
+ bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
+
+ if (record_status() == Recording && record_arm_state_changed ) {
+ RecordArmStateChanged ();
+ }
+
}
void
@@ -5013,7 +5646,8 @@ Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
void
Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
{
- RouteRemovedFromRouteGroup (rg, r);
+ update_route_record_state ();
+ RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
}
boost::shared_ptr<RouteList>
@@ -5090,7 +5724,7 @@ Session::current_end_frame () const
}
void
-Session::add_session_range_location (framepos_t start, framepos_t end)
+Session::set_session_range_location (framepos_t start, framepos_t end)
{
_session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
_locations->add (_session_range_location);
@@ -5526,6 +6160,12 @@ Session::next_control_id () const
subtract++;
}
+ /* the same about masterbus in Waves Tracks */
+
+ if (Profile->get_trx() && _master_out) {
+ subtract++;
+ }
+
return nroutes() - subtract;
}
@@ -5543,6 +6183,14 @@ Session::notify_remote_id_change ()
default:
break;
}
+
+#ifdef USE_TRACKS_CODE_FEATURES
+ /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
+ * if track order has been changed by user
+ */
+ reconnect_existing_routes(true, true);
+#endif
+
}
void
@@ -5597,6 +6245,11 @@ Session::reconnect_ltc_input ()
if (src != _("None") && !src.empty()) {
_ltc_input->nth (0)->connect (src);
}
+
+ if ( ARDOUR::Profile->get_trx () ) {
+ // Tracks need this signal to update timecode_source_dropdown
+ MtcOrLtcInputPortChanged (); //emit signal
+ }
}
}
@@ -5605,14 +6258,48 @@ Session::reconnect_ltc_output ()
{
if (_ltc_output) {
-#if 0
- string src = Config->get_ltc_sink_port();
+ string src = Config->get_ltc_output_port();
_ltc_output->disconnect (this);
if (src != _("None") && !src.empty()) {
_ltc_output->nth (0)->connect (src);
}
-#endif
}
}
+
+void
+Session::set_range_selection (framepos_t start, framepos_t end)
+{
+ _range_selection = Evoral::Range<framepos_t> (start, end);
+#ifdef USE_TRACKS_CODE_FEATURES
+ follow_playhead_priority ();
+#endif
+}
+
+void
+Session::set_object_selection (framepos_t start, framepos_t end)
+{
+ _object_selection = Evoral::Range<framepos_t> (start, end);
+#ifdef USE_TRACKS_CODE_FEATURES
+ follow_playhead_priority ();
+#endif
+}
+
+void
+Session::clear_range_selection ()
+{
+ _range_selection = Evoral::Range<framepos_t> (-1,-1);
+#ifdef USE_TRACKS_CODE_FEATURES
+ follow_playhead_priority ();
+#endif
+}
+
+void
+Session::clear_object_selection ()
+{
+ _object_selection = Evoral::Range<framepos_t> (-1,-1);
+#ifdef USE_TRACKS_CODE_FEATURES
+ follow_playhead_priority ();
+#endif
+}
diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc
index 53a2636..7d8cbdc 100644
--- a/libs/ardour/session_events.cc
+++ b/libs/ardour/session_events.cc
@@ -42,6 +42,12 @@ SessionEvent::init_event_pool ()
pool = new PerThreadPool;
}
+bool
+SessionEvent::has_per_thread_pool ()
+{
+ return pool->has_per_thread_pool ();
+}
+
void
SessionEvent::create_per_thread_pool (const std::string& name, uint32_t nitems)
{
diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc
index 7becd9c..a97f405 100644
--- a/libs/ardour/session_midi.cc
+++ b/libs/ardour/session_midi.cc
@@ -43,6 +43,7 @@
#include "ardour/midi_port.h"
#include "ardour/midi_track.h"
#include "ardour/midi_ui.h"
+#include "ardour/profile.h"
#include "ardour/session.h"
#include "ardour/slave.h"
#include "ardour/ticker.h"
@@ -129,6 +130,19 @@ Session::mmc_record_pause (MIDI::MachineControl &/*mmc*/)
void
Session::mmc_record_strobe (MIDI::MachineControl &/*mmc*/)
{
+ if (Profile->get_trx()) {
+
+ /* In Tracks Live, there is no concept of punch, so we just
+ treat RecordStrobe like RecordPause. This violates the MMC
+ specification.
+ */
+
+ if (Config->get_mmc_control()) {
+ maybe_enable_record();
+ }
+ return;
+ }
+
if (!Config->get_mmc_control() || (_step_editors > 0)) {
return;
}
@@ -523,11 +537,13 @@ Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_f
}
#ifndef NDEBUG
- DEBUG_STR_DECL(foo)
- DEBUG_STR_APPEND(foo,"sending ");
- DEBUG_STR_APPEND(foo, transmitting_timecode_time);
- DEBUG_TRACE (DEBUG::MTC, string_compose ("%1 qfm = %2, stamp = %3\n", DEBUG_STR(foo).str(), next_quarter_frame_to_send,
- out_stamp));
+ if (DEBUG_ENABLED(DEBUG::MTC)) {
+ DEBUG_STR_DECL(foo)
+ DEBUG_STR_APPEND(foo,"sending ");
+ DEBUG_STR_APPEND(foo, transmitting_timecode_time);
+ DEBUG_TRACE (DEBUG::MTC, string_compose ("%1 qfm = %2, stamp = %3\n", DEBUG_STR(foo).str(), next_quarter_frame_to_send,
+ out_stamp));
+ }
#endif
// Increment quarter frame counter
diff --git a/libs/ardour/session_rtevents.cc b/libs/ardour/session_rtevents.cc
index 11d8319..b00c4c1 100644
--- a/libs/ardour/session_rtevents.cc
+++ b/libs/ardour/session_rtevents.cc
@@ -62,12 +62,17 @@ Session::set_solo (boost::shared_ptr<RouteList> rl, bool yn, SessionEvent::RTeve
void
Session::rt_set_solo (boost::shared_ptr<RouteList> rl, bool yn, bool /* group_override */)
{
+ solo_update_disabled = true;
+
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
if (!(*i)->is_auditioner()) {
(*i)->set_solo (yn, this);
}
}
+ solo_update_disabled = false;
+ routes_solo_changed (rl);
+
set_dirty();
}
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index f11ba77..0edff32 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -100,6 +100,7 @@
#include "ardour/playlist_source.h"
#include "ardour/port.h"
#include "ardour/processor.h"
+#include "ardour/profile.h"
#include "ardour/proxy_controllable.h"
#include "ardour/recent_sessions.h"
#include "ardour/region_factory.h"
@@ -141,8 +142,18 @@ Session::pre_engine_init (string fullpath)
_path = canonical_path(fullpath);
/* is it new ? */
+ if (Profile->get_trx() ) {
+ // Waves TracksLive has a usecase of session replacement with a new one.
+ // We should check session state file (<session_name>.ardour) existance
+ // to determine if the session is new or not
- _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
+ string full_session_name = Glib::build_filename( fullpath, _name );
+ full_session_name += statefile_suffix;
+
+ _is_new = !Glib::file_test (full_session_name, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
+ } else {
+ _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
+ }
/* finish initialization that can't be done in a normal C++ constructor
definition.
@@ -270,6 +281,7 @@ Session::post_engine_init ()
Config->map_parameters (ff);
config.map_parameters (ft);
+ _butler->map_parameters ();
/* Reset all panners */
@@ -351,9 +363,44 @@ Session::post_engine_init ()
state_was_pending = false;
}
+ /* Now, finally, we can fill the playback buffers */
+
+ BootMessage (_("Filling playback buffers"));
+
+ boost::shared_ptr<RouteList> rl = routes.reader();
+ for (RouteList::iterator r = rl->begin(); r != rl->end(); ++r) {
+ boost::shared_ptr<Track> trk = boost::dynamic_pointer_cast<Track> (*r);
+ if (trk && !trk->hidden()) {
+ trk->seek (_transport_frame, true);
+ }
+ }
+
return 0;
}
+void
+Session::session_loaded ()
+{
+ SessionLoaded();
+
+ _state_of_the_state = Clean;
+
+ DirtyChanged (); /* EMIT SIGNAL */
+
+ if (_is_new) {
+ save_state ("");
+ } else if (state_was_pending) {
+ save_state ("");
+ remove_pending_capture_state ();
+ state_was_pending = false;
+ }
+
+ /* Now, finally, we can fill the playback buffers */
+
+ BootMessage (_("Filling playback buffers"));
+ force_locate (_transport_frame, false);
+}
+
string
Session::raid_path () const
{
@@ -490,7 +537,7 @@ Session::create (const string& session_template, BusProfile* bus_profile)
_writable = exists_and_writable (_path);
if (!session_template.empty()) {
- std::string in_path = session_template_dir_to_file (session_template);
+ std::string in_path = (ARDOUR::Profile->get_trx () ? session_template : session_template_dir_to_file (session_template));
ifstream in(in_path.c_str());
@@ -506,10 +553,12 @@ Session::create (const string& session_template, BusProfile* bus_profile)
out << in.rdbuf();
_is_new = false;
- /* Copy plugin state files from template to new session */
- std::string template_plugins = Glib::build_filename (session_template, X_("plugins"));
- copy_recurse (template_plugins, plugins_dir ());
-
+ if (!ARDOUR::Profile->get_trx()) {
+ /* Copy plugin state files from template to new session */
+ std::string template_plugins = Glib::build_filename (session_template, X_("plugins"));
+ copy_recurse (template_plugins, plugins_dir ());
+ }
+
return 0;
} else {
@@ -526,7 +575,21 @@ Session::create (const string& session_template, BusProfile* bus_profile)
}
- /* set initial start + end point */
+ if (Profile->get_trx()) {
+
+ /* set initial start + end point : ARDOUR::Session::session_end_shift long.
+ Remember that this is a brand new session. Sessions
+ loaded from saved state will get this range from the saved state.
+ */
+
+ set_session_range_location (0, 0);
+
+ /* Initial loop location, from absolute zero, length 10 seconds */
+
+ Location* loc = new Location (*this, 0, 10.0 * _engine.sample_rate(), _("Loop"), Location::IsAutoLoop);
+ _locations->add (loc, true);
+ set_auto_loop_location (loc);
+ }
_state_of_the_state = Clean;
@@ -537,8 +600,9 @@ Session::create (const string& session_template, BusProfile* bus_profile)
RouteList rl;
ChanCount count(DataType::AUDIO, bus_profile->master_out_channels);
- if (bus_profile->master_out_channels) {
- boost::shared_ptr<Route> r (new Route (*this, _("Master"), Route::MasterOut, DataType::AUDIO));
+ // Waves Tracks: always create master bus for Tracks
+ if (ARDOUR::Profile->get_trx() || bus_profile->master_out_channels) {
+ boost::shared_ptr<Route> r (new Route (*this, _("Master"), Route::MasterOut, DataType::AUDIO));
if (r->init ()) {
return -1;
}
@@ -562,16 +626,20 @@ Session::create (const string& session_template, BusProfile* bus_profile)
add_routes (rl, false, false, false);
}
- /* this allows the user to override settings with an environment variable.
- */
-
- if (no_auto_connect()) {
- bus_profile->input_ac = AutoConnectOption (0);
- bus_profile->output_ac = AutoConnectOption (0);
- }
-
- Config->set_input_auto_connect (bus_profile->input_ac);
- Config->set_output_auto_connect (bus_profile->output_ac);
+ // Waves Tracks: Skip this. Always use autoconnection for Tracks
+ if (!ARDOUR::Profile->get_trx()) {
+
+ /* this allows the user to override settings with an environment variable.
+ */
+
+ if (no_auto_connect()) {
+ bus_profile->input_ac = AutoConnectOption (0);
+ bus_profile->output_ac = AutoConnectOption (0);
+ }
+
+ Config->set_input_auto_connect (bus_profile->input_ac);
+ Config->set_output_auto_connect (bus_profile->output_ac);
+ }
}
if (Config->get_use_monitor_bus() && bus_profile) {
@@ -1045,17 +1113,32 @@ Session::state (bool full_state)
}
}
}
+
+
if (full_state) {
- node->add_child_nocopy (_locations->get_state());
+
+ if (_locations) {
+ node->add_child_nocopy (_locations->get_state());
+ }
} else {
+ Locations loc (*this);
// for a template, just create a new Locations, populate it
// with the default start and end, and get the state for that.
- Locations loc (*this);
Location* range = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
range->set (max_framepos, 0);
loc.add (range);
- node->add_child_nocopy (loc.get_state());
+ XMLNode& locations_state = loc.get_state();
+
+ if (ARDOUR::Profile->get_trx() && _locations) {
+ // For tracks we need stored the Auto Loop Range and all MIDI markers.
+ for (Locations::LocationList::const_iterator i = _locations->list ().begin (); i != _locations->list ().end (); ++i) {
+ if ((*i)->is_mark () || (*i)->is_auto_loop ()) {
+ locations_state.add_child_nocopy ((*i)->get_state ());
+ }
+ }
+ }
+ node->add_child_nocopy (locations_state);
}
child = node->add_child ("Bundles");
@@ -1076,12 +1159,12 @@ Session::state (bool full_state)
RoutePublicOrderSorter cmp;
RouteList public_order (*r);
public_order.sort (cmp);
-
- /* the sort should have put control outs first */
-
- if (_monitor_out) {
- assert (_monitor_out == public_order.front());
- }
+
+ /* the sort should have put control outs first */
+
+ if (_monitor_out) {
+ assert (_monitor_out == public_order.front());
+ }
for (RouteList::iterator i = public_order.begin(); i != public_order.end(); ++i) {
if (!(*i)->is_auditioner()) {
@@ -1335,7 +1418,7 @@ Session::set_state (const XMLNode& node, int version)
ControlProtocolManager::instance().set_state (*child, version);
}
- update_have_rec_enabled_track ();
+ update_route_record_state ();
/* here beginneth the second phase ... */
@@ -1856,17 +1939,15 @@ Session::get_sources_as_xml ()
void
Session::reset_write_sources (bool mark_write_complete, bool force)
{
- boost::shared_ptr<RouteList> rl = routes.reader();
- for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
- if (tr) {
-
- // block state saving
+ boost::shared_ptr<RouteList> rl = routes.reader();
+ for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
+ boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
+ if (tr) {
_state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
tr->reset_write_sources(mark_write_complete, force);
_state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
- }
- }
+ }
+ }
}
int
@@ -1985,60 +2066,80 @@ Session::XMLSourceFactory (const XMLNode& node)
int
Session::save_template (string template_name)
{
- XMLTree tree;
-
- if (_state_of_the_state & CannotSave) {
+ if ((_state_of_the_state & CannotSave) || template_name.empty ()) {
return -1;
}
- std::string user_template_dir(user_template_directory());
+ bool absolute_path = Glib::path_is_absolute (template_name);
- if (g_mkdir_with_parents (user_template_dir.c_str(), 0755) != 0) {
- error << string_compose(_("Could not create templates directory \"%1\" (%2)"),
- user_template_dir, g_strerror (errno)) << endmsg;
- return -1;
- }
+ /* directory to put the template in */
+ std::string template_dir_path;
- tree.set_root (&get_template());
+ if (!absolute_path) {
+ std::string user_template_dir(user_template_directory());
- std::string template_dir_path(user_template_dir);
-
- /* directory to put the template in */
- template_dir_path = Glib::build_filename (template_dir_path, template_name);
+ if (g_mkdir_with_parents (user_template_dir.c_str(), 0755) != 0) {
+ error << string_compose(_("Could not create templates directory \"%1\" (%2)"),
+ user_template_dir, g_strerror (errno)) << endmsg;
+ return -1;
+ }
- if (Glib::file_test (template_dir_path, Glib::FILE_TEST_EXISTS)) {
- warning << string_compose(_("Template \"%1\" already exists - new version not created"),
- template_dir_path) << endmsg;
- return -1;
+ template_dir_path = Glib::build_filename (user_template_dir, template_name);
+ } else {
+ template_dir_path = template_name;
}
-
- if (g_mkdir_with_parents (template_dir_path.c_str(), 0755) != 0) {
- error << string_compose(_("Could not create directory for Session template\"%1\" (%2)"),
- template_dir_path, g_strerror (errno)) << endmsg;
- return -1;
+
+ if (!ARDOUR::Profile->get_trx()) {
+ if (Glib::file_test (template_dir_path, Glib::FILE_TEST_EXISTS)) {
+ warning << string_compose(_("Template \"%1\" already exists - new version not created"),
+ template_dir_path) << endmsg;
+ return -1;
+ }
+
+ if (g_mkdir_with_parents (template_dir_path.c_str(), 0755) != 0) {
+ error << string_compose(_("Could not create directory for Session template\"%1\" (%2)"),
+ template_dir_path, g_strerror (errno)) << endmsg;
+ return -1;
+ }
}
/* file to write */
- std::string template_file_path(template_dir_path);
- template_file_path = Glib::build_filename (template_file_path, template_name + template_suffix);
+ std::string template_file_path;
+
+ if (ARDOUR::Profile->get_trx()) {
+ template_file_path = template_name;
+ } else {
+ if (absolute_path) {
+ template_file_path = Glib::build_filename (template_dir_path, Glib::path_get_basename (template_dir_path) + template_suffix);
+ } else {
+ template_file_path = Glib::build_filename (template_dir_path, template_name + template_suffix);
+ }
+ }
+ SessionSaveUnderway (); /* EMIT SIGNAL */
+
+ XMLTree tree;
+
+ tree.set_root (&get_template());
if (!tree.write (template_file_path)) {
error << _("template not saved") << endmsg;
return -1;
}
- /* copy plugin state directory */
+ if (!ARDOUR::Profile->get_trx()) {
+ /* copy plugin state directory */
- std::string template_plugin_state_path(template_dir_path);
- template_plugin_state_path = Glib::build_filename (template_plugin_state_path, X_("plugins"));
+ std::string template_plugin_state_path (Glib::build_filename (template_dir_path, X_("plugins")));
- if (g_mkdir_with_parents (template_plugin_state_path.c_str(), 0755) != 0) {
- error << string_compose(_("Could not create directory for Session template plugin state\"%1\" (%2)"),
- template_plugin_state_path, g_strerror (errno)) << endmsg;
- return -1;
+ if (g_mkdir_with_parents (template_plugin_state_path.c_str(), 0755) != 0) {
+ error << string_compose(_("Could not create directory for Session template plugin state\"%1\" (%2)"),
+ template_plugin_state_path, g_strerror (errno)) << endmsg;
+ return -1;
+ }
+ copy_files (plugins_dir(), template_plugin_state_path);
}
- copy_recurse (plugins_dir(), template_plugin_state_path);
+ store_recent_templates (template_file_path);
return 0;
}
@@ -2241,25 +2342,25 @@ Session::get_best_session_directory_for_new_audio ()
string
Session::automation_dir () const
{
- return Glib::build_filename (_path, "automation");
+ return Glib::build_filename (_path, automation_dir_name);
}
string
Session::analysis_dir () const
{
- return Glib::build_filename (_path, "analysis");
+ return Glib::build_filename (_path, analysis_dir_name);
}
string
Session::plugins_dir () const
{
- return Glib::build_filename (_path, "plugins");
+ return Glib::build_filename (_path, plugins_dir_name);
}
string
Session::externals_dir () const
{
- return Glib::build_filename (_path, "externals");
+ return Glib::build_filename (_path, externals_dir_name);
}
int
@@ -2788,17 +2889,18 @@ Session::cleanup_sources (CleanupReport& rep)
*/
RegionFactory::remove_regions_using_source (i->second);
- sources.erase (i);
// also remove source from all_sources
for (set<string>::iterator j = all_sources.begin(); j != all_sources.end(); ++j) {
spath = Glib::path_get_basename (*j);
- if ( spath == i->second->name () ) {
+ if (spath == i->second->name()) {
all_sources.erase (j);
break;
}
}
+
+ sources.erase (i);
}
}
}
@@ -3561,6 +3663,8 @@ Session::config_changed (std::string p, bool ours)
reconnect_ltc_output ();
} else if (p == "timecode-generator-offset") {
ltc_tx_parse_offset();
+ } else if (p == "auto-return-target-list") {
+ follow_playhead_priority ();
}
set_dirty ();
@@ -4152,7 +4256,15 @@ Session::save_as (SaveAs& saveas)
std::string from = *i;
- if ((*i).find (audiofile_dir_string) != string::npos) {
+#ifdef __APPLE__
+ string filename = Glib::path_get_basename (from);
+ std::transform (filename.begin(), filename.end(), filename.begin(), ::toupper);
+ if (filename == ".DS_STORE") {
+ continue;
+ }
+#endif
+
+ if (from.find (audiofile_dir_string) != string::npos) {
/* audio file: only copy if asked */
@@ -4163,7 +4275,8 @@ Session::save_as (SaveAs& saveas)
info << "media file copying from " << from << " to " << to << endmsg;
if (!copy_file (from, to)) {
- throw Glib::FileError (Glib::FileError::IO_ERROR, "copy failed");
+ throw Glib::FileError (Glib::FileError::IO_ERROR,
+ string_compose(_("\ncopying \"%1\" failed !"), from));
}
}
@@ -4171,7 +4284,7 @@ Session::save_as (SaveAs& saveas)
internal_file_cnt++;
- } else if ((*i).find (midifile_dir_string) != string::npos) {
+ } else if (from.find (midifile_dir_string) != string::npos) {
/* midi file: always copy unless
* creating an empty new session
@@ -4192,7 +4305,7 @@ Session::save_as (SaveAs& saveas)
internal_file_cnt++;
- } else if ((*i).find (analysis_dir_string) != string::npos) {
+ } else if (from.find (analysis_dir_string) != string::npos) {
/* make sure analysis dir exists in
* new session folder, but we're not
@@ -4211,14 +4324,14 @@ Session::save_as (SaveAs& saveas)
bool do_copy = true;
for (vector<string>::iterator v = do_not_copy_extensions.begin(); v != do_not_copy_extensions.end(); ++v) {
- if (((*i).length() > (*v).length()) && ((*i).find (*v) == (*i).length() - (*v).length())) {
+ if ((from.length() > (*v).length()) && (from.find (*v) == from.length() - (*v).length())) {
/* end of filename matches extension, do not copy file */
do_copy = false;
break;
}
}
- if (!saveas.copy_media && (*i).find (peakfile_suffix) != string::npos) {
+ if (!saveas.copy_media && from.find (peakfile_suffix) != string::npos) {
/* don't copy peakfiles if
* we're not copying media
*/
@@ -4226,7 +4339,7 @@ Session::save_as (SaveAs& saveas)
}
if (do_copy) {
- string to = Glib::build_filename (to_dir, (*i).substr (prefix_len));
+ string to = Glib::build_filename (to_dir, from.substr (prefix_len));
info << "attempting to make directory/folder " << to << endmsg;
@@ -4237,7 +4350,8 @@ Session::save_as (SaveAs& saveas)
info << "attempting to copy " << from << " to " << to << endmsg;
if (!copy_file (from, to)) {
- throw Glib::FileError (Glib::FileError::IO_ERROR, "copy failed");
+ throw Glib::FileError (Glib::FileError::IO_ERROR,
+ string_compose(_("\ncopying \"%1\" failed !"), from));
}
}
}
@@ -4248,7 +4362,7 @@ Session::save_as (SaveAs& saveas)
*/
GStatBuf gsb;
- g_stat ((*i).c_str(), &gsb);
+ g_stat (from.c_str(), &gsb);
copied += gsb.st_size;
cnt++;
@@ -4343,6 +4457,7 @@ Session::save_as (SaveAs& saveas)
if (internal_file_cnt) {
for (vector<string>::iterator s = old_search_path[DataType::AUDIO].begin(); s != old_search_path[DataType::AUDIO].end(); ++s) {
ensure_search_path_includes (*s, DataType::AUDIO);
+ cerr << "be sure to include " << *s << " for audio" << endl;
}
/* we do not do this for MIDI because we copy
@@ -4364,6 +4479,8 @@ Session::save_as (SaveAs& saveas)
}
saveas.final_session_folder_name = _path;
+
+ store_recent_sessions (_name, _path);
if (!saveas.switch_to) {
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index d5adbc5..51734a0 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -314,12 +314,13 @@ Session::butler_transport_work ()
bool finished;
PostTransportWork ptw;
boost::shared_ptr<RouteList> r = routes.reader ();
-
+ uint64_t before;
+
int on_entry = g_atomic_int_get (&_butler->should_do_transport_work);
finished = true;
ptw = post_transport_work();
- DEBUG_TRACE (DEBUG::Transport, string_compose ("Butler transport work, todo = %1\n", enum_2_string (ptw)));
+ DEBUG_TRACE (DEBUG::Transport, string_compose ("Butler transport work, todo = %1 at %2\n", enum_2_string (ptw), (before = g_get_monotonic_time())));
if (ptw & PostTransportAdjustPlaybackBuffering) {
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
@@ -410,7 +411,7 @@ Session::butler_transport_work ()
g_atomic_int_dec_and_test (&_butler->should_do_transport_work);
- DEBUG_TRACE (DEBUG::Transport, X_("Butler transport work all done\n"));
+ DEBUG_TRACE (DEBUG::Transport, string_compose (X_("Butler transport work all done after %1 usecs\n"), g_get_monotonic_time() - before));
DEBUG_TRACE (DEBUG::Transport, X_(string_compose ("Frame %1\n", _transport_frame)));
}
@@ -493,6 +494,106 @@ Session::non_realtime_locate ()
clear_clicks ();
}
+#ifdef USE_TRACKS_CODE_FEATURES
+bool
+Session::select_playhead_priority_target (framepos_t& jump_to)
+{
+ jump_to = -1;
+
+ AutoReturnTarget autoreturn = Config->get_auto_return_target_list ();
+
+ if (!autoreturn) {
+ return false;
+ }
+
+ if (Profile->get_trx() && transport_rolling() ) {
+ // We're playing, so do nothing.
+ // Next stop will put us where we need to be.
+ return false;
+ }
+
+ /* Note that the order of checking each AutoReturnTarget flag defines
+ the priority each flag.
+
+ Ardour/Mixbus: Last Locate
+ Range Selection
+ Loop Range
+ Region Selection
+
+ Tracks: Range Selection
+ Loop Range
+ Region Selection
+ Last Locate
+ */
+
+ if (autoreturn & RangeSelectionStart) {
+ if (!_range_selection.empty()) {
+ jump_to = _range_selection.from;
+ } else {
+ if (transport_rolling ()) {
+ /* Range selection no longer exists, but we're playing,
+ so do nothing. Next stop will put us where
+ we need to be.
+ */
+ return false;
+ }
+ }
+ }
+
+ if (jump_to < 0 && (autoreturn & Loop) && get_play_loop()) {
+ /* don't try to handle loop play when synced to JACK */
+
+ if (!synced_to_engine()) {
+ Location *location = _locations->auto_loop_location();
+
+ if (location) {
+ jump_to = location->start();
+
+ if (Config->get_seamless_loop()) {
+ /* need to get track buffers reloaded */
+ set_track_loop (true);
+ }
+ }
+ }
+ }
+
+ if (jump_to < 0 && (autoreturn & RegionSelectionStart)) {
+ if (!_object_selection.empty()) {
+ jump_to = _object_selection.from;
+ }
+ }
+
+ if (jump_to < 0 && (autoreturn & LastLocate)) {
+ jump_to = _last_roll_location;
+ }
+
+ return jump_to >= 0;
+}
+#else
+
+bool
+Session::select_playhead_priority_target (framepos_t& jump_to)
+{
+ if (!config.get_auto_return()) {
+ return false;
+ }
+
+ jump_to = _last_roll_location;
+ return jump_to >= 0;
+}
+
+#endif
+
+void
+Session::follow_playhead_priority ()
+{
+ framepos_t target;
+
+ if (select_playhead_priority_target (target)) {
+ request_locate (target);
+ }
+}
+
void
Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
{
@@ -575,8 +676,7 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
update_latency_compensation ();
}
- bool const auto_return_enabled =
- (!config.get_external_sync() && (config.get_auto_return() || abort));
+ bool const auto_return_enabled = (!config.get_external_sync() && (Config->get_auto_return_target_list() || abort));
if (auto_return_enabled ||
(ptw & PostTransportLocate) ||
@@ -602,40 +702,13 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
do_locate = true;
} else {
- if (config.get_auto_return()) {
-
- if (play_loop) {
-
- /* don't try to handle loop play when synced to JACK */
+ framepos_t jump_to;
- if (!synced_to_engine()) {
+ if (select_playhead_priority_target (jump_to)) {
- Location *location = _locations->auto_loop_location();
-
- if (location != 0) {
- _transport_frame = location->start();
- } else {
- _transport_frame = _last_roll_location;
- }
- do_locate = true;
- }
-
- } else if (_play_range) {
-
- /* return to start of range */
-
- if (!current_audio_range.empty()) {
- _transport_frame = current_audio_range.front().start;
- do_locate = true;
- }
-
- } else {
-
- /* regular auto-return */
+ _transport_frame = jump_to;
+ do_locate = true;
- _transport_frame = _last_roll_location;
- do_locate = true;
- }
} else if (abort) {
_transport_frame = _last_roll_location;
@@ -1035,8 +1108,9 @@ 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_engine() && play_loop)) {
+
+ if (transport_was_stopped && (!auto_play_legal || !config.get_auto_play()) && !with_roll && !(synced_to_engine() && play_loop) &&
+ (!Profile->get_trx() || !(config.get_external_sync() && !synced_to_engine()))) {
realtime_stop (false, true); // XXX paul - check if the 2nd arg is really correct
transport_was_stopped = true;
} else {
@@ -1216,7 +1290,7 @@ Session::set_transport_speed (double speed, framepos_t destination_frame, bool a
}
_engine.transport_stop ();
} else {
- bool const auto_return_enabled = (!config.get_external_sync() && (config.get_auto_return() || abort));
+ bool const auto_return_enabled = (!config.get_external_sync() && (Config->get_auto_return_target_list() || abort));
if (!auto_return_enabled) {
_requested_return_frame = destination_frame;
@@ -1543,6 +1617,20 @@ Session::reset_rf_scale (framecnt_t motion)
}
void
+Session::mtc_status_changed (bool yn)
+{
+ g_atomic_int_set (&_mtc_active, yn);
+ MTCSyncStateChanged( yn );
+}
+
+void
+Session::ltc_status_changed (bool yn)
+{
+ g_atomic_int_set (&_ltc_active, yn);
+ LTCSyncStateChanged( yn );
+}
+
+void
Session::use_sync_source (Slave* new_slave)
{
/* Runs in process() context */
@@ -1554,6 +1642,30 @@ Session::use_sync_source (Slave* new_slave)
delete _slave;
_slave = new_slave;
+ MTC_Slave* mtc_slave = dynamic_cast<MTC_Slave*>(_slave);
+ if (mtc_slave) {
+ mtc_slave->ActiveChanged.connect_same_thread (mtc_status_connection, boost::bind (&Session::mtc_status_changed, this, _1));
+ MTCSyncStateChanged(mtc_slave->locked() );
+ } else {
+ if (g_atomic_int_get (&_mtc_active) ){
+ g_atomic_int_set (&_mtc_active, 0);
+ MTCSyncStateChanged( false );
+ }
+ mtc_status_connection.disconnect ();
+ }
+
+ LTC_Slave* ltc_slave = dynamic_cast<LTC_Slave*> (_slave);
+ if (ltc_slave) {
+ ltc_slave->ActiveChanged.connect_same_thread (ltc_status_connection, boost::bind (&Session::ltc_status_changed, this, _1));
+ LTCSyncStateChanged (ltc_slave->locked() );
+ } else {
+ if (g_atomic_int_get (&_ltc_active) ){
+ g_atomic_int_set (&_ltc_active, 0);
+ LTCSyncStateChanged( false );
+ }
+ ltc_status_connection.disconnect ();
+ }
+
DEBUG_TRACE (DEBUG::Slave, string_compose ("set new slave to %1\n", _slave));
// need to queue this for next process() cycle
@@ -1789,8 +1901,6 @@ Session::engine_halted ()
*/
if (_butler) {
- g_atomic_int_set (&_butler->should_do_transport_work, 0);
- set_post_transport_work (PostTransportWork (0));
_butler->stop ();
}
diff --git a/libs/ardour/sha1.c b/libs/ardour/sha1.c
new file mode 100644
index 0000000..f9dbaac
--- /dev/null
+++ b/libs/ardour/sha1.c
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2012,2015 Robin Gareus <robin at gareus.org>
+ *
+ * This code is inspired by libcrypt, which was placed
+ * in the public domain by Wei Dai and other contributors.
+ *
+ * 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 EXPORT_SHA
+#define EXPORT_SHA static
+#endif
+
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdlib.h>
+
+#if defined(PLATFORM_WINDOWS) && !defined(__LITTLE_ENDIAN__)
+#define __LITTLE_ENDIAN__
+#endif
+
+#ifdef __BIG_ENDIAN__
+# define SHA_BIG_ENDIAN
+#elif defined _BIG_ENDIAN
+# define SHA_BIG_ENDIAN
+#elif defined __BYTE_ORDER__
+# if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+# define SHA_BIG_ENDIAN
+# endif
+#elif !defined __LITTLE_ENDIAN__
+# include <endian.h> // machine/endian.h
+# if (defined __BYTE_ORDER__ && defined __ORDER_BIG_ENDIAN__ && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+# define SHA_BIG_ENDIAN
+# endif
+#endif
+
+typedef struct {
+ uint32_t buffer[16];
+ uint32_t state[5];
+ uint32_t byteCount;
+ uint8_t bufferOffset;
+} Sha1Digest;
+
+
+static inline uint32_t sha1_rol32 (uint32_t number, uint8_t bits) {
+ return ((number << bits) | (number >> (32 - bits)));
+}
+
+static void sha1_hashBlock (Sha1Digest *s) {
+ uint8_t i;
+ uint32_t a, b, c, d, e, t;
+
+ a = s->state[0];
+ b = s->state[1];
+ c = s->state[2];
+ d = s->state[3];
+ e = s->state[4];
+
+ for (i = 0; i < 80; ++i) {
+ if (i >= 16) {
+ t = s->buffer[(i + 13) & 15] ^ s->buffer[(i + 8) & 15] ^ s->buffer[(i + 2) & 15] ^ s->buffer[i & 15];
+ s->buffer[i & 15] = sha1_rol32 (t, 1);
+ }
+ if (i < 20) {
+ t = (d ^ (b & (c ^ d))) + 0x5a827999;
+ } else if (i < 40) {
+ t = (b ^ c ^ d) + 0x6ed9eba1;
+ } else if (i < 60) {
+ t = ((b & c) | (d & (b | c))) + 0x8f1bbcdc;
+ } else {
+ t = (b ^ c ^ d) + 0xca62c1d6;
+ }
+ t += sha1_rol32 (a, 5) + e + s->buffer[i & 15];
+ e = d;
+ d = c;
+ c = sha1_rol32 (b, 30);
+ b = a;
+ a = t;
+ }
+
+ s->state[0] += a;
+ s->state[1] += b;
+ s->state[2] += c;
+ s->state[3] += d;
+ s->state[4] += e;
+}
+
+static void sha1_addUncounted (Sha1Digest *s, const uint8_t data) {
+ uint8_t * const b = (uint8_t*) s->buffer;
+#ifdef SHA_BIG_ENDIAN
+ b[s->bufferOffset] = data;
+#else
+ b[s->bufferOffset ^ 3] = data;
+#endif
+ s->bufferOffset++;
+ if (s->bufferOffset == 64) {
+ sha1_hashBlock (s);
+ s->bufferOffset = 0;
+ }
+}
+
+static void sha1_pad (Sha1Digest *s) {
+ // Implement SHA-1 padding (fips180-2 5.1.1)
+ // Pad with 0x80 followed by 0x00 until the end of the block
+ sha1_addUncounted (s, 0x80);
+ while (s->bufferOffset != 56) sha1_addUncounted (s, 0x00);
+
+ // Append length in the last 8 bytes
+ sha1_addUncounted (s, 0); // We're only using 32 bit lengths
+ sha1_addUncounted (s, 0); // But SHA-1 supports 64 bit lengths
+ sha1_addUncounted (s, 0); // So zero pad the top bits
+ sha1_addUncounted (s, s->byteCount >> 29); // Shifting to multiply by 8
+ sha1_addUncounted (s, s->byteCount >> 21); // as SHA-1 supports bitstreams as well as
+ sha1_addUncounted (s, s->byteCount >> 13); // byte.
+ sha1_addUncounted (s, s->byteCount >> 5);
+ sha1_addUncounted (s, s->byteCount << 3);
+}
+
+
+/*** public functions ***/
+
+EXPORT_SHA void sha1_init (Sha1Digest *s) {
+ s->state[0] = 0x67452301;
+ s->state[1] = 0xefcdab89;
+ s->state[2] = 0x98badcfe;
+ s->state[3] = 0x10325476;
+ s->state[4] = 0xc3d2e1f0;
+ s->byteCount = 0;
+ s->bufferOffset = 0;
+}
+
+EXPORT_SHA void sha1_writebyte (Sha1Digest *s, const uint8_t data) {
+ ++s->byteCount;
+ sha1_addUncounted (s, data);
+}
+
+EXPORT_SHA void sha1_write (Sha1Digest *s, const uint8_t *data, size_t len) {
+ for (;len--;) sha1_writebyte (s, (uint8_t) *data++);
+}
+
+EXPORT_SHA uint8_t* sha1_result (Sha1Digest *s) {
+ // Pad to complete the last block
+ sha1_pad (s);
+
+#ifndef SHA_BIG_ENDIAN
+ // Swap byte order back
+ int i;
+ for (i = 0; i < 5; ++i) {
+ s->state[i] =
+ (((s->state[i])<<24)& 0xff000000)
+ | (((s->state[i])<<8) & 0x00ff0000)
+ | (((s->state[i])>>8) & 0x0000ff00)
+ | (((s->state[i])>>24)& 0x000000ff);
+ }
+#endif
+ // Return pointer to hash (20 characters)
+ return (uint8_t*) s->state;
+}
+
+EXPORT_SHA void sha1_result_hash (Sha1Digest *s, char *rv) {
+ int i;
+ uint8_t* hash = sha1_result (s);
+ for (i = 0; i < 20; ++i) {
+ sprintf (&rv[2*i], "%02x", hash[i]);
+ }
+}
diff --git a/libs/ardour/sndfileimportable.cc b/libs/ardour/sndfileimportable.cc
index 5ccab2c..7f10845 100644
--- a/libs/ardour/sndfileimportable.cc
+++ b/libs/ardour/sndfileimportable.cc
@@ -20,10 +20,17 @@
#include <sndfile.h>
#include <iostream>
#include <cstring>
+#include <fcntl.h>
+
+#include <glib.h>
+#include <glib/gstdio.h>
+
#include "pbd/error.h"
#include "ardour/sndfileimportable.h"
+#include <glibmm/convert.h>
+
using namespace ARDOUR;
using namespace std;
@@ -67,8 +74,12 @@ SndFileImportableSource::get_timecode_info (SNDFILE* sf, SF_BROADCAST_INFO* binf
SndFileImportableSource::SndFileImportableSource (const string& path)
{
+ int fd = g_open (path.c_str (), O_RDONLY, 0444);
+ if (fd == -1) {
+ throw failed_constructor ();
+ }
memset(&sf_info, 0 , sizeof(sf_info));
- in.reset( sf_open(path.c_str(), SFM_READ, &sf_info), sf_close);
+ in.reset (sf_open_fd (fd, SFM_READ, &sf_info, true), sf_close);
if (!in) throw failed_constructor();
SF_BROADCAST_INFO binfo;
diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc
index 5acfe7b..7dc2803 100644
--- a/libs/ardour/sndfilesource.cc
+++ b/libs/ardour/sndfilesource.cc
@@ -25,12 +25,14 @@
#include <cerrno>
#include <climits>
#include <cstdarg>
+#include <fcntl.h>
#include <sys/stat.h>
-#ifdef PLATFORM_WINDOWS
+#include <glib.h>
+#include <glib/gstdio.h>
+
#include <glibmm/convert.h>
-#endif
#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>
@@ -242,19 +244,30 @@ SndFileSource::close ()
int
SndFileSource::open ()
{
- string path_to_open;
-
if (_sndfile) {
return 0;
}
-
+
+// We really only want to use g_open for all platforms but because of this
+// method(SndfileSource::open), the compiler(or at least GCC) is confused
+// because g_open will expand to "open" on non-POSIX systems and needs the
+// global namespace qualifer. The problem is since since C99 ::g_open will
+// apparently expand to ":: open"
#ifdef PLATFORM_WINDOWS
- path_to_open = Glib::locale_from_utf8(_path);
+ int fd = g_open (_path.c_str(), writable() ? O_CREAT | O_RDWR : O_RDONLY, writable() ? 0644 : 0444);
#else
- path_to_open = _path;
+ int fd = ::open (_path.c_str(), writable() ? O_CREAT | O_RDWR : O_RDONLY, writable() ? 0644 : 0444);
#endif
- _sndfile = sf_open (path_to_open.c_str(), writable() ? SFM_RDWR : SFM_READ, &_info);
+ if (fd == -1) {
+ error << string_compose (
+ _ ("SndFileSource: cannot open file \"%1\" for %2"),
+ _path,
+ (writable () ? "read+write" : "reading")) << endmsg;
+ return false;
+ }
+
+ _sndfile = sf_open_fd (fd, writable() ? SFM_RDWR : SFM_READ, &_info, true);
if (_sndfile == 0) {
char errbuf[1024];
@@ -264,10 +277,10 @@ SndFileSource::open ()
so we don't want to see this message.
*/
- cerr << "failed to open " << path_to_open << " with name " << _name << endl;
+ cerr << "failed to open " << _path << " with name " << _name << endl;
error << string_compose(_("SndFileSource: cannot open file \"%1\" for %2 (%3)"),
- path_to_open, (writable() ? "read+write" : "reading"), errbuf) << endmsg;
+ _path, (writable() ? "read+write" : "reading"), errbuf) << endmsg;
#endif
return -1;
}
@@ -329,7 +342,7 @@ SndFileSource::open ()
if (!_broadcast_info->write_to_file (_sndfile)) {
error << string_compose (_("cannot set broadcast info for audio file %1 (%2); dropping broadcast info for this file"),
- path_to_open, _broadcast_info->get_error())
+ _path, _broadcast_info->get_error())
<< endmsg;
_flags = Flag (_flags & ~Broadcast);
delete _broadcast_info;
@@ -924,8 +937,19 @@ SndFileSource::get_soundfile_info (const string& path, SoundFileInfo& info, stri
sf_info.format = 0; // libsndfile says to clear this before sf_open().
- if ((sf = sf_open (const_cast<char*>(path.c_str()), SFM_READ, &sf_info)) == 0) {
- char errbuf[256];
+#ifdef PLATFORM_WINDOWS
+ int fd = g_open (path.c_str(), O_RDONLY, 0444);
+#else
+ int fd = ::open (path.c_str(), O_RDONLY, 0444);
+#endif
+
+ if (fd == -1) {
+ error << string_compose ( _("SndFileSource: cannot open file \"%1\" for reading"), path)
+ << endmsg;
+ return false;
+ }
+ if ((sf = sf_open_fd (fd, SFM_READ, &sf_info, true)) == 0) {
+ char errbuf[1024];
error_msg = sf_error_str (0, errbuf, sizeof (errbuf) - 1);
return false;
}
diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc
index 03039fe..ef0538b 100644
--- a/libs/ardour/source.cc
+++ b/libs/ardour/source.cc
@@ -35,6 +35,7 @@
#include "pbd/enumwriter.h"
#include "ardour/debug.h"
+#include "ardour/profile.h"
#include "ardour/session.h"
#include "ardour/source.h"
#include "ardour/transient_detector.h"
@@ -144,6 +145,11 @@ Source::set_state (const XMLNode& node, int version)
_flags = Flag (_flags | Destructive);
}
+ if (Profile->get_trx() && (_flags & Destructive)) {
+ error << string_compose (_("%1: this session uses destructive tracks, which are not supported"), PROGRAM_NAME) << endmsg;
+ return -1;
+ }
+
if (version < 3000) {
/* a source with an XML node must necessarily already exist,
and therefore cannot be removable/writable etc. etc.; 2.X
diff --git a/libs/ardour/srcfilesource.cc b/libs/ardour/srcfilesource.cc
index 276a31e..b9421d2 100644
--- a/libs/ardour/srcfilesource.cc
+++ b/libs/ardour/srcfilesource.cc
@@ -30,7 +30,7 @@
using namespace ARDOUR;
using namespace PBD;
-const uint32_t SrcFileSource::blocksize = 65536U; /* somewhat arbitrary */
+const uint32_t SrcFileSource::max_blocksize = 2097152U; /* see AudioDiskstream::_do_refill_with_alloc, max */
SrcFileSource::SrcFileSource (Session& s, boost::shared_ptr<AudioFileSource> src, SrcQuality srcq)
: Source(s, DataType::AUDIO, src->name(), Flag (src->flags() & ~(Writable|Removable|RemovableIfEmpty|RemoveAtDestroy)))
@@ -67,7 +67,7 @@ SrcFileSource::SrcFileSource (Session& s, boost::shared_ptr<AudioFileSource> src
_ratio = s.nominal_frame_rate() / _source->sample_rate();
_src_data.src_ratio = _ratio;
- src_buffer_size = ceil((double)blocksize / _ratio) + 2;
+ src_buffer_size = ceil((double)max_blocksize / _ratio) + 2;
_src_buffer = new float[src_buffer_size];
int err;
@@ -120,13 +120,17 @@ SrcFileSource::read_unlocked (Sample *dst, framepos_t start, framecnt_t cnt) con
_src_data.input_frames = _source->read (_src_buffer, _source_position, scnt);
- if ((framecnt_t) _src_data.input_frames < scnt
- || _source_position + scnt >= _source->length(0)) {
+ if ((framecnt_t) _src_data.input_frames * _ratio <= cnt
+ && _source_position + scnt >= _source->length(0)) {
_src_data.end_of_input = true;
- _target_position += _src_data.input_frames * _ratio;
DEBUG_TRACE (DEBUG::AudioPlayback, "SRC: END OF INPUT\n");
} else {
_src_data.end_of_input = false;
+ }
+
+ if ((framecnt_t) _src_data.input_frames < scnt) {
+ _target_position += _src_data.input_frames * _ratio;
+ } else {
_target_position += cnt;
}
@@ -134,11 +138,6 @@ SrcFileSource::read_unlocked (Sample *dst, framepos_t start, framecnt_t cnt) con
_src_data.data_in = _src_buffer;
_src_data.data_out = dst;
- if (_src_data.end_of_input) {
- _src_data.output_frames = std::min ((long)floor(_src_data.input_frames * _ratio), _src_data.output_frames);
- }
-
-
if ((err = src_process (_src_state, &_src_data))) {
error << string_compose(_("SrcFileSource: %1"), src_strerror (err)) << endmsg ;
return 0;
diff --git a/libs/ardour/sse_avx_functions_64bit_win.s b/libs/ardour/sse_avx_functions_64bit_win.s
new file mode 100644
index 0000000..2e82ab8
--- /dev/null
+++ b/libs/ardour/sse_avx_functions_64bit_win.s
@@ -0,0 +1,600 @@
+/*
+ Copyright (C) 2005-2006 Paul Davis, John Rigg
+
+ 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.
+
+ Author: Sampo Savolainen
+ 64-bit conversion: John Rigg
+
+ $Id$
+*/
+
+#; Microsoft version of AVX sample processing functions
+
+#; void x86_sse_avx_mix_buffers_with_gain (float *dst, float *src, unsigned int nframes, float gain);
+
+.globl x86_sse_avx_mix_buffers_with_gain
+ .def x86_sse_avx_mix_buffers_with_gain; .scl 2; .type 32;
+.endef
+
+x86_sse_avx_mix_buffers_with_gain:
+
+#; due to Microsoft calling convention
+#; %rcx float *dst
+#; %rdx float *src
+#; %r8 unsigned int nframes
+#; %xmm3 float gain
+
+ pushq %rbp
+ movq %rsp, %rbp
+
+ #; save the registers
+ pushq %rbx #; must be preserved
+
+ #; move current max to %xmm0 for convenience
+ movss %xmm3, %xmm0
+
+ #; if nframes == 0, go to end
+ cmp $0, %r8
+ je .MBWG_END
+
+ #; Check for alignment
+
+ movq %rcx, %rax
+ andq $28, %rax #; mask alignment offset
+
+ movq %rdx, %rbx
+ andq $28, %rbx #; mask alignment offset
+
+ cmp %rax, %rbx
+ jne .MBWG_NONALIGN #; if buffer are not aligned between each other, calculate manually
+
+ #; if we are aligned
+ cmp $0, %rbx
+ jz .MBWG_AVX
+
+ #; Pre-loop, we need to run 1-7 frames "manually" without
+ #; SSE instructions
+
+.MBWG_PRELOOP:
+
+ #; gain is already in %xmm0
+ movss (%rdx), %xmm1
+ mulss %xmm0, %xmm1
+ addss (%rcx), %xmm1
+ movss %xmm1, (%rcx)
+
+ addq $4, %rcx #; dst++
+ addq $4, %rdx #; src++
+ decq %r8 #; nframes--
+ jz .MBWG_END
+
+ addq $4, %rbx
+
+ cmp $32, %rbx #; test if we've reached 32 byte alignment
+ jne .MBWG_PRELOOP
+
+.MBWG_AVX:
+
+ cmp $8, %r8 #; we know it's not zero, but if it's not >=4, then
+ jl .MBWG_NONALIGN #; we jump straight to the "normal" code
+
+ #; set up the gain buffer (gain is already in %xmm0)
+ vshufps $0x00, %ymm0, %ymm0, %ymm0 #; spread single float value to the first 128 bits of ymm0 register
+ vperm2f128 $0x00, %ymm0, %ymm0, %ymm0 #; extend the first 128 bits of ymm0 register to higher 128 bits
+
+.MBWG_AVXLOOP:
+
+ vmovaps (%rdx), %ymm1 #; source => xmm0
+ vmulps %ymm0, %ymm1, %ymm2 #; apply gain to source
+ vaddps (%rcx), %ymm2, %ymm1 #; mix with destination
+ vmovaps %ymm1, (%rcx) #; copy result to destination
+
+ addq $32, %rcx #; dst+=8
+ addq $32, %rdx #; src+=8
+
+ subq $8, %r8 #; nframes-=8
+ cmp $8, %r8
+ jge .MBWG_AVXLOOP
+
+ #; zero upper 128 bits of all ymm registers to proceed with SSE operations without penalties
+ vzeroupper
+
+ cmp $0, %r8
+ je .MBWG_END
+
+ #; if there are remaining frames, the nonalign code will do nicely
+ #; for the rest 1-7 frames.
+
+.MBWG_NONALIGN:
+ #; not aligned!
+
+ #; gain is already in %xmm0
+
+.MBWG_NONALIGNLOOP:
+
+ movss (%rdx), %xmm1
+ mulss %xmm0, %xmm1
+ addss (%rcx), %xmm1
+ movss %xmm1, (%rcx)
+
+ addq $4, %rcx
+ addq $4, %rdx
+
+ decq %r8
+ jnz .MBWG_NONALIGNLOOP
+
+.MBWG_END:
+
+ popq %rbx
+
+ #; return
+ leave
+ ret
+
+
+#; void x86_sse_avx_mix_buffers_no_gain (float *dst, float *src, unsigned int nframes);
+
+.globl x86_sse_avx_mix_buffers_no_gain
+ .def x86_sse_avx_mix_buffers_no_gain; .scl 2; .type 32;
+.endef
+
+x86_sse_avx_mix_buffers_no_gain:
+
+#; due to Microsoft calling convention
+#; %rcx float *dst
+#; %rdx float *src
+#; %r8 unsigned int nframes
+
+ pushq %rbp
+ movq %rsp, %rbp
+
+ #; save the registers
+ pushq %rbx #; must be preserved
+
+ #; the real function
+
+ #; if nframes == 0, go to end
+ cmp $0, %r8
+ je .MBNG_END
+
+ #; Check for alignment
+
+ movq %rcx, %rax
+ andq $28, %rax #; mask alignment offset
+
+ movq %rdx, %rbx
+ andq $28, %rbx #; mask alignment offset
+
+ cmp %rax, %rbx
+ jne .MBNG_NONALIGN #; if not buffers are not aligned btween each other, calculate manually
+
+ cmp $0, %rbx
+ je .MBNG_AVX #; aligned at 32, rpoceed to AVX
+
+ #; Pre-loop, we need to run 1-7 frames "manually" without
+ #; AVX instructions
+
+.MBNG_PRELOOP:
+
+ movss (%rdx), %xmm0
+ addss (%rcx), %xmm0
+ movss %xmm0, (%rcx)
+
+ addq $4, %rcx #; dst++
+ addq $4, %rdx #; src++
+
+ decq %r8 #; nframes--
+ jz .MBNG_END
+
+ addq $4, %rbx #; one non-aligned byte less
+
+ cmp $32, %rbx #; test if we've reached 32 byte alignment
+ jne .MBNG_PRELOOP
+
+.MBNG_AVX:
+
+ cmp $8, %r8 #; if there are frames left, but less than 8
+ jl .MBNG_NONALIGN #; we can't run AVX
+
+.MBNG_AVXLOOP:
+
+ vmovaps (%rdx), %ymm0 #; source => xmm0
+ vaddps (%rcx), %ymm0, %ymm1 #; mix with destination
+ vmovaps %ymm1, (%rcx) #; copy result to destination
+
+ addq $32, %rcx #; dst+=8
+ addq $32, %rdx #; src+=8
+
+ subq $8, %r8 #; nframes-=8
+ cmp $8, %r8
+ jge .MBNG_AVXLOOP
+
+ #; zero upper 128 bits of all ymm registers to proceed with SSE operations without penalties
+ vzeroupper
+
+ cmp $0, %r8
+ je .MBNG_END
+
+ #; if there are remaining frames, the nonalign code will do nicely
+ #; for the rest 1-7 frames.
+
+.MBNG_NONALIGN:
+ #; not aligned!
+ #;
+
+ movss (%rdx), %xmm0 #; src => xmm0
+ addss (%rcx), %xmm0 #; xmm0 += dst
+ movss %xmm0, (%rcx) #; xmm0 => dst
+
+ addq $4, %rcx
+ addq $4, %rdx
+
+ decq %r8
+ jnz .MBNG_NONALIGN
+
+.MBNG_END:
+
+ popq %rbx
+
+ #; return
+ leave
+ ret
+
+
+#; void x86_sse_avx_copy_vector (float *dst, float *src, unsigned int nframes);
+
+.globl x86_sse_avx_copy_vector
+ .def x86_sse_avx_copy_vector; .scl 2; .type 32;
+.endef
+
+x86_sse_avx_copy_vector:
+
+#; due to Microsoft calling convention
+#; %rcx float *dst
+#; %rdx float *src
+#; %r8 unsigned int nframes
+
+ pushq %rbp
+ movq %rsp, %rbp
+
+ #; save the registers
+ pushq %rbx #; must be preserved
+
+ #; the real function
+
+ #; if nframes == 0, go to end
+ cmp $0, %r8
+ je .CB_END
+
+ #; Check for alignment
+
+ movq %rcx, %rax
+ andq $28, %rax #; mask alignment offset
+
+ movq %rdx, %rbx
+ andq $28, %rbx #; mask alignment offset
+
+ cmp %rax, %rbx
+ jne .CB_NONALIGN #; if not buffers are not aligned btween each other, calculate manually
+
+ cmp $0, %rbx
+ je .CB_AVX #; aligned at 32, rpoceed to AVX
+
+ #; Pre-loop, we need to run 1-7 frames "manually" without
+ #; AVX instructions
+
+.CB_PRELOOP:
+
+ movss (%rdx), %xmm0
+ movss %xmm0, (%rcx)
+
+ addq $4, %rcx #; dst++
+ addq $4, %rdx #; src++
+
+ decq %r8 #; nframes--
+ jz .CB_END
+
+ addq $4, %rbx #; one non-aligned byte less
+
+ cmp $32, %rbx #; test if we've reached 32 byte alignment
+ jne .CB_PRELOOP
+
+.CB_AVX:
+
+ cmp $8, %r8 #; if there are frames left, but less than 8
+ jl .CB_NONALIGN #; we can't run AVX
+
+.CB_AVXLOOP:
+
+ vmovaps (%rdx), %ymm0 #; source => xmm0
+ vmovaps %ymm0, (%rcx) #; copy result to destination
+
+ addq $32, %rcx #; dst+=8
+ addq $32, %rdx #; src+=8
+
+ subq $8, %r8 #; nframes-=8
+ cmp $8, %r8
+ jge .CB_AVXLOOP
+
+ #; zero upper 128 bits of all ymm registers to proceed with SSE operations without penalties
+ vzeroupper
+
+ cmp $0, %r8
+ je .CB_END
+
+ #; if there are remaining frames, the nonalign code will do nicely
+ #; for the rest 1-7 frames.
+
+.CB_NONALIGN:
+ #; not aligned!
+ #;
+
+ movss (%rdx), %xmm0 #; src => xmm0
+ movss %xmm0, (%rcx) #; xmm0 => dst
+
+ addq $4, %rcx
+ addq $4, %rdx
+
+ decq %r8
+ jnz .CB_NONALIGN
+
+.CB_END:
+
+ popq %rbx
+
+ #; return
+ leave
+ ret
+
+
+#; void x86_sse_avx_apply_gain_to_buffer (float *buf, unsigned int nframes, float gain);
+
+.globl x86_sse_avx_apply_gain_to_buffer
+ .def x86_sse_avx_apply_gain_to_buffer; .scl 2; .type 32;
+.endef
+
+x86_sse_avx_apply_gain_to_buffer:
+
+#; due to Microsoft calling convention
+#; %rcx float *buf 32(%rbp)
+#; %rdx unsigned int nframes
+#; %xmm2 float gain avx specific register
+
+ pushq %rbp
+ movq %rsp, %rbp
+
+ #; move current max to %xmm0 for convenience
+ movss %xmm2, %xmm0
+
+ #; the real function
+
+ #; if nframes == 0, go to end
+ cmp $0, %rdx
+ je .AG_END
+
+ #; Check for alignment
+
+ movq %rcx, %r8 #; buf => %rdx
+ andq $28, %r8 #; check alignment with mask 11100
+ jz .AG_AVX #; if buffer IS aligned
+
+ #; PRE-LOOP
+ #; we iterate 1-7 times, doing normal x87 float comparison
+ #; so we reach a 32 byte aligned "buf" (=%rdi) value
+
+.AGLP_START:
+
+ #; Load next value from the buffer into %xmm1
+ movss (%rcx), %xmm1
+ mulss %xmm0, %xmm1
+ movss %xmm1, (%rcx)
+
+ #; increment buffer, decrement counter
+ addq $4, %rcx #; buf++;
+
+ decq %rdx #; nframes--
+ jz .AG_END #; if we run out of frames, we go to the end
+
+ addq $4, %r8 #; one non-aligned byte less
+ cmp $16, %r8
+ jne .AGLP_START #; if more non-aligned frames exist, we do a do-over
+
+.AG_AVX:
+
+ #; We have reached the 32 byte aligned "buf" ("rcx") value
+ #; use AVX instructions
+
+ #; Figure out how many loops we should do
+ movq %rdx, %rax #; copy remaining nframes to %rax for division
+
+ shr $3, %rax #; unsigned divide by 8
+
+ #; %rax = AVX iterations
+ cmp $0, %rax
+ je .AGPOST_START
+
+ #; set up the gain buffer (gain is already in %xmm0)
+ vshufps $0x00, %ymm0, %ymm0, %ymm0 #; spread single float value to the first 128 bits of ymm0 register
+ vperm2f128 $0x00, %ymm0, %ymm0, %ymm0 #; extend the first 128 bits of ymm0 register to higher 128 bits
+
+.AGLP_AVX:
+
+ vmovaps (%rcx), %ymm1
+ vmulps %ymm0, %ymm1, %ymm2
+ vmovaps %ymm2, (%rcx)
+
+ addq $32, %rcx #; buf + 8
+ subq $8, %rdx #; nframes-=8
+
+ decq %rax
+ jnz .AGLP_AVX
+
+ #; zero upper 128 bits of all ymm registers to proceed with SSE operations without penalties
+ vzeroupper
+
+ #; Next we need to post-process all remaining frames
+ #; the remaining frame count is in %rcx
+ cmpq $0, %rdx #;
+ jz .AG_END
+
+.AGPOST_START:
+
+ movss (%rcx), %xmm1
+ mulss %xmm0, %xmm1
+ movss %xmm1, (%rcx)
+
+ #; increment buffer, decrement counter
+ addq $4, %rcx #; buf++;
+
+ decq %rdx #; nframes--
+ jnz .AGPOST_START #; if we run out of frames, we go to the end
+
+.AG_END:
+
+ #; return
+ leave
+ ret
+
+#; end proc
+
+
+#; float x86_sse_avx_compute_peak(float *buf, long nframes, float current);
+
+.globl x86_sse_avx_compute_peak
+ .def x86_sse_avx_compute_peak; .scl 2; .type 32;
+.endef
+
+x86_sse_avx_compute_peak:
+
+#; due to Microsoft calling convention
+#; %rcx float* buf 32(%rbp)
+#; %rdx unsigned int nframes
+#; %xmm2 float current
+
+ pushq %rbp
+ movq %rsp, %rbp
+
+ #; move current max to %xmm0 for convenience
+ movss %xmm2, %xmm0
+
+ #; if nframes == 0, go to end
+ cmp $0, %rdx
+ je .CP_END
+
+ #; create the "abs" mask in %xmm3
+ #; if will be used to discard sign bit
+ pushq $2147483647
+ movss (%rsp), %xmm3
+ addq $8, %rsp
+
+ #; Check for alignment
+ movq %rcx, %r8 #; buf => %rdx
+ andq $28, %r8 #; mask bits 1 & 2
+ jz .CP_AVX #; if buffer IS aligned
+
+ #; PRE-LOOP
+ #; we iterate 1-7 times, doing normal x87 float comparison
+ #; so we reach a 32 byte aligned "buf" (=%rcx) value
+
+.LP_START:
+
+ #; Load next value from the buffer
+ movss (%rcx), %xmm1
+ andps %xmm3, %xmm1 #; mask out sign bit
+ maxss %xmm1, %xmm0
+
+ #; increment buffer, decrement counter
+ addq $4, %rcx #; buf++;
+
+ decq %rdx #; nframes--
+ jz .CP_END #; if we run out of frames, we go to the end
+
+ addq $4, %r8 #; one non-aligned byte less
+ cmp $32, %r8
+ jne .LP_START #; if more non-aligned frames exist, we do a do-over
+
+.CP_AVX:
+
+ #; We have reached the 32 byte aligned "buf" ("rdi") value
+
+ #; Figure out how many loops we should do
+ movq %rdx, %rax #; copy remaining nframes to %rax for division
+
+ shr $3, %rax #; unsigned divide by 8
+ jz .POST_START
+
+ #; %rax = AVX iterations
+
+ #; current maximum is at %xmm0, but we need to broadcast it to the whole ymm0 register..
+ vshufps $0x00, %ymm0, %ymm0, %ymm0 #; spread single float value to the all 128 bits of xmm0 register
+ vperm2f128 $0x00, %ymm0, %ymm0, %ymm0 #; extend the first 128 bits of ymm0 register to higher 128 bits
+
+ #; broadcast sign mask to the whole ymm3 register
+ vshufps $0x00, %ymm3, %ymm3, %ymm3 #; spread single float value to the all 128 bits of xmm3 register
+ vperm2f128 $0x00, %ymm3, %ymm3, %ymm3 #; extend the first 128 bits of ymm3 register to higher 128 bits
+
+.LP_AVX:
+
+ vmovaps (%rcx), %ymm1
+ vandps %ymm3, %ymm1, %ymm1 #; mask out sign bit
+ vmaxps %ymm1, %ymm0, %ymm0
+
+ addq $32, %rcx #; buf+=8
+ subq $8, %rdx #; nframes-=8
+
+ decq %rax
+ jnz .LP_AVX
+
+ #; Calculate the maximum value contained in the 4 FP's in %ymm0
+ vshufps $0x4e, %ymm0, %ymm0, %ymm1 #; shuffle left & right pairs (1234 => 3412) in each 128 bit half
+ vmaxps %ymm1, %ymm0, %ymm0 #; maximums of the four pairs, if each of 8 elements was unique, 4 unique elements left now
+ vshufps $0xb1, %ymm0, %ymm0, %ymm1 #; shuffle the floats inside pairs (1234 => 2143) in each 128 bit half
+ vmaxps %ymm1, %ymm0, %ymm0 #; maximums of the four pairs, we had up to 4 unique elements was unique, 2 unique elements left now
+ vperm2f128 $0x01, %ymm0, %ymm0, %ymm1 #; swap 128 bit halfs
+ vmaxps %ymm1, %ymm0, %ymm0 #; the result will be - all 8 elemens are maximums
+
+ #; now every float in %ymm0 is the same value, current maximum value
+
+ #; Next we need to post-process all remaining frames
+ #; the remaining frame count is in %rcx
+
+ #; zero upper 128 bits of all ymm registers to proceed with SSE operations without penalties
+ vzeroupper
+
+ #; if no remaining frames, jump to the end
+ cmp $0, %rdx
+ je .CP_END
+
+.POST_START:
+
+ movss (%rcx), %xmm1
+ andps %xmm3, %xmm1 #; mask out sign bit
+ maxss %xmm1, %xmm0
+
+ addq $4, %rcx #; buf++;
+
+ decq %rdx #; nframes--;
+ jnz .POST_START
+
+.CP_END:
+
+ #; return value is in xmm0
+
+ #; return
+ leave
+ ret
+
+#; end proc
\ No newline at end of file
diff --git a/libs/ardour/sse_functions_avx.cc b/libs/ardour/sse_functions_avx.cc
new file mode 100644
index 0000000..89cb91f
--- /dev/null
+++ b/libs/ardour/sse_functions_avx.cc
@@ -0,0 +1,119 @@
+/*
+ Copyright (C) 2007 Paul sDavis
+ Written by Sampo Savolainen
+
+ 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.
+
+*/
+
+#include <xmmintrin.h>
+#include <immintrin.h>
+#include <stdint.h>
+
+
+void
+x86_sse_avx_find_peaks(const float* buf, uint32_t nframes, float *min, float *max)
+{
+ __m256 current_max, current_min, work;
+
+ // Load max and min values into all eight slots of the YMM registers
+ current_min = _mm256_set1_ps(*min);
+ current_max = _mm256_set1_ps(*max);
+
+ // Work input until "buf" reaches 16 byte alignment
+ while ( ((intptr_t)buf) % 32 != 0 && nframes > 0) {
+
+ // Load the next float into the work buffer
+ work = _mm256_set1_ps(*buf);
+
+ current_min = _mm256_min_ps(current_min, work);
+ current_max = _mm256_max_ps(current_max, work);
+
+ buf++;
+ nframes--;
+ }
+
+ // use 64 byte prefetch for quadruple quads:
+ // load each 64 bytes into cash before processing
+ while (nframes >= 16) {
+#if defined(COMPILER_MSVC) || defined(COMPILER_MINGW)
+ _mm_prefetch(((char*)buf+64), _mm_hint(0) );
+#else
+ __builtin_prefetch(buf+64,0,0);
+#endif
+ work = _mm256_load_ps(buf);
+ current_min = _mm256_min_ps(current_min, work);
+ current_max = _mm256_max_ps(current_max, work);
+ buf+=8;
+ work = _mm256_load_ps(buf);
+ current_min = _mm256_min_ps(current_min, work);
+ current_max = _mm256_max_ps(current_max, work);
+ buf+=8;
+
+ nframes-=16;
+ }
+
+ // work through 32 bytes aligned buffers
+ while (nframes >= 8) {
+
+ work = _mm256_load_ps(buf);
+
+ current_min = _mm256_min_ps(current_min, work);
+ current_max = _mm256_max_ps(current_max, work);
+
+ buf+=8;
+ nframes-=8;
+ }
+
+ // work through the rest < 4 samples
+ while ( nframes > 0) {
+
+ // Load the next float into the work buffer
+ work = _mm256_set1_ps(*buf);
+
+ current_min = _mm256_min_ps(current_min, work);
+ current_max = _mm256_max_ps(current_max, work);
+
+ buf++;
+ nframes--;
+ }
+
+ // Find min & max value in current_max through shuffle tricks
+
+ work = current_min;
+ work = _mm256_shuffle_ps (current_min, current_min, _MM_SHUFFLE(2, 3, 0, 1));
+ current_min = _mm256_min_ps (work, current_min);
+ work = _mm256_shuffle_ps (current_min, current_min, _MM_SHUFFLE(1, 0, 3, 2));
+ current_min = _mm256_min_ps (work, current_min);
+ work = _mm256_permute2f128_ps( current_min, current_min, 1);
+ current_min = _mm256_min_ps (work, current_min);
+
+ *min = current_min[0];
+
+ work = current_max;
+ work = _mm256_shuffle_ps(current_max, current_max, _MM_SHUFFLE(2, 3, 0, 1));
+ current_max = _mm256_max_ps (work, current_max);
+ work = _mm256_shuffle_ps(current_max, current_max, _MM_SHUFFLE(1, 0, 3, 2));
+ current_max = _mm256_max_ps (work, current_max);
+ work = _mm256_permute2f128_ps( current_max, current_max, 1);
+ current_max = _mm256_max_ps (work, current_max);
+
+ *max = current_max[0];
+
+ // zero upper 128 bit of 256 bit ymm register to avoid penalties using non-AVX instructions
+ _mm256_zeroupper ();
+}
+
+
diff --git a/libs/ardour/sse_functions_avx_linux.cc b/libs/ardour/sse_functions_avx_linux.cc
new file mode 100644
index 0000000..9f56595
--- /dev/null
+++ b/libs/ardour/sse_functions_avx_linux.cc
@@ -0,0 +1,56 @@
+/*
+ Copyright (C) 2015 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.
+
+*/
+
+#include "ardour/mix.h"
+
+float
+x86_sse_avx_compute_peak (const float * buf, uint32_t nsamples, float current)
+{
+ return default_compute_peak (buf, nsamples, current);
+}
+
+void
+x86_sse_avx_apply_gain_to_buffer (float * buf, uint32_t nframes, float gain)
+{
+ default_apply_gain_to_buffer (buf, nframes, gain);
+}
+
+void
+x86_sse_avx_mix_buffers_with_gain (float * dst, const float * src, uint32_t nframes, float gain)
+{
+ default_mix_buffers_with_gain (dst, src, nframes, gain);
+}
+
+void
+x86_sse_avx_mix_buffers_no_gain (float * dst, const float * src, uint32_t nframes)
+{
+ default_mix_buffers_no_gain (dst, src, nframes);
+}
+
+void
+x86_sse_avx_copy_vector (float * dst, const float * src, uint32_t nframes)
+{
+ default_copy_vector (dst, src, nframes);
+}
+
+void
+x86_sse_avx_find_peaks (const float * buf, uint32_t nsamples, float *min, float *max)
+{
+ default_find_peaks (buf, nsamples, min, max);
+}
diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc
index 244c050..82520c1 100644
--- a/libs/ardour/tempo.cc
+++ b/libs/ardour/tempo.cc
@@ -1903,7 +1903,7 @@ TempoMap::insert_time (framepos_t where, framecnt_t amount)
PropertyChanged (PropertyChange ());
}
bool
-TempoMap::cut_time (framepos_t where, framecnt_t amount)
+TempoMap::remove_time (framepos_t where, framecnt_t amount)
{
bool moved = false;
@@ -1911,6 +1911,8 @@ TempoMap::cut_time (framepos_t where, framecnt_t amount)
TempoSection* last_tempo = NULL;
MeterSection* last_meter = NULL;
+ bool tempo_after = false; // is there a tempo marker at the first sample after the removed range?
+ bool meter_after = false; // is there a meter marker likewise?
{
Glib::Threads::RWLock::WriterLock lm (lock);
for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
@@ -1924,18 +1926,24 @@ TempoMap::cut_time (framepos_t where, framecnt_t amount)
last_meter = lm;
}
else if ((*i)->frame() >= where) {
+ // TODO: make sure that moved tempo/meter markers are rounded to beat/bar boundaries
(*i)->set_frame ((*i)->frame() - amount);
+ if ((*i)->frame() == where) {
+ // marker was immediately after end of range
+ tempo_after = dynamic_cast<TempoSection*> (*i);
+ meter_after = dynamic_cast<MeterSection*> (*i);
+ }
moved = true;
}
}
//find the last TEMPO and METER metric (if any) and move it to the cut point so future stuff is correct
- if (last_tempo) {
+ if (last_tempo && !tempo_after) {
metric_kill_list.remove(last_tempo);
last_tempo->set_frame(where);
moved = true;
}
- if (last_meter) {
+ if (last_meter && !meter_after) {
metric_kill_list.remove(last_meter);
last_meter->set_frame(where);
moved = true;
diff --git a/libs/ardour/test/audio_engine_test.cc b/libs/ardour/test/audio_engine_test.cc
index 7fbb62c..d5d2eae 100644
--- a/libs/ardour/test/audio_engine_test.cc
+++ b/libs/ardour/test/audio_engine_test.cc
@@ -47,7 +47,7 @@ AudioEngineTest::test_start ()
CPPUNIT_ASSERT (AudioEngine::instance ());
- boost::shared_ptr<AudioBackend> backend = engine->set_backend ("Dummy", "", "");
+ boost::shared_ptr<AudioBackend> backend = engine->set_backend ("None (Dummy)", "", "");
CPPUNIT_ASSERT (backend);
diff --git a/libs/ardour/test/sha1_test.cc b/libs/ardour/test/sha1_test.cc
new file mode 100644
index 0000000..0fbb009
--- /dev/null
+++ b/libs/ardour/test/sha1_test.cc
@@ -0,0 +1,53 @@
+#include <stdio.h>
+#include <string.h>
+#include "sha1.c"
+#include "sha1_test.h"
+
+CPPUNIT_TEST_SUITE_REGISTRATION (Sha1Test);
+
+void
+Sha1Test::basicTest ()
+{
+ uint32_t a;
+ char hash[41];
+ Sha1Digest s;
+
+ sha1_init (&s);
+ sha1_write (&s, (const uint8_t *) "abc", 3);
+ sha1_result_hash (&s, hash);
+ printf ("\nSha1: FIPS 180-2 C.1 and RFC3174 7.3 TEST1\n");
+ printf ("Expect: a9993e364706816aba3e25717850c26c9cd0d89d\n");
+ printf ("Result: %s\n", hash);
+ CPPUNIT_ASSERT_MESSAGE ("Sha1: FIPS 180-2 C.1 and RFC3174 7.3 TEST1",
+ !strcmp ("a9993e364706816aba3e25717850c26c9cd0d89d", hash));
+
+
+ sha1_init (&s);
+ sha1_write (&s, (const uint8_t *) "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56);
+ sha1_result_hash (&s, hash);
+ printf ("\nSha1: FIPS 180-2 C.2 and RFC3174 7.3 TEST2\n");
+ printf ("Expect: 84983e441c3bd26ebaae4aa1f95129e5e54670f1\n");
+ printf ("Result: %s\n", hash);
+ CPPUNIT_ASSERT_MESSAGE ("Sha1: FIPS 180-2 C.2 and RFC3174 7.3 TEST2",
+ !strcmp ("84983e441c3bd26ebaae4aa1f95129e5e54670f1", hash));
+
+
+ sha1_init (&s);
+ for (a = 0; a < 80; ++a) sha1_write (&s, (const uint8_t *) "01234567", 8);
+ sha1_result_hash (&s, hash);
+ printf ("\nSha1: RFC3174 7.3 TEST4\n");
+ printf ("Expect: dea356a2cddd90c7a7ecedc5ebb563934f460452\n");
+ printf ("Result: %s\n", hash);
+ CPPUNIT_ASSERT_MESSAGE ("Sha1: RFC3174 7.3 TEST4",
+ !strcmp ("dea356a2cddd90c7a7ecedc5ebb563934f460452", hash));
+
+
+ sha1_init (&s);
+ for (a = 0; a < 1000000; ++a) sha1_writebyte (&s, 'a');
+ sha1_result_hash (&s, hash);
+ printf ("\nSha1: Sha1: FIPS 180-2 C.3 and RFC3174 7.3 TEST3\n");
+ printf ("Expect:34aa973cd4c4daa4f61eeb2bdbad27316534016f\n");
+ printf ("Result:%s\n", hash);
+ CPPUNIT_ASSERT_MESSAGE ("Sha1: FIPS 180-2 C.3 and RFC3174 7.3 TEST3",
+ !strcmp ("34aa973cd4c4daa4f61eeb2bdbad27316534016f", hash));
+}
diff --git a/libs/ardour/test/mtdm_test.h b/libs/ardour/test/sha1_test.h
similarity index 75%
copy from libs/ardour/test/mtdm_test.h
copy to libs/ardour/test/sha1_test.h
index c02a4f2..d2fe6d5 100644
--- a/libs/ardour/test/mtdm_test.h
+++ b/libs/ardour/test/sha1_test.h
@@ -2,9 +2,9 @@
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
-class MTDMTest : public CppUnit::TestFixture
+class Sha1Test : public CppUnit::TestFixture
{
- CPPUNIT_TEST_SUITE (MTDMTest);
+ CPPUNIT_TEST_SUITE (Sha1Test);
CPPUNIT_TEST (basicTest);
CPPUNIT_TEST_SUITE_END ();
@@ -14,4 +14,3 @@ public:
void basicTest ();
};
-
diff --git a/libs/ardour/test/test_util.cc b/libs/ardour/test/test_util.cc
index 9543bf5..3e9566c 100644
--- a/libs/ardour/test/test_util.cc
+++ b/libs/ardour/test/test_util.cc
@@ -103,7 +103,7 @@ create_and_start_dummy_backend ()
CPPUNIT_ASSERT (AudioEngine::instance ());
CPPUNIT_ASSERT (engine);
- CPPUNIT_ASSERT (engine->set_backend ("Dummy", "", ""));
+ CPPUNIT_ASSERT (engine->set_backend ("None (Dummy)", "", ""));
init_post_engine ();
diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc
index 92ea993..2d46c60 100644
--- a/libs/ardour/track.cc
+++ b/libs/ardour/track.cc
@@ -930,6 +930,65 @@ Track::adjust_capture_buffering ()
}
}
+#ifdef USE_TRACKS_CODE_FEATURES
+
+/* This is the Tracks version of Track::monitoring_state().
+ *
+ * Ardour developers: try to flag or fix issues if parts of the libardour API
+ * change in ways that invalidate this
+ */
+
+MonitorState
+Track::monitoring_state () const
+{
+ /* Explicit requests */
+
+ if (_monitoring & MonitorInput) {
+ return MonitoringInput;
+ }
+
+ if (_monitoring & MonitorDisk) {
+ return MonitoringDisk;
+ }
+
+ /* This is an implementation of the truth table in doc/monitor_modes.pdf;
+ I don't think it's ever going to be too pretty too look at.
+ */
+
+ // GZ: NOT USED IN TRACKS
+ //bool const auto_input = _session.config.get_auto_input ();
+ //bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
+ //bool const tape_machine_mode = Config->get_tape_machine_mode ();
+
+ bool const roll = _session.transport_rolling ();
+ bool const track_rec = _diskstream->record_enabled ();
+ bool session_rec = _session.actively_recording ();
+
+ if (track_rec) {
+
+ if (!session_rec && roll) {
+ return MonitoringDisk;
+ } else {
+ return MonitoringInput;
+ }
+
+ } else {
+
+ if (roll) {
+ return MonitoringDisk;
+ }
+ }
+
+ return MonitoringSilence;
+}
+
+#else
+
+/* This is the Ardour/Mixbus version of Track::monitoring_state().
+ *
+ * Tracks developers: do NOT modify this method under any circumstances.
+ */
+
MonitorState
Track::monitoring_state () const
{
@@ -995,6 +1054,8 @@ Track::monitoring_state () const
return MonitoringSilence;
}
+#endif
+
void
Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
{
diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc
index 6d6511b..bda7197 100644
--- a/libs/ardour/utils.cc
+++ b/libs/ardour/utils.cc
@@ -296,17 +296,6 @@ ARDOUR::cmp_nocase_utf8 (const string& s1, const string& s2)
return retval;
}
-int
-ARDOUR::touch_file (string path)
-{
- int fd = open (path.c_str(), O_RDWR|O_CREAT, 0660);
- if (fd >= 0) {
- close (fd);
- return 0;
- }
- return 1;
-}
-
string
ARDOUR::region_name_from_path (string path, bool strip_channels, bool add_channel_suffix, uint32_t total, uint32_t this_one)
{
@@ -467,6 +456,10 @@ ARDOUR::string_to_sync_source (string str)
return Engine;
}
+ if (str == _("LTC")) {
+ return LTC;
+ }
+
fatal << string_compose (_("programming error: unknown sync source string \"%1\""), str) << endmsg;
abort(); /*NOTREACHED*/
return Engine;
@@ -521,11 +514,8 @@ ARDOUR::meter_falloff_to_float (MeterFalloff falloff)
case MeterFalloffModerate:
return METER_FALLOFF_MODERATE;
case MeterFalloffFast:
- return METER_FALLOFF_FAST;
- case MeterFalloffFaster:
- return METER_FALLOFF_FASTER;
+ case MeterFalloffFaster: // backwards compat enum MeterFalloff
case MeterFalloffFastest:
- return METER_FALLOFF_FASTEST;
default:
return METER_FALLOFF_FAST;
}
@@ -552,14 +542,8 @@ ARDOUR::meter_falloff_from_float (float val)
else if (val <= METER_FALLOFF_MEDIUM) {
return MeterFalloffMedium;
}
- else if (val <= METER_FALLOFF_FAST) {
- return MeterFalloffFast;
- }
- else if (val <= METER_FALLOFF_FASTER) {
- return MeterFalloffFaster;
- }
else {
- return MeterFalloffFastest;
+ return MeterFalloffFast;
}
}
diff --git a/libs/ardour/vst_info_file.cc b/libs/ardour/vst_info_file.cc
index 3b56876..b273124 100644
--- a/libs/ardour/vst_info_file.cc
+++ b/libs/ardour/vst_info_file.cc
@@ -23,10 +23,12 @@
*/
#include <iostream>
+#include <fstream>
#include <cassert>
#include <sys/types.h>
#include <sys/stat.h>
+#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
@@ -40,6 +42,7 @@
#include <glibmm.h>
#include "pbd/error.h"
+#include "pbd/compose.h"
#ifndef VST_SCANNER_APP
#include "ardour/plugin_manager.h" // scanner_bin_path
@@ -52,22 +55,12 @@
#include "ardour/plugin_types.h"
#include "ardour/vst_info_file.h"
+#include "i18n.h"
+#include "sha1.c"
+
#define MAX_STRING_LEN 256
#define PLUGIN_SCAN_TIMEOUT (Config->get_vst_scan_timeout()) // in deciseconds
-
-/* CACHE FILE PATHS */
-#define EXT_BLACKLIST ".fsb"
-#define EXT_ERRORFILE ".err"
-#define EXT_INFOFILE ".fsi"
-
-#ifdef PLATFORM_WINDOWS
-#define PFX_DOTFILE ""
-#else
-#define PFX_DOTFILE "."
-#endif
-
-
using namespace std;
#ifndef VST_SCANNER_APP
namespace ARDOUR {
@@ -87,54 +80,110 @@ static bool vstfx_instantiate_and_get_info_lx (const char* dllpath, vector<VSTIn
/* ID for shell plugins */
static int vstfx_current_loading_id = 0;
-
-
/* *** CACHE FILE PATHS *** */
static string
-vstfx_cache_file (const char* dllpath, int personal, const char *ext)
-{
- string dir;
- if (personal) {
- dir = get_personal_vst_info_cache_dir();
- // TODO prefix path relative to scan-root to avoid duplicates
- } else {
- dir = Glib::path_get_dirname (std::string(dllpath));
+get_vst_info_cache_dir () {
+ string dir = Glib::build_filename (ARDOUR::user_cache_directory (), "vst");
+ /* if the directory doesn't exist, try to create it */
+ if (!Glib::file_test (dir, Glib::FILE_TEST_IS_DIR)) {
+ if (g_mkdir (dir.c_str (), 0700)) {
+ PBD::fatal << "Cannot create VST info folder '" << dir << "'" << endmsg;
+ }
}
-
- stringstream s;
- s << PFX_DOTFILE << Glib::path_get_basename (dllpath) << ext;
- return Glib::build_filename (dir, s.str ());
+ return dir;
}
static string
-vstfx_blacklist_path (const char* dllpath, int personal)
+vstfx_infofile_path (const char* dllpath)
{
- string dir;
- if (personal) {
- dir = get_personal_vst_blacklist_dir();
- } else {
- dir = Glib::path_get_dirname (std::string(dllpath));
- }
+ char hash[41];
+ Sha1Digest s;
+ sha1_init (&s);
+ sha1_write (&s, (const uint8_t *) dllpath, strlen (dllpath));
+ sha1_result_hash (&s, hash);
+ return Glib::build_filename (get_vst_info_cache_dir (), std::string (hash) + std::string (VST_EXT_INFOFILE));
+}
- stringstream s;
- s << PFX_DOTFILE << Glib::path_get_basename (dllpath) << EXT_BLACKLIST;
- return Glib::build_filename (dir, s.str ());
+
+/* *** VST Blacklist *** */
+
+/** mark plugin as blacklisted */
+static void vstfx_blacklist (const char *id)
+{
+ string fn = Glib::build_filename (ARDOUR::user_cache_directory (), VST_BLACKLIST);
+ FILE * blacklist_fd = NULL;
+ if (! (blacklist_fd = g_fopen (fn.c_str (), "a"))) {
+ PBD::error << string_compose (_("Cannot append to VST blacklist for '%1'"), id) << endmsg;
+ return;
+ }
+ assert (NULL == strchr (id, '\n'));
+ fprintf (blacklist_fd, "%s\n", id);
+ ::fclose (blacklist_fd);
}
-static string
-vstfx_infofile_path (const char* dllpath, int personal)
+/** mark plugin as not blacklisted */
+static void vstfx_un_blacklist (const char *idcs)
{
- return vstfx_cache_file(dllpath, personal, EXT_INFOFILE);
+ string id (idcs);
+ string fn = Glib::build_filename (ARDOUR::user_cache_directory (), VST_BLACKLIST);
+ if (!Glib::file_test (fn, Glib::FILE_TEST_EXISTS)) {
+ PBD::warning << _("Expected VST Blacklist file does not exist.") << endmsg;
+ return;
+ }
+
+ std::string bl;
+ {
+ std::ifstream ifs (fn.c_str ());
+ bl.assign ((std::istreambuf_iterator<char> (ifs)), (std::istreambuf_iterator<char> ()));
+ }
+
+ ::g_unlink (fn.c_str ());
+
+ assert (!Glib::file_test (fn, Glib::FILE_TEST_EXISTS));
+ assert (id.find ("\n") == string::npos);
+
+ id += "\n"; // add separator
+ const size_t rpl = bl.find (id);
+ if (rpl != string::npos) {
+ bl.replace (rpl, id.size (), "");
+ }
+ if (bl.empty ()) {
+ return;
+ }
+
+ FILE * blacklist_fd = NULL;
+ if (! (blacklist_fd = g_fopen (fn.c_str (), "w"))) {
+ PBD::error << _("Cannot open VST blacklist.") << endmsg;;
+ return;
+ }
+ fprintf (blacklist_fd, "%s", bl.c_str ());
+ ::fclose (blacklist_fd);
}
-#ifndef VST_SCANNER_APP
-static string
-vstfx_errorfile_path (const char* dllpath, int personal)
+/* return true if plugin is blacklisted */
+static bool vst_is_blacklisted (const char *idcs)
{
- return vstfx_cache_file(dllpath, personal, EXT_ERRORFILE);
+ // TODO ideally we'd also check if the VST has been updated since blacklisting
+ string id (idcs);
+ string fn = Glib::build_filename (ARDOUR::user_cache_directory (), VST_BLACKLIST);
+ if (!Glib::file_test (fn, Glib::FILE_TEST_EXISTS)) {
+ return false;
+ }
+ std::string bl;
+ std::ifstream ifs (fn.c_str ());
+ bl.assign ((std::istreambuf_iterator<char> (ifs)), (std::istreambuf_iterator<char> ()));
+
+ assert (id.find ("\n") == string::npos);
+
+ id += "\n"; // add separator
+ const size_t rpl = bl.find (id);
+ if (rpl != string::npos) {
+ return true;
+ }
+ return false;
}
-#endif
+
/* *** MEMORY MANAGEMENT *** */
@@ -160,14 +209,13 @@ vstfx_free_info (VSTInfo *info)
static void
vstfx_clear_info_list (vector<VSTInfo *> *infos)
{
- for (vector<VSTInfo *>::iterator i = infos->begin(); i != infos->end(); ++i) {
- vstfx_free_info(*i);
+ for (vector<VSTInfo *>::iterator i = infos->begin (); i != infos->end (); ++i) {
+ vstfx_free_info (*i);
}
- infos->clear();
+ infos->clear ();
}
-
/* *** CACHE FILE I/O *** */
/** Helper function to read a line from the cache file
@@ -182,9 +230,9 @@ read_string (FILE *fp)
return 0;
}
- if (strlen(buf) < MAX_STRING_LEN) {
+ if (strlen (buf) < MAX_STRING_LEN) {
if (strlen (buf)) {
- buf[strlen(buf)-1] = 0;
+ buf[strlen (buf)-1] = 0;
}
return strdup (buf);
} else {
@@ -210,12 +258,12 @@ read_int (FILE* fp, int* n)
/** parse a plugin-block from the cache info file */
static bool
-vstfx_load_info_block(FILE* fp, VSTInfo *info)
+vstfx_load_info_block (FILE* fp, VSTInfo *info)
{
- if ((info->name = read_string(fp)) == 0) return false;
- if ((info->creator = read_string(fp)) == 0) return false;
+ if ((info->name = read_string (fp)) == 0) return false;
+ if ((info->creator = read_string (fp)) == 0) return false;
if (read_int (fp, &info->UniqueID)) return false;
- if ((info->Category = read_string(fp)) == 0) return false;
+ if ((info->Category = read_string (fp)) == 0) return false;
if (read_int (fp, &info->numInputs)) return false;
if (read_int (fp, &info->numOutputs)) return false;
if (read_int (fp, &info->numParams)) return false;
@@ -234,20 +282,20 @@ vstfx_load_info_block(FILE* fp, VSTInfo *info)
return true;
}
- if ((info->ParamNames = (char **) malloc(sizeof(char*)*info->numParams)) == 0) {
+ if ((info->ParamNames = (char **) malloc (sizeof (char*) * info->numParams)) == 0) {
return false;
}
for (int i = 0; i < info->numParams; ++i) {
- if ((info->ParamNames[i] = read_string(fp)) == 0) return false;
+ if ((info->ParamNames[i] = read_string (fp)) == 0) return false;
}
- if ((info->ParamLabels = (char **) malloc(sizeof(char*)*info->numParams)) == 0) {
+ if ((info->ParamLabels = (char **) malloc (sizeof (char*) * info->numParams)) == 0) {
return false;
}
for (int i = 0; i < info->numParams; ++i) {
- if ((info->ParamLabels[i] = read_string(fp)) == 0) {
+ if ((info->ParamLabels[i] = read_string (fp)) == 0) {
return false;
}
}
@@ -262,23 +310,23 @@ vstfx_load_info_file (FILE* fp, vector<VSTInfo*> *infos)
if ((info = (VSTInfo*) calloc (1, sizeof (VSTInfo))) == 0) {
return false;
}
- if (vstfx_load_info_block(fp, info)) {
+ if (vstfx_load_info_block (fp, info)) {
if (strncmp (info->Category, "Shell", 5)) {
- infos->push_back(info);
+ infos->push_back (info);
} else {
int plugin_cnt = 0;
- vstfx_free_info(info);
+ vstfx_free_info (info);
if (!read_int (fp, &plugin_cnt)) {
for (int i = 0; i < plugin_cnt; i++) {
if ((info = (VSTInfo*) calloc (1, sizeof (VSTInfo))) == 0) {
- vstfx_clear_info_list(infos);
+ vstfx_clear_info_list (infos);
return false;
}
- if (vstfx_load_info_block(fp, info)) {
- infos->push_back(info);
+ if (vstfx_load_info_block (fp, info)) {
+ infos->push_back (info);
} else {
- vstfx_free_info(info);
- vstfx_clear_info_list(infos);
+ vstfx_free_info (info);
+ vstfx_clear_info_list (infos);
return false;
}
}
@@ -288,8 +336,8 @@ vstfx_load_info_file (FILE* fp, vector<VSTInfo*> *infos)
}
return true;
}
- vstfx_free_info(info);
- vstfx_clear_info_list(infos);
+ vstfx_free_info (info);
+ vstfx_clear_info_list (infos);
return false;
}
@@ -322,124 +370,42 @@ vstfx_write_info_block (FILE* fp, VSTInfo *info)
static void
vstfx_write_info_file (FILE* fp, vector<VSTInfo *> *infos)
{
- assert(infos);
- assert(fp);
+ assert (infos);
+ assert (fp);
- if (infos->size() > 1) {
- vector<VSTInfo *>::iterator x = infos->begin();
+ if (infos->size () > 1) {
+ vector<VSTInfo *>::iterator x = infos->begin ();
/* write out the shell info first along with count of the number of
* plugins contained in this shell
*/
- vstfx_write_info_block(fp, *x);
- fprintf( fp, "%d\n", (int)infos->size() - 1 );
+ vstfx_write_info_block (fp, *x);
+ fprintf (fp, "%d\n", (int)infos->size () - 1 );
++x;
/* Now write out the info for each plugin */
- for (; x != infos->end(); ++x) {
- vstfx_write_info_block(fp, *x);
+ for (; x != infos->end (); ++x) {
+ vstfx_write_info_block (fp, *x);
}
- } else if (infos->size() == 1) {
- vstfx_write_info_block(fp, infos->front());
+ } else if (infos->size () == 1) {
+ vstfx_write_info_block (fp, infos->front ());
} else {
- PBD::error << "Zero plugins in VST." << endmsg; // XXX here? rather make this impossible before if it ain't already.
+ PBD::warning << _("VST object file contains no plugins.") << endmsg;
}
}
-/* *** CACHE AND BLACKLIST MANAGEMENT *** */
-
-/* return true if plugin is blacklisted or has an invalid file extension */
-static bool
-vstfx_blacklist_stat (const char *dllpath, int personal)
-{
- const size_t slen = strlen (dllpath);
- if (
- (slen <= 3 || g_ascii_strcasecmp (&dllpath[slen-3], ".so"))
- &&
- (slen <= 4 || g_ascii_strcasecmp (&dllpath[slen-4], ".dll"))
- ) {
- return true;
- }
-
- string const path = vstfx_blacklist_path (dllpath, personal);
-
- if (Glib::file_test (path, Glib::FileTest (Glib::FILE_TEST_EXISTS | Glib::FILE_TEST_IS_REGULAR))) {
- struct stat dllstat;
- struct stat fsbstat;
-
- if (stat (dllpath, &dllstat) == 0 && stat (path.c_str(), &fsbstat) == 0) {
- if (dllstat.st_mtime > fsbstat.st_mtime) {
- /* plugin is newer than blacklist file */
- return true;
- }
- }
- /* stat failed or plugin is older than blacklist file */
- return true;
- }
- /* blacklist file does not exist */
- return false;
-}
-
-/* return true if plugin is blacklisted, checks both personal
- * and global folder */
-static bool
-vstfx_check_blacklist (const char *dllpath)
-{
- if (vstfx_blacklist_stat(dllpath, 0)) return true;
- if (vstfx_blacklist_stat(dllpath, 1)) return true;
- return false;
-}
-
-/* create blacklist file, preferably in same folder as the
- * plugin, fall back to personal folder in $HOME
- */
-static FILE *
-vstfx_blacklist_file (const char *dllpath)
-{
- FILE *f;
- if ((f = fopen (vstfx_blacklist_path (dllpath, 0).c_str(), "wb"))) {
-#ifndef NDEBUG
- PBD::info << "Blacklisted VST: '" << vstfx_blacklist_path (dllpath, 0) << "'" << endmsg;
-#endif
- return f;
- }
-#ifndef NDEBUG
- PBD::info << "Blacklisted VST: '" << vstfx_blacklist_path (dllpath, 1) << "'" << endmsg;
-#endif
- return fopen (vstfx_blacklist_path (dllpath, 1).c_str(), "wb");
-}
-
-/** mark plugin as blacklisted */
-static bool
-vstfx_blacklist (const char *dllpath)
-{
- FILE *f = vstfx_blacklist_file(dllpath);
- if (f) {
- fclose(f);
- return true;
- }
- return false;
-}
-
-/** mark plugin as not blacklisted */
-static void
-vstfx_un_blacklist (const char *dllpath)
-{
- ::g_unlink(vstfx_blacklist_path (dllpath, 0).c_str());
- ::g_unlink(vstfx_blacklist_path (dllpath, 1).c_str());
-}
+/* *** CACHE MANAGEMENT *** */
/** remove info file from cache */
static void
vstfx_remove_infofile (const char *dllpath)
{
- ::g_unlink(vstfx_infofile_path (dllpath, 0).c_str());
- ::g_unlink(vstfx_infofile_path (dllpath, 1).c_str());
+ ::g_unlink (vstfx_infofile_path (dllpath).c_str ());
}
-/** helper function, check if cache is newer than plugin
- * @return path to cache file */
-static char *
-vstfx_infofile_stat (const char *dllpath, struct stat* statbuf, int personal)
+/** cache file for given plugin
+ * @return FILE of the .fsi cache if found and up-to-date*/
+static FILE *
+vstfx_infofile_for_read (const char* dllpath)
{
const size_t slen = strlen (dllpath);
if (
@@ -450,60 +416,31 @@ vstfx_infofile_stat (const char *dllpath, struct stat* statbuf, int personal)
return 0;
}
- string const path = vstfx_infofile_path (dllpath, personal);
+ string const path = vstfx_infofile_path (dllpath);
if (Glib::file_test (path, Glib::FileTest (Glib::FILE_TEST_EXISTS | Glib::FILE_TEST_IS_REGULAR))) {
-
struct stat dllstat;
+ struct stat fsistat;
if (stat (dllpath, &dllstat) == 0) {
- if (stat (path.c_str(), statbuf) == 0) {
- if (dllstat.st_mtime <= statbuf->st_mtime) {
+ if (stat (path.c_str (), &fsistat) == 0) {
+ if (dllstat.st_mtime <= fsistat.st_mtime) {
/* plugin is older than info file */
- return strdup (path.c_str ());
+ return g_fopen (path.c_str (), "rb");
}
}
}
+ PBD::warning << string_compose (_("Ignored VST plugin which is newer than cache: '%1' (cache: '%2')"), dllpath, path) << endmsg;
+ PBD::info << _("Re-Scan Plugins (Preferences > Plugins) to update the cache, also make sure your system-time is set correctly.") << endmsg;
}
-
- return 0;
+ return NULL;
}
-/** cache file for given plugin
- * @return FILE of the .fsi cache if found and up-to-date*/
-static FILE *
-vstfx_infofile_for_read (const char* dllpath)
-{
- struct stat own_statbuf;
- struct stat sys_statbuf;
- FILE *rv = NULL;
-
- char* own_info = vstfx_infofile_stat (dllpath, &own_statbuf, 1);
- char* sys_info = vstfx_infofile_stat (dllpath, &sys_statbuf, 0);
-
- if (own_info) {
- if (sys_info) {
- if (own_statbuf.st_mtime <= sys_statbuf.st_mtime) {
- /* system info file is newer, use it */
- rv = g_fopen (sys_info, "rb");
- }
- } else {
- rv = g_fopen (own_info, "rb");
- }
- } else if (sys_info) {
- rv = g_fopen (sys_info, "rb");
- }
- free(own_info);
- free(sys_info);
-
- return rv;
-}
-
-/** helper function for \ref vstfx_infofile_for_write
- * abstract global and personal cache folders
+/** newly created cache file for given plugin
+ * @return FILE for the .fsi cache or NULL on error
*/
static FILE *
-vstfx_infofile_create (const char* dllpath, int personal)
+vstfx_infofile_for_write (const char* dllpath)
{
const size_t slen = strlen (dllpath);
if (
@@ -514,26 +451,8 @@ vstfx_infofile_create (const char* dllpath, int personal)
return NULL;
}
- string const path = vstfx_infofile_path (dllpath, personal);
-#ifndef NDEBUG
- PBD::info << "Creating VST cache file " << path << endmsg;
-#endif
- return fopen (path.c_str(), "wb");
-}
-
-/** newly created cache file for given plugin
- * @return FILE for the .fsi cache, NULL if neither personal,
- * nor global cache folder is writable */
-static FILE *
-vstfx_infofile_for_write (const char* dllpath)
-{
- FILE* f;
-
- if ((f = vstfx_infofile_create (dllpath, 0)) == 0) {
- f = vstfx_infofile_create (dllpath, 1);
- }
-
- return f;
+ string const path = vstfx_infofile_path (dllpath);
+ return g_fopen (path.c_str (), "wb");
}
/** check if cache-file exists, is up-to-date and parse cache file
@@ -541,15 +460,15 @@ vstfx_infofile_for_write (const char* dllpath)
* @return true if .fsi cache was read successfully, false otherwise
*/
static bool
-vstfx_get_info_from_file(const char* dllpath, vector<VSTInfo*> *infos)
+vstfx_get_info_from_file (const char* dllpath, vector<VSTInfo*> *infos)
{
FILE* infofile;
bool rv = false;
if ((infofile = vstfx_infofile_for_read (dllpath)) != 0) {
- rv = vstfx_load_info_file(infofile, infos);
+ rv = vstfx_load_info_file (infofile, infos);
fclose (infofile);
if (!rv) {
- PBD::warning << "Cannot get VST information form " << dllpath << ": info file load failed." << endmsg;
+ PBD::warning << string_compose (_("Cannot get VST information for '%1': failed to load cache file."), dllpath) << endmsg;
}
}
return rv;
@@ -588,8 +507,8 @@ bool vstfx_midi_output (VSTState* vstfx)
/* should we send it VST events (i.e. MIDI) */
if ( (plugin->dispatcher (plugin, effCanDo, 0, 0, const_cast<char*> ("sendVstEvents"), 0.0f) > 0)
- || (plugin->dispatcher (plugin, effCanDo, 0, 0, const_cast<char*> ("sendVstMidiEvent"), 0.0f) > 0)
- ) {
+ || (plugin->dispatcher (plugin, effCanDo, 0, 0, const_cast<char*> ("sendVstMidiEvent"), 0.0f) > 0)
+ ) {
return true;
}
}
@@ -621,7 +540,7 @@ simple_master_callback (AEffect *, int32_t opcode, int32_t, intptr_t, void *ptr,
}
else if (opcode == audioMasterCanDo) {
for (int i = 0; i < vstfx_can_do_string_count; i++) {
- if (! strcmp(vstfx_can_do_strings[i], (const char*)ptr)) {
+ if (! strcmp (vstfx_can_do_strings[i], (const char*)ptr)) {
return 1;
}
}
@@ -647,9 +566,9 @@ vstfx_parse_vst_state (VSTState* vstfx)
return 0;
}
- /*We need to init the creator because some plugins
- fail to implement getVendorString, and so won't stuff the
- string with any name*/
+ /* We need to init the creator because some plugins
+ * fail to implement getVendorString, and so won't stuff the
+ * string with any name */
char creator[65] = "Unknown";
char name[65] = "";
@@ -659,25 +578,25 @@ vstfx_parse_vst_state (VSTState* vstfx)
plugin->dispatcher (plugin, effGetEffectName, 0, 0, name, 0);
- if (strlen(name) == 0) {
+ if (strlen (name) == 0) {
plugin->dispatcher (plugin, effGetProductString, 0, 0, name, 0);
}
- if (strlen(name) == 0) {
+ if (strlen (name) == 0) {
info->name = strdup (vstfx->handle->name);
} else {
info->name = strdup (name);
}
/*If the plugin doesn't bother to implement GetVendorString we will
- have pre-stuffed the string with 'Unknown' */
+ * have pre-stuffed the string with 'Unknown' */
plugin->dispatcher (plugin, effGetVendorString, 0, 0, creator, 0);
- /*Some plugins DO implement GetVendorString, but DON'T put a name in it
- so if its just a zero length string we replace it with 'Unknown' */
+ /* Some plugins DO implement GetVendorString, but DON'T put a name in it
+ * so if its just a zero length string we replace it with 'Unknown' */
- if (strlen(creator) == 0) {
+ if (strlen (creator) == 0) {
info->creator = strdup ("Unknown");
} else {
info->creator = strdup (creator);
@@ -705,11 +624,11 @@ vstfx_parse_vst_state (VSTState* vstfx)
info->numInputs = plugin->numInputs;
info->numOutputs = plugin->numOutputs;
info->numParams = plugin->numParams;
- info->wantMidi = (vstfx_midi_input(vstfx) ? 1 : 0) | (vstfx_midi_output(vstfx) ? 2 : 0);
+ info->wantMidi = (vstfx_midi_input (vstfx) ? 1 : 0) | (vstfx_midi_output (vstfx) ? 2 : 0);
info->hasEditor = plugin->flags & effFlagsHasEditor ? true : false;
info->canProcessReplacing = plugin->flags & effFlagsCanReplacing ? true : false;
- info->ParamNames = (char **) malloc(sizeof(char*)*info->numParams);
- info->ParamLabels = (char **) malloc(sizeof(char*)*info->numParams);
+ info->ParamNames = (char **) malloc (sizeof (char*)*info->numParams);
+ info->ParamLabels = (char **) malloc (sizeof (char*)*info->numParams);
for (int i = 0; i < info->numParams; ++i) {
char name[64];
@@ -721,11 +640,11 @@ vstfx_parse_vst_state (VSTState* vstfx)
strcpy (label, "No Label");
plugin->dispatcher (plugin, effGetParamName, i, 0, name, 0);
- info->ParamNames[i] = strdup(name);
+ info->ParamNames[i] = strdup (name);
//NOTE: 'effGetParamLabel' is no longer defined in vestige headers
//plugin->dispatcher (plugin, effGetParamLabel, i, 0, label, 0);
- info->ParamLabels[i] = strdup(label);
+ info->ParamLabels[i] = strdup (label);
}
return info;
}
@@ -736,14 +655,14 @@ vstfx_parse_vst_state (VSTState* vstfx)
static void
vstfx_info_from_plugin (const char *dllpath, VSTState* vstfx, vector<VSTInfo *> *infos, enum ARDOUR::PluginType type)
{
- assert(vstfx);
+ assert (vstfx);
VSTInfo *info;
- if (!(info = vstfx_parse_vst_state(vstfx))) {
+ if (!(info = vstfx_parse_vst_state (vstfx))) {
return;
}
- infos->push_back(info);
+ infos->push_back (info);
#if 1 // shell-plugin support
/* If this plugin is a Shell and we are not already inside a shell plugin
* read the info for all of the plugins contained in this shell.
@@ -757,20 +676,26 @@ vstfx_info_from_plugin (const char *dllpath, VSTState* vstfx, vector<VSTInfo *>
do {
char name[65] = "Unknown";
id = plugin->dispatcher (plugin, effShellGetNextPlugin, 0, 0, name, 0);
- ids.push_back(std::make_pair(id, name));
+ ids.push_back (std::make_pair (id, name));
} while ( id != 0 );
- switch(type) {
+ switch (type) {
#ifdef WINDOWS_VST_SUPPORT
- case ARDOUR::Windows_VST: fst_close(vstfx); break;
+ case ARDOUR::Windows_VST:
+ fst_close (vstfx);
+ break;
#endif
#ifdef LXVST_SUPPORT
- case ARDOUR::LXVST: vstfx_close (vstfx); break;
+ case ARDOUR::LXVST:
+ vstfx_close (vstfx);
+ break;
#endif
- default: assert(0); break;
+ default:
+ assert (0);
+ break;
}
- for (vector< pair<int, string> >::iterator x = ids.begin(); x != ids.end(); ++x) {
+ for (vector< pair<int, string> >::iterator x = ids.begin (); x != ids.end (); ++x) {
id = (*x).first;
if (id == 0) continue;
/* recurse vstfx_get_info() */
@@ -778,37 +703,49 @@ vstfx_info_from_plugin (const char *dllpath, VSTState* vstfx, vector<VSTInfo *>
bool ok;
switch (type) {
#ifdef WINDOWS_VST_SUPPORT
- case ARDOUR::Windows_VST: ok = vstfx_instantiate_and_get_info_fst(dllpath, infos, id); break;
+ case ARDOUR::Windows_VST:
+ ok = vstfx_instantiate_and_get_info_fst (dllpath, infos, id);
+ break;
#endif
#ifdef LXVST_SUPPORT
- case ARDOUR::LXVST: ok = vstfx_instantiate_and_get_info_lx(dllpath, infos, id); break;
+ case ARDOUR::LXVST:
+ ok = vstfx_instantiate_and_get_info_lx (dllpath, infos, id);
+ break;
#endif
- default: ok = false;
+ default:
+ ok = false;
+ break;
}
if (ok) {
// One shell (some?, all?) does not report the actual plugin name
// even after the shelled plugin has been instantiated.
// Replace the name of the shell with the real name.
- info = infos->back();
+ info = infos->back ();
free (info->name);
- if ((*x).second.length() == 0) {
- info->name = strdup("Unknown");
+ if ((*x).second.length () == 0) {
+ info->name = strdup ("Unknown");
}
else {
- info->name = strdup ((*x).second.c_str());
+ info->name = strdup ((*x).second.c_str ());
}
}
}
} else {
- switch(type) {
+ switch (type) {
#ifdef WINDOWS_VST_SUPPORT
- case ARDOUR::Windows_VST: fst_close(vstfx); break;
+ case ARDOUR::Windows_VST:
+ fst_close (vstfx);
+ break;
#endif
#ifdef LXVST_SUPPORT
- case ARDOUR::LXVST: vstfx_close (vstfx); break;
+ case ARDOUR::LXVST:
+ vstfx_close (vstfx);
+ break;
#endif
- default: assert(0); break;
+ default:
+ assert (0);
+ break;
}
}
#endif
@@ -825,22 +762,22 @@ vstfx_instantiate_and_get_info_lx (
{
VSTHandle* h;
VSTState* vstfx;
- if (!(h = vstfx_load(dllpath))) {
- PBD::warning << "Cannot get LinuxVST information from " << dllpath << ": load failed." << endmsg;
+ if (!(h = vstfx_load (dllpath))) {
+ PBD::warning << string_compose (_("Cannot get LinuxVST information from '%1': load failed."), dllpath) << endmsg;
return false;
}
vstfx_current_loading_id = uniqueID;
- if (!(vstfx = vstfx_instantiate(h, simple_master_callback, 0))) {
- vstfx_unload(h);
- PBD::warning << "Cannot get LinuxVST information from " << dllpath << ": instantiation failed." << endmsg;
+ if (!(vstfx = vstfx_instantiate (h, simple_master_callback, 0))) {
+ vstfx_unload (h);
+ PBD::warning << string_compose (_("Cannot get LinuxVST information from '%1': instantiation failed."), dllpath) << endmsg;
return false;
}
vstfx_current_loading_id = 0;
- vstfx_info_from_plugin(dllpath, vstfx, infos, ARDOUR::LXVST);
+ vstfx_info_from_plugin (dllpath, vstfx, infos, ARDOUR::LXVST);
vstfx_unload (h);
return true;
@@ -854,22 +791,22 @@ vstfx_instantiate_and_get_info_fst (
{
VSTHandle* h;
VSTState* vstfx;
- if(!(h = fst_load(dllpath))) {
- PBD::warning << "Cannot get Windows VST information from " << dllpath << ": load failed." << endmsg;
+ if (!(h = fst_load (dllpath))) {
+ PBD::warning << string_compose (_("Cannot get Windows VST information from '%1': load failed."), dllpath) << endmsg;
return false;
}
vstfx_current_loading_id = uniqueID;
- if(!(vstfx = fst_instantiate(h, simple_master_callback, 0))) {
- fst_unload(&h);
+ if (!(vstfx = fst_instantiate (h, simple_master_callback, 0))) {
+ fst_unload (&h);
vstfx_current_loading_id = 0;
- PBD::warning << "Cannot get Windows VST information from " << dllpath << ": instantiation failed." << endmsg;
+ PBD::warning << string_compose (_("Cannot get Windows VST information from '%1': instantiation failed."), dllpath) << endmsg;
return false;
}
vstfx_current_loading_id = 0;
- vstfx_info_from_plugin(dllpath, vstfx, infos, ARDOUR::Windows_VST);
+ vstfx_info_from_plugin (dllpath, vstfx, infos, ARDOUR::Windows_VST);
return true;
}
@@ -890,18 +827,20 @@ static void parse_scanner_output (std::string msg, size_t /*len*/)
return;
}
+#if 0 // TODO
if (!_errorlog_fd) {
- if (!(_errorlog_fd = fopen(vstfx_errorfile_path(_errorlog_dll, 0).c_str(), "w"))) {
- if (!(_errorlog_fd = fopen(vstfx_errorfile_path(_errorlog_dll, 1).c_str(), "w"))) {
- PBD::error << "Cannot create plugin error-log for plugin " << _errorlog_dll;
- free(_errorlog_dll);
- _errorlog_dll = NULL;
- }
+ if (!(_errorlog_fd = g_fopen (vstfx_errorfile_path (_errorlog_dll).c_str (), "w"))) {
+ PBD::error << "Cannot create plugin error-log for plugin " << _errorlog_dll;
+ free (_errorlog_dll);
+ _errorlog_dll = NULL;
}
}
+#endif
if (_errorlog_fd) {
- fprintf (_errorlog_fd, "%s\n", msg.c_str());
+ fprintf (_errorlog_fd, "%s\n", msg.c_str ());
+ } else if (_errorlog_dll) {
+ PBD::error << "VST '" << _errorlog_dll << "': " << msg;
} else {
PBD::error << "VST scanner: " << msg;
}
@@ -909,25 +848,25 @@ static void parse_scanner_output (std::string msg, size_t /*len*/)
static void
set_error_log (const char* dllpath) {
- assert(!_errorlog_fd);
- assert(!_errorlog_dll);
- _errorlog_dll = strdup(dllpath);
+ assert (!_errorlog_fd);
+ assert (!_errorlog_dll);
+ _errorlog_dll = strdup (dllpath);
}
static void
close_error_log () {
if (_errorlog_fd) {
- fclose(_errorlog_fd);
+ fclose (_errorlog_fd);
_errorlog_fd = 0;
}
- free(_errorlog_dll);
+ free (_errorlog_dll);
_errorlog_dll = 0;
}
#endif
-/* *** THE MAIN FUNCTION THAT USES ALL OF THE ABOVE :) *** */
+/* *** the main function that uses all of the above *** */
static vector<VSTInfo *> *
vstfx_get_info (const char* dllpath, enum ARDOUR::PluginType type, enum VSTScanMode mode)
@@ -935,11 +874,11 @@ vstfx_get_info (const char* dllpath, enum ARDOUR::PluginType type, enum VSTScanM
FILE* infofile;
vector<VSTInfo*> *infos = new vector<VSTInfo*>;
- if (vstfx_check_blacklist(dllpath)) {
+ if (vst_is_blacklisted (dllpath)) {
return infos;
}
- if (vstfx_get_info_from_file(dllpath, infos)) {
+ if (vstfx_get_info_from_file (dllpath, infos)) {
return infos;
}
@@ -953,50 +892,50 @@ vstfx_get_info (const char* dllpath, enum ARDOUR::PluginType type, enum VSTScanM
else if (mode == VST_SCAN_USE_APP && scanner_bin_path != "") {
/* use external scanner app */
- char **argp= (char**) calloc(3,sizeof(char*));
- argp[0] = strdup(scanner_bin_path.c_str());
- argp[1] = strdup(dllpath);
+ char **argp= (char**) calloc (3,sizeof (char*));
+ argp[0] = strdup (scanner_bin_path.c_str ());
+ argp[1] = strdup (dllpath);
argp[2] = 0;
- set_error_log(dllpath);
+ set_error_log (dllpath);
ARDOUR::SystemExec scanner (scanner_bin_path, argp);
PBD::ScopedConnectionList cons;
scanner.ReadStdout.connect_same_thread (cons, boost::bind (&parse_scanner_output, _1 ,_2));
if (scanner.start (2 /* send stderr&stdout via signal */)) {
- PBD::error << "Cannot launch VST scanner app '" << scanner_bin_path << "': "<< strerror(errno) << endmsg;
- close_error_log();
+ PBD::error << string_compose (_("Cannot launch VST scanner app '%1': %2"), scanner_bin_path, strerror (errno)) << endmsg;
+ close_error_log ();
return infos;
} else {
int timeout = PLUGIN_SCAN_TIMEOUT;
bool no_timeout = (timeout <= 0);
- ARDOUR::PluginScanTimeout(timeout);
- while (scanner.is_running() && (no_timeout || timeout > 0)) {
- if (!no_timeout && !ARDOUR::PluginManager::instance().no_timeout()) {
+ ARDOUR::PluginScanTimeout (timeout);
+ while (scanner.is_running () && (no_timeout || timeout > 0)) {
+ if (!no_timeout && !ARDOUR::PluginManager::instance ().no_timeout ()) {
if (timeout%5 == 0) {
- ARDOUR::PluginScanTimeout(timeout);
+ ARDOUR::PluginScanTimeout (timeout);
}
--timeout;
}
- ARDOUR::GUIIdle();
+ ARDOUR::GUIIdle ();
Glib::usleep (100000);
- if (ARDOUR::PluginManager::instance().cancelled()) {
+ if (ARDOUR::PluginManager::instance ().cancelled ()) {
// remove info file (might be incomplete)
- vstfx_remove_infofile(dllpath);
+ vstfx_remove_infofile (dllpath);
// remove temporary blacklist file (scan incomplete)
- vstfx_un_blacklist(dllpath);
- scanner.terminate();
- close_error_log();
+ vstfx_un_blacklist (dllpath);
+ scanner.terminate ();
+ close_error_log ();
return infos;
}
}
- scanner.terminate();
+ scanner.terminate ();
}
- close_error_log();
+ close_error_log ();
/* re-read index (generated by external scanner) */
- vstfx_clear_info_list(infos);
- if (!vstfx_check_blacklist(dllpath)) {
- vstfx_get_info_from_file(dllpath, infos);
+ vstfx_clear_info_list (infos);
+ if (!vst_is_blacklisted (dllpath)) {
+ vstfx_get_info_from_file (dllpath, infos);
}
return infos;
}
@@ -1007,16 +946,22 @@ vstfx_get_info (const char* dllpath, enum ARDOUR::PluginType type, enum VSTScanM
bool ok;
/* blacklist in case instantiation fails */
- vstfx_blacklist(dllpath);
+ vstfx_blacklist (dllpath);
switch (type) {
#ifdef WINDOWS_VST_SUPPORT
- case ARDOUR::Windows_VST: ok = vstfx_instantiate_and_get_info_fst(dllpath, infos, 0); break;
+ case ARDOUR::Windows_VST:
+ ok = vstfx_instantiate_and_get_info_fst (dllpath, infos, 0);
+ break;
#endif
#ifdef LXVST_SUPPORT
- case ARDOUR::LXVST: ok = vstfx_instantiate_and_get_info_lx(dllpath, infos, 0); break;
+ case ARDOUR::LXVST:
+ ok = vstfx_instantiate_and_get_info_lx (dllpath, infos, 0);
+ break;
#endif
- default: ok = false;
+ default:
+ ok = false;
+ break;
}
if (!ok) {
@@ -1024,12 +969,12 @@ vstfx_get_info (const char* dllpath, enum ARDOUR::PluginType type, enum VSTScanM
}
/* remove from blacklist */
- vstfx_un_blacklist(dllpath);
+ vstfx_un_blacklist (dllpath);
/* crate cache/whitelist */
infofile = vstfx_infofile_for_write (dllpath);
if (!infofile) {
- PBD::warning << "Cannot cache VST information for " << dllpath << ": cannot create new FST info file." << endmsg;
+ PBD::warning << string_compose (_("Cannot cache VST information for '%1': cannot create cache file."), dllpath) << endmsg;
return infos;
} else {
vstfx_write_info_file (infofile, infos);
@@ -1039,49 +984,22 @@ vstfx_get_info (const char* dllpath, enum ARDOUR::PluginType type, enum VSTScanM
}
-
/* *** public API *** */
void
vstfx_free_info_list (vector<VSTInfo *> *infos)
{
- for (vector<VSTInfo *>::iterator i = infos->begin(); i != infos->end(); ++i) {
- vstfx_free_info(*i);
+ for (vector<VSTInfo *>::iterator i = infos->begin (); i != infos->end (); ++i) {
+ vstfx_free_info (*i);
}
delete infos;
}
-string
-get_personal_vst_blacklist_dir() {
- string dir = Glib::build_filename (ARDOUR::user_cache_directory(), "fst_blacklist");
- /* if the directory doesn't exist, try to create it */
- if (!Glib::file_test (dir, Glib::FILE_TEST_IS_DIR)) {
- if (g_mkdir (dir.c_str (), 0700)) {
- PBD::error << "Cannot create VST blacklist folder '" << dir << "'" << endmsg;
- //exit(1);
- }
- }
- return dir;
-}
-
-string
-get_personal_vst_info_cache_dir() {
- string dir = Glib::build_filename (ARDOUR::user_cache_directory(), "fst_info");
- /* if the directory doesn't exist, try to create it */
- if (!Glib::file_test (dir, Glib::FILE_TEST_IS_DIR)) {
- if (g_mkdir (dir.c_str (), 0700)) {
- PBD::error << "Cannot create VST info folder '" << dir << "'" << endmsg;
- //exit(1);
- }
- }
- return dir;
-}
-
#ifdef LXVST_SUPPORT
vector<VSTInfo *> *
vstfx_get_info_lx (char* dllpath, enum VSTScanMode mode)
{
- return vstfx_get_info(dllpath, ARDOUR::LXVST, mode);
+ return vstfx_get_info (dllpath, ARDOUR::LXVST, mode);
}
#endif
@@ -1089,7 +1007,7 @@ vstfx_get_info_lx (char* dllpath, enum VSTScanMode mode)
vector<VSTInfo *> *
vstfx_get_info_fst (char* dllpath, enum VSTScanMode mode)
{
- return vstfx_get_info(dllpath, ARDOUR::Windows_VST, mode);
+ return vstfx_get_info (dllpath, ARDOUR::Windows_VST, mode);
}
#endif
diff --git a/libs/ardour/vst_plugin.cc b/libs/ardour/vst_plugin.cc
index 189dd93..ad5ecb4 100644
--- a/libs/ardour/vst_plugin.cc
+++ b/libs/ardour/vst_plugin.cc
@@ -565,12 +565,7 @@ VSTPlugin::connect_and_run (BufferSet& bufs,
uint32_t out_index = 0;
for (i = 0; i < (int32_t) _plugin->numOutputs; ++i) {
- uint32_t index;
- bool valid = false;
- index = out_map.get(DataType::AUDIO, out_index++, &valid);
- outs[i] = (valid)
- ? bufs.get_audio(index).data(offset)
- : scratch_bufs.get_audio(0).data(offset);
+ outs[i] = scratch_bufs.get_audio(i).data(offset);
}
if (bufs.count().n_midi() > 0) {
@@ -597,6 +592,16 @@ VSTPlugin::connect_and_run (BufferSet& bufs,
_plugin->processReplacing (_plugin, &ins[0], &outs[0], nframes);
_midi_out_buf = 0;
+ out_index = 0;
+ for (i = 0; i < (int32_t) _plugin->numOutputs; ++i) {
+ uint32_t index;
+ bool valid = false;
+ index = out_map.get(DataType::AUDIO, out_index++, &valid);
+ if (!valid) {
+ continue;
+ }
+ copy_vector (bufs.get_audio(index).data(offset), outs[i], nframes);
+ }
return 0;
}
@@ -614,6 +619,9 @@ VSTPlugin::unique_id () const
const char *
VSTPlugin::name () const
{
+ if (!_info->name.empty ()) {
+ return _info->name.c_str();
+ }
return _handle->name;
}
diff --git a/libs/ardour/wscript b/libs/ardour/wscript
index 918408c..c732161 100644
--- a/libs/ardour/wscript
+++ b/libs/ardour/wscript
@@ -331,15 +331,19 @@ def build(bld):
# micro increment <=> no interface changes
LIBARDOUR_LIB_VERSION = "3.0.0"
+ sources = libardour_sources
+ if bld.is_tracks_build():
+ sources += [ 'engine_state_controller.cc' ]
+
# Library
if bld.is_defined ('INTERNAL_SHARED_LIBS'):
- obj = bld.shlib(features = 'c cxx cshlib cxxshlib', source=libardour_sources)
+ obj = bld.shlib(features = 'c cxx cshlib cxxshlib', source=sources)
# macros for this shared library
obj.defines = [ 'LIBARDOUR_DLL_EXPORTS=1' ]
else:
- obj = bld.stlib(features = 'c cxx cstlib cxxstlib', source=libardour_sources)
- obj.cxxflags = [ '-fPIC' ]
- obj.cflags = [ '-fPIC' ]
+ obj = bld.stlib(features = 'c cxx cstlib cxxstlib', source=sources)
+ obj.cxxflags = [ bld.env['compiler_flags_dict']['pic'] ]
+ obj.cflags = [ bld.env['compiler_flags_dict']['pic'] ]
obj.defines = []
obj.export_includes = ['.']
@@ -403,18 +407,39 @@ def build(bld):
if bld.is_defined('AUDIOUNIT_SUPPORT'):
obj.source += [ 'audio_unit.cc' ]
+ avx_sources = []
+
if Options.options.fpu_optimization:
if (bld.env['build_target'] == 'i386' or bld.env['build_target'] == 'i686'):
- obj.source += [ 'sse_functions_xmm.cc', 'sse_functions.s' ]
+ obj.source += [ 'sse_functions_xmm.cc', 'sse_functions.s', ]
+ avx_sources = [ 'sse_functions_avx_linux.cc' ]
elif bld.env['build_target'] == 'x86_64':
- obj.source += [ 'sse_functions_xmm.cc', 'sse_functions_64bit.s' ]
+ obj.source += [ 'sse_functions_xmm.cc', 'sse_functions_64bit.s', ]
+ avx_sources = [ 'sse_functions_avx_linux.cc' ]
elif bld.env['build_target'] == 'mingw':
- # usability of the 64 bit windows assembler depends on the compiler target,
- # not the build host, which in turn can only be inferred from the name
- # of the compiler.
- if re.search ('/^x86_64/', str(bld.env['CC'])):
- obj.source += [ 'sse_functions_xmm.cc', 'sse_functions_64bit_win.s' ]
-
+ # usability of the 64 bit windows assembler depends on the compiler target,
+ # not the build host, which in turn can only be inferred from the name
+ # of the compiler.
+ if re.search ('x86_64-w64', str(bld.env['CC'])):
+ obj.source += [ 'sse_functions_xmm.cc' ]
+ obj.source += [ 'sse_functions_64bit_win.s', 'sse_avx_functions_64bit_win.s' ]
+ avx_sources = [ 'sse_functions_avx.cc' ]
+
+ if avx_sources:
+ # as long as we want to use AVX intrinsics in this file,
+ # compile it with -mavx flag - append avx flag to the existing
+ avx_cxxflags = list(bld.env['CXXFLAGS'])
+ avx_cxxflags.append (bld.env['compiler_flags_dict']['avx'])
+ avx_cxxflags.append (bld.env['compiler_flags_dict']['pic'])
+ bld(features = 'cxx',
+ source = avx_sources,
+ cxxflags = avx_cxxflags,
+ includes = [ '.' ],
+ use = [ 'libtimecode', 'libpbd', 'libevoral', ],
+ target = 'sse_avx_functions')
+
+ obj.use += ['sse_avx_functions' ]
+
# i18n
if bld.is_defined('ENABLE_NLS'):
mo_files = bld.path.ant_glob('po/*.mo')
@@ -446,14 +471,6 @@ def build(bld):
]
testcommon.name = 'testcommon'
- if bld.env['FPU_OPTIMIZATION']:
- testcommon.source += [ 'sse_functions_xmm.cc' ]
- if (bld.env['build_target'] == 'i386'
- or bld.env['build_target'] == 'i686'):
- testcommon.source += [ 'sse_functions.s' ]
- elif bld.env['build_target'] == 'x86_64':
- testcommon.source += [ 'sse_functions_64bit.s' ]
-
if bld.env['SINGLE_TESTS']:
create_ardour_test_program(bld, obj.includes, 'audio_engine_test', 'test_audio_engine', ['test/audio_engine_test.cc'])
create_ardour_test_program(bld, obj.includes, 'automation_list_property_test', 'test_automation_list_property', ['test/automation_list_property_test.cc'])
@@ -471,6 +488,7 @@ def build(bld):
create_ardour_test_program(bld, obj.includes, 'region_naming', 'test_region_naming', ['test/region_naming_test.cc'])
create_ardour_test_program(bld, obj.includes, 'control_surface', 'test_control_surfaces', ['test/control_surfaces_test.cc'])
create_ardour_test_program(bld, obj.includes, 'mtdm_test', 'test_mtdm', ['test/mtdm_test.cc'])
+ create_ardour_test_program(bld, obj.includes, 'sha1_test', 'test_sha1', ['test/sha1_test.cc'])
create_ardour_test_program(bld, obj.includes, 'session_test', 'test_session', ['test/session_test.cc'])
test_sources = '''
@@ -490,6 +508,7 @@ def build(bld):
test/region_naming_test.cc
test/control_surfaces_test.cc
test/mtdm_test.cc
+ test/sha1_test.cc
test/session_test.cc
'''.split()
@@ -523,13 +542,6 @@ def build(bld):
'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
'LOCALEDIR="' + os.path.normpath(bld.env['LOCALEDIR']) + '"',
]
- if bld.env['FPU_OPTIMIZATION']:
- session_load_tester.source += [ 'sse_functions_xmm.cc' ]
- if (bld.env['build_target'] == 'i386'
- or bld.env['build_target'] == 'i686'):
- session_load_tester.source += [ 'sse_functions.s' ]
- elif bld.env['build_target'] == 'x86_64':
- session_load_tester.source += [ 'sse_functions_64bit.s' ]
# Profiling
for p in ['runpc', 'lots_of_regions', 'load_session']:
@@ -555,13 +567,6 @@ def build(bld):
'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
'LOCALEDIR="' + os.path.normpath(bld.env['LOCALEDIR']) + '"',
]
- if bld.env['FPU_OPTIMIZATION']:
- profilingobj.source += [ 'sse_functions_xmm.cc' ]
- if (bld.env['build_target'] == 'i386'
- or bld.env['build_target'] == 'i686'):
- profilingobj.source += [ 'sse_functions.s' ]
- elif bld.env['build_target'] == 'x86_64':
- profilingobj.source += [ 'sse_functions_64bit.s' ]
def create_ardour_test_program(bld, includes, name, target, sources):
testobj = bld(features = 'cxx cxxprogram')
diff --git a/libs/backends/alsa/select_sleep.h b/libs/ardouralsautil/ardouralsautil/deviceinfo.h
similarity index 58%
copy from libs/backends/alsa/select_sleep.h
copy to libs/ardouralsautil/ardouralsautil/deviceinfo.h
index ec6a93d..ab77831 100644
--- a/libs/backends/alsa/select_sleep.h
+++ b/libs/ardouralsautil/ardouralsautil/deviceinfo.h
@@ -1,5 +1,6 @@
/*
- * Copyright (C) 2004,2014 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2015 Robin Gareus <robin at gareus.org>
+ * 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
@@ -16,20 +17,18 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include <stdint.h>
-#include <sys/select.h>
+#ifndef __libardouralsautil_deviceinfo_h__
+#define __libardouralsautil_deviceinfo_h__
-/* select() sleeps _at most_ a given time.
- * (compared to usleep() or nanosleep() which sleep at least a given time)
- */
-static void select_sleep (uint64_t usec) {
- if (usec <= 10) return;
- fd_set fd;
- int max_fd=0;
- struct timeval tv;
- tv.tv_sec = usec / 1000000;
- tv.tv_usec = usec % 1000000;
- FD_ZERO (&fd);
- select (max_fd, &fd, NULL, NULL, &tv);
- // on Linux, tv reflects the actual time slept.
+namespace ARDOUR {
+
+ struct ALSADeviceInfo {
+ unsigned int max_channels;
+ unsigned int min_rate, max_rate;
+ unsigned long min_size, max_size;
+ bool valid;
+ };
+
+ int get_alsa_device_parameters (const char* device_name, const bool play, ALSADeviceInfo *nfo);
}
+#endif
diff --git a/libs/ardouralsautil/deviceparams.cc b/libs/ardouralsautil/deviceparams.cc
new file mode 100644
index 0000000..2e9f121
--- /dev/null
+++ b/libs/ardouralsautil/deviceparams.cc
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2015 Robin Gareus <robin at gareus.org>
+ * 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.
+ */
+
+#include <alsa/asoundlib.h>
+#include "pbd/convert.h"
+#include "ardouralsautil/deviceinfo.h"
+
+using namespace std;
+
+int
+ARDOUR::get_alsa_device_parameters (const char* device_name, const bool play, ALSADeviceInfo *nfo)
+{
+ snd_pcm_t *pcm;
+ snd_pcm_hw_params_t *hw_params;
+ std::string errmsg;
+ int err;
+
+ nfo->valid = false;
+
+ err = snd_pcm_open (&pcm, device_name,
+ play ? SND_PCM_STREAM_PLAYBACK : SND_PCM_STREAM_CAPTURE,
+ SND_PCM_NONBLOCK);
+
+ if (err < 0) {
+ fprintf (stderr, "ALSA: Cannot open device '%s': %s\n", device_name, snd_strerror (err));
+ return 1;
+ }
+
+ snd_pcm_hw_params_alloca (&hw_params);
+ err = snd_pcm_hw_params_any (pcm, hw_params);
+ if (err < 0) {
+ errmsg = "Cannot get hardware parameters";
+ goto error_out;
+ }
+
+ err = snd_pcm_hw_params_get_channels_max (hw_params, &nfo->max_channels);
+ if (err < 0) {
+ errmsg = "Cannot get maximum channels count";
+ goto error_out;
+ }
+
+ err = snd_pcm_hw_params_get_rate_min (hw_params, &nfo->min_rate, NULL);
+ if (err < 0) {
+ errmsg = "Cannot get minimum rate";
+ goto error_out;
+ }
+ err = snd_pcm_hw_params_get_rate_max (hw_params, &nfo->max_rate, NULL);
+ if (err < 0) {
+ errmsg = "Cannot get maximum rate";
+ goto error_out;
+ }
+
+ err = snd_pcm_hw_params_get_buffer_size_min (hw_params, &nfo->min_size);
+ if (err < 0) {
+ errmsg = "Cannot get minimum buffer size";
+ goto error_out;
+ }
+ err = snd_pcm_hw_params_get_buffer_size_max (hw_params, &nfo->max_size);
+ if (err < 0) {
+ errmsg = "Cannot get maximum buffer size";
+ goto error_out;
+ }
+ snd_pcm_close (pcm);
+ nfo->valid = true;
+ return 0;
+
+error_out:
+ fprintf (stderr, "ALSA: %s: %s\n", errmsg.c_str(), snd_strerror (err));
+ snd_pcm_close (pcm);
+ return 1;
+
+}
diff --git a/libs/ardouralsautil/wscript b/libs/ardouralsautil/wscript
index 7f70e2e..60be052 100644
--- a/libs/ardouralsautil/wscript
+++ b/libs/ardouralsautil/wscript
@@ -26,7 +26,8 @@ def build(bld):
if bld.is_defined('HAVE_ALSA'):
obj = bld(features = 'cxx cxxshlib')
obj.source = [
- 'devicelist.cc'
+ 'devicelist.cc',
+ 'deviceparams.cc'
]
obj.export_includes = ['.']
obj.includes = ['.']
diff --git a/libs/audiographer/macos/audiographer/audiographer.xcodeproj/project.pbxproj b/libs/audiographer/macos/audiographer/audiographer.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..650b7e1
--- /dev/null
+++ b/libs/audiographer/macos/audiographer/audiographer.xcodeproj/project.pbxproj
@@ -0,0 +1,166 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXFileReference section */
+ 435E66801A4AB63D00472D50 /* broadcast_info.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = broadcast_info.h; path = ../../audiographer/broadcast_info.h; sourceTree = "<group>"; };
+ 435E66811A4AB63D00472D50 /* debug_utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = debug_utils.h; path = ../../audiographer/debug_utils.h; sourceTree = "<group>"; };
+ 435E66821A4AB63D00472D50 /* debuggable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = debuggable.h; path = ../../audiographer/debuggable.h; sourceTree = "<group>"; };
+ 435E66831A4AB63D00472D50 /* exception.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = exception.h; path = ../../audiographer/exception.h; sourceTree = "<group>"; };
+ 435E66841A4AB63D00472D50 /* flag_debuggable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = flag_debuggable.h; path = ../../audiographer/flag_debuggable.h; sourceTree = "<group>"; };
+ 435E66851A4AB63D00472D50 /* flag_field.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = flag_field.h; path = ../../audiographer/flag_field.h; sourceTree = "<group>"; };
+ 435E66861A4AB63D00472D50 /* process_context.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = process_context.h; path = ../../audiographer/process_context.h; sourceTree = "<group>"; };
+ 435E66871A4AB63D00472D50 /* routines.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = routines.h; path = ../../audiographer/routines.h; sourceTree = "<group>"; };
+ 435E66881A4AB63D00472D50 /* sink.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sink.h; path = ../../audiographer/sink.h; sourceTree = "<group>"; };
+ 435E66891A4AB63D00472D50 /* source.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = source.h; path = ../../audiographer/source.h; sourceTree = "<group>"; };
+ 435E668A1A4AB63D00472D50 /* throwing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = throwing.h; path = ../../audiographer/throwing.h; sourceTree = "<group>"; };
+ 435E668B1A4AB63D00472D50 /* type_utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = type_utils.h; path = ../../audiographer/type_utils.h; sourceTree = "<group>"; };
+ 435E668C1A4AB63D00472D50 /* types.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../../audiographer/types.h; sourceTree = "<group>"; };
+ 435E668D1A4AB63D00472D50 /* visibility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = visibility.h; path = ../../audiographer/visibility.h; sourceTree = "<group>"; };
+ 435E668E1A4AB64B00472D50 /* chunker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = chunker.h; path = ../../audiographer/general/chunker.h; sourceTree = "<group>"; };
+ 435E668F1A4AB64B00472D50 /* deinterleaver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = deinterleaver.h; path = ../../audiographer/general/deinterleaver.h; sourceTree = "<group>"; };
+ 435E66901A4AB64B00472D50 /* interleaver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = interleaver.h; path = ../../audiographer/general/interleaver.h; sourceTree = "<group>"; };
+ 435E66911A4AB64B00472D50 /* normalizer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = normalizer.h; path = ../../audiographer/general/normalizer.h; sourceTree = "<group>"; };
+ 435E66921A4AB64B00472D50 /* peak_reader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = peak_reader.h; path = ../../audiographer/general/peak_reader.h; sourceTree = "<group>"; };
+ 435E66931A4AB64B00472D50 /* sample_format_converter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sample_format_converter.h; path = ../../audiographer/general/sample_format_converter.h; sourceTree = "<group>"; };
+ 435E66941A4AB64B00472D50 /* silence_trimmer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = silence_trimmer.h; path = ../../audiographer/general/silence_trimmer.h; sourceTree = "<group>"; };
+ 435E66951A4AB64B00472D50 /* sr_converter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sr_converter.h; path = ../../audiographer/general/sr_converter.h; sourceTree = "<group>"; };
+ 435E66961A4AB64B00472D50 /* threader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = threader.h; path = ../../audiographer/general/threader.h; sourceTree = "<group>"; };
+ 435E66981A4AB66B00472D50 /* sndfile_base.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sndfile_base.h; path = ../../audiographer/sndfile/sndfile_base.h; sourceTree = "<group>"; };
+ 435E66991A4AB66B00472D50 /* sndfile_reader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sndfile_reader.h; path = ../../audiographer/sndfile/sndfile_reader.h; sourceTree = "<group>"; };
+ 435E669A1A4AB66B00472D50 /* sndfile_writer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sndfile_writer.h; path = ../../audiographer/sndfile/sndfile_writer.h; sourceTree = "<group>"; };
+ 435E669B1A4AB66B00472D50 /* sndfile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sndfile.h; path = ../../audiographer/sndfile/sndfile.h; sourceTree = "<group>"; };
+ 435E669C1A4AB66B00472D50 /* tmp_file.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = tmp_file.h; path = ../../audiographer/sndfile/tmp_file.h; sourceTree = "<group>"; };
+ 435E669D1A4AB67A00472D50 /* identity_vertex.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = identity_vertex.h; path = ../../audiographer/utils/identity_vertex.h; sourceTree = "<group>"; };
+ 435E669E1A4AB67A00472D50 /* listed_source.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = listed_source.h; path = ../../audiographer/utils/listed_source.h; sourceTree = "<group>"; };
+ 435E669F1A4AB69E00472D50 /* debug_utils.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = debug_utils.cc; path = ../../src/debug_utils.cc; sourceTree = "<group>"; };
+ 435E66A01A4AB69E00472D50 /* routines.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = routines.cc; path = ../../src/routines.cc; sourceTree = "<group>"; };
+ 435E66A11A4AB6A800472D50 /* broadcast_info.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = broadcast_info.cc; path = ../../src/general/broadcast_info.cc; sourceTree = "<group>"; };
+ 435E66A21A4AB6A800472D50 /* normalizer.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = normalizer.cc; path = ../../src/general/normalizer.cc; sourceTree = "<group>"; };
+ 435E66A31A4AB6A800472D50 /* sample_format_converter.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = sample_format_converter.cc; path = ../../src/general/sample_format_converter.cc; sourceTree = "<group>"; };
+ 435E66A41A4AB6A800472D50 /* sr_converter.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = sr_converter.cc; path = ../../src/general/sr_converter.cc; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXGroup section */
+ 435E66711A4AB60C00472D50 = {
+ isa = PBXGroup;
+ children = (
+ 435E667F1A4AB61C00472D50 /* headers */,
+ 435E667E1A4AB61400472D50 /* src */,
+ );
+ sourceTree = "<group>";
+ };
+ 435E667E1A4AB61400472D50 /* src */ = {
+ isa = PBXGroup;
+ children = (
+ 435E66A11A4AB6A800472D50 /* broadcast_info.cc */,
+ 435E66A21A4AB6A800472D50 /* normalizer.cc */,
+ 435E66A31A4AB6A800472D50 /* sample_format_converter.cc */,
+ 435E66A41A4AB6A800472D50 /* sr_converter.cc */,
+ 435E669F1A4AB69E00472D50 /* debug_utils.cc */,
+ 435E66A01A4AB69E00472D50 /* routines.cc */,
+ );
+ name = src;
+ sourceTree = "<group>";
+ };
+ 435E667F1A4AB61C00472D50 /* headers */ = {
+ isa = PBXGroup;
+ children = (
+ 435E66971A4AB65700472D50 /* SND */,
+ 435E668E1A4AB64B00472D50 /* chunker.h */,
+ 435E668F1A4AB64B00472D50 /* deinterleaver.h */,
+ 435E66901A4AB64B00472D50 /* interleaver.h */,
+ 435E669D1A4AB67A00472D50 /* identity_vertex.h */,
+ 435E669E1A4AB67A00472D50 /* listed_source.h */,
+ 435E66911A4AB64B00472D50 /* normalizer.h */,
+ 435E66921A4AB64B00472D50 /* peak_reader.h */,
+ 435E66931A4AB64B00472D50 /* sample_format_converter.h */,
+ 435E66941A4AB64B00472D50 /* silence_trimmer.h */,
+ 435E66951A4AB64B00472D50 /* sr_converter.h */,
+ 435E66961A4AB64B00472D50 /* threader.h */,
+ 435E66801A4AB63D00472D50 /* broadcast_info.h */,
+ 435E66811A4AB63D00472D50 /* debug_utils.h */,
+ 435E66821A4AB63D00472D50 /* debuggable.h */,
+ 435E66831A4AB63D00472D50 /* exception.h */,
+ 435E66841A4AB63D00472D50 /* flag_debuggable.h */,
+ 435E66851A4AB63D00472D50 /* flag_field.h */,
+ 435E66861A4AB63D00472D50 /* process_context.h */,
+ 435E66871A4AB63D00472D50 /* routines.h */,
+ 435E66881A4AB63D00472D50 /* sink.h */,
+ 435E66891A4AB63D00472D50 /* source.h */,
+ 435E668A1A4AB63D00472D50 /* throwing.h */,
+ 435E668B1A4AB63D00472D50 /* type_utils.h */,
+ 435E668C1A4AB63D00472D50 /* types.h */,
+ 435E668D1A4AB63D00472D50 /* visibility.h */,
+ );
+ name = headers;
+ sourceTree = "<group>";
+ };
+ 435E66971A4AB65700472D50 /* SND */ = {
+ isa = PBXGroup;
+ children = (
+ 435E66981A4AB66B00472D50 /* sndfile_base.h */,
+ 435E66991A4AB66B00472D50 /* sndfile_reader.h */,
+ 435E669A1A4AB66B00472D50 /* sndfile_writer.h */,
+ 435E669B1A4AB66B00472D50 /* sndfile.h */,
+ 435E669C1A4AB66B00472D50 /* tmp_file.h */,
+ );
+ name = SND;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXProject section */
+ 435E66721A4AB60C00472D50 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0610;
+ };
+ buildConfigurationList = 435E66751A4AB60C00472D50 /* Build configuration list for PBXProject "audiographer" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 435E66711A4AB60C00472D50;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ );
+ };
+/* End PBXProject section */
+
+/* Begin XCBuildConfiguration section */
+ 435E66761A4AB60C00472D50 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ 435E66771A4AB60C00472D50 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 435E66751A4AB60C00472D50 /* Build configuration list for PBXProject "audiographer" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 435E66761A4AB60C00472D50 /* Debug */,
+ 435E66771A4AB60C00472D50 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 435E66721A4AB60C00472D50 /* Project object */;
+}
diff --git a/libs/audiographer/wscript b/libs/audiographer/wscript
index 2fe2739..d3efbf5 100644
--- a/libs/audiographer/wscript
+++ b/libs/audiographer/wscript
@@ -70,7 +70,7 @@ def build(bld):
# macros for this shared library
audiographer.defines = [ 'LIBAUDIOGRAPHER_DLL_EXPORTS=1' ]
else:
- audiographer = bld.stlib(features = 'c cxx cstlib cxxstlib', source=libardour_sources)
+ audiographer = bld.stlib(features = 'c cxx cstlib cxxstlib', source=audiographer_sources)
audiographer.cxxflags = [ '-fPIC' ]
audiographer.cflags = [ '-fPIC' ]
audiographer.defines = []
diff --git a/libs/backends/MSVCbackends/portaudio_audiobackend.vcproj b/libs/backends/MSVCbackends/portaudio_audiobackend.vcproj
index 610891a..2120a32 100644
--- a/libs/backends/MSVCbackends/portaudio_audiobackend.vcproj
+++ b/libs/backends/MSVCbackends/portaudio_audiobackend.vcproj
@@ -42,7 +42,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\portaudio;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\boost";..\..;..\..\..\..\support\MB3Portaudio\include"
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_PORTAUDIO_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_PORTAUDIO_BACKEND;WITH_ASIO;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -124,7 +124,7 @@
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..;..\portaudio;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\boost";..\..;..\..\..\..\support\MB3Portaudio\include"
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_PORTAUDIO_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_PORTAUDIO_BACKEND;WITH_ASIO;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -206,7 +206,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\portaudio;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\boost";..\..;..\..\..\..\support\MB3Portaudio\include"
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_PORTAUDIO_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_PORTAUDIO_BACKEND;WITH_ASIO;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -269,6 +269,14 @@
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
+ RelativePath="..\portaudio\midi_util.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\portaudio\mmcss.cc"
+ >
+ </File>
+ <File
RelativePath="..\portaudio\portaudio_backend.cc"
>
</File>
@@ -276,6 +284,22 @@
RelativePath="..\portaudio\portaudio_io.cc"
>
</File>
+ <File
+ RelativePath="..\portaudio\win_utils.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\portaudio\winmmemidi_input_device.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\portaudio\winmmemidi_io.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\portaudio\winmmemidi_output_device.cc"
+ >
+ </File>
</Filter>
<Filter
Name="Header Files"
@@ -283,6 +307,22 @@
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
+ RelativePath="..\portaudio\cycle_timer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\portaudio\debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\portaudio\midi_util.h"
+ >
+ </File>
+ <File
+ RelativePath="..\portaudio\mmcss.h"
+ >
+ </File>
+ <File
RelativePath="..\portaudio\portaudio_backend.h"
>
</File>
@@ -294,6 +334,22 @@
RelativePath="..\portaudio\rt_thread.h"
>
</File>
+ <File
+ RelativePath="..\portaudio\win_utils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\portaudio\winmmemidi_input_device.h"
+ >
+ </File>
+ <File
+ RelativePath="..\portaudio\winmmemidi_io.h"
+ >
+ </File>
+ <File
+ RelativePath="..\portaudio\winmmemidi_output_device.h"
+ >
+ </File>
</Filter>
<Filter
Name="Resource Files"
diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc
index ab6c029..9e81170 100644
--- a/libs/backends/alsa/alsa_audiobackend.cc
+++ b/libs/backends/alsa/alsa_audiobackend.cc
@@ -44,6 +44,9 @@ std::vector<AudioBackend::DeviceStatus> AlsaAudioBackend::_output_audio_device_s
std::vector<AudioBackend::DeviceStatus> AlsaAudioBackend::_duplex_audio_device_status;
std::vector<AudioBackend::DeviceStatus> AlsaAudioBackend::_midi_device_status;
+ALSADeviceInfo AlsaAudioBackend::_input_audio_device_info;
+ALSADeviceInfo AlsaAudioBackend::_output_audio_device_info;
+
AlsaAudioBackend::AlsaAudioBackend (AudioEngine& e, AudioBackendInfo& info)
: AudioBackend (e, info)
, _pcmi (0)
@@ -70,6 +73,8 @@ AlsaAudioBackend::AlsaAudioBackend (AudioEngine& e, AudioBackendInfo& info)
{
_instance_name = s_instance_name;
pthread_mutex_init (&_port_callback_mutex, 0);
+ _input_audio_device_info.valid = false;
+ _output_audio_device_info.valid = false;
}
AlsaAudioBackend::~AlsaAudioBackend ()
@@ -211,47 +216,118 @@ AlsaAudioBackend::acquire_device(const char* device_name)
}
std::vector<float>
-AlsaAudioBackend::available_sample_rates (const std::string&) const
+AlsaAudioBackend::available_sample_rates2 (const std::string& input_device, const std::string& output_device) const
{
std::vector<float> sr;
- sr.push_back (8000.0);
- sr.push_back (22050.0);
- sr.push_back (24000.0);
- sr.push_back (44100.0);
- sr.push_back (48000.0);
- sr.push_back (88200.0);
- sr.push_back (96000.0);
- sr.push_back (176400.0);
- sr.push_back (192000.0);
+ if (input_device == _("None") && output_device == _("None")) {
+ return sr;
+ }
+ else if (input_device == _("None")) {
+ sr = available_sample_rates (output_device);
+ }
+ else if (output_device == _("None")) {
+ sr = available_sample_rates (input_device);
+ } else {
+ std::vector<float> sr_in = available_sample_rates (input_device);
+ std::vector<float> sr_out = available_sample_rates (output_device);
+ std::set_intersection (sr_in.begin(), sr_in.end(), sr_out.begin(), sr_out.end(), std::back_inserter(sr));
+ }
+ return sr;
+}
+
+std::vector<float>
+AlsaAudioBackend::available_sample_rates (const std::string& device) const
+{
+ ALSADeviceInfo *nfo = NULL;
+ std::vector<float> sr;
+ if (device == _("None")) {
+ return sr;
+ }
+ if (device == _input_audio_device && _input_audio_device_info.valid) {
+ nfo = &_input_audio_device_info;
+ }
+ else if (device == _output_audio_device && _output_audio_device_info.valid) {
+ nfo = &_output_audio_device_info;
+ }
+
+ static const float avail_rates [] = { 8000, 22050.0, 24000.0, 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0 };
+
+ for (size_t i = 0 ; i < sizeof(avail_rates) / sizeof(float); ++i) {
+ if (!nfo || (avail_rates[i] >= nfo->min_rate && avail_rates[i] <= nfo->max_rate)) {
+ sr.push_back (avail_rates[i]);
+ }
+ }
+
return sr;
}
std::vector<uint32_t>
-AlsaAudioBackend::available_buffer_sizes (const std::string&) const
+AlsaAudioBackend::available_buffer_sizes2 (const std::string& input_device, const std::string& output_device) const
{
std::vector<uint32_t> bs;
- 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);
+ if (input_device == _("None") && output_device == _("None")) {
+ return bs;
+ }
+ else if (input_device == _("None")) {
+ bs = available_buffer_sizes (output_device);
+ }
+ else if (output_device == _("None")) {
+ bs = available_buffer_sizes (input_device);
+ } else {
+ std::vector<uint32_t> bs_in = available_buffer_sizes (input_device);
+ std::vector<uint32_t> bs_out = available_buffer_sizes (output_device);
+ std::set_intersection (bs_in.begin(), bs_in.end(), bs_out.begin(), bs_out.end(), std::back_inserter(bs));
+ }
+ return bs;
+}
+
+std::vector<uint32_t>
+AlsaAudioBackend::available_buffer_sizes (const std::string& device) const
+{
+ ALSADeviceInfo *nfo = NULL;
+ std::vector<uint32_t> bs;
+ if (device == _("None")) {
+ return bs;
+ }
+ if (device == _input_audio_device && _input_audio_device_info.valid) {
+ nfo = &_input_audio_device_info;
+ }
+ else if (device == _output_audio_device && _output_audio_device_info.valid) {
+ nfo = &_output_audio_device_info;
+ }
+
+ static const unsigned long avail_sizes [] = { 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 };
+
+ for (size_t i = 0 ; i < sizeof(avail_sizes) / sizeof(unsigned long); ++i) {
+ if (!nfo || (avail_sizes[i] >= nfo->min_size && avail_sizes[i] <= nfo->max_size)) {
+ bs.push_back (avail_sizes[i]);
+ }
+ }
return bs;
}
uint32_t
-AlsaAudioBackend::available_input_channel_count (const std::string&) const
+AlsaAudioBackend::available_input_channel_count (const std::string& device) const
{
- return 128; // TODO query current device
+ if (device == _("None")) {
+ return 0;
+ }
+ if (device == _input_audio_device && _input_audio_device_info.valid) {
+ return _input_audio_device_info.max_channels;
+ }
+ return 128;
}
uint32_t
-AlsaAudioBackend::available_output_channel_count (const std::string&) const
+AlsaAudioBackend::available_output_channel_count (const std::string& device) const
{
- return 128; // TODO query current device
+ if (device == _("None")) {
+ return 0;
+ }
+ if (device == _output_audio_device && _output_audio_device_info.valid) {
+ return _output_audio_device_info.max_channels;
+ }
+ return 128;
}
bool
@@ -269,14 +345,62 @@ AlsaAudioBackend::can_change_buffer_size_when_running () const
int
AlsaAudioBackend::set_input_device_name (const std::string& d)
{
+ if (_input_audio_device == d) {
+ return 0;
+ }
_input_audio_device = d;
+
+ if (d == _("None")) {
+ _input_audio_device_info.valid = false;
+ return 0;
+ }
+ std::string alsa_device;
+ std::map<std::string, std::string> devices;
+
+ get_alsa_audio_device_names(devices, HalfDuplexIn);
+ for (std::map<std::string, std::string>::const_iterator i = devices.begin (); i != devices.end(); ++i) {
+ if (i->first == d) {
+ alsa_device = i->second;
+ break;
+ }
+ }
+ if (alsa_device == "") {
+ _input_audio_device_info.valid = false;
+ return 1;
+ }
+ /* device will be busy once used, hence cache the parameters */
+ /* return */ get_alsa_device_parameters (alsa_device.c_str(), true, &_input_audio_device_info);
return 0;
}
int
AlsaAudioBackend::set_output_device_name (const std::string& d)
{
+ if (_output_audio_device == d) {
+ return 0;
+ }
+
_output_audio_device = d;
+
+ if (d == _("None")) {
+ _output_audio_device_info.valid = false;
+ return 0;
+ }
+ std::string alsa_device;
+ std::map<std::string, std::string> devices;
+
+ get_alsa_audio_device_names(devices, HalfDuplexOut);
+ for (std::map<std::string, std::string>::const_iterator i = devices.begin (); i != devices.end(); ++i) {
+ if (i->first == d) {
+ alsa_device = i->second;
+ break;
+ }
+ }
+ if (alsa_device == "") {
+ _output_audio_device_info.valid = false;
+ return 1;
+ }
+ /* return */ get_alsa_device_parameters (alsa_device.c_str(), true, &_output_audio_device_info);
return 0;
}
diff --git a/libs/backends/alsa/alsa_audiobackend.h b/libs/backends/alsa/alsa_audiobackend.h
index 49066e3..e604fe0 100644
--- a/libs/backends/alsa/alsa_audiobackend.h
+++ b/libs/backends/alsa/alsa_audiobackend.h
@@ -34,6 +34,8 @@
#include "ardour/system_exec.h"
#include "ardour/types.h"
+#include "ardouralsautil/deviceinfo.h"
+
#include "zita-alsa-pcmi.h"
#include "alsa_rawmidi.h"
#include "alsa_sequencer.h"
@@ -169,7 +171,9 @@ class AlsaAudioBackend : public AudioBackend {
std::vector<DeviceStatus> enumerate_input_devices () const;
std::vector<DeviceStatus> enumerate_output_devices () const;
std::vector<float> available_sample_rates (const std::string& device) const;
+ std::vector<float> available_sample_rates2 (const std::string&, const std::string&) const;
std::vector<uint32_t> available_buffer_sizes (const std::string& device) const;
+ std::vector<uint32_t> available_buffer_sizes2 (const std::string&, const std::string&) const;
uint32_t available_input_channel_count (const std::string& device) const;
uint32_t available_output_channel_count (const std::string& device) const;
@@ -319,6 +323,8 @@ class AlsaAudioBackend : public AudioBackend {
static std::vector<AudioBackend::DeviceStatus> _output_audio_device_status;
static std::vector<AudioBackend::DeviceStatus> _duplex_audio_device_status;
static std::vector<AudioBackend::DeviceStatus> _midi_device_status;
+ static ARDOUR::ALSADeviceInfo _input_audio_device_info;
+ static ARDOUR::ALSADeviceInfo _output_audio_device_info;
mutable std::string _input_audio_device;
mutable std::string _output_audio_device;
diff --git a/libs/backends/coreaudio/coreaudio_backend.cc b/libs/backends/coreaudio/coreaudio_backend.cc
index 09bab52..4e01a26 100644
--- a/libs/backends/coreaudio/coreaudio_backend.cc
+++ b/libs/backends/coreaudio/coreaudio_backend.cc
@@ -17,6 +17,21 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+
+/* use an additional midi message parser
+ *
+ * coreaudio does packetize midi. every packet includes a timestamp.
+ * With any real midi-device with a phyical layer
+ * 1 packet = 1 event (no concurrent events are possible on a cable)
+ *
+ * Howver, some USB-midi keyboards manage to send concurrent events
+ * which end up in the same packet (eg. 6 byte message: 2 note-on).
+ *
+ * An additional parser is needed to separate them
+ */
+#define USE_MIDI_PARSER
+
+
#include <regex.h>
#include <sys/mman.h>
#include <sys/time.h>
@@ -104,6 +119,13 @@ CoreAudioBackend::CoreAudioBackend (AudioEngine& e, AudioBackendInfo& info)
, _dsp_load (0)
, _processed_samples (0)
, _port_change_flag (false)
+#ifdef USE_MIDI_PARSER
+ , _unbuffered_bytes(0)
+ , _total_bytes(0)
+ , _expected_bytes(0)
+ , _status_byte(0)
+ , _parser_bytes(0)
+#endif
{
_instance_name = s_instance_name;
pthread_mutex_init (&_port_callback_mutex, 0);
@@ -189,27 +211,36 @@ CoreAudioBackend::enumerate_output_devices () const
}
std::vector<float>
-CoreAudioBackend::available_sample_rates (const std::string&) const
+CoreAudioBackend::available_sample_rates (const std::string& device) const
+{
+ std::vector<float> sr;
+ _pcmio->available_sample_rates (name_to_id (device), sr);
+ return sr;
+}
+
+std::vector<float>
+CoreAudioBackend::available_sample_rates2 (const std::string& input_device, const std::string& output_device) const
{
std::vector<float> sr;
std::vector<float> sr_in;
std::vector<float> sr_out;
- const uint32_t inp = name_to_id(_input_audio_device);
- const uint32_t out = name_to_id(_output_audio_device);
+ const uint32_t inp = name_to_id (input_device);
+ const uint32_t out = name_to_id (output_device);
+
if (inp == UINT32_MAX && out == UINT32_MAX) {
return sr;
} else if (inp == UINT32_MAX) {
- _pcmio->available_sample_rates(out, sr_out);
+ _pcmio->available_sample_rates (out, sr_out);
return sr_out;
} else if (out == UINT32_MAX) {
- _pcmio->available_sample_rates(inp, sr_in);
+ _pcmio->available_sample_rates (inp, sr_in);
return sr_in;
} else {
- _pcmio->available_sample_rates(inp, sr_in);
- _pcmio->available_sample_rates(out, sr_out);
+ _pcmio->available_sample_rates (inp, sr_in);
+ _pcmio->available_sample_rates (out, sr_out);
// TODO allow to use different SR per device, tweak aggregate
- std::set_intersection(sr_in.begin(), sr_in.end(), sr_out.begin(), sr_out.end(), std::back_inserter(sr));
+ std::set_intersection (sr_in.begin(), sr_in.end(), sr_out.begin(), sr_out.end(), std::back_inserter(sr));
return sr;
}
}
@@ -218,10 +249,34 @@ std::vector<uint32_t>
CoreAudioBackend::available_buffer_sizes (const std::string& device) const
{
std::vector<uint32_t> bs;
- _pcmio->available_buffer_sizes(name_to_id(device), bs);
+ _pcmio->available_buffer_sizes (name_to_id (device), bs);
return bs;
}
+std::vector<uint32_t>
+CoreAudioBackend::available_buffer_sizes2 (const std::string& input_device, const std::string& output_device) const
+{
+ std::vector<uint32_t> bs;
+ std::vector<uint32_t> bs_in;
+ std::vector<uint32_t> bs_out;
+ const uint32_t inp = name_to_id (input_device);
+ const uint32_t out = name_to_id (output_device);
+ if (inp == UINT32_MAX && out == UINT32_MAX) {
+ return bs;
+ } else if (inp == UINT32_MAX) {
+ _pcmio->available_buffer_sizes (out, bs_out);
+ return bs_out;
+ } else if (out == UINT32_MAX) {
+ _pcmio->available_buffer_sizes (inp, bs_in);
+ return bs_in;
+ } else {
+ _pcmio->available_buffer_sizes (inp, bs_in);
+ _pcmio->available_buffer_sizes (out, bs_out);
+ std::set_intersection (bs_in.begin(), bs_in.end(), bs_out.begin(), bs_out.end(), std::back_inserter(bs));
+ return bs;
+ }
+}
+
uint32_t
CoreAudioBackend::available_input_channel_count (const std::string&) const
{
@@ -277,7 +332,7 @@ CoreAudioBackend::set_output_device_name (const std::string& d)
int
CoreAudioBackend::set_sample_rate (float sr)
{
- std::vector<float> srs = available_sample_rates (/* really ignored */_input_audio_device);
+ std::vector<float> srs = available_sample_rates2 (_input_audio_device, _output_audio_device);
if (std::find(srs.begin(), srs.end(), sr) == srs.end()) {
return -1;
}
@@ -425,7 +480,12 @@ CoreAudioBackend::midi_option () const
void
CoreAudioBackend::launch_control_app ()
{
- _pcmio->launch_control_app(name_to_id(_input_audio_device));
+ if (name_to_id (_input_audio_device) != UINT32_MAX) {
+ _pcmio->launch_control_app(name_to_id(_input_audio_device));
+ }
+ if (name_to_id (_output_audio_device) != UINT32_MAX) {
+ _pcmio->launch_control_app(name_to_id(_output_audio_device));
+ }
}
/* State Control */
@@ -1559,6 +1619,100 @@ CoreAudioBackend::freewheel_thread ()
return 0;
}
+#ifdef USE_MIDI_PARSER
+bool
+CoreAudioBackend::midi_process_byte (const uint8_t byte)
+{
+ if (byte >= 0xf8) {
+ // Realtime
+ if (byte == 0xfd) {
+ // undefined
+ return false;
+ }
+ midi_prepare_byte_event (byte);
+ return true;
+ }
+ if (byte == 0xf7) {
+ // Sysex end
+ if (_status_byte == 0xf0) {
+ midi_record_byte (byte);
+ return midi_prepare_buffered_event ();
+ }
+ _total_bytes = 0;
+ _unbuffered_bytes = 0;
+ _expected_bytes = 0;
+ _status_byte = 0;
+ return false;
+ }
+ if (byte >= 0x80) {
+ // Non-realtime status byte
+ if (_total_bytes) {
+ _total_bytes = 0;
+ _unbuffered_bytes = 0;
+ }
+ _status_byte = byte;
+ switch (byte & 0xf0) {
+ case 0x80:
+ case 0x90:
+ case 0xa0:
+ case 0xb0:
+ case 0xe0:
+ // Note On, Note Off, Aftertouch, Control Change, Pitch Wheel
+ _expected_bytes = 3;
+ break;
+ case 0xc0:
+ case 0xd0:
+ // Program Change, Channel Pressure
+ _expected_bytes = 2;
+ break;
+ case 0xf0:
+ switch (byte) {
+ case 0xf0:
+ // Sysex
+ _expected_bytes = 0;
+ break;
+ case 0xf1:
+ case 0xf3:
+ // MTC Quarter Frame, Song Select
+ _expected_bytes = 2;
+ break;
+ case 0xf2:
+ // Song Position
+ _expected_bytes = 3;
+ break;
+ case 0xf4:
+ case 0xf5:
+ // Undefined
+ _expected_bytes = 0;
+ _status_byte = 0;
+ return false;
+ case 0xf6:
+ // Tune Request
+ midi_prepare_byte_event (byte);
+ _expected_bytes = 0;
+ _status_byte = 0;
+ return true;
+ }
+ }
+ midi_record_byte (byte);
+ return false;
+ }
+ // Data byte
+ if (! _status_byte) {
+ // Data bytes without a status will be discarded.
+ _total_bytes++;
+ _unbuffered_bytes++;
+ return false;
+ }
+ if (! _total_bytes) {
+ midi_record_byte (_status_byte);
+ }
+ midi_record_byte(byte);
+ return (_total_bytes == _expected_bytes) ? midi_prepare_buffered_event() : false;
+}
+#endif
+
+
int
CoreAudioBackend::process_callback (const uint32_t n_samples, const uint64_t host_time)
{
@@ -1614,7 +1768,29 @@ CoreAudioBackend::process_callback (const uint32_t n_samples, const uint64_t hos
while (_midiio->recv_event (i, nominal_time, time_ns, data, size)) {
pframes_t time = floor((float) time_ns * _samplerate * 1e-9);
assert (time < n_samples);
+#ifndef USE_MIDI_PARSER
midi_event_put((void*)mbuf, time, data, size);
+#else
+ assert (size < 128);// coremidi limit per packet
+ bool first_time = true; // this would need to be rememberd per port.
+ for (size_t mb = 0; mb < size; ++mb) {
+ if (first_time && !(data[mb] & 0x80)) {
+ /* expect a status byte at the beginning or every Packet.
+ *
+ * This parser drops messages spanning multiple packets
+ * (sysex > 127 bytes).
+ * see also libs/backends/alsa/alsa_rawmidi.cc
+ * which implements a complete parser per port without this limit.
+ */
+ continue;
+ }
+ first_time = false;
+
+ if (midi_process_byte (data[mb])) {
+ midi_event_put ((void*)mbuf, time, _parser_buffer, _parser_bytes);
+ }
+ }
+#endif
size = sizeof(data);
}
}
diff --git a/libs/backends/coreaudio/coreaudio_backend.h b/libs/backends/coreaudio/coreaudio_backend.h
index 3300fc4..55aaf47 100644
--- a/libs/backends/coreaudio/coreaudio_backend.h
+++ b/libs/backends/coreaudio/coreaudio_backend.h
@@ -171,7 +171,9 @@ class CoreAudioBackend : public AudioBackend {
std::vector<DeviceStatus> enumerate_output_devices () const;
std::vector<float> available_sample_rates (const std::string& device) const;
+ std::vector<float> available_sample_rates2 (const std::string&, const std::string&) const;
std::vector<uint32_t> available_buffer_sizes (const std::string& device) const;
+ std::vector<uint32_t> available_buffer_sizes2 (const std::string&, const std::string&) const;
uint32_t available_input_channel_count (const std::string& device) const;
uint32_t available_output_channel_count (const std::string& device) const;
@@ -445,6 +447,46 @@ class CoreAudioBackend : public AudioBackend {
return NULL;
}
+#ifdef USE_MIDI_PARSER
+
+ bool midi_process_byte (const uint8_t);
+
+ void midi_record_byte (uint8_t byte) {
+ if (_total_bytes < sizeof (_parser_buffer)) {
+ _parser_buffer[_total_bytes] = byte;
+ } else {
+ ++_unbuffered_bytes;
+ }
+ ++_total_bytes;
+ }
+
+ void midi_prepare_byte_event (const uint8_t byte) {
+ _parser_buffer[0] = byte;
+ _parser_bytes = 1;
+ }
+
+ bool midi_prepare_buffered_event () {
+ const bool result = _unbuffered_bytes == 0;
+ if (result) {
+ _parser_bytes = _total_bytes;
+ }
+ _total_bytes = 0;
+ _unbuffered_bytes = 0;
+ if (_status_byte >= 0xf0) {
+ _expected_bytes = 0;
+ _status_byte = 0;
+ }
+ return result;
+ }
+
+ size_t _unbuffered_bytes;
+ size_t _total_bytes;
+ size_t _expected_bytes;
+ uint8_t _status_byte;
+ uint8_t _parser_buffer[128];
+ uint8_t _parser_bytes;
+#endif
+
}; // class CoreAudioBackend
} // namespace
diff --git a/libs/backends/coreaudio/coreaudio_pcmio.cc b/libs/backends/coreaudio/coreaudio_pcmio.cc
index b6105c9..5be717b 100644
--- a/libs/backends/coreaudio/coreaudio_pcmio.cc
+++ b/libs/backends/coreaudio/coreaudio_pcmio.cc
@@ -82,7 +82,7 @@ static OSStatus GetHardwarePropertyWrapper (AudioDevicePropertyID prop, UInt32*
property_address.mElement = kAudioObjectPropertyElementMaster;
return AudioObjectGetPropertyData(kAudioObjectSystemObject, &property_address, 0, NULL, size, d);
#else
- return AudioHardwareGetProperty (kAudioHardwarePropertyDevices, size, d);
+ return AudioHardwareGetProperty (prop, size, d);
#endif
}
@@ -822,12 +822,21 @@ CoreAudioPCM::pcm_start (
AudioDeviceID device_id;
AudioStreamBasicDescription srcFormat, dstFormat;
+#ifndef COREAUDIO_108
+ ComponentDescription cd = {kAudioUnitType_Output, kAudioUnitSubType_HALOutput, kAudioUnitManufacturer_Apple, 0, 0};
+ Component HALOutput = FindNextComponent(NULL, &cd);
+ if (!HALOutput) { errorMsg="FindNextComponent"; goto error; }
+
+ err = OpenAComponent(HALOutput, &_auhal);
+ if (err != noErr) { errorMsg="OpenAComponent"; goto error; }
+#else
AudioComponentDescription cd = {kAudioUnitType_Output, kAudioUnitSubType_HALOutput, kAudioUnitManufacturer_Apple, 0, 0};
AudioComponent HALOutput = AudioComponentFindNext(NULL, &cd);
if (!HALOutput) { errorMsg="AudioComponentFindNext"; goto error; }
err = AudioComponentInstanceNew(HALOutput, &_auhal);
if (err != noErr) { errorMsg="AudioComponentInstanceNew"; goto error; }
+#endif
err = AudioUnitInitialize(_auhal);
if (err != noErr) { errorMsg="AudioUnitInitialize"; goto error; }
diff --git a/libs/backends/coreaudio/coremidi_io.cc b/libs/backends/coreaudio/coremidi_io.cc
index 0cef589..a64fade 100644
--- a/libs/backends/coreaudio/coremidi_io.cc
+++ b/libs/backends/coreaudio/coremidi_io.cc
@@ -24,28 +24,71 @@
using namespace ARDOUR;
+#ifndef NDEBUG
+static int _debug_mode = 0;
+#endif
+
static void notifyProc (const MIDINotification *message, void *refCon) {
CoreMidiIo *self = static_cast<CoreMidiIo*>(refCon);
self->notify_proc(message);
}
+#ifndef NDEBUG
+static void print_packet (const MIDIPacket *p) {
+ fprintf (stderr, "CoreMIDI: Packet %d bytes [ ", p->length);
+ for (int bb = 0; bb < p->length; ++bb) {
+ fprintf (stderr, "%02x ", ((uint8_t*)p->data)[bb]);
+ }
+ fprintf (stderr, "]\n");
+}
+
+static void dump_packet_list (const UInt32 numPackets, MIDIPacket const *p) {
+ for (UInt32 i = 0; i < numPackets; ++i) {
+ print_packet (p);
+ p = MIDIPacketNext (p);
+ }
+}
+#endif
+
static void midiInputCallback(const MIDIPacketList *list, void *procRef, void *srcRef) {
CoreMidiIo *self = static_cast<CoreMidiIo*> (procRef);
if (!self || !self->enabled()) {
// skip while freewheeling
+#ifndef NDEBUG
+ if (_debug_mode & 2) {
+ fprintf (stderr, "Ignored Midi Packet while freewheeling:\n");
+ dump_packet_list (list->numPackets, &list->packet[0]);
+ }
+#endif
return;
}
RingBuffer<uint8_t> * rb = static_cast<RingBuffer < uint8_t > *> (srcRef);
- if (!rb) return;
+ if (!rb) {
+#ifndef NDEBUG
+ if (_debug_mode & 4) {
+ fprintf (stderr, "Ignored Midi Packet - no ringbuffer:\n");
+ dump_packet_list (list->numPackets, &list->packet[0]);
+ }
+#endif
+ return;
+ }
MIDIPacket const *p = &list->packet[0];
for (UInt32 i = 0; i < list->numPackets; ++i) {
uint32_t len = ((p->length + 3)&~3) + sizeof(MIDITimeStamp) + sizeof(UInt16);
- if (rb->write_space() < sizeof(uint32_t) + len) {
- fprintf(stderr, "CoreMIDI: dropped MIDI event\n");
- continue;
+#ifndef NDEBUG
+ if (_debug_mode & 1) {
+ print_packet (p);
}
- rb->write ((uint8_t*)&len, sizeof(uint32_t));
- rb->write ((uint8_t*)p, len);
+#endif
+ if (rb->write_space() > sizeof(uint32_t) + len) {
+ rb->write ((uint8_t*)&len, sizeof(uint32_t));
+ rb->write ((uint8_t*)p, len);
+ }
+#ifndef NDEBUG
+ else {
+ fprintf (stderr, "CoreMIDI: dropped MIDI event\n");
+ }
+#endif
p = MIDIPacketNext (p);
}
}
@@ -88,6 +131,11 @@ CoreMidiIo::CoreMidiIo()
, _changed_arg (0)
{
pthread_mutex_init (&_discovery_lock, 0);
+
+#ifndef NDEBUG
+ const char *p = getenv ("COREMIDIDEBUG");
+ if (p && *p) _debug_mode = atoi (p);
+#endif
}
CoreMidiIo::~CoreMidiIo()
diff --git a/libs/backends/coreaudio/wscript b/libs/backends/coreaudio/wscript
index 75bed91..9aad9cd 100644
--- a/libs/backends/coreaudio/wscript
+++ b/libs/backends/coreaudio/wscript
@@ -30,7 +30,7 @@ def build(bld):
obj.target = 'coreaudio_backend'
obj.use = 'libardour libpbd'
obj.framework = [ 'CoreAudio', 'AudioToolbox', 'CoreServices' ]
- if bld.env['build_target'] not in [ 'lion' ]:
+ if bld.env['build_target'] not in [ 'lion' ] and (not bld.env['build_arch'] == "ppc"):
obj.framework += [ 'CoreMidi' ]
else:
obj.framework += [ 'CoreMIDI' ]
diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc
index 680c5a6..66978ef 100644
--- a/libs/backends/dummy/dummy_audiobackend.cc
+++ b/libs/backends/dummy/dummy_audiobackend.cc
@@ -93,7 +93,7 @@ DummyAudioBackend::~DummyAudioBackend ()
std::string
DummyAudioBackend::name () const
{
- return X_("Dummy");
+ return X_("Dummy"); // internal name
}
bool
@@ -1312,7 +1312,7 @@ static bool already_configured ();
static bool available ();
static ARDOUR::AudioBackendInfo _descriptor = {
- "Dummy",
+ _("None (Dummy)"),
instantiate,
deinstantiate,
backend_factory,
@@ -1737,7 +1737,7 @@ void DummyAudioPort::generate (const pframes_t n_samples)
{
const float vols = 2.f / (float)_gen_perio2;
for (pframes_t i = 0; i < n_samples; ++i) {
- const float g = fabsf (_gen_count2 * vols - 1.0);
+ const float g = fabsf (_gen_count2 * vols - 1.f);
_buffer[i] = g * _wavetable[_gen_offset];
_gen_offset = (_gen_offset + 1) % _gen_period;
_gen_count2 = (_gen_count2 + 1) % _gen_perio2;
diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc
index d66055d..c3ce0b0 100644
--- a/libs/backends/jack/jack_audiobackend.cc
+++ b/libs/backends/jack/jack_audiobackend.cc
@@ -838,7 +838,7 @@ JACKAudioBackend::join_process_threads ()
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 defined(USING_JACK2_EXPANSION_OF_JACK_API) || defined __jack_systemdeps_h__
// jack_client is not used by JACK2's implementation
// also jack_client_close() leaves threads active
if (jack_client_stop_thread (NULL, *i) != 0)
@@ -860,7 +860,7 @@ JACKAudioBackend::join_process_threads ()
bool
JACKAudioBackend::in_process_thread ()
{
-#ifdef COMPILER_MINGW
+#if defined COMPILER_MINGW && (!defined PTW32_VERSION || defined __jack_systemdeps_h__)
if (_main_thread == GetCurrentThread()) {
return true;
}
@@ -873,7 +873,7 @@ JACKAudioBackend::in_process_thread ()
for (std::vector<jack_native_thread_t>::const_iterator i = _jack_threads.begin ();
i != _jack_threads.end(); i++) {
-#ifdef COMPILER_MINGW
+#if defined COMPILER_MINGW && (!defined PTW32_VERSION || defined __jack_systemdeps_h__)
if (*i == GetCurrentThread()) {
return true;
}
@@ -917,7 +917,7 @@ JACKAudioBackend::process_thread ()
/* JACK doesn't do this for us when we use the wait API
*/
-#ifdef COMPILER_MINGW
+#if defined COMPILER_MINGW && (!defined PTW32_VERSION || defined __jack_systemdeps_h__)
_main_thread = GetCurrentThread();
#else
_main_thread = pthread_self ();
diff --git a/libs/backends/jack/jack_portengine.cc b/libs/backends/jack/jack_portengine.cc
index 1f0515b..8aa489d 100644
--- a/libs/backends/jack/jack_portengine.cc
+++ b/libs/backends/jack/jack_portengine.cc
@@ -106,7 +106,16 @@ JACKAudioBackend::when_connected_to_jack ()
int
JACKAudioBackend::set_port_name (PortHandle port, const std::string& name)
{
+#if HAVE_JACK_PORT_RENAME
+ jack_client_t* client = _jack_connection->jack();
+ if (client) {
+ return jack_port_rename (client, (jack_port_t*) port, name.c_str());
+ } else {
+ return -1;
+ }
+#else
return jack_port_set_name ((jack_port_t*) port, name.c_str());
+#endif
}
string
diff --git a/libs/backends/jack/jack_utils.cc b/libs/backends/jack/jack_utils.cc
index c6cbf0f..2ea110d 100644
--- a/libs/backends/jack/jack_utils.cc
+++ b/libs/backends/jack/jack_utils.cc
@@ -698,8 +698,10 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c
#ifdef PLATFORM_WINDOWS
// must use sync mode on windows
args.push_back ("-S");
+#endif
- // this needs to be added now on windows
+#if (defined PLATFORM_WINDOWS || defined __APPLE__)
+ // midi systems needs to be added before the audio driver for jack2
if (!options.midi_driver.empty () && options.midi_driver != get_none_string ()) {
args.push_back ("-X");
args.push_back (options.midi_driver);
@@ -879,7 +881,7 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c
}
}
- if (options.driver == alsa_driver_name || options.driver == coreaudio_driver_name) {
+ if (options.driver == alsa_driver_name) {
if (options.midi_driver != alsa_seq_midi_driver_name) {
if (!options.midi_driver.empty() && options.midi_driver != get_none_string ()) {
diff --git a/libs/backends/jack/weak_libjack.def b/libs/backends/jack/weak_libjack.def
index 5a3e080..8f6a6cd 100644
--- a/libs/backends/jack/weak_libjack.def
+++ b/libs/backends/jack/weak_libjack.def
@@ -36,6 +36,7 @@ JCFUN(1, jack_nframes_t, get_buffer_size, 0)
JPFUN(1, jack_nframes_t, frames_since_cycle_start, (const jack_client_t *c), (c), 0)
JPFUN(1, jack_nframes_t, frame_time, (const jack_client_t *c), (c), 0)
JPFUN(1, jack_nframes_t, last_frame_time, (const jack_client_t *c), (c), 0)
+JPFUN(1, jack_time_t, get_time, (void), (), 0)
JCFUN(1, float, cpu_load, 0)
JCFUN(1, int, is_realtime, 0)
@@ -53,6 +54,7 @@ JPFUN(1, int, port_ensure_monitor, (jack_port_t *p, int o), (p,o), 0)
JPFUN(1, int, port_monitoring_input, (jack_port_t *p), (p), 0)
JPFUN(1, const char*, port_name, (const jack_port_t *p), (p), NULL)
+JPFUN(1, const char*, port_short_name, (const jack_port_t *p), (p), NULL)
JPFUN(1, int, port_flags, (const jack_port_t *p), (p), 0)
JPFUN(1, const char**, get_ports,(jack_client_t *c, const char *p, const char *t, unsigned long f), (c,p,t,f), NULL)
JPFUN(1, int, port_name_size, (void), (), 0)
@@ -65,7 +67,9 @@ JPFUN(1, int, port_unregister, (jack_client_t *c, jack_port_t *p), (c
JPFUN(1, const char *, port_type, (const jack_port_t *p), (p), 0)
JPFUN(1, const char **, port_get_connections, (const jack_port_t *p), (p), 0)
JPFUN(1, const char **, port_get_all_connections, (const jack_client_t *c, const jack_port_t *p), (c,p), 0)
-JPFUN(1, int, port_set_name, (jack_port_t *p, const char *n), (p,n), 0)
+JPFUN(1, int, port_set_name, (jack_port_t *p, const char *n), (p,n), -1)
+JXFUN(0, int, port_rename, (jack_client_t *c, jack_port_t *p, const char *n), (c,p,n), return jack_port_set_name (p,n);)
+JPFUN(1, int, port_get_aliases, (const jack_port_t *port, char* const aliases[2]), (port,aliases), 0)
JPFUN(1, int, port_disconnect, (jack_client_t *c, jack_port_t *p), (c,p), 0)
JPFUN(1, int, connect, (jack_client_t *c, const char *s, const char *d), (c,s,d), -1)
JPFUN(1, int, disconnect, (jack_client_t *c, const char *s, const char *d), (c,s,d), -1)
@@ -141,4 +145,9 @@ JPFUN(0, int, remove_all_properties, (jack_client_t* c), (c), -1)
JPFUN(0, int, set_property_change_callback, (jack_client_t *c, JackPropertyChangeCallback s, void *a), (c,s,a), -1)
#endif
+/* <jack/statistics.h> */
+JCFUN(1, float, get_max_delayed_usecs, 0.0)
+JCFUN(1, float, get_xrun_delayed_usecs, 0.0)
+JVFUN(0, reset_max_delayed_usecs, (jack_client_t *c), (c),)
+
#endif // end USE_WEAK_JACK
diff --git a/libs/backends/jack/weak_libjack.h b/libs/backends/jack/weak_libjack.h
index abfe3af..0f98de3 100644
--- a/libs/backends/jack/weak_libjack.h
+++ b/libs/backends/jack/weak_libjack.h
@@ -55,6 +55,7 @@ int have_libjack(void);
#define jack_frames_since_cycle_start WJACK_frames_since_cycle_start
#define jack_frame_time WJACK_frame_time
#define jack_last_frame_time WJACK_last_frame_time
+#define jack_get_time WJACK_get_time
#define jack_cpu_load WJACK_cpu_load
#define jack_is_realtime WJACK_is_realtime
@@ -87,6 +88,7 @@ int have_libjack(void);
#define jack_port_monitoring_input WJACK_port_monitoring_input
#define jack_port_name WJACK_port_name
+#define jack_port_short_name WJACK_port_short_name
#define jack_port_flags WJACK_port_flags
#define jack_get_ports WJACK_get_ports
#define jack_port_name_size WJACK_port_name_size
@@ -95,6 +97,8 @@ int have_libjack(void);
#define jack_port_by_name WJACK_port_by_name
#define jack_port_by_id WJACK_port_by_id
#define jack_port_set_name WJACK_port_set_name
+#define jack_port_get_aliases WJACK_port_get_aliases
+#define jack_port_rename WJACK_port_rename
#define jack_port_disconnect WJACK_port_disconnect
#define jack_port_register WJACK_port_register
#define jack_port_unregister WJACK_port_unregister
@@ -172,6 +176,11 @@ int have_libjack(void);
#define jack_set_property_change_callback WJACK_set_property_change_callback
#endif
+/* <jack/statistics.h> */
+#define jack_get_max_delayed_usecs WJACK_get_max_delayed_usecs
+#define jack_get_xrun_delayed_usecs WJACK_get_xrun_delayed_usecs
+#define jack_reset_max_delayed_usecs WJACK_reset_max_delayed_usecs
+
#endif // end USE_WEAK_JACK
#include <jack/jack.h>
@@ -185,6 +194,9 @@ int have_libjack(void);
#include <jack/metadata.h>
#endif
+// prototype for function currently only available in jack1 headers
+int jack_port_rename (jack_client_t* client, jack_port_t *port, const char *port_name);
+
#ifdef USE_WEAK_JACK
#undef jack_client_open
diff --git a/libs/backends/jack/wscript b/libs/backends/jack/wscript
index fca2230..b2a12b5 100644
--- a/libs/backends/jack/wscript
+++ b/libs/backends/jack/wscript
@@ -41,11 +41,24 @@ def configure(conf):
conf.check_cxx(fragment = "#include <jack/jack.h>\n#include <jack/metadata.h>\nint main(void) { jack_port_uuid(NULL); return 0; }\n",
mandatory = False,
msg = 'Checking for JACK metadata API',
+ execute = False,
+ features = ['cxx'],
okmsg = 'ok',
errmsg = 'not found (or broken). JACK metadata API will not be used',
define_name = 'HAVE_JACK_METADATA',
uselib = 'JACK')
-
+
+ # Check to see if jack_port_rename() is available and working
+ conf.check_cxx(fragment = "#include <jack/jack.h>\nint main(void) { jack_client_t* c; jack_port_t* p; jack_port_rename (c, p, \"foo\"); return 0; }\n",
+ mandatory = False,
+ execute = False,
+ features = ['cxx'],
+ msg = 'Checking for jack_port_rename()',
+ okmsg = 'ok',
+ errmsg = 'not found (or broken). jack_port_rename() will not be used, and jack_port_set_name() will be used instead',
+ define_name = 'HAVE_JACK_PORT_RENAME',
+ uselib = 'JACK')
+
def build(bld):
obj = bld(features = 'c cxx cxxshlib')
obj.source = [
@@ -68,11 +81,18 @@ def build(bld):
if bld.env['build_target'] != 'mingw':
obj.cxxflags = [ '-fPIC' ]
obj.cflags = [ '-fPIC' ]
+ else:
+ obj.cxxflags = [ ]
+ obj.cflags = [ ]
if bld.is_defined ('HAVE_JACK_METADATA'):
obj.cxxflags += [ '-DHAVE_JACK_METADATA' ]
obj.cflags += [ '-DHAVE_JACK_METADATA' ]
+ if bld.is_defined ('HAVE_JACK_PORT_RENAME'):
+ obj.cxxflags += [ '-DHAVE_JACK_PORT_RENAME' ]
+ obj.cflags += [ '-DHAVE_JACK_PORT_RENAME' ]
+
if (bld.env['build_target'] == 'mingw'):
obj.uselib = [ 'PORTAUDIO' ]
else:
diff --git a/libs/backends/portaudio/cycle_timer.h b/libs/backends/portaudio/cycle_timer.h
new file mode 100644
index 0000000..95811ae
--- /dev/null
+++ b/libs/backends/portaudio/cycle_timer.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2015 Tim Mayberry <mojofunk at gmail.com>
+ *
+ * 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 CYCLE_TIMER_H
+#define CYCLE_TIMER_H
+
+#include <stdint.h>
+#include <cmath>
+#include <algorithm>
+
+// Could call it FrameTimer and make it more generic
+// Could be an interface and or include clock source
+// include sample count/processed frames in iteration?
+class CycleTimer {
+public:
+ CycleTimer ()
+ : m_cycle_start (0)
+ , m_samplerate (0)
+ , m_samples_per_cycle (0)
+ {
+ }
+
+ void set_samplerate (double samplerate) { m_samplerate = samplerate; }
+
+ double get_samplerate () const { return m_samplerate; }
+
+ double get_sample_length_us () const { return 1e6 / m_samplerate; }
+
+ double get_length_us () const
+ {
+ return get_sample_length_us () * m_samples_per_cycle;
+ }
+
+ void set_samples_per_cycle (uint32_t samples)
+ {
+ m_samples_per_cycle = samples;
+ }
+
+ uint32_t get_samples_per_cycle () const { return m_samples_per_cycle; }
+
+ // rint?? that may round to sample outside of cycle?
+ // max(0, value)?
+ uint32_t samples_since_cycle_start (uint64_t timer_val) const
+ {
+ if (timer_val < m_cycle_start) {
+ return 0;
+ }
+ return std::max((double)0, (timer_val - get_start ()) / get_sample_length_us ());
+ }
+
+ uint64_t timestamp_from_sample_offset (uint32_t sample_offset)
+ {
+ return m_cycle_start + get_sample_length_us () * sample_offset;
+ }
+
+ bool valid () const { return m_samples_per_cycle && m_samplerate; }
+
+ bool in_cycle (uint64_t timer_value_us) const
+ { return (timer_value_us >= get_start()) && (timer_value_us < get_next_start());
+ }
+
+ void reset_start (uint64_t timestamp) { m_cycle_start = timestamp; }
+
+ uint64_t get_start () const { return m_cycle_start; }
+
+ uint64_t microseconds_since_start (uint64_t timestamp) const
+ {
+ return timestamp - m_cycle_start;
+ }
+
+ uint64_t microseconds_since_start (uint32_t samples) const
+ {
+ return m_cycle_start + samples * get_sample_length_us ();
+ }
+
+ uint64_t get_next_start () const
+ {
+ return m_cycle_start + rint (get_length_us ());
+ }
+
+private:
+ uint64_t m_cycle_start;
+
+ uint32_t m_samplerate;
+ uint32_t m_samples_per_cycle;
+};
+
+#endif // CYCLE_TIMER_H
diff --git a/libs/backends/portaudio/debug.h b/libs/backends/portaudio/debug.h
new file mode 100644
index 0000000..0270efa
--- /dev/null
+++ b/libs/backends/portaudio/debug.h
@@ -0,0 +1,13 @@
+#ifndef PORTAUDIO_BACKEND_DEBUG_H
+#define PORTAUDIO_BACKEND_DEBUG_H
+
+#include "pbd/debug.h"
+
+using namespace PBD;
+
+#define DEBUG_AUDIO(msg) DEBUG_TRACE (DEBUG::BackendAudio, msg);
+#define DEBUG_MIDI(msg) DEBUG_TRACE (DEBUG::BackendMIDI, msg);
+#define DEBUG_TIMING(msg) DEBUG_TRACE (DEBUG::BackendTiming, msg);
+#define DEBUG_THREADS(msg) DEBUG_TRACE (DEBUG::BackendThreads, msg);
+
+#endif // PORTAUDIO_BACKEND_DEBUG_H
diff --git a/libs/backends/alsa/select_sleep.h b/libs/backends/portaudio/midi_util.cc
similarity index 56%
copy from libs/backends/alsa/select_sleep.h
copy to libs/backends/portaudio/midi_util.cc
index ec6a93d..0542dfc 100644
--- a/libs/backends/alsa/select_sleep.h
+++ b/libs/backends/portaudio/midi_util.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004,2014 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2015 Tim Mayberry <mojofunk at gmail.com>
*
* 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
@@ -16,20 +16,38 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include <stdint.h>
-#include <sys/select.h>
+#include "midi_util.h"
-/* select() sleeps _at most_ a given time.
- * (compared to usleep() or nanosleep() which sleep at least a given time)
- */
-static void select_sleep (uint64_t usec) {
- if (usec <= 10) return;
- fd_set fd;
- int max_fd=0;
- struct timeval tv;
- tv.tv_sec = usec / 1000000;
- tv.tv_usec = usec % 1000000;
- FD_ZERO (&fd);
- select (max_fd, &fd, NULL, NULL, &tv);
- // on Linux, tv reflects the actual time slept.
+int get_midi_msg_length (uint8_t status_byte)
+{
+ // define these with meaningful names
+ switch (status_byte & 0xf0) {
+ case 0x80:
+ case 0x90:
+ case 0xa0:
+ case 0xb0:
+ case 0xe0:
+ return 3;
+ case 0xc0:
+ case 0xd0:
+ return 2;
+ case 0xf0:
+ switch (status_byte) {
+ case 0xf0:
+ return 0;
+ case 0xf1:
+ case 0xf3:
+ return 2;
+ case 0xf2:
+ return 3;
+ case 0xf4:
+ case 0xf5:
+ case 0xf7:
+ case 0xfd:
+ break;
+ default:
+ return 1;
+ }
+ }
+ return -1;
}
diff --git a/libs/backends/alsa/select_sleep.h b/libs/backends/portaudio/midi_util.h
similarity index 60%
copy from libs/backends/alsa/select_sleep.h
copy to libs/backends/portaudio/midi_util.h
index ec6a93d..7b6366a 100644
--- a/libs/backends/alsa/select_sleep.h
+++ b/libs/backends/portaudio/midi_util.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004,2014 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2015 Tim Mayberry <mojofunk at gmail.com>
*
* 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
@@ -16,20 +16,23 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#ifndef MIDI_UTIL_H
+#define MIDI_UTIL_H
+
#include <stdint.h>
-#include <sys/select.h>
-/* select() sleeps _at most_ a given time.
- * (compared to usleep() or nanosleep() which sleep at least a given time)
- */
-static void select_sleep (uint64_t usec) {
- if (usec <= 10) return;
- fd_set fd;
- int max_fd=0;
- struct timeval tv;
- tv.tv_sec = usec / 1000000;
- tv.tv_usec = usec % 1000000;
- FD_ZERO (&fd);
- select (max_fd, &fd, NULL, NULL, &tv);
- // on Linux, tv reflects the actual time slept.
-}
+struct MidiEventHeader {
+ uint64_t time;
+ size_t size;
+ MidiEventHeader (const uint64_t t, const size_t s)
+ : time (t)
+ , size (s)
+ {
+ }
+};
+
+// rename to get_midi_message_size?
+// @return -1 to indicate error
+int get_midi_msg_length (uint8_t status_byte);
+
+#endif
diff --git a/libs/backends/portaudio/mmcss.cc b/libs/backends/portaudio/mmcss.cc
new file mode 100644
index 0000000..d8cec02
--- /dev/null
+++ b/libs/backends/portaudio/mmcss.cc
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2015 Tim Mayberry <mojofunk at gmail.com>
+ *
+ * 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.
+ */
+
+#include "mmcss.h"
+
+#include "pbd/compose.h"
+
+#include "debug.h"
+
+typedef HANDLE (WINAPI* AvSetMmThreadCharacteristicsA_t)(LPCSTR TaskName,
+ LPDWORD TaskIndex);
+
+typedef BOOL (WINAPI* AvRevertMmThreadCharacteristics_t)(HANDLE AvrtHandle);
+
+typedef BOOL (WINAPI* AvSetMmThreadPriority_t)(
+ HANDLE AvrtHandle, mmcss::AVRT_PRIORITY Priority);
+
+static HMODULE avrt_dll = NULL;
+
+static AvSetMmThreadCharacteristicsA_t AvSetMmThreadCharacteristicsA = NULL;
+static AvRevertMmThreadCharacteristics_t AvRevertMmThreadCharacteristics = NULL;
+static AvSetMmThreadPriority_t AvSetMmThreadPriority = NULL;
+
+
+namespace mmcss {
+
+bool
+initialize ()
+{
+ if (avrt_dll != NULL) return true;
+
+ avrt_dll = LoadLibraryA ("avrt.dll");
+
+ if (avrt_dll == NULL) {
+ DEBUG_THREADS ("Unable to load avrt.dll\n");
+ return false;
+ }
+ bool unload_dll = false;
+
+ AvSetMmThreadCharacteristicsA =
+ (AvSetMmThreadCharacteristicsA_t)GetProcAddress (
+ avrt_dll, "AvSetMmThreadCharacteristicsA");
+
+ if (AvSetMmThreadCharacteristicsA == NULL) {
+ DEBUG_THREADS ("Unable to resolve AvSetMmThreadCharacteristicsA\n");
+ unload_dll = true;
+ }
+
+ AvRevertMmThreadCharacteristics =
+ (AvRevertMmThreadCharacteristics_t)GetProcAddress (
+ avrt_dll, "AvRevertMmThreadCharacteristics");
+
+ if (AvRevertMmThreadCharacteristics == NULL) {
+ DEBUG_THREADS ("Unable to resolve AvRevertMmThreadCharacteristics\n");
+ unload_dll = true;
+ }
+
+ AvSetMmThreadPriority = (AvSetMmThreadPriority_t)GetProcAddress (
+ avrt_dll, "AvSetMmThreadPriority");
+
+ if (AvSetMmThreadPriority == NULL) {
+ DEBUG_THREADS ("Unable to resolve AvSetMmThreadPriority\n");
+ unload_dll = true;
+ }
+
+ if (unload_dll) {
+ DEBUG_THREADS (
+ "MMCSS Unable to resolve necessary symbols, unloading avrt.dll\n");
+ deinitialize ();
+ }
+
+ return true;
+}
+
+bool
+deinitialize ()
+{
+ if (avrt_dll == NULL) return true;
+
+ if (FreeLibrary (avrt_dll) == 0) {
+ DEBUG_THREADS ("Unable to unload avrt.dll\n");
+ return false;
+ }
+
+ avrt_dll = NULL;
+
+ AvSetMmThreadCharacteristicsA = NULL;
+ AvRevertMmThreadCharacteristics = NULL;
+ AvSetMmThreadPriority = NULL;
+
+ return true;
+}
+
+bool
+set_thread_characteristics (const std::string& task_name, HANDLE* task_handle)
+{
+ if (AvSetMmThreadCharacteristicsA == NULL) return false;
+
+ DWORD task_index_dummy = 0;
+
+ *task_handle = AvSetMmThreadCharacteristicsA(task_name.c_str(), &task_index_dummy);
+
+ if (*task_handle == 0) {
+ DEBUG_THREADS (string_compose ("Failed to set Thread Characteristics to %1\n",
+ task_name));
+ return false;
+ }
+
+ DEBUG_THREADS (
+ string_compose ("Set thread characteristics to %1\n", task_name));
+
+ return true;
+}
+
+bool
+revert_thread_characteristics (HANDLE task_handle)
+{
+ if (AvRevertMmThreadCharacteristics == NULL) return false;
+
+ if (AvRevertMmThreadCharacteristics (task_handle) == 0) {
+ DEBUG_THREADS ("Failed to set revert thread characteristics\n");
+ return false;
+ }
+
+ DEBUG_THREADS ("Reverted thread characteristics\n");
+
+ return true;
+}
+
+bool
+set_thread_priority (HANDLE task_handle, AVRT_PRIORITY priority)
+{
+ if (AvSetMmThreadPriority == NULL) return false;
+
+ if (AvSetMmThreadPriority (task_handle, priority) == 0) {
+ DEBUG_THREADS (
+ string_compose ("Failed to set thread priority %1\n", priority));
+ return false;
+ }
+
+ DEBUG_THREADS (string_compose ("Set thread priority to %1\n", priority));
+
+ return true;
+}
+
+} // namespace mmcss
diff --git a/libs/backends/alsa/select_sleep.h b/libs/backends/portaudio/mmcss.h
similarity index 55%
copy from libs/backends/alsa/select_sleep.h
copy to libs/backends/portaudio/mmcss.h
index ec6a93d..deb9a41 100644
--- a/libs/backends/alsa/select_sleep.h
+++ b/libs/backends/portaudio/mmcss.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004,2014 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2015 Tim Mayberry <mojofunk at gmail.com>
*
* 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
@@ -16,20 +16,34 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include <stdint.h>
-#include <sys/select.h>
+#ifndef MMCSS_H
+#define MMCSS_H
-/* select() sleeps _at most_ a given time.
- * (compared to usleep() or nanosleep() which sleep at least a given time)
- */
-static void select_sleep (uint64_t usec) {
- if (usec <= 10) return;
- fd_set fd;
- int max_fd=0;
- struct timeval tv;
- tv.tv_sec = usec / 1000000;
- tv.tv_usec = usec % 1000000;
- FD_ZERO (&fd);
- select (max_fd, &fd, NULL, NULL, &tv);
- // on Linux, tv reflects the actual time slept.
-}
+#include <windows.h>
+
+#include <string>
+
+namespace mmcss {
+
+enum AVRT_PRIORITY {
+ AVRT_PRIORITY_VERYLOW = -2,
+ AVRT_PRIORITY_LOW,
+ AVRT_PRIORITY_NORMAL,
+ AVRT_PRIORITY_HIGH,
+ AVRT_PRIORITY_CRITICAL
+};
+
+bool initialize ();
+
+bool deinitialize ();
+
+bool set_thread_characteristics (const std::string& task_name, HANDLE *task_handle);
+
+bool revert_thread_characteristics (HANDLE task_handle);
+
+bool set_thread_priority (HANDLE, AVRT_PRIORITY);
+
+
+} // namespace mmcss
+
+#endif // MMCSS_H
diff --git a/libs/backends/portaudio/portaudio_backend.cc b/libs/backends/portaudio/portaudio_backend.cc
index 0277ca1..0356025 100644
--- a/libs/backends/portaudio/portaudio_backend.cc
+++ b/libs/backends/portaudio/portaudio_backend.cc
@@ -36,12 +36,24 @@
#include "ardour/port_manager.h"
#include "i18n.h"
+#include "win_utils.h"
+#include "mmcss.h"
+
+#include "debug.h"
+
using namespace ARDOUR;
+namespace {
+
+const char * const winmme_driver_name = X_("WinMME");
+
+}
+
static std::string s_instance_name;
size_t PortAudioBackend::_max_buffer_size = 8192;
std::vector<std::string> PortAudioBackend::_midi_options;
-std::vector<AudioBackend::DeviceStatus> PortAudioBackend::_audio_device_status;
+std::vector<AudioBackend::DeviceStatus> PortAudioBackend::_input_audio_device_status;
+std::vector<AudioBackend::DeviceStatus> PortAudioBackend::_output_audio_device_status;
PortAudioBackend::PortAudioBackend (AudioEngine& e, AudioBackendInfo& info)
: AudioBackend (e, info)
@@ -50,8 +62,11 @@ PortAudioBackend::PortAudioBackend (AudioEngine& e, AudioBackendInfo& info)
, _active (false)
, _freewheel (false)
, _measure_latency (false)
- , _last_process_start (0)
- , _audio_device("")
+ , m_cycle_count(0)
+ , m_total_deviation_us(0)
+ , m_max_deviation_us(0)
+ , _input_audio_device("")
+ , _output_audio_device("")
, _midi_driver_option(_("None"))
, _samplerate (48000)
, _samples_per_period (1024)
@@ -66,12 +81,19 @@ PortAudioBackend::PortAudioBackend (AudioEngine& e, AudioBackendInfo& info)
_instance_name = s_instance_name;
pthread_mutex_init (&_port_callback_mutex, 0);
+ mmcss::initialize ();
+
_pcmio = new PortAudioIO ();
+ _midiio = new WinMMEMidiIO ();
}
PortAudioBackend::~PortAudioBackend ()
{
delete _pcmio; _pcmio = 0;
+ delete _midiio; _midiio = 0;
+
+ mmcss::deinitialize ();
+
pthread_mutex_destroy (&_port_callback_mutex);
}
@@ -89,34 +111,104 @@ PortAudioBackend::is_realtime () const
return true;
}
+bool
+PortAudioBackend::requires_driver_selection() const
+{
+ // we could do this but implementation would need changing
+ /*
+ if (enumerate_drivers().size() == 1) {
+ return false;
+ }
+ */
+ return true;
+}
+
+std::vector<std::string>
+PortAudioBackend::enumerate_drivers () const
+{
+ DEBUG_AUDIO ("Portaudio: enumerate_drivers\n");
+ std::vector<std::string> currently_available;
+ _pcmio->host_api_list (currently_available);
+ return currently_available;
+}
+
+int
+PortAudioBackend::set_driver (const std::string& name)
+{
+ DEBUG_AUDIO (string_compose ("Portaudio: set_driver %1 \n", name));
+ if (!_pcmio->set_host_api (name)) {
+ DEBUG_AUDIO (string_compose ("Portaudio: Unable to set_driver %1 \n", name));
+ return -1;
+ }
+ return 0;
+}
+
+std::string
+PortAudioBackend::driver_name () const
+{
+ std::string driver_name = _pcmio->get_host_api ();
+ DEBUG_AUDIO (string_compose ("Portaudio: driver_name %1 \n", driver_name));
+ return driver_name;
+}
+
+bool
+PortAudioBackend::use_separate_input_and_output_devices () const
+{
+ return true;
+}
+
std::vector<AudioBackend::DeviceStatus>
PortAudioBackend::enumerate_devices () const
{
+ DEBUG_AUDIO ("Portaudio: ERROR enumerate devices should not be called \n");
+ return std::vector<AudioBackend::DeviceStatus>();
+}
+
+std::vector<AudioBackend::DeviceStatus>
+PortAudioBackend::enumerate_input_devices () const
+{
_pcmio->discover();
- _audio_device_status.clear();
- std::map<int, std::string> devices;
- _pcmio->device_list(devices);
+ _input_audio_device_status.clear();
+ std::map<int, std::string> input_devices;
+ _pcmio->input_device_list(input_devices);
- for (std::map<int, std::string>::const_iterator i = devices.begin (); i != devices.end(); ++i) {
- if (_audio_device == "") _audio_device = i->second;
- _audio_device_status.push_back (DeviceStatus (i->second, true));
+ for (std::map<int, std::string>::const_iterator i = input_devices.begin (); i != input_devices.end(); ++i) {
+ if (_input_audio_device == "") _input_audio_device = i->second;
+ _input_audio_device_status.push_back (DeviceStatus (i->second, true));
+ }
+ return _input_audio_device_status;
+}
+
+std::vector<AudioBackend::DeviceStatus>
+PortAudioBackend::enumerate_output_devices () const
+{
+ _pcmio->discover();
+ _output_audio_device_status.clear();
+ std::map<int, std::string> output_devices;
+ _pcmio->output_device_list(output_devices);
+
+ for (std::map<int, std::string>::const_iterator i = output_devices.begin (); i != output_devices.end(); ++i) {
+ if (_output_audio_device == "") _output_audio_device = i->second;
+ _output_audio_device_status.push_back (DeviceStatus (i->second, true));
}
- return _audio_device_status;
+ return _output_audio_device_status;
}
std::vector<float>
PortAudioBackend::available_sample_rates (const std::string&) const
{
+ DEBUG_AUDIO ("Portaudio: available_sample_rates\n");
std::vector<float> sr;
- _pcmio->available_sample_rates(name_to_id(_audio_device), sr);
+ _pcmio->available_sample_rates(name_to_id(_input_audio_device), sr);
return sr;
}
std::vector<uint32_t>
PortAudioBackend::available_buffer_sizes (const std::string&) const
{
+ DEBUG_AUDIO ("Portaudio: available_buffer_sizes\n");
std::vector<uint32_t> bs;
- _pcmio->available_buffer_sizes(name_to_id(_audio_device), bs);
+ _pcmio->available_buffer_sizes(name_to_id(_input_audio_device), bs);
return bs;
}
@@ -147,7 +239,23 @@ PortAudioBackend::can_change_buffer_size_when_running () const
int
PortAudioBackend::set_device_name (const std::string& d)
{
- _audio_device = d;
+ DEBUG_AUDIO ("Portaudio: set_device_name should not be called\n");
+ return 0;
+}
+
+int
+PortAudioBackend::set_input_device_name (const std::string& d)
+{
+ DEBUG_AUDIO (string_compose ("Portaudio: set_input_device_name %1\n", d));
+ _input_audio_device = d;
+ return 0;
+}
+
+int
+PortAudioBackend::set_output_device_name (const std::string& d)
+{
+ DEBUG_AUDIO (string_compose ("Portaudio: set_output_device_name %1\n", d));
+ _output_audio_device = d;
return 0;
}
@@ -211,7 +319,19 @@ PortAudioBackend::set_systemic_output_latency (uint32_t sl)
std::string
PortAudioBackend::device_name () const
{
- return _audio_device;
+ return "Unused";
+}
+
+std::string
+PortAudioBackend::input_device_name () const
+{
+ return _input_audio_device;
+}
+
+std::string
+PortAudioBackend::output_device_name () const
+{
+ return _output_audio_device;
}
float
@@ -256,13 +376,25 @@ PortAudioBackend::systemic_output_latency () const
return _systemic_audio_output_latency;
}
+std::string
+PortAudioBackend::control_app_name () const
+{
+ return _pcmio->control_app_name (name_to_id (_input_audio_device));
+}
+
+void
+PortAudioBackend::launch_control_app ()
+{
+ return _pcmio->launch_control_app (name_to_id(_input_audio_device));
+}
+
/* MIDI */
std::vector<std::string>
PortAudioBackend::enumerate_midi_options () const
{
if (_midi_options.empty()) {
- //_midi_options.push_back (_("PortMidi"));
+ _midi_options.push_back (winmme_driver_name);
_midi_options.push_back (_("None"));
}
return _midi_options;
@@ -271,9 +403,10 @@ PortAudioBackend::enumerate_midi_options () const
int
PortAudioBackend::set_midi_option (const std::string& opt)
{
- if (opt != _("None") /* && opt != _("PortMidi")*/) {
+ if (opt != _("None") && opt != winmme_driver_name) {
return -1;
}
+ DEBUG_MIDI (string_compose ("Setting midi option to %1\n", opt));
_midi_driver_option = opt;
return 0;
}
@@ -320,9 +453,8 @@ PortAudioBackend::_start (bool for_latency_measurement)
_dsp_load = 0;
_freewheeling = false;
_freewheel = false;
- _last_process_start = 0;
- _pcmio->pcm_setup (name_to_id(_audio_device), name_to_id(_audio_device), _samplerate, _samples_per_period);
+ _pcmio->pcm_setup (name_to_id(_input_audio_device), name_to_id(_output_audio_device), _samplerate, _samples_per_period);
switch (_pcmio->state ()) {
case 0: /* OK */ break;
@@ -360,10 +492,28 @@ PortAudioBackend::_start (bool for_latency_measurement)
_run = true;
_port_change_flag = false;
- // TODO MIDI
+ if (_midi_driver_option == winmme_driver_name) {
+ _midiio->set_enabled(true);
+ //_midiio->set_port_changed_callback(midi_port_change, this);
+ _midiio->start(); // triggers port discovery, callback coremidi_rediscover()
+ }
+
+ m_cycle_timer.set_samplerate(_samplerate);
+ m_cycle_timer.set_samples_per_cycle(_samples_per_period);
+
+ DEBUG_MIDI ("Registering MIDI ports\n");
+
+ if (register_system_midi_ports () != 0) {
+ PBD::error << _ ("PortAudioBackend: failed to register system midi ports.")
+ << endmsg;
+ _run = false;
+ return -1;
+ }
+
+ DEBUG_AUDIO ("Registering Audio ports\n");
if (register_system_audio_ports()) {
- PBD::error << _("PortAudioBackend: failed to register system ports.") << endmsg;
+ PBD::error << _("PortAudioBackend: failed to register system audio ports.") << endmsg;
_run = false;
return -1;
}
@@ -476,19 +626,19 @@ PortAudioBackend::samples_since_cycle_start ()
if (!_active || !_run || _freewheeling || _freewheel) {
return 0;
}
- if (_last_process_start == 0) {
+ if (!m_cycle_timer.valid()) {
return 0;
}
- const int64_t elapsed_time_us = g_get_monotonic_time() - _last_process_start;
- return std::max((pframes_t)0, (pframes_t)rint(1e-6 * elapsed_time_us * _samplerate));
+ return m_cycle_timer.samples_since_cycle_start (utils::get_microseconds());
}
int
PortAudioBackend::name_to_id(std::string device_name) const {
uint32_t device_id = UINT32_MAX;
std::map<int, std::string> devices;
- _pcmio->device_list(devices);
+ _pcmio->input_device_list(devices);
+ _pcmio->output_device_list(devices);
for (std::map<int, std::string>::const_iterator i = devices.begin (); i != devices.end(); ++i) {
if (i->second == device_name) {
@@ -505,7 +655,23 @@ PortAudioBackend::portaudio_process_thread (void *arg)
ThreadData* td = reinterpret_cast<ThreadData*> (arg);
boost::function<void ()> f = td->f;
delete td;
+
+#ifdef USE_MMCSS_THREAD_PRIORITIES
+ HANDLE task_handle;
+
+ mmcss::set_thread_characteristics ("Pro Audio", &task_handle);
+ mmcss::set_thread_priority (task_handle, mmcss::AVRT_PRIORITY_NORMAL);
+#endif
+
+ DWORD tid = GetCurrentThreadId ();
+ DEBUG_THREADS (string_compose ("Process Thread Child ID: %1\n", tid));
+
f ();
+
+#ifdef USE_MMCSS_THREAD_PRIORITIES
+ mmcss::revert_thread_characteristics (task_handle);
+#endif
+
return 0;
}
@@ -626,6 +792,28 @@ PortAudioBackend::get_port_name (PortEngine::PortHandle port) const
return static_cast<PamPort*>(port)->name ();
}
+int
+PortAudioBackend::get_port_property (PortHandle port,
+ const std::string& key,
+ std::string& value,
+ std::string& type) const
+{
+ if (!valid_port (port)) {
+ PBD::error << _ ("PortAudioBackend::get_port_name: Invalid Port(s)")
+ << endmsg;
+ return -1;
+ }
+
+ if (key == "http://jackaudio.org/metadata/pretty-name") {
+ type = "";
+ value = static_cast<PamPort*>(port)->pretty_name ();
+ if (!value.empty()) {
+ return 0;
+ }
+ }
+ return -1;
+}
+
PortEngine::PortHandle
PortAudioBackend::get_port_by_name (const std::string& name) const
{
@@ -749,7 +937,10 @@ PortAudioBackend::register_system_audio_ports()
PortHandle p = add_port(std::string(tmp), DataType::AUDIO, static_cast<PortFlags>(IsOutput | IsPhysical | IsTerminal));
if (!p) return -1;
set_latency_range (p, false, lr);
- _system_inputs.push_back(static_cast<PortAudioPort*>(p));
+ PortAudioPort* audio_port = static_cast<PortAudioPort*>(p);
+ audio_port->set_pretty_name (
+ _pcmio->get_input_channel_name (name_to_id (_input_audio_device), i));
+ _system_inputs.push_back (audio_port);
}
lr.min = lr.max = portaudio_reported_output_latency + (_measure_latency ? 0 : _systemic_audio_output_latency);
@@ -759,7 +950,56 @@ PortAudioBackend::register_system_audio_ports()
PortHandle p = add_port(std::string(tmp), DataType::AUDIO, static_cast<PortFlags>(IsInput | IsPhysical | IsTerminal));
if (!p) return -1;
set_latency_range (p, true, lr);
- _system_outputs.push_back(static_cast<PamPort*>(p));
+ PortAudioPort* audio_port = static_cast<PortAudioPort*>(p);
+ audio_port->set_pretty_name (
+ _pcmio->get_output_channel_name (name_to_id (_output_audio_device), i));
+ _system_outputs.push_back(audio_port);
+ }
+ return 0;
+}
+
+int
+PortAudioBackend::register_system_midi_ports()
+{
+ if (_midi_driver_option == _("None")) {
+ DEBUG_MIDI ("No MIDI backend selected, not system midi ports available\n");
+ return 0;
+ }
+
+ LatencyRange lr;
+ lr.min = lr.max = _samples_per_period;
+
+ const std::vector<WinMMEMidiInputDevice*> inputs = _midiio->get_inputs();
+
+ for (std::vector<WinMMEMidiInputDevice*>::const_iterator i = inputs.begin ();
+ i != inputs.end ();
+ ++i) {
+ std::string port_name = "system_midi:" + (*i)->name() + " capture";
+ PortHandle p =
+ add_port (port_name,
+ DataType::MIDI,
+ static_cast<PortFlags>(IsOutput | IsPhysical | IsTerminal));
+ if (!p) return -1;
+ set_latency_range (p, false, lr);
+ _system_midi_in.push_back (static_cast<PortMidiPort*>(p));
+ DEBUG_MIDI (string_compose ("Registered MIDI input port: %1\n", port_name));
+ }
+
+ const std::vector<WinMMEMidiOutputDevice*> outputs = _midiio->get_outputs();
+
+ for (std::vector<WinMMEMidiOutputDevice*>::const_iterator i = outputs.begin ();
+ i != outputs.end ();
+ ++i) {
+ std::string port_name = "system_midi:" + (*i)->name() + " playback";
+ PortHandle p =
+ add_port (port_name,
+ DataType::MIDI,
+ static_cast<PortFlags>(IsInput | IsPhysical | IsTerminal));
+ if (!p) return -1;
+ set_latency_range (p, false, lr);
+ static_cast<PortMidiPort*>(p)->set_n_periods(2);
+ _system_midi_out.push_back (static_cast<PortMidiPort*>(p));
+ DEBUG_MIDI (string_compose ("Registered MIDI output port: %1\n", port_name));
}
return 0;
}
@@ -933,11 +1173,10 @@ PortAudioBackend::midi_event_put (
if (!buffer || !port_buffer) return -1;
PortMidiBuffer& dst = * static_cast<PortMidiBuffer*>(port_buffer);
if (dst.size () && (pframes_t)dst.back ()->timestamp () > timestamp) {
-#ifndef NDEBUG
// nevermind, ::get_buffer() sorts events
- fprintf (stderr, "PortMidiBuffer: unordered event: %d > %d\n",
- (pframes_t)dst.back ()->timestamp (), timestamp);
-#endif
+ DEBUG_MIDI (string_compose ("PortMidiBuffer: unordered event: %1 > %2\n",
+ (pframes_t)dst.back ()->timestamp (),
+ timestamp));
}
dst.push_back (boost::shared_ptr<PortMidiEvent>(new PortMidiEvent (timestamp, buffer, size)));
return 0;
@@ -1118,7 +1357,10 @@ PortAudioBackend::main_process_thread ()
_processed_samples = 0;
uint64_t clock1, clock2;
+ int64_t min_elapsed_us = 1000000;
+ int64_t max_elapsed_us = 0;
const int64_t nomial_time = 1e6 * _samples_per_period / _samplerate;
+ // const int64_t nomial_time = m_cycle_timer.get_length_us();
manager.registration_callback();
manager.graph_order_callback();
@@ -1129,6 +1371,16 @@ PortAudioBackend::main_process_thread ()
engine.halted_callback("PortAudio I/O error.");
}
+#ifdef USE_MMCSS_THREAD_PRIORITIES
+ HANDLE task_handle;
+
+ mmcss::set_thread_characteristics ("Pro Audio", &task_handle);
+ mmcss::set_thread_priority (task_handle, mmcss::AVRT_PRIORITY_NORMAL);
+#endif
+
+ DWORD tid = GetCurrentThreadId ();
+ DEBUG_THREADS (string_compose ("Process Thread Master ID: %1\n", tid));
+
while (_run) {
if (_freewheeling != _freewheel) {
@@ -1142,9 +1394,7 @@ PortAudioBackend::main_process_thread ()
case 0: // OK
break;
case 1:
-#ifndef NDEBUG
- printf("PortAudio: Xrun\n");
-#endif
+ DEBUG_AUDIO ("PortAudio: Xrun\n");
engine.Xrun ();
break;
default:
@@ -1153,7 +1403,7 @@ PortAudioBackend::main_process_thread ()
}
uint32_t i = 0;
- clock1 = g_get_monotonic_time();
+ clock1 = utils::get_microseconds ();
/* get audio */
i = 0;
@@ -1166,6 +1416,26 @@ PortAudioBackend::main_process_thread ()
for (std::vector<PamPort*>::const_iterator it = _system_midi_in.begin (); it != _system_midi_in.end (); ++it, ++i) {
PortMidiBuffer* mbuf = static_cast<PortMidiBuffer*>((*it)->get_buffer(0));
mbuf->clear();
+ uint64_t timestamp;
+ pframes_t sample_offset;
+ uint8_t data[256];
+ size_t size = sizeof(data);
+ while (_midiio->dequeue_input_event (i,
+ m_cycle_timer.get_start (),
+ m_cycle_timer.get_next_start (),
+ timestamp,
+ data,
+ size)) {
+ sample_offset = m_cycle_timer.samples_since_cycle_start (timestamp);
+ midi_event_put (mbuf, sample_offset, data, size);
+ DEBUG_MIDI (string_compose ("Dequeuing incoming MIDI data for device: %1 "
+ "sample_offset: %2 timestamp: %3, size: %4\n",
+ _midiio->get_inputs ()[i]->name (),
+ sample_offset,
+ timestamp,
+ size));
+ size = sizeof(data);
+ }
}
/* clear output buffers */
@@ -1173,25 +1443,61 @@ PortAudioBackend::main_process_thread ()
memset ((*it)->get_buffer (_samples_per_period), 0, _samples_per_period * sizeof (Sample));
}
+ m_last_cycle_start = m_cycle_timer.get_start ();
+ m_cycle_timer.reset_start(utils::get_microseconds());
+ m_cycle_count++;
+
+ uint64_t cycle_diff_us = (m_cycle_timer.get_start () - m_last_cycle_start);
+ int64_t deviation_us = (cycle_diff_us - m_cycle_timer.get_length_us());
+ m_total_deviation_us += ::llabs(deviation_us);
+ m_max_deviation_us =
+ std::max (m_max_deviation_us, (uint64_t)::llabs (deviation_us));
+
+ if ((m_cycle_count % 1000) == 0) {
+ uint64_t mean_deviation_us = m_total_deviation_us / m_cycle_count;
+ DEBUG_TIMING (
+ string_compose ("Mean avg cycle deviation: %1(ms), max %2(ms)\n",
+ mean_deviation_us * 1e-3,
+ m_max_deviation_us * 1e-3));
+ }
+
+ if (::llabs(deviation_us) > m_cycle_timer.get_length_us()) {
+ DEBUG_TIMING (string_compose (
+ "time between process(ms): %1, Est(ms): %2, Dev(ms): %3\n",
+ cycle_diff_us * 1e-3,
+ m_cycle_timer.get_length_us () * 1e-3,
+ deviation_us * 1e-3));
+ }
+
/* call engine process callback */
- _last_process_start = g_get_monotonic_time();
if (engine.process_callback (_samples_per_period)) {
_pcmio->pcm_stop ();
_active = false;
return 0;
}
-#if 0
/* mixdown midi */
for (std::vector<PamPort*>::iterator it = _system_midi_out.begin (); it != _system_midi_out.end (); ++it) {
- static_cast<PortBackendMidiPort*>(*it)->next_period();
+ static_cast<PortMidiPort*>(*it)->next_period();
}
-
/* queue outgoing midi */
i = 0;
for (std::vector<PamPort*>::const_iterator it = _system_midi_out.begin (); it != _system_midi_out.end (); ++it, ++i) {
- // TODO
+ const PortMidiBuffer* src = static_cast<const PortMidiPort*>(*it)->const_buffer();
+
+ for (PortMidiBuffer::const_iterator mit = src->begin (); mit != src->end (); ++mit) {
+ uint64_t timestamp =
+ m_cycle_timer.timestamp_from_sample_offset ((*mit)->timestamp ());
+ DEBUG_MIDI (
+ string_compose ("Queuing outgoing MIDI data for device: "
+ "%1 sample_offset: %2 timestamp: %3, size: %4\n",
+ _midiio->get_outputs ()[i]->name (),
+ (*mit)->timestamp (),
+ timestamp,
+ (*mit)->size ()));
+ _midiio->enqueue_output_event (
+ i, timestamp, (*mit)->data (), (*mit)->size ());
+ }
}
-#endif
/* write back audio */
i = 0;
@@ -1202,10 +1508,19 @@ PortAudioBackend::main_process_thread ()
_processed_samples += _samples_per_period;
/* calculate DSP load */
- clock2 = g_get_monotonic_time();
+ clock2 = utils::get_microseconds ();
const int64_t elapsed_time = clock2 - clock1;
_dsp_load = elapsed_time / (float) nomial_time;
+ max_elapsed_us = std::max (elapsed_time, max_elapsed_us);
+ min_elapsed_us = std::min (elapsed_time, min_elapsed_us);
+ if ((m_cycle_count % 1000) == 0) {
+ DEBUG_TIMING (
+ string_compose ("Elapsed process time(usecs) max: %1, min: %2\n",
+ max_elapsed_us,
+ min_elapsed_us));
+ }
+
} else {
// Freewheelin'
@@ -1214,11 +1529,10 @@ PortAudioBackend::main_process_thread ()
memset ((*it)->get_buffer (_samples_per_period), 0, _samples_per_period * sizeof (Sample));
}
- clock1 = g_get_monotonic_time();
+ clock1 = utils::get_microseconds ();
// TODO clear midi or stop midi recv when entering fwheelin'
- _last_process_start = 0;
if (engine.process_callback (_samples_per_period)) {
_pcmio->pcm_stop ();
_active = false;
@@ -1270,6 +1584,11 @@ PortAudioBackend::main_process_thread ()
if (_run) {
engine.halted_callback("PortAudio I/O error.");
}
+
+#ifdef USE_MMCSS_THREAD_PRIORITIES
+ mmcss::revert_thread_characteristics (task_handle);
+#endif
+
return 0;
}
diff --git a/libs/backends/portaudio/portaudio_backend.h b/libs/backends/portaudio/portaudio_backend.h
index 36aebe0..f1ff790 100644
--- a/libs/backends/portaudio/portaudio_backend.h
+++ b/libs/backends/portaudio/portaudio_backend.h
@@ -33,6 +33,8 @@
#include "ardour/types.h"
#include "portaudio_io.h"
+#include "winmmemidi_io.h"
+#include "cycle_timer.h"
namespace ARDOUR {
@@ -63,9 +65,11 @@ class PamPort { // PortAudio / PortMidi Backend Port
virtual ~PamPort ();
const std::string& name () const { return _name; }
+ const std::string& pretty_name () const { return _pretty_name; }
PortFlags flags () const { return _flags; }
int set_name (const std::string &name) { _name = name; return 0; }
+ int set_pretty_name (const std::string& name) { _pretty_name = name; return 0;}
virtual DataType type () const = 0;
@@ -105,6 +109,7 @@ class PamPort { // PortAudio / PortMidi Backend Port
private:
PortAudioBackend &_osx_backend;
std::string _name;
+ std::string _pretty_name;
const PortFlags _flags;
LatencyRange _capture_latency_range;
LatencyRange _playback_latency_range;
@@ -160,7 +165,16 @@ class PortAudioBackend : public AudioBackend {
std::string name () const;
bool is_realtime () const;
+ bool requires_driver_selection() const;
+ std::string driver_name () const;
+ std::vector<std::string> enumerate_drivers () const;
+ int set_driver (const std::string&);
+
+ bool use_separate_input_and_output_devices () const;
std::vector<DeviceStatus> enumerate_devices () const;
+ std::vector<DeviceStatus> enumerate_input_devices () const;
+ std::vector<DeviceStatus> enumerate_output_devices () const;
+
std::vector<float> available_sample_rates (const std::string& device) const;
std::vector<uint32_t> available_buffer_sizes (const std::string& device) const;
uint32_t available_input_channel_count (const std::string& device) const;
@@ -170,6 +184,8 @@ class PortAudioBackend : public AudioBackend {
bool can_change_buffer_size_when_running () const;
int set_device_name (const std::string&);
+ int set_input_device_name (const std::string&);
+ int set_output_device_name (const std::string&);
int set_sample_rate (float);
int set_buffer_size (uint32_t);
int set_interleaved (bool yn);
@@ -184,6 +200,8 @@ class PortAudioBackend : public AudioBackend {
/* Retrieving parameters */
std::string device_name () const;
+ std::string input_device_name () const;
+ std::string output_device_name () const;
float sample_rate () const;
uint32_t buffer_size () const;
bool interleaved () const;
@@ -197,8 +215,8 @@ class PortAudioBackend : public AudioBackend {
bool can_set_systemic_midi_latencies () const { return false; }
/* External control app */
- std::string control_app_name () const { return std::string (); }
- void launch_control_app () {}
+ std::string control_app_name () const;
+ void launch_control_app ();
/* MIDI */
std::vector<std::string> enumerate_midi_options () const;
@@ -246,6 +264,7 @@ class PortAudioBackend : public AudioBackend {
int set_port_name (PortHandle, const std::string&);
std::string get_port_name (PortHandle) const;
PortHandle get_port_by_name (const std::string&) const;
+ int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const;
int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>&) const;
@@ -300,6 +319,7 @@ class PortAudioBackend : public AudioBackend {
private:
std::string _instance_name;
PortAudioIO *_pcmio;
+ WinMMEMidiIO *_midiio;
bool _run; /* keep going or stop, ardour thread */
bool _active; /* is running, process thread */
@@ -307,13 +327,20 @@ class PortAudioBackend : public AudioBackend {
bool _freewheeling;
bool _measure_latency;
- uint64_t _last_process_start;
+ uint64_t m_cycle_count;
+ uint64_t m_total_deviation_us;
+ uint64_t m_max_deviation_us;
+
+ CycleTimer m_cycle_timer;
+ uint64_t m_last_cycle_start;
static std::vector<std::string> _midi_options;
- static std::vector<AudioBackend::DeviceStatus> _audio_device_status;
+ static std::vector<AudioBackend::DeviceStatus> _input_audio_device_status;
+ static std::vector<AudioBackend::DeviceStatus> _output_audio_device_status;
static std::vector<AudioBackend::DeviceStatus> _midi_device_status;
- mutable std::string _audio_device;
+ mutable std::string _input_audio_device;
+ mutable std::string _output_audio_device;
std::string _midi_driver_option;
/* audio settings */
@@ -351,6 +378,7 @@ class PortAudioBackend : public AudioBackend {
/* port engine */
PortHandle add_port (const std::string& shortname, ARDOUR::DataType, ARDOUR::PortFlags);
int register_system_audio_ports ();
+ int register_system_midi_ports ();
void unregister_ports (bool system_only = false);
std::vector<PamPort *> _ports;
diff --git a/libs/backends/portaudio/portaudio_io.cc b/libs/backends/portaudio/portaudio_io.cc
index 18a676f..809666f 100644
--- a/libs/backends/portaudio/portaudio_io.cc
+++ b/libs/backends/portaudio/portaudio_io.cc
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2015 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2015 Tim Mayberry <mojofunk at gmail.com>
*
* 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
@@ -20,8 +21,17 @@
#include <stdlib.h>
#include <string.h>
#include <assert.h>
+#include <glibmm.h>
#include "portaudio_io.h"
+#ifdef WITH_ASIO
+#include "pa_asio.h"
+#endif
+
+#include "pbd/compose.h"
+
+#include "debug.h"
+
#define INTERLEAVED_INPUT
#define INTERLEAVED_OUTPUT
@@ -38,6 +48,7 @@ PortAudioIO::PortAudioIO ()
, _cur_sample_rate (0)
, _cur_input_latency (0)
, _cur_output_latency (0)
+ , _host_api_index(-1)
{
}
@@ -50,30 +61,64 @@ PortAudioIO::~PortAudioIO ()
Pa_Terminate();
}
- for (std::map<int, paDevice*>::const_iterator i = _devices.begin (); i != _devices.end(); ++i) {
- delete i->second;
- }
- _devices.clear();
+ clear_device_lists ();
free (_input_buffer); _input_buffer = NULL;
free (_output_buffer); _output_buffer = NULL;
}
+std::string
+PortAudioIO::control_app_name (int device_id) const
+{
+ const PaHostApiInfo* info = Pa_GetHostApiInfo (_host_api_index);
+ std::string app_name;
+
+ if (info == NULL) {
+ DEBUG_AUDIO (string_compose ("Unable to determine Host API from index %1\n",
+ _host_api_index));
+ return app_name;
+ }
+
+ PaHostApiTypeId type_id = info->type;
+
+#ifdef WITH_ASIO
+ if (type_id == paASIO) {
+ // is this used for anything, or just acts as a boolean?
+ return "PortaudioASIO";
+ }
+#endif
+
+ return app_name;
+}
+
+void
+PortAudioIO::launch_control_app (int device_id)
+{
+#ifdef WITH_ASIO
+ PaError err = PaAsio_ShowControlPanel (device_id, NULL);
+
+ if (err != paNoError) {
+ // error << ?
+ DEBUG_AUDIO (string_compose (
+ "Unable to show control panel for device with index %1\n", device_id));
+ }
+#endif
+}
int
PortAudioIO::available_sample_rates(int device_id, std::vector<float>& sampleRates)
{
static const float ardourRates[] = { 8000.0, 22050.0, 24000.0, 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0};
- assert(_initialized);
+ if (!initialize_pa()) return -1;
// TODO use separate int device_input, int device_output ?!
if (device_id == -1) {
- device_id = Pa_GetDefaultInputDevice();
+ device_id = get_default_input_device ();
}
-#ifndef NDEBUG
- printf("PortAudio: Querying Samplerates for device %d\n", device_id);
-#endif
+
+ DEBUG_AUDIO (
+ string_compose ("Querying Samplerates for device %1\n", device_id));
sampleRates.clear();
const PaDeviceInfo* nfo = Pa_GetDeviceInfo(device_id);
@@ -113,87 +158,353 @@ PortAudioIO::available_sample_rates(int device_id, std::vector<float>& sampleRat
return 0;
}
-int
-PortAudioIO::available_buffer_sizes(int device_id, std::vector<uint32_t>& bufferSizes)
+#ifdef WITH_ASIO
+bool
+PortAudioIO::get_asio_buffer_properties (int device_id,
+ long& min_size_frames,
+ long& max_size_frames,
+ long& preferred_size_frames,
+ long& granularity)
+{
+ // we shouldn't really need all these checks but it shouldn't hurt
+ const PaDeviceInfo* device_info = Pa_GetDeviceInfo(device_id);
+
+ if (!device_info) {
+ DEBUG_AUDIO (string_compose (
+ "Unable to get device info from device index %1\n", device_id));
+ return false;
+ }
+
+ const PaHostApiInfo* info = Pa_GetHostApiInfo (device_info->hostApi);
+
+ if (info == NULL) {
+ DEBUG_AUDIO (string_compose (
+ "Unable to determine Host API from device index %1\n", device_id));
+ return false;
+ }
+
+ if (info->type != paASIO) {
+ DEBUG_AUDIO (string_compose (
+ "ERROR device_id %1 is not an ASIO device\n", device_id));
+ return false;
+ }
+
+ PaError err = PaAsio_GetAvailableBufferSizes (device_id,
+ &min_size_frames,
+ &max_size_frames,
+ &preferred_size_frames,
+ &granularity);
+
+ if (err != paNoError) {
+ DEBUG_AUDIO (string_compose (
+ "Unable to determine available buffer sizes for device %1\n", device_id));
+ return false;
+ }
+ return true;
+}
+
+bool
+PortAudioIO::get_asio_buffer_sizes (int device_id, std::vector<uint32_t>& buffer_sizes)
+{
+ long min_size_frames = 0;
+ long max_size_frames = 0;
+ long preferred_size_frames = 0;
+ long granularity = 0;
+
+ if (!get_asio_buffer_properties (device_id,
+ min_size_frames,
+ max_size_frames,
+ preferred_size_frames,
+ granularity)) {
+ DEBUG_AUDIO (string_compose (
+ "Unable to get device buffer properties from device index %1\n", device_id));
+ return false;
+ }
+
+ DEBUG_AUDIO (string_compose ("ASIO buffer properties for device %1, "
+ "min_size_frames: %2, max_size_frames: %3, "
+ "preferred_size_frames: %4, granularity: %5\n",
+ device_id,
+ min_size_frames,
+ max_size_frames,
+ preferred_size_frames,
+ granularity));
+
+#ifdef USE_ASIO_MIN_MAX_BUFFER_SIZES
+ if (min_size_frames >= max_size_frames) {
+ buffer_sizes.push_back (preferred_size_frames);
+ return true;
+ }
+
+ long buffer_size = min_size_frames;
+ while (buffer_size <= max_size_frames) {
+ buffer_sizes.push_back (buffer_size);
+
+ if (granularity <= 0) {
+ // buffer sizes are power of 2
+ buffer_size = buffer_size * 2;
+ } else {
+ buffer_size += granularity;
+ }
+ }
+#else
+ buffer_sizes.push_back (preferred_size_frames);
+#endif
+ return true;
+}
+#endif
+
+bool
+PortAudioIO::get_default_buffer_sizes (int device_id, std::vector<uint32_t>& buffer_sizes)
{
- // TODO
static const uint32_t ardourSizes[] = { 64, 128, 256, 512, 1024, 2048, 4096 };
for(uint32_t i = 0; i < sizeof(ardourSizes)/sizeof(uint32_t); ++i) {
- bufferSizes.push_back (ardourSizes[i]);
+ buffer_sizes.push_back (ardourSizes[i]);
}
+ return true;
+}
+
+int
+PortAudioIO::available_buffer_sizes(int device_id, std::vector<uint32_t>& buffer_sizes)
+{
+#ifdef WITH_ASIO
+ const PaHostApiInfo* info = Pa_GetHostApiInfo (_host_api_index);
+
+ if (info == NULL) {
+ DEBUG_AUDIO (string_compose ("Unable to determine Host API from index %1\n",
+ _host_api_index));
+ return -1;
+ }
+
+ PaHostApiTypeId type_id = info->type;
+
+ if (type_id == paASIO) {
+ if (get_asio_buffer_sizes (device_id, buffer_sizes)) {
+ return 0;
+ }
+ }
+#endif
+
+ get_default_buffer_sizes (device_id, buffer_sizes);
+
return 0;
}
void
-PortAudioIO::device_list (std::map<int, std::string> &devices) const {
- devices.clear();
- for (std::map<int, paDevice*>::const_iterator i = _devices.begin (); i != _devices.end(); ++i) {
- devices.insert (std::pair<int, std::string> (i->first, i->second->name));
+PortAudioIO::input_device_list(std::map<int, std::string> &devices) const
+{
+ for (std::map<int, paDevice*>::const_iterator i = _input_devices.begin ();
+ i != _input_devices.end ();
+ ++i) {
+ devices.insert (std::pair<int, std::string>(i->first, Glib::locale_to_utf8(i->second->name)));
}
}
void
-PortAudioIO::discover()
+PortAudioIO::output_device_list(std::map<int, std::string> &devices) const
{
- for (std::map<int, paDevice*>::const_iterator i = _devices.begin (); i != _devices.end(); ++i) {
- delete i->second;
+ for (std::map<int, paDevice*>::const_iterator i = _output_devices.begin ();
+ i != _output_devices.end ();
+ ++i) {
+ devices.insert (std::pair<int, std::string>(i->first, Glib::locale_to_utf8(i->second->name)));
}
- _devices.clear();
-
+}
+
+bool
+PortAudioIO::initialize_pa ()
+{
PaError err = paNoError;
if (!_initialized) {
err = Pa_Initialize();
+ if (err != paNoError) {
+ return false;
+ }
+ _initialized = true;
+ _host_api_index = Pa_GetDefaultHostApi ();
+ _host_api_name = get_host_api_name_from_index (_host_api_index);
}
- if (err != paNoError) {
- return;
+
+ return true;
+}
+
+void
+PortAudioIO::host_api_list (std::vector<std::string>& api_list)
+{
+ if (!initialize_pa()) return;
+
+ PaHostApiIndex count = Pa_GetHostApiCount();
+
+ if (count < 0) return;
+
+ for (int i = 0; i < count; ++i) {
+ const PaHostApiInfo* info = Pa_GetHostApiInfo (i);
+ if (info->name != NULL) { // possible?
+ api_list.push_back (info->name);
+ }
}
+}
- _initialized = true;
+std::string
+PortAudioIO::get_host_api_name_from_index (PaHostApiIndex index)
+{
+ std::vector<std::string> api_list;
+ host_api_list(api_list);
+ return api_list[index];
+}
- {
- const PaDeviceInfo* nfo_i = Pa_GetDeviceInfo(Pa_GetDefaultInputDevice());
- const PaDeviceInfo* nfo_o = Pa_GetDeviceInfo(Pa_GetDefaultOutputDevice());
- if (nfo_i && nfo_o) {
- _devices.insert (std::pair<int, paDevice*> (-1,
- new paDevice("Default",
- nfo_i->maxInputChannels,
- nfo_o->maxOutputChannels
- )));
+bool
+PortAudioIO::set_host_api (const std::string& host_api_name)
+{
+ PaHostApiIndex new_index = get_host_api_index_from_name (host_api_name);
+
+ if (new_index < 0) {
+ DEBUG_AUDIO ("Portaudio: Error setting host API\n");
+ return false;
+ }
+ _host_api_index = new_index;
+ _host_api_name = host_api_name;
+ return true;
+}
+
+PaHostApiIndex
+PortAudioIO::get_host_api_index_from_name (const std::string& name)
+{
+ if (!initialize_pa()) return -1;
+
+ PaHostApiIndex count = Pa_GetHostApiCount();
+
+ if (count < 0) {
+ DEBUG_AUDIO ("Host API count < 0\n");
+ return -1;
+ }
+
+ for (int i = 0; i < count; ++i) {
+ const PaHostApiInfo* info = Pa_GetHostApiInfo (i);
+ if (info != NULL && info->name != NULL) { // possible?
+ if (name == info->name) {
+ return i;
+ }
}
}
+ DEBUG_AUDIO (string_compose ("Unable to get host API from name: %1\n", name));
+
+ return -1;
+}
+
+PaDeviceIndex
+PortAudioIO::get_default_input_device ()
+{
+ const PaHostApiInfo* info = Pa_GetHostApiInfo (_host_api_index);
+ if (info == NULL) return -1;
+ return info->defaultInputDevice;
+}
+
+PaDeviceIndex
+PortAudioIO::get_default_output_device ()
+{
+ const PaHostApiInfo* info = Pa_GetHostApiInfo (_host_api_index);
+ if (info == NULL) return -1;
+ return info->defaultOutputDevice;
+}
+
+void
+PortAudioIO::clear_device_lists ()
+{
+ for (std::map<int, paDevice*>::const_iterator i = _input_devices.begin (); i != _input_devices.end(); ++i) {
+ delete i->second;
+ }
+ _input_devices.clear();
+
+ for (std::map<int, paDevice*>::const_iterator i = _output_devices.begin (); i != _output_devices.end(); ++i) {
+ delete i->second;
+ }
+ _output_devices.clear();
+}
+
+void
+PortAudioIO::add_default_devices ()
+{
+ const PaHostApiInfo* info = Pa_GetHostApiInfo (_host_api_index);
+ if (info == NULL) return;
+
+ const PaDeviceInfo* nfo_i = Pa_GetDeviceInfo(get_default_input_device());
+ const PaDeviceInfo* nfo_o = Pa_GetDeviceInfo(get_default_output_device());
+ if (nfo_i && nfo_o) {
+ _input_devices.insert (std::pair<int, paDevice*> (-1,
+ new paDevice("Default",
+ nfo_i->maxInputChannels,
+ nfo_o->maxOutputChannels
+ )));
+ _output_devices.insert (std::pair<int, paDevice*> (-1,
+ new paDevice("Default",
+ nfo_i->maxInputChannels,
+ nfo_o->maxOutputChannels
+ )));
+ }
+}
+
+void
+PortAudioIO::add_devices ()
+{
+ const PaHostApiInfo* info = Pa_GetHostApiInfo (_host_api_index);
+ if (info == NULL) return;
int n_devices = Pa_GetDeviceCount();
-#ifndef NDEBUG
- printf("PortAudio %d devices found:\n", n_devices);
-#endif
+
+ DEBUG_AUDIO (string_compose ("PortAudio found %1 devices\n", n_devices));
for (int i = 0 ; i < n_devices; ++i) {
const PaDeviceInfo* nfo = Pa_GetDeviceInfo(i);
+
if (!nfo) continue;
-#ifndef NDEBUG
- printf(" (%d) '%s' in: %d (lat: %.1f .. %.1f) out: %d (lat: %.1f .. %.1f) sr:%.2f\n",
- i, nfo->name,
- nfo->maxInputChannels,
- nfo->defaultLowInputLatency * 1e3,
- nfo->defaultHighInputLatency * 1e3,
- nfo->maxOutputChannels,
- nfo->defaultLowOutputLatency * 1e3,
- nfo->defaultHighOutputLatency * 1e3,
- nfo->defaultSampleRate);
-#endif
+ if (nfo->hostApi != _host_api_index) continue;
+
+ DEBUG_AUDIO (string_compose (" (%1) '%2' '%3' in: %4 (lat: %5 .. %6) out: %7 "
+ "(lat: %8 .. %9) sr:%10\n",
+ i,
+ info->name,
+ nfo->name,
+ nfo->maxInputChannels,
+ nfo->defaultLowInputLatency * 1e3,
+ nfo->defaultHighInputLatency * 1e3,
+ nfo->maxOutputChannels,
+ nfo->defaultLowOutputLatency * 1e3,
+ nfo->defaultHighOutputLatency * 1e3,
+ nfo->defaultSampleRate));
+
if ( nfo->maxInputChannels == 0 && nfo->maxOutputChannels == 0) {
continue;
}
- _devices.insert (std::pair<int, paDevice*> (i, new paDevice(
- nfo->name,
- nfo->maxInputChannels,
- nfo->maxOutputChannels
- )));
+
+ if (nfo->maxInputChannels > 0) {
+ _input_devices.insert (std::pair<int, paDevice*> (i, new paDevice(
+ nfo->name,
+ nfo->maxInputChannels,
+ nfo->maxOutputChannels
+ )));
+ }
+ if (nfo->maxOutputChannels > 0) {
+ _output_devices.insert (std::pair<int, paDevice*> (i, new paDevice(
+ nfo->name,
+ nfo->maxInputChannels,
+ nfo->maxOutputChannels
+ )));
+ }
}
}
void
+PortAudioIO::discover()
+{
+ DEBUG_AUDIO ("PortAudio: discover\n");
+ if (!initialize_pa()) return;
+
+ clear_device_lists ();
+ add_devices ();
+}
+
+void
PortAudioIO::pcm_stop ()
{
if (_stream) {
@@ -244,28 +555,21 @@ PortAudioIO::pcm_setup (
{
_state = -2;
- // TODO error reporting sans fprintf()
-
PaError err = paNoError;
const PaDeviceInfo *nfo_in;
const PaDeviceInfo *nfo_out;
const PaStreamInfo *nfo_s;
- if (!_initialized) {
- err = Pa_Initialize();
- }
- if (err != paNoError) {
- fprintf(stderr, "PortAudio Initialization Failed\n");
+ if (!initialize_pa()) {
+ DEBUG_AUDIO ("PortAudio Initialization Failed\n");
goto error;
}
- _initialized = true;
-
if (device_input == -1) {
- device_input = Pa_GetDefaultInputDevice();
+ device_input = get_default_input_device ();
}
if (device_output == -1) {
- device_output = Pa_GetDefaultOutputDevice();
+ device_output = get_default_output_device ();
}
_capture_channels = 0;
@@ -274,15 +578,14 @@ PortAudioIO::pcm_setup (
_cur_input_latency = 0;
_cur_output_latency = 0;
-#ifndef NDEBUG
- printf("PortAudio Device IDs: i:%d o:%d\n", device_input, device_output);
-#endif
+ DEBUG_AUDIO (string_compose (
+ "PortAudio Device IDs: i:%1 o:%2\n", device_input, device_output));
nfo_in = Pa_GetDeviceInfo(device_input);
nfo_out = Pa_GetDeviceInfo(device_output);
if (!nfo_in && ! nfo_out) {
- fprintf(stderr, "PortAudio Cannot Query Device Info\n");
+ DEBUG_AUDIO ("PortAudio Cannot Query Device Info\n");
goto error;
}
@@ -294,29 +597,29 @@ PortAudioIO::pcm_setup (
}
if(_capture_channels == 0 && _playback_channels == 0) {
- fprintf(stderr, "PortAudio no Input and no output channels.\n");
+ DEBUG_AUDIO ("PortAudio no input or output channels.\n");
goto error;
}
-
#ifdef __APPLE__
// pa_mac_core_blocking.c pa_stable_v19_20140130
// BUG: ringbuffer alloc requires power-of-two chn count.
if ((_capture_channels & (_capture_channels - 1)) != 0) {
- printf("Adjusted capture channes to power of two (portaudio rb bug)\n");
+ DEBUG_AUDIO (
+ "Adjusted capture channels to power of two (portaudio rb bug)\n");
_capture_channels = lower_power_of_two (_capture_channels);
}
if ((_playback_channels & (_playback_channels - 1)) != 0) {
- printf("Adjusted capture channes to power of two (portaudio rb bug)\n");
+ DEBUG_AUDIO (
+ "Adjusted capture channels to power of two (portaudio rb bug)\n");
_playback_channels = lower_power_of_two (_playback_channels);
}
#endif
-
-#ifndef NDEBUG
- printf("PortAudio Channels: in:%d out:%d\n",
- _capture_channels, _playback_channels);
-#endif
+
+ DEBUG_AUDIO (string_compose ("PortAudio Channels: in:%1 out:%2\n",
+ _capture_channels,
+ _playback_channels));
PaStreamParameters inputParam;
PaStreamParameters outputParam;
@@ -352,17 +655,17 @@ PortAudioIO::pcm_setup (
_playback_channels > 0 ? &outputParam: NULL,
sample_rate,
samples_per_period,
- paClipOff | paDitherOff,
+ paDitherOff,
NULL, NULL);
if (err != paNoError) {
- fprintf(stderr, "PortAudio failed to start stream.\n");
+ DEBUG_AUDIO ("PortAudio failed to start stream.\n");
goto error;
}
nfo_s = Pa_GetStreamInfo (_stream);
if (!nfo_s) {
- fprintf(stderr, "PortAudio failed to query stream information.\n");
+ DEBUG_AUDIO ("PortAudio failed to query stream information.\n");
pcm_stop();
goto error;
}
@@ -371,18 +674,22 @@ PortAudioIO::pcm_setup (
_cur_input_latency = nfo_s->inputLatency * _cur_sample_rate;
_cur_output_latency = nfo_s->outputLatency * _cur_sample_rate;
-#ifndef NDEBUG
- printf("PA Sample Rate %.1f SPS\n", _cur_sample_rate);
- printf("PA Input Latency %.1fms %d spl\n", 1e3 * nfo_s->inputLatency, _cur_input_latency);
- printf("PA Output Latency %.1fms %d spl\n", 1e3 * nfo_s->outputLatency, _cur_output_latency);
-#endif
+ DEBUG_AUDIO (string_compose ("PA Sample Rate %1 SPS\n", _cur_sample_rate));
+
+ DEBUG_AUDIO (string_compose ("PA Input Latency %1ms, %2 spl\n",
+ 1e3 * nfo_s->inputLatency,
+ _cur_input_latency));
+
+ DEBUG_AUDIO (string_compose ("PA Output Latency %1ms, %2 spl\n",
+ 1e3 * nfo_s->outputLatency,
+ _cur_output_latency));
_state = 0;
if (_capture_channels > 0) {
_input_buffer = (float*) malloc (samples_per_period * _capture_channels * sizeof(float));
if (!_input_buffer) {
- fprintf(stderr, "PortAudio failed to allocate input buffer.\n");
+ DEBUG_AUDIO ("PortAudio failed to allocate input buffer.\n");
pcm_stop();
goto error;
}
@@ -391,7 +698,7 @@ PortAudioIO::pcm_setup (
if (_playback_channels > 0) {
_output_buffer = (float*) calloc (samples_per_period * _playback_channels, sizeof(float));
if (!_output_buffer) {
- fprintf(stderr, "PortAudio failed to allocate output buffer.\n");
+ DEBUG_AUDIO ("PortAudio failed to allocate output buffer.\n");
pcm_stop();
goto error;
}
@@ -404,7 +711,6 @@ error:
_playback_channels = 0;
free (_input_buffer); _input_buffer = NULL;
free (_output_buffer); _output_buffer = NULL;
- Pa_Terminate();
return -1;
}
@@ -440,6 +746,47 @@ PortAudioIO::next_cycle (uint32_t n_samples)
return xrun ? 1 : 0;
}
+std::string
+PortAudioIO::get_input_channel_name (int device_id, uint32_t channel) const
+{
+#ifdef WITH_ASIO
+ const char* channel_name;
+
+ // This will return an error for non-ASIO devices so no need to check if
+ // the device_id corresponds to an ASIO device.
+ PaError err = PaAsio_GetInputChannelName (device_id, channel, &channel_name);
+
+ if (err == paNoError) {
+ DEBUG_AUDIO (
+ string_compose ("Input channel name for device %1, channel %2 is %3\n",
+ device_id,
+ channel,
+ channel_name));
+ return channel_name;
+ }
+#endif
+ return std::string();
+}
+
+std::string
+PortAudioIO::get_output_channel_name (int device_id, uint32_t channel) const
+{
+#ifdef WITH_ASIO
+ const char* channel_name;
+
+ PaError err = PaAsio_GetOutputChannelName (device_id, channel, &channel_name);
+
+ if (err == paNoError) {
+ DEBUG_AUDIO (
+ string_compose ("Output channel name for device %1, channel %2 is %3\n",
+ device_id,
+ channel,
+ channel_name));
+ return channel_name;
+ }
+#endif
+ return std::string();
+}
#ifdef INTERLEAVED_INPUT
diff --git a/libs/backends/portaudio/portaudio_io.h b/libs/backends/portaudio/portaudio_io.h
index 532dc66..f5ee897 100644
--- a/libs/backends/portaudio/portaudio_io.h
+++ b/libs/backends/portaudio/portaudio_io.h
@@ -37,12 +37,36 @@ public:
int state (void) const { return _state; }
+ bool initialize_pa ();
+
+ void host_api_list (std::vector<std::string>&);
+ bool set_host_api (const std::string& host_api_name);
+ std::string get_host_api () const { return _host_api_name; }
+ PaHostApiIndex get_host_api_index_from_name (const std::string& name);
+
+ PaDeviceIndex get_default_input_device ();
+ PaDeviceIndex get_default_output_device ();
+
void discover();
- void device_list (std::map<int, std::string> &devices) const;
+ void input_device_list (std::map<int, std::string> &devices) const;
+ void output_device_list (std::map<int, std::string> &devices) const;
- int available_sample_rates (int device_id, std::vector<float>& sampleRates);
- int available_buffer_sizes (int device_id, std::vector<uint32_t>& sampleRates);
+ int available_sample_rates (int device_id, std::vector<float>& sample_rates);
+ int available_buffer_sizes (int device_id, std::vector<uint32_t>& buffer_sizes);
+ bool get_default_buffer_sizes (int device_id, std::vector<uint32_t>& buffer_sizes);
+#ifdef WITH_ASIO
+ bool get_asio_buffer_properties (int device_id,
+ long& min_size_frames,
+ long& max_size_frames,
+ long& preferred_size_frames,
+ long& granularity);
+
+ bool get_asio_buffer_sizes (int device_id, std::vector<uint32_t>& buffer_size);
+#endif
+
+ std::string control_app_name (int device_id) const;
+ void launch_control_app (int device_id);
void pcm_stop (void);
int pcm_start (void);
@@ -57,6 +81,9 @@ public:
uint32_t n_playback_channels (void) const { return _playback_channels; }
uint32_t n_capture_channels (void) const { return _capture_channels; }
+ std::string get_input_channel_name (int device_id, uint32_t channel) const;
+ std::string get_output_channel_name (int device_id, uint32_t channel) const;
+
double sample_rate (void) const { return _cur_sample_rate; }
uint32_t capture_latency (void) const { return _cur_input_latency; }
uint32_t playback_latency (void) const { return _cur_output_latency; }
@@ -66,7 +93,14 @@ public:
int get_capture_channel (uint32_t chn, float *input, uint32_t n_samples);
int set_playback_channel (uint32_t chn, const float *input, uint32_t n_samples);
-private:
+private: // Methods
+
+ void clear_device_lists ();
+ void add_default_devices ();
+ void add_devices ();
+ std::string get_host_api_name_from_index (PaHostApiIndex index);
+
+private: // Data
int _state;
bool _initialized;
@@ -82,7 +116,6 @@ private:
uint32_t _cur_input_latency;
uint32_t _cur_output_latency;
-
struct paDevice {
std::string name;
uint32_t n_inputs;
@@ -95,7 +128,12 @@ private:
{}
};
- std::map<int, paDevice *> _devices;
+ std::map<int, paDevice *> _input_devices;
+ std::map<int, paDevice *> _output_devices;
+
+ PaHostApiIndex _host_api_index;
+ std::string _host_api_name;
+
};
} // namespace
diff --git a/libs/backends/portaudio/win_utils.cc b/libs/backends/portaudio/win_utils.cc
new file mode 100644
index 0000000..3b98582
--- /dev/null
+++ b/libs/backends/portaudio/win_utils.cc
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2015 Tim Mayberry <mojofunk at gmail.com>
+ *
+ * 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.
+ */
+
+#include "win_utils.h"
+
+#include <windows.h>
+#include <mmsystem.h>
+
+#include "pbd/compose.h"
+
+#include "debug.h"
+
+namespace {
+
+LARGE_INTEGER
+get_frequency ()
+{
+ LARGE_INTEGER freq;
+ QueryPerformanceFrequency(&freq);
+ return freq;
+}
+
+
+UINT&
+old_timer_resolution ()
+{
+ static UINT timer_res_ms = 0;
+ return timer_res_ms;
+}
+
+} // anon namespace
+
+namespace utils {
+
+bool
+set_min_timer_resolution ()
+{
+ TIMECAPS caps;
+
+ if (timeGetDevCaps (&caps, sizeof(TIMECAPS)) != TIMERR_NOERROR) {
+ DEBUG_TIMING ("Could not get timer device capabilities.\n");
+ return false;
+ } else {
+ old_timer_resolution () = caps.wPeriodMin;
+ if (timeBeginPeriod (caps.wPeriodMin) != TIMERR_NOERROR) {
+ DEBUG_TIMING (string_compose (
+ "Could not set minimum timer resolution to %1(ms)\n", caps.wPeriodMin));
+ return false;
+ }
+ }
+
+ DEBUG_TIMING (string_compose ("Multimedia timer resolution set to %1(ms)\n",
+ caps.wPeriodMin));
+
+ return true;
+}
+
+bool
+reset_timer_resolution ()
+{
+ if (old_timer_resolution ()) {
+ if (timeEndPeriod (old_timer_resolution ()) != TIMERR_NOERROR) {
+ DEBUG_TIMING ("Could not reset timer resolution.\n");
+ return false;
+ }
+ }
+
+ DEBUG_TIMING (string_compose ("Multimedia timer resolution set to %1(ms)\n",
+ old_timer_resolution ()));
+
+ return true;
+}
+
+uint64_t get_microseconds ()
+{
+ static LARGE_INTEGER frequency = get_frequency ();
+ LARGE_INTEGER current_val;
+
+ QueryPerformanceCounter (¤t_val);
+
+ return (uint64_t)(((double)current_val.QuadPart) /
+ ((double)frequency.QuadPart) * 1000000.0);
+}
+
+} // namespace utils
diff --git a/libs/backends/alsa/select_sleep.h b/libs/backends/portaudio/win_utils.h
similarity index 58%
copy from libs/backends/alsa/select_sleep.h
copy to libs/backends/portaudio/win_utils.h
index ec6a93d..50576b9 100644
--- a/libs/backends/alsa/select_sleep.h
+++ b/libs/backends/portaudio/win_utils.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004,2014 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2015 Tim Mayberry <mojofunk at gmail.com>
*
* 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
@@ -16,20 +16,19 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include <stdint.h>
-#include <sys/select.h>
+#ifndef WIN_UTILS_H
+#define WIN_UTILS_H
+
+#include "stdint.h"
+
+namespace utils {
+
+bool set_min_timer_resolution ();
+
+bool reset_timer_resolution ();
+
+uint64_t get_microseconds ();
-/* select() sleeps _at most_ a given time.
- * (compared to usleep() or nanosleep() which sleep at least a given time)
- */
-static void select_sleep (uint64_t usec) {
- if (usec <= 10) return;
- fd_set fd;
- int max_fd=0;
- struct timeval tv;
- tv.tv_sec = usec / 1000000;
- tv.tv_usec = usec % 1000000;
- FD_ZERO (&fd);
- select (max_fd, &fd, NULL, NULL, &tv);
- // on Linux, tv reflects the actual time slept.
}
+
+#endif // WIN_UTILS_H
diff --git a/libs/backends/portaudio/winmmemidi_input_device.cc b/libs/backends/portaudio/winmmemidi_input_device.cc
new file mode 100644
index 0000000..d7a0a6d
--- /dev/null
+++ b/libs/backends/portaudio/winmmemidi_input_device.cc
@@ -0,0 +1,395 @@
+/*
+ * Copyright (C) 2015 Tim Mayberry <mojofunk at gmail.com>
+ *
+ * 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.
+ */
+
+#include "winmmemidi_input_device.h"
+
+#include <stdexcept>
+#include <cmath>
+
+#include "pbd/compose.h"
+
+#include "win_utils.h"
+#include "midi_util.h"
+
+#include "mmcss.h"
+
+#include "debug.h"
+
+static const uint32_t MIDI_BUFFER_SIZE = 32768;
+static const uint32_t SYSEX_BUFFER_SIZE = 32768;
+
+namespace ARDOUR {
+
+WinMMEMidiInputDevice::WinMMEMidiInputDevice (int index)
+ : m_handle(0)
+ , m_started(false)
+ , m_midi_buffer(new RingBuffer<uint8_t>(MIDI_BUFFER_SIZE))
+ , m_sysex_buffer(new uint8_t[SYSEX_BUFFER_SIZE])
+{
+ DEBUG_MIDI (string_compose ("Creating midi input device index: %1\n", index));
+
+ std::string error_msg;
+
+ if (!open (index, error_msg)) {
+ DEBUG_MIDI (error_msg);
+ throw std::runtime_error (error_msg);
+ }
+
+ // perhaps this should be called in open
+ if (!add_sysex_buffer (error_msg)) {
+ DEBUG_MIDI (error_msg);
+ std::string close_error;
+ if (!close (close_error)) {
+ DEBUG_MIDI (close_error);
+ }
+ throw std::runtime_error (error_msg);
+ }
+
+ set_device_name (index);
+}
+
+WinMMEMidiInputDevice::~WinMMEMidiInputDevice ()
+{
+ std::string error_msg;
+ if (!close (error_msg)) {
+ DEBUG_MIDI (error_msg);
+ }
+}
+
+bool
+WinMMEMidiInputDevice::open (UINT index, std::string& error_msg)
+{
+ MMRESULT result = midiInOpen (&m_handle,
+ index,
+ (DWORD_PTR) winmm_input_callback,
+ (DWORD_PTR) this,
+ CALLBACK_FUNCTION | MIDI_IO_STATUS);
+ if (result != MMSYSERR_NOERROR) {
+ error_msg = get_error_string (result);
+ return false;
+ }
+ DEBUG_MIDI (string_compose ("Opened MIDI device index %1\n", index));
+ return true;
+}
+
+bool
+WinMMEMidiInputDevice::close (std::string& error_msg)
+{
+ // return error message for first error encountered?
+ bool success = true;
+
+ MMRESULT result = midiInReset (m_handle);
+ if (result != MMSYSERR_NOERROR) {
+ error_msg = get_error_string (result);
+ DEBUG_MIDI (error_msg);
+ success = false;
+ }
+ result = midiInUnprepareHeader (m_handle, &m_sysex_header, sizeof(MIDIHDR));
+ if (result != MMSYSERR_NOERROR) {
+ error_msg = get_error_string (result);
+ DEBUG_MIDI (error_msg);
+ success = false;
+ }
+ result = midiInClose (m_handle);
+ if (result != MMSYSERR_NOERROR) {
+ error_msg = get_error_string (result);
+ DEBUG_MIDI (error_msg);
+ success = false;
+ }
+ m_handle = 0;
+ if (success) {
+ DEBUG_MIDI (string_compose ("Closed MIDI device: %1\n", name ()));
+ } else {
+ DEBUG_MIDI (string_compose ("Unable to Close MIDI device: %1\n", name ()));
+ }
+ return success;
+}
+
+bool
+WinMMEMidiInputDevice::add_sysex_buffer (std::string& error_msg)
+{
+ m_sysex_header.dwBufferLength = SYSEX_BUFFER_SIZE;
+ m_sysex_header.dwFlags = 0;
+ m_sysex_header.lpData = (LPSTR)m_sysex_buffer.get ();
+
+ MMRESULT result = midiInPrepareHeader (m_handle, &m_sysex_header, sizeof(MIDIHDR));
+
+ if (result != MMSYSERR_NOERROR) {
+ error_msg = get_error_string (result);
+ DEBUG_MIDI (error_msg);
+ return false;
+ }
+ result = midiInAddBuffer (m_handle, &m_sysex_header, sizeof(MIDIHDR));
+ if (result != MMSYSERR_NOERROR) {
+ error_msg = get_error_string (result);
+ DEBUG_MIDI (error_msg);
+ return false;
+ }
+ return true;
+}
+
+bool
+WinMMEMidiInputDevice::set_device_name (UINT index)
+{
+ MIDIINCAPS capabilities;
+ MMRESULT result = midiInGetDevCaps (index, &capabilities, sizeof(capabilities));
+ if (result != MMSYSERR_NOERROR) {
+ DEBUG_MIDI (get_error_string (result));
+ m_name = "Unknown Midi Input Device";
+ return false;
+ } else {
+ m_name = capabilities.szPname;
+ }
+ return true;
+}
+
+std::string
+WinMMEMidiInputDevice::get_error_string (MMRESULT error_code)
+{
+ char error_msg[MAXERRORLENGTH];
+ MMRESULT result = midiInGetErrorText (error_code, error_msg, MAXERRORLENGTH);
+ if (result != MMSYSERR_NOERROR) {
+ return error_msg;
+ }
+ return "WinMMEMidiInput: Unknown Error code";
+}
+
+void CALLBACK
+WinMMEMidiInputDevice::winmm_input_callback(HMIDIIN handle,
+ UINT msg,
+ DWORD_PTR instance,
+ DWORD_PTR midi_msg,
+ DWORD timestamp)
+{
+ WinMMEMidiInputDevice* midi_input = (WinMMEMidiInputDevice*)instance;
+
+#ifdef USE_MMCSS_THREAD_PRIORITIES
+
+ static HANDLE input_thread = GetCurrentThread ();
+ static bool priority_boosted = false;
+
+#if 0 // GetThreadId() is Vista or later only.
+ if (input_thread != GetCurrentThread ()) {
+ DWORD otid = GetThreadId (input_thread);
+ DWORD ntid = GetThreadId (GetCurrentThread ());
+ // There was a reference on the internet somewhere that it is possible
+ // for the callback to come from different threads(thread pool) this
+ // could be problematic but I haven't seen this behaviour yet
+ DEBUG_THREADS (string_compose (
+ "WinMME input Thread ID Changed: was %1, now %2\n", otid, ntid));
+ }
+#endif
+
+ HANDLE task_handle;
+
+ if (!priority_boosted) {
+ mmcss::set_thread_characteristics ("Pro Audio", &task_handle);
+ mmcss::set_thread_priority (task_handle, mmcss::AVRT_PRIORITY_HIGH);
+ priority_boosted = true;
+ }
+#endif
+
+ switch (msg) {
+ case MIM_OPEN:
+ case MIM_CLOSE:
+ // devices_changed_callback
+ break;
+ case MIM_MOREDATA:
+ // passing MIDI_IO_STATUS to midiInOpen means that MIM_MOREDATA
+ // will be sent when the callback isn't processing MIM_DATA messages
+ // fast enough to keep up with messages arriving at input device
+ // driver. I'm not sure what could be done differently if that occurs
+ // so just handle MIM_DATA as per normal
+ case MIM_DATA:
+ midi_input->handle_short_msg ((const uint8_t*)&midi_msg, (uint32_t)timestamp);
+ break;
+ case MIM_LONGDATA:
+ midi_input->handle_sysex_msg ((MIDIHDR*)&midi_msg, (uint32_t)timestamp);
+ break;
+ case MIM_ERROR:
+ DEBUG_MIDI ("WinMME: Driver sent an invalid MIDI message\n");
+ break;
+ case MIM_LONGERROR:
+ DEBUG_MIDI ("WinMME: Driver sent an invalid or incomplete SYSEX message\n");
+ break;
+ }
+}
+
+void
+WinMMEMidiInputDevice::handle_short_msg (const uint8_t* midi_data,
+ uint32_t timestamp)
+{
+ int length = get_midi_msg_length (midi_data[0]);
+
+ if (length == 0 || length == -1) {
+ DEBUG_MIDI ("ERROR: midi input driver sent an invalid midi message\n");
+ return;
+ }
+
+ enqueue_midi_msg (midi_data, length, timestamp);
+}
+
+void
+WinMMEMidiInputDevice::handle_sysex_msg (MIDIHDR* const midi_header,
+ uint32_t timestamp)
+{
+#ifdef ENABLE_SYSEX
+ LPMIDIHDR header = (LPMIDIHDR)midi_header;
+ size_t byte_count = header->dwBytesRecorded;
+
+ if (!byte_count) {
+ DEBUG_MIDI (
+ "ERROR: WinMME driver has returned sysex header to us with no bytes\n");
+ return;
+ }
+
+ uint8_t* data = (uint8_t*)header->lpData;
+
+ if ((data[0] != 0xf0) || (data[byte_count - 1] != 0xf7)) {
+ DEBUG_MIDI (string_compose ("Discarding %1 byte sysex chunk\n", byte_count));
+ } else {
+ enqueue_midi_msg (data, byte_count, timestamp);
+ }
+
+ MMRESULT result = midiInAddBuffer (m_handle, &m_sysex_header, sizeof(MIDIHDR));
+ if (result != MMSYSERR_NOERROR) {
+ DEBUG_MIDI (get_error_string (result));
+ }
+#endif
+}
+
+// fix param order
+bool
+WinMMEMidiInputDevice::dequeue_midi_event (uint64_t timestamp_start,
+ uint64_t timestamp_end,
+ uint64_t& timestamp,
+ uint8_t* midi_data,
+ size_t& data_size)
+{
+ const uint32_t read_space = m_midi_buffer->read_space();
+ struct MidiEventHeader h(0,0);
+
+ if (read_space <= sizeof(MidiEventHeader)) {
+ return false;
+ }
+
+ RingBuffer<uint8_t>::rw_vector vector;
+ m_midi_buffer->get_read_vector (&vector);
+ if (vector.len[0] >= sizeof(MidiEventHeader)) {
+ memcpy ((uint8_t*)&h, vector.buf[0], sizeof(MidiEventHeader));
+ } else {
+ if (vector.len[0] > 0) {
+ memcpy ((uint8_t*)&h, vector.buf[0], vector.len[0]);
+ }
+ assert (vector.buf[1] || vector.len[0] == sizeof(MidiEventHeader));
+ memcpy (((uint8_t*)&h) + vector.len[0],
+ vector.buf[1],
+ sizeof(MidiEventHeader) - vector.len[0]);
+ }
+
+ if (h.time >= timestamp_end) {
+ DEBUG_TIMING (string_compose ("WinMMEMidiInput EVENT %1(ms) early\n",
+ (h.time - timestamp_end) * 1e-3));
+ return false;
+ } else if (h.time < timestamp_start) {
+ DEBUG_TIMING (string_compose ("WinMMEMidiInput EVENT %1(ms) late\n",
+ (timestamp_start - h.time) * 1e-3));
+ }
+
+ m_midi_buffer->increment_read_idx (sizeof(MidiEventHeader));
+
+ assert (h.size > 0);
+ if (h.size > data_size) {
+ DEBUG_MIDI ("WinMMEMidiInput::dequeue_event MIDI event too large!\n");
+ m_midi_buffer->increment_read_idx (h.size);
+ return false;
+ }
+ if (m_midi_buffer->read (&midi_data[0], h.size) != h.size) {
+ DEBUG_MIDI ("WinMMEMidiInput::dequeue_event Garbled MIDI EVENT DATA!!\n");
+ return false;
+ }
+ timestamp = h.time;
+ data_size = h.size;
+ return true;
+}
+
+bool
+WinMMEMidiInputDevice::enqueue_midi_msg (const uint8_t* midi_data,
+ size_t data_size,
+ uint32_t timestamp)
+{
+ const uint32_t total_size = sizeof(MidiEventHeader) + data_size;
+
+ if (data_size == 0) {
+ DEBUG_MIDI ("ERROR: zero length midi data\n");
+ return false;
+ }
+
+ if (m_midi_buffer->write_space () < total_size) {
+ DEBUG_MIDI ("WinMMEMidiInput: ring buffer overflow\n");
+ return false;
+ }
+
+ // don't use winmme timestamps for now
+ uint64_t ts = utils::get_microseconds ();
+
+ DEBUG_TIMING (string_compose (
+ "Enqueing MIDI data device: %1 with timestamp: %2 and size %3\n",
+ name (),
+ ts,
+ data_size));
+
+ struct MidiEventHeader h (ts, data_size);
+ m_midi_buffer->write ((uint8_t*)&h, sizeof(MidiEventHeader));
+ m_midi_buffer->write (midi_data, data_size);
+ return true;
+}
+
+bool
+WinMMEMidiInputDevice::start ()
+{
+ if (!m_started) {
+ MMRESULT result = midiInStart (m_handle);
+ m_started = (result == MMSYSERR_NOERROR);
+ if (!m_started) {
+ DEBUG_MIDI (get_error_string (result));
+ } else {
+ DEBUG_MIDI (
+ string_compose ("WinMMEMidiInput: device %1 started\n", name ()));
+ }
+ }
+ return m_started;
+}
+
+bool
+WinMMEMidiInputDevice::stop ()
+{
+ if (m_started) {
+ MMRESULT result = midiInStop (m_handle);
+ m_started = (result != MMSYSERR_NOERROR);
+ if (m_started) {
+ DEBUG_MIDI (get_error_string (result));
+ } else {
+ DEBUG_MIDI (
+ string_compose ("WinMMEMidiInput: device %1 stopped\n", name ()));
+ }
+ }
+ return !m_started;
+}
+
+} // namespace ARDOUR
diff --git a/libs/backends/portaudio/winmmemidi_input_device.h b/libs/backends/portaudio/winmmemidi_input_device.h
new file mode 100644
index 0000000..b1a7fb6
--- /dev/null
+++ b/libs/backends/portaudio/winmmemidi_input_device.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2015 Tim Mayberry <mojofunk at gmail.com>
+ *
+ * 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 WINMME_MIDI_INPUT_DEVICE_H
+#define WINMME_MIDI_INPUT_DEVICE_H
+
+#include <windows.h>
+#include <mmsystem.h>
+
+#include <stdint.h>
+
+#include <string>
+
+#include <boost/scoped_array.hpp>
+#include <boost/scoped_ptr.hpp>
+
+#include <pbd/ringbuffer.h>
+
+namespace ARDOUR {
+
+class WinMMEMidiInputDevice {
+public: // ctors
+ WinMMEMidiInputDevice (int index);
+
+ ~WinMMEMidiInputDevice ();
+
+public: // methods
+
+ /**
+ * Dequeue events that have accumulated in winmm_input_callback.
+ *
+ * This is called by the audio processing thread/callback to transfer events
+ * into midi ports before processing.
+ */
+ bool dequeue_midi_event (uint64_t timestamp_start,
+ uint64_t timestamp_end,
+ uint64_t& timestamp,
+ uint8_t* data,
+ size_t& size);
+
+ bool start ();
+ bool stop ();
+
+ void set_enabled (bool enable);
+
+ bool get_enabled ();
+
+ /**
+ * @return Name of midi device
+ */
+ std::string name () const { return m_name; }
+
+private: // methods
+ bool open (UINT index, std::string& error_msg);
+ bool close (std::string& error_msg);
+
+ bool add_sysex_buffer (std::string& error_msg);
+ bool set_device_name (UINT index);
+
+ std::string get_error_string (MMRESULT error_code);
+
+ static void CALLBACK winmm_input_callback (HMIDIIN handle,
+ UINT msg,
+ DWORD_PTR instance,
+ DWORD_PTR midi_msg,
+ DWORD timestamp);
+
+ void handle_short_msg (const uint8_t* midi_data, uint32_t timestamp);
+
+ void handle_sysex_msg (MIDIHDR* const midi_header, uint32_t timestamp);
+
+ bool enqueue_midi_msg (const uint8_t* midi_data, size_t size, uint32_t timestamp);
+
+private: // data
+ HMIDIIN m_handle;
+ MIDIHDR m_sysex_header;
+
+ bool m_started;
+
+ std::string m_name;
+
+ // can't use unique_ptr yet
+ boost::scoped_ptr<RingBuffer<uint8_t> > m_midi_buffer;
+ boost::scoped_array<uint8_t> m_sysex_buffer;
+};
+
+}
+
+#endif // WINMME_MIDI_INPUT_DEVICE_H
diff --git a/libs/backends/portaudio/winmmemidi_io.cc b/libs/backends/portaudio/winmmemidi_io.cc
new file mode 100644
index 0000000..710456d
--- /dev/null
+++ b/libs/backends/portaudio/winmmemidi_io.cc
@@ -0,0 +1,294 @@
+/*
+ * Copyright (C) 2015 Tim Mayberry <mojofunk at gmail.com>
+ *
+ * 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.
+ */
+
+#include <windows.h>
+#include <mmsystem.h>
+
+#include <sstream>
+
+#include "pbd/error.h"
+#include "pbd/compose.h"
+
+#include "winmmemidi_io.h"
+#include "win_utils.h"
+#include "debug.h"
+
+#include "i18n.h"
+
+using namespace ARDOUR;
+using namespace utils;
+
+WinMMEMidiIO::WinMMEMidiIO()
+ : m_active (false)
+ , m_enabled (true)
+ , m_run (false)
+ , m_changed_callback (0)
+ , m_changed_arg (0)
+{
+ pthread_mutex_init (&m_device_lock, 0);
+}
+
+WinMMEMidiIO::~WinMMEMidiIO()
+{
+ pthread_mutex_lock (&m_device_lock);
+ cleanup();
+ pthread_mutex_unlock (&m_device_lock);
+ pthread_mutex_destroy (&m_device_lock);
+}
+
+void
+WinMMEMidiIO::cleanup()
+{
+ DEBUG_MIDI ("MIDI cleanup\n");
+ m_active = false;
+
+ destroy_input_devices ();
+ destroy_output_devices ();
+}
+
+bool
+WinMMEMidiIO::dequeue_input_event (uint32_t port,
+ uint64_t timestamp_start,
+ uint64_t timestamp_end,
+ uint64_t ×tamp,
+ uint8_t *d,
+ size_t &s)
+{
+ if (!m_active) {
+ return false;
+ }
+ assert(port < m_inputs.size());
+
+ // m_inputs access should be protected by trylock
+ return m_inputs[port]->dequeue_midi_event (
+ timestamp_start, timestamp_end, timestamp, d, s);
+}
+
+bool
+WinMMEMidiIO::enqueue_output_event (uint32_t port,
+ uint64_t timestamp,
+ const uint8_t *d,
+ const size_t s)
+{
+ if (!m_active) {
+ return false;
+ }
+ assert(port < m_outputs.size());
+
+ // m_outputs access should be protected by trylock
+ return m_outputs[port]->enqueue_midi_event (timestamp, d, s);
+}
+
+
+std::string
+WinMMEMidiIO::port_id (uint32_t port, bool input)
+{
+ std::stringstream ss;
+
+ if (input) {
+ ss << "system:midi_capture_";
+ ss << port;
+ } else {
+ ss << "system:midi_playback_";
+ ss << port;
+ }
+ return ss.str();
+}
+
+std::string
+WinMMEMidiIO::port_name (uint32_t port, bool input)
+{
+ if (input) {
+ if (port < m_inputs.size ()) {
+ return m_inputs[port]->name ();
+ }
+ } else {
+ if (port < m_outputs.size ()) {
+ return m_outputs[port]->name ();
+ }
+ }
+ return "";
+}
+
+void
+WinMMEMidiIO::start ()
+{
+ if (m_run) {
+ DEBUG_MIDI ("MIDI driver already started\n");
+ return;
+ }
+
+ m_run = true;
+ DEBUG_MIDI ("Starting MIDI driver\n");
+
+ set_min_timer_resolution();
+ discover();
+ start_devices ();
+}
+
+
+void
+WinMMEMidiIO::stop ()
+{
+ DEBUG_MIDI ("Stopping MIDI driver\n");
+ m_run = false;
+ stop_devices ();
+ pthread_mutex_lock (&m_device_lock);
+ cleanup ();
+ pthread_mutex_unlock (&m_device_lock);
+
+ reset_timer_resolution();
+}
+
+void
+WinMMEMidiIO::start_devices ()
+{
+ for (std::vector<WinMMEMidiInputDevice*>::iterator i = m_inputs.begin ();
+ i < m_inputs.end();
+ ++i) {
+ if (!(*i)->start ()) {
+ PBD::error << string_compose (_("Unable to start MIDI input device %1\n"),
+ (*i)->name ()) << endmsg;
+ }
+ }
+ for (std::vector<WinMMEMidiOutputDevice*>::iterator i = m_outputs.begin ();
+ i < m_outputs.end();
+ ++i) {
+ if (!(*i)->start ()) {
+ PBD::error << string_compose (_ ("Unable to start MIDI output device %1\n"),
+ (*i)->name ()) << endmsg;
+ }
+ }
+}
+
+void
+WinMMEMidiIO::stop_devices ()
+{
+ for (std::vector<WinMMEMidiInputDevice*>::iterator i = m_inputs.begin ();
+ i < m_inputs.end();
+ ++i) {
+ if (!(*i)->stop ()) {
+ PBD::error << string_compose (_ ("Unable to stop MIDI input device %1\n"),
+ (*i)->name ()) << endmsg;
+ }
+ }
+ for (std::vector<WinMMEMidiOutputDevice*>::iterator i = m_outputs.begin ();
+ i < m_outputs.end();
+ ++i) {
+ if (!(*i)->stop ()) {
+ PBD::error << string_compose (_ ("Unable to stop MIDI output device %1\n"),
+ (*i)->name ()) << endmsg;
+ }
+ }
+}
+
+void
+WinMMEMidiIO::create_input_devices ()
+{
+ int srcCount = midiInGetNumDevs ();
+
+ DEBUG_MIDI (string_compose ("MidiIn count: %1\n", srcCount));
+
+ for (int i = 0; i < srcCount; ++i) {
+ try {
+ WinMMEMidiInputDevice* midi_input = new WinMMEMidiInputDevice (i);
+ if (midi_input) {
+ m_inputs.push_back (midi_input);
+ }
+ }
+ catch (...) {
+ DEBUG_MIDI ("Unable to create MIDI input\n");
+ continue;
+ }
+ }
+}
+void
+WinMMEMidiIO::create_output_devices ()
+{
+ int dstCount = midiOutGetNumDevs ();
+
+ DEBUG_MIDI (string_compose ("MidiOut count: %1\n", dstCount));
+
+ for (int i = 0; i < dstCount; ++i) {
+ try {
+ WinMMEMidiOutputDevice* midi_output = new WinMMEMidiOutputDevice(i);
+ if (midi_output) {
+ m_outputs.push_back(midi_output);
+ }
+ } catch(...) {
+ DEBUG_MIDI ("Unable to create MIDI output\n");
+ continue;
+ }
+ }
+}
+
+void
+WinMMEMidiIO::destroy_input_devices ()
+{
+ while (!m_inputs.empty ()) {
+ WinMMEMidiInputDevice* midi_input = m_inputs.back ();
+ // assert(midi_input->stopped ());
+ m_inputs.pop_back ();
+ delete midi_input;
+ }
+}
+
+void
+WinMMEMidiIO::destroy_output_devices ()
+{
+ while (!m_outputs.empty ()) {
+ WinMMEMidiOutputDevice* midi_output = m_outputs.back ();
+ // assert(midi_output->stopped ());
+ m_outputs.pop_back ();
+ delete midi_output;
+ }
+}
+
+void
+WinMMEMidiIO::discover()
+{
+ if (!m_run) {
+ return;
+ }
+
+ if (pthread_mutex_trylock (&m_device_lock)) {
+ return;
+ }
+
+ cleanup ();
+
+ create_input_devices ();
+ create_output_devices ();
+
+ if (!(m_inputs.size () || m_outputs.size ())) {
+ DEBUG_MIDI ("No midi inputs or outputs\n");
+ pthread_mutex_unlock (&m_device_lock);
+ return;
+ }
+
+ DEBUG_MIDI (string_compose ("Discovered %1 inputs and %2 outputs\n",
+ m_inputs.size (),
+ m_outputs.size ()));
+
+ if (m_changed_callback) {
+ m_changed_callback(m_changed_arg);
+ }
+
+ m_active = true;
+ pthread_mutex_unlock (&m_device_lock);
+}
diff --git a/libs/backends/portaudio/winmmemidi_io.h b/libs/backends/portaudio/winmmemidi_io.h
new file mode 100644
index 0000000..28450e9
--- /dev/null
+++ b/libs/backends/portaudio/winmmemidi_io.h
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2015 Tim Mayberry <mojofunk at gmail.com>
+ *
+ * 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 WINMME_MIDI_IO_H
+#define WINMME_MIDI_IO_H
+
+#include <map>
+#include <vector>
+#include <string>
+#include <stdint.h>
+#include <pthread.h>
+
+#include <boost/shared_ptr.hpp>
+#include "pbd/ringbuffer.h"
+
+#include "winmmemidi_input_device.h"
+#include "winmmemidi_output_device.h"
+
+namespace ARDOUR {
+
+struct WinMMEMIDIPacket {
+
+#if 0
+ WinMMEMIDIPacket (const WinMMEMIDIPacket& other)
+ : timeStamp (other.timeStamp)
+ , length (other.length)
+ {
+ if (length > 0) {
+ memcpy (data, other.data, length);
+ }
+ }
+#endif
+
+ // MIDITimeStamp timeStamp;
+ uint16_t length;
+ uint8_t data[256];
+};
+
+typedef std::vector<boost::shared_ptr<WinMMEMIDIPacket> > WinMMEMIDIQueue;
+
+class WinMMEMidiIO {
+public:
+ WinMMEMidiIO ();
+ ~WinMMEMidiIO ();
+
+ void start ();
+ void stop ();
+
+ bool dequeue_input_event (uint32_t port,
+ uint64_t timestamp_start,
+ uint64_t timestamp_end,
+ uint64_t& timestamp,
+ uint8_t* data,
+ size_t& size);
+
+ bool enqueue_output_event (uint32_t port,
+ uint64_t timestamp,
+ const uint8_t* data,
+ const size_t size);
+
+ uint32_t n_midi_inputs (void) const { return m_inputs.size(); }
+ uint32_t n_midi_outputs (void) const { return m_outputs.size(); }
+
+ std::vector<WinMMEMidiInputDevice*> get_inputs () { return m_inputs; }
+ std::vector<WinMMEMidiOutputDevice*> get_outputs () { return m_outputs; }
+
+ std::string port_id (uint32_t, bool input);
+ std::string port_name (uint32_t, bool input);
+
+ void set_enabled (bool yn = true) { m_enabled = yn; }
+ bool enabled (void) const { return m_active && m_enabled; }
+
+ void set_port_changed_callback (void (changed_callback (void*)), void *arg) {
+ m_changed_callback = changed_callback;
+ m_changed_arg = arg;
+ }
+
+private: // Methods
+ void discover ();
+ void cleanup ();
+
+ void create_input_devices ();
+ void create_output_devices ();
+
+ void destroy_input_devices ();
+ void destroy_output_devices ();
+
+ void start_devices ();
+ void stop_devices ();
+
+private: // Data
+
+ std::vector<WinMMEMidiInputDevice*> m_inputs;
+ std::vector<WinMMEMidiOutputDevice*> m_outputs;
+
+ bool m_active;
+ bool m_enabled;
+ bool m_run;
+
+ void (* m_changed_callback) (void*);
+ void * m_changed_arg;
+
+ // protects access to m_inputs and m_outputs
+ pthread_mutex_t m_device_lock;
+};
+
+} // namespace
+
+#endif // WINMME_MIDI_IO_H
+
diff --git a/libs/backends/portaudio/winmmemidi_output_device.cc b/libs/backends/portaudio/winmmemidi_output_device.cc
new file mode 100644
index 0000000..7dec08e
--- /dev/null
+++ b/libs/backends/portaudio/winmmemidi_output_device.cc
@@ -0,0 +1,508 @@
+/*
+ * Copyright (C) 2015 Tim Mayberry <mojofunk at gmail.com>
+ *
+ * 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.
+ */
+
+#include "winmmemidi_output_device.h"
+
+#include <glibmm.h>
+
+#include "pbd/debug.h"
+#include "pbd/compose.h"
+
+#include "rt_thread.h"
+#include "win_utils.h"
+#include "midi_util.h"
+
+#include "mmcss.h"
+#include "debug.h"
+
+// remove dup with input_device
+static const uint32_t MIDI_BUFFER_SIZE = 32768;
+static const uint32_t MAX_MIDI_MSG_SIZE = 256; // fix this for sysex
+static const uint32_t MAX_QUEUE_SIZE = 4096;
+
+namespace ARDOUR {
+
+WinMMEMidiOutputDevice::WinMMEMidiOutputDevice (int index)
+ : m_handle(0)
+ , m_queue_semaphore(0)
+ , m_sysex_semaphore(0)
+ , m_timer(0)
+ , m_started(false)
+ , m_enabled(false)
+ , m_thread_running(false)
+ , m_thread_quit(false)
+ , m_midi_buffer(new RingBuffer<uint8_t>(MIDI_BUFFER_SIZE))
+{
+ DEBUG_MIDI (string_compose ("Creating midi output device index: %1\n", index));
+
+ std::string error_msg;
+
+ if (!open (index, error_msg)) {
+ DEBUG_MIDI (error_msg);
+ throw std::runtime_error (error_msg);
+ }
+
+ set_device_name (index);
+}
+
+WinMMEMidiOutputDevice::~WinMMEMidiOutputDevice ()
+{
+ std::string error_msg;
+ if (!close (error_msg)) {
+ DEBUG_MIDI (error_msg);
+ }
+}
+
+bool
+WinMMEMidiOutputDevice::enqueue_midi_event (uint64_t timestamp,
+ const uint8_t* data,
+ size_t size)
+{
+ const uint32_t total_bytes = sizeof(MidiEventHeader) + size;
+ if (m_midi_buffer->write_space () < total_bytes) {
+ DEBUG_MIDI ("WinMMEMidiOutput: ring buffer overflow\n");
+ return false;
+ }
+
+ MidiEventHeader h (timestamp, size);
+ m_midi_buffer->write ((uint8_t*)&h, sizeof(MidiEventHeader));
+ m_midi_buffer->write (data, size);
+
+ signal (m_queue_semaphore);
+ return true;
+}
+
+bool
+WinMMEMidiOutputDevice::open (UINT index, std::string& error_msg)
+{
+ MMRESULT result = midiOutOpen (&m_handle,
+ index,
+ (DWORD_PTR)winmm_output_callback,
+ (DWORD_PTR) this,
+ CALLBACK_FUNCTION);
+ if (result != MMSYSERR_NOERROR) {
+ error_msg = get_error_string (result);
+ return false;
+ }
+
+ m_queue_semaphore = CreateSemaphore (NULL, 0, MAX_QUEUE_SIZE, NULL);
+ if (m_queue_semaphore == NULL) {
+ DEBUG_MIDI ("WinMMEMidiOutput: Unable to create queue semaphore\n");
+ return false;
+ }
+ m_sysex_semaphore = CreateSemaphore (NULL, 0, 1, NULL);
+ if (m_sysex_semaphore == NULL) {
+ DEBUG_MIDI ("WinMMEMidiOutput: Unable to create sysex semaphore\n");
+ return false;
+ }
+ return true;
+}
+
+bool
+WinMMEMidiOutputDevice::close (std::string& error_msg)
+{
+ // return error message for first error encountered?
+ bool success = true;
+ MMRESULT result = midiOutReset (m_handle);
+ if (result != MMSYSERR_NOERROR) {
+ error_msg = get_error_string (result);
+ DEBUG_MIDI (error_msg);
+ success = false;
+ }
+ result = midiOutClose (m_handle);
+ if (result != MMSYSERR_NOERROR) {
+ error_msg = get_error_string (result);
+ DEBUG_MIDI (error_msg);
+ success = false;
+ }
+
+ if (m_sysex_semaphore) {
+ if (!CloseHandle (m_sysex_semaphore)) {
+ DEBUG_MIDI ("WinMMEMidiOut Unable to close sysex semaphore\n");
+ success = false;
+ } else {
+ m_sysex_semaphore = 0;
+ }
+ }
+ if (m_queue_semaphore) {
+ if (!CloseHandle (m_queue_semaphore)) {
+ DEBUG_MIDI ("WinMMEMidiOut Unable to close queue semaphore\n");
+ success = false;
+ } else {
+ m_queue_semaphore = 0;
+ }
+ }
+
+ m_handle = 0;
+ return success;
+}
+
+bool
+WinMMEMidiOutputDevice::set_device_name (UINT index)
+{
+ MIDIOUTCAPS capabilities;
+ MMRESULT result =
+ midiOutGetDevCaps (index, &capabilities, sizeof(capabilities));
+
+ if (result != MMSYSERR_NOERROR) {
+ DEBUG_MIDI (get_error_string (result));
+ m_name = "Unknown Midi Output Device";
+ return false;
+ } else {
+ m_name = capabilities.szPname;
+ }
+ return true;
+}
+
+std::string
+WinMMEMidiOutputDevice::get_error_string (MMRESULT error_code)
+{
+ char error_msg[MAXERRORLENGTH];
+ MMRESULT result = midiOutGetErrorText (error_code, error_msg, MAXERRORLENGTH);
+ if (result != MMSYSERR_NOERROR) {
+ return error_msg;
+ }
+ return "WinMMEMidiOutput: Unknown Error code";
+}
+
+bool
+WinMMEMidiOutputDevice::start ()
+{
+ if (m_thread_running) {
+ DEBUG_MIDI (
+ string_compose ("WinMMEMidiOutput: device %1 already started\n", m_name));
+ return true;
+ }
+
+ m_timer = CreateWaitableTimer (NULL, FALSE, NULL);
+
+ if (!m_timer) {
+ DEBUG_MIDI ("WinMMEMidiOutput: unable to create waitable timer\n");
+ return false;
+ }
+
+ if (!start_midi_output_thread ()) {
+ DEBUG_MIDI ("WinMMEMidiOutput: Failed to start MIDI output thread\n");
+
+ if (!CloseHandle (m_timer)) {
+ DEBUG_MIDI ("WinMMEMidiOutput: unable to close waitable timer\n");
+ }
+ return false;
+ }
+ return true;
+}
+
+bool
+WinMMEMidiOutputDevice::stop ()
+{
+ if (!m_thread_running) {
+ DEBUG_MIDI ("WinMMEMidiOutputDevice: device already stopped\n");
+ return true;
+ }
+
+ if (!stop_midi_output_thread ()) {
+ DEBUG_MIDI ("WinMMEMidiOutput: Failed to start MIDI output thread\n");
+ return false;
+ }
+
+ if (!CloseHandle (m_timer)) {
+ DEBUG_MIDI ("WinMMEMidiOutput: unable to close waitable timer\n");
+ return false;
+ }
+ m_timer = 0;
+ return true;
+}
+
+bool
+WinMMEMidiOutputDevice::start_midi_output_thread ()
+{
+ m_thread_quit = false;
+
+ //pthread_attr_t attr;
+ size_t stacksize = 100000;
+
+ // TODO Use native threads
+ if (_realtime_pthread_create (SCHED_FIFO, -21, stacksize,
+ &m_output_thread_handle, midi_output_thread, this)) {
+ return false;
+ }
+
+ int timeout = 5000;
+ while (!m_thread_running && --timeout > 0) { Glib::usleep (1000); }
+ if (timeout == 0 || !m_thread_running) {
+ DEBUG_MIDI (string_compose ("Unable to start midi output device thread: %1\n",
+ m_name));
+ return false;
+ }
+ return true;
+}
+
+bool
+WinMMEMidiOutputDevice::stop_midi_output_thread ()
+{
+ int timeout = 5000;
+ m_thread_quit = true;
+
+ while (m_thread_running && --timeout > 0) { Glib::usleep (1000); }
+ if (timeout == 0 || m_thread_running) {
+ DEBUG_MIDI (string_compose ("Unable to stop midi output device thread: %1\n",
+ m_name));
+ return false;
+ }
+
+ void *status;
+ if (pthread_join (m_output_thread_handle, &status)) {
+ DEBUG_MIDI (string_compose ("Unable to join midi output device thread: %1\n",
+ m_name));
+ return false;
+ }
+ return true;
+}
+
+bool
+WinMMEMidiOutputDevice::signal (HANDLE semaphore)
+{
+ bool result = (bool)ReleaseSemaphore (semaphore, 1, NULL);
+ if (!result) {
+ DEBUG_MIDI ("WinMMEMidiOutDevice: Cannot release semaphore\n");
+ }
+ return result;
+}
+
+bool
+WinMMEMidiOutputDevice::wait (HANDLE semaphore)
+{
+ DWORD result = WaitForSingleObject (semaphore, INFINITE);
+ switch (result) {
+ case WAIT_FAILED:
+ DEBUG_MIDI ("WinMMEMidiOutDevice: WaitForSingleObject Failed\n");
+ break;
+ case WAIT_OBJECT_0:
+ return true;
+ default:
+ DEBUG_MIDI ("WinMMEMidiOutDevice: Unexpected result from WaitForSingleObject\n");
+ }
+ return false;
+}
+
+void CALLBACK
+WinMMEMidiOutputDevice::winmm_output_callback (HMIDIOUT handle,
+ UINT msg,
+ DWORD_PTR instance,
+ DWORD_PTR midi_data,
+ DWORD_PTR timestamp)
+{
+ ((WinMMEMidiOutputDevice*)instance)
+ ->midi_output_callback (msg, midi_data, timestamp);
+}
+
+void
+WinMMEMidiOutputDevice::midi_output_callback (UINT message,
+ DWORD_PTR midi_data,
+ DWORD_PTR timestamp)
+{
+ switch (message) {
+ case MOM_CLOSE:
+ DEBUG_MIDI ("WinMMEMidiOutput - MIDI device closed\n");
+ break;
+ case MOM_DONE:
+ signal (m_sysex_semaphore);
+ break;
+ case MOM_OPEN:
+ DEBUG_MIDI ("WinMMEMidiOutput - MIDI device opened\n");
+ break;
+ case MOM_POSITIONCB:
+ LPMIDIHDR header = (LPMIDIHDR)midi_data;
+ DEBUG_MIDI (string_compose ("WinMMEMidiOut - %1 bytes out of %2 bytes of "
+ "the current sysex message have been sent.\n",
+ header->dwOffset,
+ header->dwBytesRecorded));
+ }
+}
+
+void*
+WinMMEMidiOutputDevice::midi_output_thread (void *arg)
+{
+ WinMMEMidiOutputDevice* output_device = reinterpret_cast<WinMMEMidiOutputDevice*> (arg);
+ output_device->midi_output_thread ();
+ return 0;
+}
+
+void
+WinMMEMidiOutputDevice::midi_output_thread ()
+{
+ m_thread_running = true;
+
+ DEBUG_MIDI ("WinMMEMidiOut: MIDI output thread started\n");
+
+#ifdef USE_MMCSS_THREAD_PRIORITIES
+ HANDLE task_handle;
+
+ mmcss::set_thread_characteristics ("Pro Audio", &task_handle);
+ mmcss::set_thread_priority (task_handle, mmcss::AVRT_PRIORITY_HIGH);
+#endif
+
+ while (!m_thread_quit) {
+ if (!wait (m_queue_semaphore)) {
+ break;
+ }
+
+ MidiEventHeader h (0, 0);
+ uint8_t data[MAX_MIDI_MSG_SIZE];
+
+ const uint32_t read_space = m_midi_buffer->read_space ();
+
+ if (read_space > sizeof(MidiEventHeader)) {
+ if (m_midi_buffer->read ((uint8_t*)&h, sizeof(MidiEventHeader)) !=
+ sizeof(MidiEventHeader)) {
+ DEBUG_MIDI ("WinMMEMidiOut: Garbled MIDI EVENT HEADER!!\n");
+ break;
+ }
+ assert (read_space >= h.size);
+
+ if (h.size > MAX_MIDI_MSG_SIZE) {
+ m_midi_buffer->increment_read_idx (h.size);
+ DEBUG_MIDI ("WinMMEMidiOut: MIDI event too large!\n");
+ continue;
+ }
+ if (m_midi_buffer->read (&data[0], h.size) != h.size) {
+ DEBUG_MIDI ("WinMMEMidiOut: Garbled MIDI EVENT DATA!!\n");
+ break;
+ }
+ } else {
+ // error/assert?
+ DEBUG_MIDI ("WinMMEMidiOut: MIDI buffer underrun, shouldn't occur\n");
+ continue;
+ }
+ uint64_t current_time = utils::get_microseconds ();
+
+ DEBUG_TIMING (string_compose (
+ "WinMMEMidiOut: h.time = %1, current_time = %2\n", h.time, current_time));
+
+ if (h.time > current_time) {
+
+ DEBUG_TIMING (string_compose ("WinMMEMidiOut: waiting at %1 for %2 "
+ "milliseconds before sending message\n",
+ ((double)current_time) / 1000.0,
+ ((double)(h.time - current_time)) / 1000.0));
+
+ if (!wait_for_microseconds (h.time - current_time))
+ {
+ DEBUG_MIDI ("WinMMEMidiOut: Error waiting for timer\n");
+ break;
+ }
+
+ uint64_t wakeup_time = utils::get_microseconds ();
+ DEBUG_TIMING (string_compose ("WinMMEMidiOut: woke up at %1(ms)\n",
+ ((double)wakeup_time) / 1000.0));
+ if (wakeup_time > h.time) {
+ DEBUG_TIMING (string_compose ("WinMMEMidiOut: overslept by %1(ms)\n",
+ ((double)(wakeup_time - h.time)) / 1000.0));
+ } else if (wakeup_time < h.time) {
+ DEBUG_TIMING (string_compose ("WinMMEMidiOut: woke up %1(ms) too early\n",
+ ((double)(h.time - wakeup_time)) / 1000.0));
+ }
+
+ } else if (h.time < current_time) {
+ DEBUG_TIMING (string_compose (
+ "WinMMEMidiOut: MIDI event at sent to driver %1(ms) late\n",
+ ((double)(current_time - h.time)) / 1000.0));
+ }
+
+ DWORD message = 0;
+ MMRESULT result;
+ switch (h.size) {
+ case 3:
+ message |= (((DWORD)data[2]) << 16);
+ // Fallthrough on purpose.
+ case 2:
+ message |= (((DWORD)data[1]) << 8);
+ // Fallthrough on purpose.
+ case 1:
+ message |= (DWORD)data[0];
+ result = midiOutShortMsg (m_handle, message);
+ if (result != MMSYSERR_NOERROR) {
+ DEBUG_MIDI (
+ string_compose ("WinMMEMidiOutput: %1\n", get_error_string (result)));
+ }
+ continue;
+ }
+
+#if ENABLE_SYSEX
+ MIDIHDR header;
+ header.dwBufferLength = h.size;
+ header.dwFlags = 0;
+ header.lpData = (LPSTR)data;
+
+ result = midiOutPrepareHeader (m_handle, &header, sizeof(MIDIHDR));
+ if (result != MMSYSERR_NOERROR) {
+ DEBUG_MIDI (string_compose ("WinMMEMidiOutput: midiOutPrepareHeader %1\n",
+ get_error_string (result)));
+ continue;
+ }
+
+ result = midiOutLongMsg (m_handle, &header, sizeof(MIDIHDR));
+ if (result != MMSYSERR_NOERROR) {
+ DEBUG_MIDI (string_compose ("WinMMEMidiOutput: midiOutLongMsg %1\n",
+ get_error_string (result)));
+ continue;
+ }
+
+ // Sysex messages may be sent synchronously or asynchronously. The
+ // choice is up to the WinMME driver. So, we wait until the message is
+ // sent, regardless of the driver's choice.
+ if (!wait (m_sysex_semaphore)) {
+ break;
+ }
+
+ result = midiOutUnprepareHeader (m_handle, &header, sizeof(MIDIHDR));
+ if (result != MMSYSERR_NOERROR) {
+ DEBUG_MIDI (string_compose ("WinMMEMidiOutput: midiOutUnprepareHeader %1\n",
+ get_error_string (result)));
+ break;
+ }
+#endif
+ }
+
+#ifdef USE_MMCSS_THREAD_PRIORITIES
+ mmcss::revert_thread_characteristics (task_handle);
+#endif
+
+ m_thread_running = false;
+}
+
+bool
+WinMMEMidiOutputDevice::wait_for_microseconds (int64_t wait_us)
+{
+ LARGE_INTEGER due_time;
+
+ // 100 ns resolution
+ due_time.QuadPart = -((LONGLONG)(wait_us * 10));
+ if (!SetWaitableTimer (m_timer, &due_time, 0, NULL, NULL, 0)) {
+ DEBUG_MIDI ("WinMMEMidiOut: Error waiting for timer\n");
+ return false;
+ }
+
+ if (!wait (m_timer)) {
+ return false;
+ }
+
+ return true;
+}
+
+} // namespace ARDOUR
diff --git a/libs/backends/portaudio/winmmemidi_output_device.h b/libs/backends/portaudio/winmmemidi_output_device.h
new file mode 100644
index 0000000..8c4d4d0
--- /dev/null
+++ b/libs/backends/portaudio/winmmemidi_output_device.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2015 Tim Mayberry <mojofunk at gmail.com>
+ *
+ * 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 WINMME_MIDI_OUTPUT_DEVICE_H
+#define WINMME_MIDI_OUTPUT_DEVICE_H
+
+#include <windows.h>
+#include <mmsystem.h>
+
+#include <stdint.h>
+#include <pthread.h>
+
+#include <string>
+
+#include <boost/scoped_ptr.hpp>
+
+#include <pbd/ringbuffer.h>
+
+namespace ARDOUR {
+
+class WinMMEMidiOutputDevice {
+public:
+ WinMMEMidiOutputDevice (int index);
+
+ ~WinMMEMidiOutputDevice ();
+
+ bool enqueue_midi_event (uint64_t rel_event_time_us,
+ const uint8_t* data,
+ const size_t size);
+
+ bool start ();
+ bool stop ();
+
+ void set_enabled (bool enable);
+ bool get_enabled ();
+
+ std::string name () const { return m_name; }
+
+private: // Methods
+ bool open (UINT index, std::string& error_msg);
+ bool close (std::string& error_msg);
+
+ bool set_device_name (UINT index);
+
+ std::string get_error_string (MMRESULT error_code);
+
+ bool start_midi_output_thread ();
+ bool stop_midi_output_thread ();
+
+ bool signal (HANDLE semaphore);
+ bool wait (HANDLE semaphore);
+
+ static void* midi_output_thread (void*);
+ void midi_output_thread ();
+
+ bool wait_for_microseconds (int64_t us);
+
+ static void CALLBACK winmm_output_callback (HMIDIOUT handle,
+ UINT msg,
+ DWORD_PTR instance,
+ DWORD_PTR midi_data,
+ DWORD_PTR timestamp);
+
+ void midi_output_callback (UINT msg, DWORD_PTR data, DWORD_PTR timestamp);
+
+private: // Data
+ HMIDIOUT m_handle;
+
+ HANDLE m_queue_semaphore;
+ HANDLE m_sysex_semaphore;
+
+ HANDLE m_timer;
+
+ bool m_started;
+ bool m_enabled;
+
+ std::string m_name;
+
+ pthread_t m_output_thread_handle;
+
+ bool m_thread_running;
+ bool m_thread_quit;
+
+ boost::scoped_ptr<RingBuffer<uint8_t> > m_midi_buffer;
+};
+
+} // namespace ARDOUR
+
+#endif // WINMME_MIDI_OUTPUT_DEVICE_H
diff --git a/libs/backends/portaudio/wscript b/libs/backends/portaudio/wscript
index 4b77f96..9c661d8 100644
--- a/libs/backends/portaudio/wscript
+++ b/libs/backends/portaudio/wscript
@@ -17,12 +17,18 @@ def options(opt):
def configure(conf):
autowaf.configure(conf)
autowaf.check_pkg(conf, 'portaudio-2.0', uselib_store='PORTAUDIO', atleast_version='19')
+ conf.check(header_name='pa_asio.h', define_name='WITH_ASIO', mandatory=False)
def build(bld):
obj = bld(features = 'cxx cxxshlib')
obj.source = [ 'portaudio_backend.cc',
'portaudio_io.cc',
-# 'portmidi_io.cc'
+ 'winmmemidi_io.cc',
+ 'winmmemidi_input_device.cc',
+ 'winmmemidi_output_device.cc',
+ 'win_utils.cc',
+ 'midi_util.cc',
+ 'mmcss.cc'
]
obj.includes = ['.']
obj.name = 'portaudio_backend'
@@ -31,5 +37,6 @@ def build(bld):
obj.uselib = ['PORTAUDIO']
obj.install_path = os.path.join(bld.env['LIBDIR'], 'backends')
obj.defines = ['PACKAGE="' + I18N_PACKAGE + '"',
- 'ARDOURBACKEND_DLL_EXPORTS'
+ 'ARDOURBACKEND_DLL_EXPORTS',
+ 'USE_MMCSS_THREAD_PRIORITIES'
]
diff --git a/libs/backends/wavesaudio/macosx/waves_audiobackend.xcodeproj/project.pbxproj b/libs/backends/wavesaudio/macosx/waves_audiobackend.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..ac12773
--- /dev/null
+++ b/libs/backends/wavesaudio/macosx/waves_audiobackend.xcodeproj/project.pbxproj
@@ -0,0 +1,517 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 43278FF0194EFB30003C9FEA /* basics.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 43278FC8194EFB30003C9FEA /* basics.hpp */; };
+ 43278FF1194EFB30003C9FEA /* compiletime_functions.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 43278FC9194EFB30003C9FEA /* compiletime_functions.hpp */; };
+ 43278FF2194EFB30003C9FEA /* atomic_ops.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 43278FCB194EFB30003C9FEA /* atomic_ops.hpp */; };
+ 43278FF3194EFB30003C9FEA /* atomic_ops_gcc_x86.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 43278FCC194EFB30003C9FEA /* atomic_ops_gcc_x86.hpp */; };
+ 43278FF4194EFB30003C9FEA /* WCFourCC.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FCE194EFB30003C9FEA /* WCFourCC.h */; };
+ 43278FF5194EFB30003C9FEA /* WTByteOrder.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FCF194EFB30003C9FEA /* WTByteOrder.h */; };
+ 43278FF6194EFB30003C9FEA /* WUComPtr.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FD0194EFB30003C9FEA /* WUComPtr.h */; };
+ 43278FF7194EFB30003C9FEA /* WUDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FD1194EFB30003C9FEA /* WUDefines.h */; };
+ 43278FF8194EFB30003C9FEA /* WUMathConsts.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FD2194EFB30003C9FEA /* WUMathConsts.h */; };
+ 43278FF9194EFB30003C9FEA /* WUTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FD3194EFB30003C9FEA /* WUTypes.h */; };
+ 43278FFA194EFB30003C9FEA /* IncludeWindows.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FD5194EFB30003C9FEA /* IncludeWindows.h */; };
+ 43278FFB194EFB30003C9FEA /* WCMRAudioDeviceManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43278FD6194EFB30003C9FEA /* WCMRAudioDeviceManager.cpp */; };
+ 43278FFC194EFB30003C9FEA /* WCMRAudioDeviceManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FD7194EFB30003C9FEA /* WCMRAudioDeviceManager.h */; };
+ 43278FFD194EFB30003C9FEA /* WCMRCoreAudioDeviceManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43278FD8194EFB30003C9FEA /* WCMRCoreAudioDeviceManager.cpp */; };
+ 43278FFE194EFB30003C9FEA /* WCMRCoreAudioDeviceManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FD9194EFB30003C9FEA /* WCMRCoreAudioDeviceManager.h */; };
+ 43278FFF194EFB30003C9FEA /* WCMRNativeAudio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43278FDA194EFB30003C9FEA /* WCMRNativeAudio.cpp */; };
+ 43279000194EFB30003C9FEA /* WCMRNativeAudio.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FDB194EFB30003C9FEA /* WCMRNativeAudio.h */; };
+ 43279001194EFB30003C9FEA /* WCMRPortAudioDeviceManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43278FDC194EFB30003C9FEA /* WCMRPortAudioDeviceManager.cpp */; };
+ 43279002194EFB30003C9FEA /* WCMRPortAudioDeviceManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FDD194EFB30003C9FEA /* WCMRPortAudioDeviceManager.h */; };
+ 43279003194EFB30003C9FEA /* MinMaxUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FDF194EFB30003C9FEA /* MinMaxUtilities.h */; };
+ 43279004194EFB30003C9FEA /* safe_delete.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FE0194EFB30003C9FEA /* safe_delete.h */; };
+ 43279005194EFB30003C9FEA /* UMicroseconds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43278FE1194EFB30003C9FEA /* UMicroseconds.cpp */; };
+ 43279006194EFB30003C9FEA /* UMicroseconds.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FE2194EFB30003C9FEA /* UMicroseconds.h */; };
+ 43279007194EFB30003C9FEA /* WCFixedString.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FE3194EFB30003C9FEA /* WCFixedString.h */; };
+ 43279008194EFB30003C9FEA /* WUErrors.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FE4194EFB30003C9FEA /* WUErrors.h */; };
+ 43279009194EFB30003C9FEA /* WCRefManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43278FE6194EFB30003C9FEA /* WCRefManager.cpp */; };
+ 4327900A194EFB30003C9FEA /* WCRefManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FE7194EFB30003C9FEA /* WCRefManager.h */; };
+ 4327900B194EFB30003C9FEA /* WCThreadSafe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43278FE9194EFB30003C9FEA /* WCThreadSafe.cpp */; };
+ 4327900C194EFB30003C9FEA /* WCThreadSafe.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FEA194EFB30003C9FEA /* WCThreadSafe.h */; };
+ 4327900D194EFB30003C9FEA /* WavesPublicAPI_Defines.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FED194EFB30003C9FEA /* WavesPublicAPI_Defines.h */; };
+ 4327900E194EFB30003C9FEA /* wstdint.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FEE194EFB30003C9FEA /* wstdint.h */; };
+ 4327900F194EFB30003C9FEA /* WTErr.h in Headers */ = {isa = PBXBuildFile; fileRef = 43278FEF194EFB30003C9FEA /* WTErr.h */; };
+ 43AA86F0194EED8900A67B56 /* waves_audiobackend.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA86E5194EED8900A67B56 /* waves_audiobackend.cc */; };
+ 43AA86F1194EED8900A67B56 /* waves_audiobackend.latency.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA86E6194EED8900A67B56 /* waves_audiobackend.latency.cc */; };
+ 43AA86F2194EED8900A67B56 /* waves_audiobackend.midi.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA86E7194EED8900A67B56 /* waves_audiobackend.midi.cc */; };
+ 43AA86F3194EED8900A67B56 /* waves_audiobackend.port_engine.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA86E8194EED8900A67B56 /* waves_audiobackend.port_engine.cc */; };
+ 43AA86F4194EED8900A67B56 /* waves_audioport.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA86E9194EED8900A67B56 /* waves_audioport.cc */; };
+ 43AA86F5194EED8900A67B56 /* waves_dataport.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA86EA194EED8900A67B56 /* waves_dataport.cc */; };
+ 43AA86F6194EED8900A67B56 /* waves_midi_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA86EB194EED8900A67B56 /* waves_midi_buffer.cc */; };
+ 43AA86F7194EED8900A67B56 /* waves_midi_device_manager.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA86EC194EED8900A67B56 /* waves_midi_device_manager.cc */; };
+ 43AA86F8194EED8900A67B56 /* waves_midi_device.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA86ED194EED8900A67B56 /* waves_midi_device.cc */; };
+ 43AA86F9194EED8900A67B56 /* waves_midi_event.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA86EE194EED8900A67B56 /* waves_midi_event.cc */; };
+ 43AA86FA194EED8900A67B56 /* waves_midiport.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43AA86EF194EED8900A67B56 /* waves_midiport.cc */; };
+ 43AA8703194EEDAC00A67B56 /* waves_audiobackend.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA86FB194EEDAC00A67B56 /* waves_audiobackend.h */; };
+ 43AA8704194EEDAC00A67B56 /* waves_audioport.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA86FC194EEDAC00A67B56 /* waves_audioport.h */; };
+ 43AA8705194EEDAC00A67B56 /* waves_dataport.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA86FD194EEDAC00A67B56 /* waves_dataport.h */; };
+ 43AA8706194EEDAC00A67B56 /* waves_midi_buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA86FE194EEDAC00A67B56 /* waves_midi_buffer.h */; };
+ 43AA8707194EEDAC00A67B56 /* waves_midi_device_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA86FF194EEDAC00A67B56 /* waves_midi_device_manager.h */; };
+ 43AA8708194EEDAC00A67B56 /* waves_midi_device.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8700194EEDAC00A67B56 /* waves_midi_device.h */; };
+ 43AA8709194EEDAC00A67B56 /* waves_midi_event.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8701194EEDAC00A67B56 /* waves_midi_event.h */; };
+ 43AA870A194EEDAC00A67B56 /* waves_midiport.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AA8702194EEDAC00A67B56 /* waves_midiport.h */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 43278FC8194EFB30003C9FEA /* basics.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = basics.hpp; path = ../wavesapi/akupara/basics.hpp; sourceTree = SOURCE_ROOT; };
+ 43278FC9194EFB30003C9FEA /* compiletime_functions.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = compiletime_functions.hpp; path = ../wavesapi/akupara/compiletime_functions.hpp; sourceTree = SOURCE_ROOT; };
+ 43278FCB194EFB30003C9FEA /* atomic_ops.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = atomic_ops.hpp; path = ../wavesapi/akupara/threading/atomic_ops.hpp; sourceTree = SOURCE_ROOT; };
+ 43278FCC194EFB30003C9FEA /* atomic_ops_gcc_x86.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = atomic_ops_gcc_x86.hpp; path = ../wavesapi/akupara/threading/atomic_ops_gcc_x86.hpp; sourceTree = SOURCE_ROOT; };
+ 43278FCE194EFB30003C9FEA /* WCFourCC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WCFourCC.h; path = ../wavesapi/BasicTypes/WCFourCC.h; sourceTree = SOURCE_ROOT; };
+ 43278FCF194EFB30003C9FEA /* WTByteOrder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WTByteOrder.h; path = ../wavesapi/BasicTypes/WTByteOrder.h; sourceTree = SOURCE_ROOT; };
+ 43278FD0194EFB30003C9FEA /* WUComPtr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WUComPtr.h; path = ../wavesapi/BasicTypes/WUComPtr.h; sourceTree = SOURCE_ROOT; };
+ 43278FD1194EFB30003C9FEA /* WUDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WUDefines.h; path = ../wavesapi/BasicTypes/WUDefines.h; sourceTree = SOURCE_ROOT; };
+ 43278FD2194EFB30003C9FEA /* WUMathConsts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WUMathConsts.h; path = ../wavesapi/BasicTypes/WUMathConsts.h; sourceTree = SOURCE_ROOT; };
+ 43278FD3194EFB30003C9FEA /* WUTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WUTypes.h; path = ../wavesapi/BasicTypes/WUTypes.h; sourceTree = SOURCE_ROOT; };
+ 43278FD5194EFB30003C9FEA /* IncludeWindows.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = IncludeWindows.h; path = ../wavesapi/devicemanager/IncludeWindows.h; sourceTree = SOURCE_ROOT; };
+ 43278FD6194EFB30003C9FEA /* WCMRAudioDeviceManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WCMRAudioDeviceManager.cpp; path = ../wavesapi/devicemanager/WCMRAudioDeviceManager.cpp; sourceTree = SOURCE_ROOT; };
+ 43278FD7194EFB30003C9FEA /* WCMRAudioDeviceManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WCMRAudioDeviceManager.h; path = ../wavesapi/devicemanager/WCMRAudioDeviceManager.h; sourceTree = SOURCE_ROOT; };
+ 43278FD8194EFB30003C9FEA /* WCMRCoreAudioDeviceManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WCMRCoreAudioDeviceManager.cpp; path = ../wavesapi/devicemanager/WCMRCoreAudioDeviceManager.cpp; sourceTree = SOURCE_ROOT; };
+ 43278FD9194EFB30003C9FEA /* WCMRCoreAudioDeviceManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WCMRCoreAudioDeviceManager.h; path = ../wavesapi/devicemanager/WCMRCoreAudioDeviceManager.h; sourceTree = SOURCE_ROOT; };
+ 43278FDA194EFB30003C9FEA /* WCMRNativeAudio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WCMRNativeAudio.cpp; path = ../wavesapi/devicemanager/WCMRNativeAudio.cpp; sourceTree = SOURCE_ROOT; };
+ 43278FDB194EFB30003C9FEA /* WCMRNativeAudio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WCMRNativeAudio.h; path = ../wavesapi/devicemanager/WCMRNativeAudio.h; sourceTree = SOURCE_ROOT; };
+ 43278FDC194EFB30003C9FEA /* WCMRPortAudioDeviceManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WCMRPortAudioDeviceManager.cpp; path = ../wavesapi/devicemanager/WCMRPortAudioDeviceManager.cpp; sourceTree = SOURCE_ROOT; };
+ 43278FDD194EFB30003C9FEA /* WCMRPortAudioDeviceManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WCMRPortAudioDeviceManager.h; path = ../wavesapi/devicemanager/WCMRPortAudioDeviceManager.h; sourceTree = SOURCE_ROOT; };
+ 43278FDF194EFB30003C9FEA /* MinMaxUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MinMaxUtilities.h; path = ../wavesapi/miscutils/MinMaxUtilities.h; sourceTree = SOURCE_ROOT; };
+ 43278FE0194EFB30003C9FEA /* safe_delete.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = safe_delete.h; path = ../wavesapi/miscutils/safe_delete.h; sourceTree = SOURCE_ROOT; };
+ 43278FE1194EFB30003C9FEA /* UMicroseconds.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = UMicroseconds.cpp; path = ../wavesapi/miscutils/UMicroseconds.cpp; sourceTree = SOURCE_ROOT; };
+ 43278FE2194EFB30003C9FEA /* UMicroseconds.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UMicroseconds.h; path = ../wavesapi/miscutils/UMicroseconds.h; sourceTree = SOURCE_ROOT; };
+ 43278FE3194EFB30003C9FEA /* WCFixedString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WCFixedString.h; path = ../wavesapi/miscutils/WCFixedString.h; sourceTree = SOURCE_ROOT; };
+ 43278FE4194EFB30003C9FEA /* WUErrors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WUErrors.h; path = ../wavesapi/miscutils/WUErrors.h; sourceTree = SOURCE_ROOT; };
+ 43278FE6194EFB30003C9FEA /* WCRefManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WCRefManager.cpp; path = ../wavesapi/refmanager/WCRefManager.cpp; sourceTree = SOURCE_ROOT; };
+ 43278FE7194EFB30003C9FEA /* WCRefManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WCRefManager.h; path = ../wavesapi/refmanager/WCRefManager.h; sourceTree = SOURCE_ROOT; };
+ 43278FE9194EFB30003C9FEA /* WCThreadSafe.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WCThreadSafe.cpp; path = ../wavesapi/threads/WCThreadSafe.cpp; sourceTree = SOURCE_ROOT; };
+ 43278FEA194EFB30003C9FEA /* WCThreadSafe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WCThreadSafe.h; path = ../wavesapi/threads/WCThreadSafe.h; sourceTree = SOURCE_ROOT; };
+ 43278FED194EFB30003C9FEA /* WavesPublicAPI_Defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WavesPublicAPI_Defines.h; path = ../wavesapi/wavespublicapi/1.0/WavesPublicAPI_Defines.h; sourceTree = SOURCE_ROOT; };
+ 43278FEE194EFB30003C9FEA /* wstdint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wstdint.h; path = ../wavesapi/wavespublicapi/wstdint.h; sourceTree = SOURCE_ROOT; };
+ 43278FEF194EFB30003C9FEA /* WTErr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WTErr.h; path = ../wavesapi/wavespublicapi/WTErr.h; sourceTree = SOURCE_ROOT; };
+ 43AA86DC194EECE000A67B56 /* libwaves_audiobackend.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libwaves_audiobackend.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 43AA86E5194EED8900A67B56 /* waves_audiobackend.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_audiobackend.cc; path = ../waves_audiobackend.cc; sourceTree = SOURCE_ROOT; };
+ 43AA86E6194EED8900A67B56 /* waves_audiobackend.latency.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_audiobackend.latency.cc; path = ../waves_audiobackend.latency.cc; sourceTree = SOURCE_ROOT; };
+ 43AA86E7194EED8900A67B56 /* waves_audiobackend.midi.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_audiobackend.midi.cc; path = ../waves_audiobackend.midi.cc; sourceTree = SOURCE_ROOT; };
+ 43AA86E8194EED8900A67B56 /* waves_audiobackend.port_engine.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_audiobackend.port_engine.cc; path = ../waves_audiobackend.port_engine.cc; sourceTree = SOURCE_ROOT; };
+ 43AA86E9194EED8900A67B56 /* waves_audioport.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_audioport.cc; path = ../waves_audioport.cc; sourceTree = SOURCE_ROOT; };
+ 43AA86EA194EED8900A67B56 /* waves_dataport.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_dataport.cc; path = ../waves_dataport.cc; sourceTree = SOURCE_ROOT; };
+ 43AA86EB194EED8900A67B56 /* waves_midi_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_midi_buffer.cc; path = ../waves_midi_buffer.cc; sourceTree = SOURCE_ROOT; };
+ 43AA86EC194EED8900A67B56 /* waves_midi_device_manager.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_midi_device_manager.cc; path = ../waves_midi_device_manager.cc; sourceTree = SOURCE_ROOT; };
+ 43AA86ED194EED8900A67B56 /* waves_midi_device.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_midi_device.cc; path = ../waves_midi_device.cc; sourceTree = SOURCE_ROOT; };
+ 43AA86EE194EED8900A67B56 /* waves_midi_event.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_midi_event.cc; path = ../waves_midi_event.cc; sourceTree = SOURCE_ROOT; };
+ 43AA86EF194EED8900A67B56 /* waves_midiport.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = waves_midiport.cc; path = ../waves_midiport.cc; sourceTree = SOURCE_ROOT; };
+ 43AA86FB194EEDAC00A67B56 /* waves_audiobackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_audiobackend.h; path = ../waves_audiobackend.h; sourceTree = SOURCE_ROOT; };
+ 43AA86FC194EEDAC00A67B56 /* waves_audioport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_audioport.h; path = ../waves_audioport.h; sourceTree = SOURCE_ROOT; };
+ 43AA86FD194EEDAC00A67B56 /* waves_dataport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_dataport.h; path = ../waves_dataport.h; sourceTree = SOURCE_ROOT; };
+ 43AA86FE194EEDAC00A67B56 /* waves_midi_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_midi_buffer.h; path = ../waves_midi_buffer.h; sourceTree = SOURCE_ROOT; };
+ 43AA86FF194EEDAC00A67B56 /* waves_midi_device_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_midi_device_manager.h; path = ../waves_midi_device_manager.h; sourceTree = SOURCE_ROOT; };
+ 43AA8700194EEDAC00A67B56 /* waves_midi_device.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_midi_device.h; path = ../waves_midi_device.h; sourceTree = SOURCE_ROOT; };
+ 43AA8701194EEDAC00A67B56 /* waves_midi_event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_midi_event.h; path = ../waves_midi_event.h; sourceTree = SOURCE_ROOT; };
+ 43AA8702194EEDAC00A67B56 /* waves_midiport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = waves_midiport.h; path = ../waves_midiport.h; sourceTree = SOURCE_ROOT; };
+ 43AA870B194EEDC600A67B56 /* wscript */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = wscript; path = ../wscript; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 43AA86D9194EECE000A67B56 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 43278FC6194EFB30003C9FEA /* wavesapi */ = {
+ isa = PBXGroup;
+ children = (
+ 43278FC7194EFB30003C9FEA /* akupara */,
+ 43278FCD194EFB30003C9FEA /* BasicTypes */,
+ 43278FD4194EFB30003C9FEA /* devicemanager */,
+ 43278FDE194EFB30003C9FEA /* miscutils */,
+ 43278FE5194EFB30003C9FEA /* refmanager */,
+ 43278FE8194EFB30003C9FEA /* threads */,
+ 43278FEB194EFB30003C9FEA /* wavespublicapi */,
+ );
+ name = wavesapi;
+ path = ../wavesapi;
+ sourceTree = SOURCE_ROOT;
+ };
+ 43278FC7194EFB30003C9FEA /* akupara */ = {
+ isa = PBXGroup;
+ children = (
+ 43278FC8194EFB30003C9FEA /* basics.hpp */,
+ 43278FC9194EFB30003C9FEA /* compiletime_functions.hpp */,
+ 43278FCA194EFB30003C9FEA /* threading */,
+ );
+ path = akupara;
+ sourceTree = "<group>";
+ };
+ 43278FCA194EFB30003C9FEA /* threading */ = {
+ isa = PBXGroup;
+ children = (
+ 43278FCB194EFB30003C9FEA /* atomic_ops.hpp */,
+ 43278FCC194EFB30003C9FEA /* atomic_ops_gcc_x86.hpp */,
+ );
+ path = threading;
+ sourceTree = "<group>";
+ };
+ 43278FCD194EFB30003C9FEA /* BasicTypes */ = {
+ isa = PBXGroup;
+ children = (
+ 43278FCE194EFB30003C9FEA /* WCFourCC.h */,
+ 43278FCF194EFB30003C9FEA /* WTByteOrder.h */,
+ 43278FD0194EFB30003C9FEA /* WUComPtr.h */,
+ 43278FD1194EFB30003C9FEA /* WUDefines.h */,
+ 43278FD2194EFB30003C9FEA /* WUMathConsts.h */,
+ 43278FD3194EFB30003C9FEA /* WUTypes.h */,
+ );
+ path = BasicTypes;
+ sourceTree = "<group>";
+ };
+ 43278FD4194EFB30003C9FEA /* devicemanager */ = {
+ isa = PBXGroup;
+ children = (
+ 43278FD5194EFB30003C9FEA /* IncludeWindows.h */,
+ 43278FD6194EFB30003C9FEA /* WCMRAudioDeviceManager.cpp */,
+ 43278FD7194EFB30003C9FEA /* WCMRAudioDeviceManager.h */,
+ 43278FD8194EFB30003C9FEA /* WCMRCoreAudioDeviceManager.cpp */,
+ 43278FD9194EFB30003C9FEA /* WCMRCoreAudioDeviceManager.h */,
+ 43278FDA194EFB30003C9FEA /* WCMRNativeAudio.cpp */,
+ 43278FDB194EFB30003C9FEA /* WCMRNativeAudio.h */,
+ 43278FDC194EFB30003C9FEA /* WCMRPortAudioDeviceManager.cpp */,
+ 43278FDD194EFB30003C9FEA /* WCMRPortAudioDeviceManager.h */,
+ );
+ path = devicemanager;
+ sourceTree = "<group>";
+ };
+ 43278FDE194EFB30003C9FEA /* miscutils */ = {
+ isa = PBXGroup;
+ children = (
+ 43278FDF194EFB30003C9FEA /* MinMaxUtilities.h */,
+ 43278FE0194EFB30003C9FEA /* safe_delete.h */,
+ 43278FE1194EFB30003C9FEA /* UMicroseconds.cpp */,
+ 43278FE2194EFB30003C9FEA /* UMicroseconds.h */,
+ 43278FE3194EFB30003C9FEA /* WCFixedString.h */,
+ 43278FE4194EFB30003C9FEA /* WUErrors.h */,
+ );
+ path = miscutils;
+ sourceTree = "<group>";
+ };
+ 43278FE5194EFB30003C9FEA /* refmanager */ = {
+ isa = PBXGroup;
+ children = (
+ 43278FE6194EFB30003C9FEA /* WCRefManager.cpp */,
+ 43278FE7194EFB30003C9FEA /* WCRefManager.h */,
+ );
+ path = refmanager;
+ sourceTree = "<group>";
+ };
+ 43278FE8194EFB30003C9FEA /* threads */ = {
+ isa = PBXGroup;
+ children = (
+ 43278FE9194EFB30003C9FEA /* WCThreadSafe.cpp */,
+ 43278FEA194EFB30003C9FEA /* WCThreadSafe.h */,
+ );
+ path = threads;
+ sourceTree = "<group>";
+ };
+ 43278FEB194EFB30003C9FEA /* wavespublicapi */ = {
+ isa = PBXGroup;
+ children = (
+ 43278FEC194EFB30003C9FEA /* 1.0 */,
+ 43278FEE194EFB30003C9FEA /* wstdint.h */,
+ 43278FEF194EFB30003C9FEA /* WTErr.h */,
+ );
+ path = wavespublicapi;
+ sourceTree = "<group>";
+ };
+ 43278FEC194EFB30003C9FEA /* 1.0 */ = {
+ isa = PBXGroup;
+ children = (
+ 43278FED194EFB30003C9FEA /* WavesPublicAPI_Defines.h */,
+ );
+ path = 1.0;
+ sourceTree = "<group>";
+ };
+ 43AA86D3194EECE000A67B56 = {
+ isa = PBXGroup;
+ children = (
+ 43278FC6194EFB30003C9FEA /* wavesapi */,
+ 43AA870C194EEDCA00A67B56 /* scripts */,
+ 43AA86E4194EECF300A67B56 /* headers */,
+ 43AA86E3194EECEB00A67B56 /* source */,
+ 43AA86DD194EECE000A67B56 /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ 43AA86DD194EECE000A67B56 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA86DC194EECE000A67B56 /* libwaves_audiobackend.dylib */,
+ );
+ name = Products;
+ sourceTree = SOURCE_ROOT;
+ };
+ 43AA86E3194EECEB00A67B56 /* source */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA86E5194EED8900A67B56 /* waves_audiobackend.cc */,
+ 43AA86E6194EED8900A67B56 /* waves_audiobackend.latency.cc */,
+ 43AA86E7194EED8900A67B56 /* waves_audiobackend.midi.cc */,
+ 43AA86E8194EED8900A67B56 /* waves_audiobackend.port_engine.cc */,
+ 43AA86E9194EED8900A67B56 /* waves_audioport.cc */,
+ 43AA86EA194EED8900A67B56 /* waves_dataport.cc */,
+ 43AA86EB194EED8900A67B56 /* waves_midi_buffer.cc */,
+ 43AA86EC194EED8900A67B56 /* waves_midi_device_manager.cc */,
+ 43AA86ED194EED8900A67B56 /* waves_midi_device.cc */,
+ 43AA86EE194EED8900A67B56 /* waves_midi_event.cc */,
+ 43AA86EF194EED8900A67B56 /* waves_midiport.cc */,
+ );
+ name = source;
+ sourceTree = SOURCE_ROOT;
+ };
+ 43AA86E4194EECF300A67B56 /* headers */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA86FB194EEDAC00A67B56 /* waves_audiobackend.h */,
+ 43AA86FC194EEDAC00A67B56 /* waves_audioport.h */,
+ 43AA86FD194EEDAC00A67B56 /* waves_dataport.h */,
+ 43AA86FE194EEDAC00A67B56 /* waves_midi_buffer.h */,
+ 43AA86FF194EEDAC00A67B56 /* waves_midi_device_manager.h */,
+ 43AA8700194EEDAC00A67B56 /* waves_midi_device.h */,
+ 43AA8701194EEDAC00A67B56 /* waves_midi_event.h */,
+ 43AA8702194EEDAC00A67B56 /* waves_midiport.h */,
+ );
+ name = headers;
+ sourceTree = SOURCE_ROOT;
+ };
+ 43AA870C194EEDCA00A67B56 /* scripts */ = {
+ isa = PBXGroup;
+ children = (
+ 43AA870B194EEDC600A67B56 /* wscript */,
+ );
+ name = scripts;
+ sourceTree = SOURCE_ROOT;
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 43AA86DA194EECE000A67B56 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 43AA8703194EEDAC00A67B56 /* waves_audiobackend.h in Headers */,
+ 43AA8704194EEDAC00A67B56 /* waves_audioport.h in Headers */,
+ 43AA8705194EEDAC00A67B56 /* waves_dataport.h in Headers */,
+ 43AA8706194EEDAC00A67B56 /* waves_midi_buffer.h in Headers */,
+ 43AA8707194EEDAC00A67B56 /* waves_midi_device_manager.h in Headers */,
+ 43AA8708194EEDAC00A67B56 /* waves_midi_device.h in Headers */,
+ 43AA8709194EEDAC00A67B56 /* waves_midi_event.h in Headers */,
+ 43AA870A194EEDAC00A67B56 /* waves_midiport.h in Headers */,
+ 43278FF0194EFB30003C9FEA /* basics.hpp in Headers */,
+ 43278FF1194EFB30003C9FEA /* compiletime_functions.hpp in Headers */,
+ 43278FF2194EFB30003C9FEA /* atomic_ops.hpp in Headers */,
+ 43278FF3194EFB30003C9FEA /* atomic_ops_gcc_x86.hpp in Headers */,
+ 43278FF4194EFB30003C9FEA /* WCFourCC.h in Headers */,
+ 43278FF5194EFB30003C9FEA /* WTByteOrder.h in Headers */,
+ 43278FF6194EFB30003C9FEA /* WUComPtr.h in Headers */,
+ 43278FF7194EFB30003C9FEA /* WUDefines.h in Headers */,
+ 43278FF8194EFB30003C9FEA /* WUMathConsts.h in Headers */,
+ 43278FF9194EFB30003C9FEA /* WUTypes.h in Headers */,
+ 43278FFA194EFB30003C9FEA /* IncludeWindows.h in Headers */,
+ 43278FFC194EFB30003C9FEA /* WCMRAudioDeviceManager.h in Headers */,
+ 43278FFE194EFB30003C9FEA /* WCMRCoreAudioDeviceManager.h in Headers */,
+ 43279000194EFB30003C9FEA /* WCMRNativeAudio.h in Headers */,
+ 43279002194EFB30003C9FEA /* WCMRPortAudioDeviceManager.h in Headers */,
+ 43279003194EFB30003C9FEA /* MinMaxUtilities.h in Headers */,
+ 43279004194EFB30003C9FEA /* safe_delete.h in Headers */,
+ 43279006194EFB30003C9FEA /* UMicroseconds.h in Headers */,
+ 43279007194EFB30003C9FEA /* WCFixedString.h in Headers */,
+ 43279008194EFB30003C9FEA /* WUErrors.h in Headers */,
+ 4327900A194EFB30003C9FEA /* WCRefManager.h in Headers */,
+ 4327900C194EFB30003C9FEA /* WCThreadSafe.h in Headers */,
+ 4327900D194EFB30003C9FEA /* WavesPublicAPI_Defines.h in Headers */,
+ 4327900E194EFB30003C9FEA /* wstdint.h in Headers */,
+ 4327900F194EFB30003C9FEA /* WTErr.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 43AA86DB194EECE000A67B56 /* waves_audiobackend */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 43AA86E0194EECE000A67B56 /* Build configuration list for PBXNativeTarget "waves_audiobackend" */;
+ buildPhases = (
+ 43AA86D8194EECE000A67B56 /* Sources */,
+ 43AA86D9194EECE000A67B56 /* Frameworks */,
+ 43AA86DA194EECE000A67B56 /* Headers */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = waves_audiobackend;
+ productName = waves_audiobackend;
+ productReference = 43AA86DC194EECE000A67B56 /* libwaves_audiobackend.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 43AA86D4194EECE000A67B56 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0460;
+ ORGANIZATIONNAME = Waves;
+ };
+ buildConfigurationList = 43AA86D7194EECE000A67B56 /* Build configuration list for PBXProject "waves_audiobackend" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 43AA86D3194EECE000A67B56;
+ productRefGroup = 43AA86DD194EECE000A67B56 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 43AA86DB194EECE000A67B56 /* waves_audiobackend */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 43AA86D8194EECE000A67B56 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 43AA86F0194EED8900A67B56 /* waves_audiobackend.cc in Sources */,
+ 43AA86F1194EED8900A67B56 /* waves_audiobackend.latency.cc in Sources */,
+ 43AA86F2194EED8900A67B56 /* waves_audiobackend.midi.cc in Sources */,
+ 43AA86F3194EED8900A67B56 /* waves_audiobackend.port_engine.cc in Sources */,
+ 43AA86F4194EED8900A67B56 /* waves_audioport.cc in Sources */,
+ 43AA86F5194EED8900A67B56 /* waves_dataport.cc in Sources */,
+ 43AA86F6194EED8900A67B56 /* waves_midi_buffer.cc in Sources */,
+ 43AA86F7194EED8900A67B56 /* waves_midi_device_manager.cc in Sources */,
+ 43AA86F8194EED8900A67B56 /* waves_midi_device.cc in Sources */,
+ 43AA86F9194EED8900A67B56 /* waves_midi_event.cc in Sources */,
+ 43AA86FA194EED8900A67B56 /* waves_midiport.cc in Sources */,
+ 43278FFB194EFB30003C9FEA /* WCMRAudioDeviceManager.cpp in Sources */,
+ 43278FFD194EFB30003C9FEA /* WCMRCoreAudioDeviceManager.cpp in Sources */,
+ 43278FFF194EFB30003C9FEA /* WCMRNativeAudio.cpp in Sources */,
+ 43279001194EFB30003C9FEA /* WCMRPortAudioDeviceManager.cpp in Sources */,
+ 43279005194EFB30003C9FEA /* UMicroseconds.cpp in Sources */,
+ 43279009194EFB30003C9FEA /* WCRefManager.cpp in Sources */,
+ 4327900B194EFB30003C9FEA /* WCThreadSafe.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 43AA86DE194EECE000A67B56 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.8;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ 43AA86DF194EECE000A67B56 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.8;
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+ 43AA86E1194EECE000A67B56 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ EXECUTABLE_PREFIX = lib;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 43AA86E2194EECE000A67B56 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ EXECUTABLE_PREFIX = lib;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 43AA86D7194EECE000A67B56 /* Build configuration list for PBXProject "waves_audiobackend" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 43AA86DE194EECE000A67B56 /* Debug */,
+ 43AA86DF194EECE000A67B56 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 43AA86E0194EECE000A67B56 /* Build configuration list for PBXNativeTarget "waves_audiobackend" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 43AA86E1194EECE000A67B56 /* Debug */,
+ 43AA86E2194EECE000A67B56 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 43AA86D4194EECE000A67B56 /* Project object */;
+}
diff --git a/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/project.pbxproj b/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/project.pbxproj
similarity index 100%
copy from libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/project.pbxproj
copy to libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/project.pbxproj
diff --git a/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata
similarity index 100%
copy from libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata
copy to libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata
diff --git a/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/project.xcworkspace/xcuserdata/VKamyshniy.xcuserdatad/UserInterfaceState.xcuserstate b/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/project.xcworkspace/xcuserdata/VKamyshniy.xcuserdatad/UserInterfaceState.xcuserstate
similarity index 100%
copy from libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/project.xcworkspace/xcuserdata/VKamyshniy.xcuserdatad/UserInterfaceState.xcuserstate
copy to libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/project.xcworkspace/xcuserdata/VKamyshniy.xcuserdatad/UserInterfaceState.xcuserstate
diff --git a/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/Assemble Application.xcscheme b/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/Assemble Application.xcscheme
similarity index 100%
copy from libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/Assemble Application.xcscheme
copy to libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/Assemble Application.xcscheme
diff --git a/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/Compile Java.xcscheme b/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/Compile Java.xcscheme
similarity index 100%
copy from libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/Compile Java.xcscheme
copy to libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/Compile Java.xcscheme
diff --git a/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/CopyJavaSources.xcscheme b/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/CopyJavaSources.xcscheme
similarity index 100%
copy from libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/CopyJavaSources.xcscheme
copy to libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/CopyJavaSources.xcscheme
diff --git a/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/JPortMidiHeaders.xcscheme b/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/JPortMidiHeaders.xcscheme
similarity index 100%
copy from libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/JPortMidiHeaders.xcscheme
copy to libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/JPortMidiHeaders.xcscheme
diff --git a/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/PmDefaults.xcscheme b/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/PmDefaults.xcscheme
similarity index 100%
copy from libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/PmDefaults.xcscheme
copy to libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/PmDefaults.xcscheme
diff --git a/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/xcschememanagement.plist b/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/xcschememanagement.plist
similarity index 100%
copy from libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/xcschememanagement.plist
copy to libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/xcschememanagement.plist
diff --git a/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/Assemble Application.xcscheme b/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/gzharun.xcuserdatad/xcschemes/Assemble Application.xcscheme
similarity index 100%
copy from libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/Assemble Application.xcscheme
copy to libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/gzharun.xcuserdatad/xcschemes/Assemble Application.xcscheme
diff --git a/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/Compile Java.xcscheme b/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/gzharun.xcuserdatad/xcschemes/Compile Java.xcscheme
similarity index 100%
copy from libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/Compile Java.xcscheme
copy to libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/gzharun.xcuserdatad/xcschemes/Compile Java.xcscheme
diff --git a/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/CopyJavaSources.xcscheme b/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/gzharun.xcuserdatad/xcschemes/CopyJavaSources.xcscheme
similarity index 100%
copy from libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/CopyJavaSources.xcscheme
copy to libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/gzharun.xcuserdatad/xcschemes/CopyJavaSources.xcscheme
diff --git a/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/JPortMidiHeaders.xcscheme b/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/gzharun.xcuserdatad/xcschemes/JPortMidiHeaders.xcscheme
similarity index 100%
copy from libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/JPortMidiHeaders.xcscheme
copy to libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/gzharun.xcuserdatad/xcschemes/JPortMidiHeaders.xcscheme
diff --git a/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/PmDefaults.xcscheme b/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/gzharun.xcuserdatad/xcschemes/PmDefaults.xcscheme
similarity index 100%
copy from libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/VKamyshniy.xcuserdatad/xcschemes/PmDefaults.xcscheme
copy to libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/gzharun.xcuserdatad/xcschemes/PmDefaults.xcscheme
diff --git a/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/gzharun.xcuserdatad/xcschemes/xcschememanagement.plist b/libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/gzharun.xcuserdatad/xcschemes/xcschememanagement.plist
similarity index 100%
copy from libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/xcuserdata/gzharun.xcuserdatad/xcschemes/xcschememanagement.plist
copy to libs/backends/wavesaudio/portmidi/src/pm_mac/pm_mac.xcodeproj/pm_mac.xcodeproj/xcuserdata/gzharun.xcuserdatad/xcschemes/xcschememanagement.plist
diff --git a/libs/backends/wavesaudio/waves_audiobackend.cc b/libs/backends/wavesaudio/waves_audiobackend.cc
index 8a1661b..8cd94c4 100644
--- a/libs/backends/wavesaudio/waves_audiobackend.cc
+++ b/libs/backends/wavesaudio/waves_audiobackend.cc
@@ -21,6 +21,15 @@
#include "waves_audioport.h"
#include "waves_midiport.h"
+#include "ardour/runtime_functions.h"
+
+#ifdef COMPILER_MSVC
+#include <windows.h>
+#define sleep(X) Sleep((X) * 1000)
+// JE - Perhaps we should be using Glib::usleep() here, rather than sleep()?? But
+// that would make the Waves backend dependent on Glib (which is isn't, currently).
+#endif
+
using namespace ARDOUR;
#if defined __MINGW64__ || defined __MINGW32__
@@ -40,8 +49,8 @@ void WavesAudioBackend::AudioDeviceManagerNotification (NotificationReason reaso
std::cout << "------------------------------- WCMRAudioDeviceManagerClient::DeviceDebugInfo -- " << (char*)parameter << std::endl;
break;
case WCMRAudioDeviceManagerClient::BufferSizeChanged:
- std::cout << "------------------------------- WCMRAudioDeviceManagerClient::BufferSizeChanged: " << *(uint32_t*)parameter << std::endl;
- _buffer_size_change(*(uint32_t*)parameter);
+ std::cout << "------------------------------- WCMRAudioDeviceManagerClient::BufferSizeChanged: " << *(int*)parameter << std::endl;
+ _buffer_size_change(*(int*)parameter);
break;
case WCMRAudioDeviceManagerClient::RequestReset:
std::cout << "------------------------------- WCMRAudioDeviceManagerClient::RequestReset" << std::endl;
@@ -52,7 +61,7 @@ void WavesAudioBackend::AudioDeviceManagerNotification (NotificationReason reaso
break;
case WCMRAudioDeviceManagerClient::SamplingRateChanged:
std::cout << "------------------------------- WCMRAudioDeviceManagerClient::SamplingRateChanged: " << *(float*)parameter << std::endl;
- set_sample_rate(*(float*)parameter);
+ _sample_rate_change(*(float*)parameter);
break;
case WCMRAudioDeviceManagerClient::Dropout:
std::cout << "------------------------------- WCMRAudioDeviceManagerClient::Dropout: " << std::endl;
@@ -75,7 +84,7 @@ void WavesAudioBackend::AudioDeviceManagerNotification (NotificationReason reaso
engine.request_device_list_update();
break;
case WCMRAudioDeviceManagerClient::IODeviceDisconnected:
- std::cout << "------------------------------- WCMRAudioDeviceManagerClient::DeviceListChanged" << std::endl;
+ std::cout << "------------------------------- WCMRAudioDeviceManagerClient::IODeviceDisconnected" << std::endl;
engine.request_device_list_update();
break;
case WCMRAudioDeviceManagerClient::AudioCallback:
@@ -221,23 +230,6 @@ float WavesAudioBackend::default_sample_rate () const
return AudioBackend::default_sample_rate ();
}
-uint32_t
-WavesAudioBackend::default_buffer_size (const std::string& device_name) const
-{
-#ifdef __APPLE__
- return AudioBackend::default_buffer_size (device_name);
-#else
- DeviceInfo devInfo;
- WTErr err = _audio_device_manager.GetDeviceInfoByName(device_name, devInfo);
-
- if (err != eNoErr) {
- std::cerr << "WavesAudioBackend::default_buffer_size (): Failed to get buffer size for device [" << device_name << "]" << std::endl;
- return AudioBackend::default_buffer_size (device_name);
- }
-
- return devInfo.m_DefaultBufferSize;
-#endif
-}
std::vector<uint32_t>
WavesAudioBackend::available_buffer_sizes (const std::string& device_name) const
@@ -418,11 +410,14 @@ WavesAudioBackend::set_sample_rate (float sample_rate)
return -1;
}
- _sample_rate_change(sample_rate);
+ // if call to set sample rate is successful
+ // but device sample rate differs from the value we tried to set
+ // this means we are driven by device for buffer size
+ sample_rate = _device->CurrentSamplingRate ();
+ _sample_rate_change(sample_rate);
if (device_needs_restart) {
// COMMENTED DBG LOGS */ std::cout << "\t\t[" << _device->DeviceName() << "]->SetStreaming (true);"<< std::endl;
- _call_thread_init_callback = true;
retVal = _device->SetStreaming (true);
if (retVal != eNoErr) {
std::cerr << "WavesAudioBackend::set_sample_rate (): [" << _device->DeviceName () << "]->SetStreaming (true) failed (" << retVal << ") !" << std::endl;
@@ -471,7 +466,6 @@ WavesAudioBackend::set_buffer_size (uint32_t buffer_size)
if (device_needs_restart) {
// COMMENTED DBG LOGS */ std::cout << "\t\t[" << _device->DeviceName() << "]->SetStreaming (true);"<< std::endl;
- _call_thread_init_callback = true;
retVal = _device->SetStreaming (true);
if (retVal != eNoErr) {
std::cerr << "WavesAudioBackend::set_buffer_size (): [" << _device->DeviceName () << "]->SetStreaming (true) failed (" << retVal << ") !" << std::endl;
@@ -497,8 +491,6 @@ WavesAudioBackend::reset_device ()
{
// COMMENTED DBG LOGS */ std::cout << "WavesAudioBackend::_reset_device ():" << std::endl;
- WTErr retVal = eNoErr;
-
if (!_device) {
std::cerr << "WavesAudioBackend::set_buffer_size (): No device is set!" << std::endl;
return -1;
@@ -707,7 +699,6 @@ WavesAudioBackend::_start (bool for_latency_measurement)
manager.registration_callback ();
- _call_thread_init_callback = true;
WTErr retVal = _device->SetStreaming (true);
if (retVal != eNoErr) {
std::cerr << "WavesAudioBackend::_start (): [" << _device->DeviceName () << "]->SetStreaming () failed!" << std::endl;
@@ -738,11 +729,6 @@ WavesAudioBackend::_audio_device_callback (const float* input_buffer,
// COMMENTED FREQUENT DBG LOGS */ std::cout << "WavesAudioBackend::_audio_device_callback ():" << _device->DeviceName () << std::endl;
_sample_time_at_cycle_start = sample_time;
_cycle_start_time_nanos = cycle_start_time_nanos;
-
- /* There is the possibility that the thread this runs in may change from
- * callback to callback, so do it every time.
- */
- _main_thread = pthread_self ();
if (_buffer_size != nframes) {
// COMMENTED DBG LOGS */ std::cout << "\tAudioEngine::thread_init_callback() buffer size and nframes are not equal: " << _buffer_size << "!=" << nframes << std::endl;
@@ -755,9 +741,30 @@ WavesAudioBackend::_audio_device_callback (const float* input_buffer,
if (_call_thread_init_callback) {
_call_thread_init_callback = false;
// COMMENTED DBG LOGS */ std::cout << "\tAudioEngine::thread_init_callback() invoked for " << std::hex << pthread_self() << std::dec << " !" << std::endl;
+
+ /* There is the possibility that the thread this runs in may change from
+ * callback to callback, so do it every time.
+ */
+ _main_thread = pthread_self ();
+
AudioEngine::thread_init_callback (this);
}
+ if ( !engine.thread_initialised_for_audio_processing () ) {
+ std::cerr << "\tWavesAudioBackend::_audio_device_callback (): It's an attempt to call process callback from the thread which didn't initialize it " << std::endl;
+
+ AudioEngine::thread_init_callback (this);
+ }
+
+ if (pthread_equal (_main_thread, pthread_self()) == 0) {
+#ifdef PTW32_VERSION
+ std::cerr << "Process thread ID has changed. Expected thread: " << _main_thread.p << " current thread: " << pthread_self().p << std::dec << " !" << std::endl;
+#else
+ std::cerr << "Process thread ID has changed. Expected thread: " << _main_thread << " current thread: " << pthread_self() << std::dec << " !" << std::endl;
+#endif
+ _main_thread = pthread_self();
+ }
+
engine.process_callback (nframes);
_write_audio_data_to_device (output_buffer, nframes);
@@ -815,11 +822,23 @@ WavesAudioBackend::freewheel (bool start_stop)
}
_call_thread_init_callback = true;
_freewheel_thread ();
- engine.freewheel_callback (start_stop);
+
+ while (!engine.freewheeling()) {
+ sleep(0);
+ }
+
+ // freewheel thread was not activated successfully
+ if (_freewheel_thread_active == false) {
+ engine.freewheel_callback(false);
+ }
}
else {
_freewheel_thread_active = false; // stop _freewheel_thread ()
- engine.freewheel_callback (start_stop);
+
+ while (engine.freewheeling()) {
+ sleep(0);
+ }
+
_call_thread_init_callback = true;
WTErr retval = _device->SetStreaming (true);
if (retval != eNoErr) {
@@ -859,6 +878,10 @@ WavesAudioBackend::_freewheel_thread ()
_freewheel_thread_active = true;
if ((pthread_create (&thread_id, &attributes, __start_process_thread, thread_data))) {
_freewheel_thread_active = false;
+
+ // release invoking thread
+ engine.freewheel_callback(true);
+
std::cerr << "WavesAudioBackend::freewheel_thread (): pthread_create () failed!" << std::endl;
return;
}
@@ -867,6 +890,9 @@ WavesAudioBackend::_freewheel_thread ()
return;
}
+ // notify angine that freewheeling is started
+ engine.freewheel_callback(true);
+
if (_call_thread_init_callback) {
_call_thread_init_callback = false;
AudioEngine::thread_init_callback (this);
@@ -875,6 +901,10 @@ WavesAudioBackend::_freewheel_thread ()
while (_freewheel_thread_active) {
engine.process_callback (_buffer_size);
}
+
+ // notify angine that freewheeling is stopped
+ engine.freewheel_callback(false);
+
// COMMENTED DBG LOGS */ std::cout << "WavesAudioBackend::_freewheel_thread (): FINISHED" << std::endl;
return;
}
@@ -1158,13 +1188,12 @@ WavesAudioBackend::_read_audio_data_from_device (const float* input_buffer, pfra
{
#if defined(PLATFORM_WINDOWS)
const float **buffer = (const float**)input_buffer;
- size_t copied_bytes = nframes*sizeof(float);
for(std::vector<WavesAudioPort*>::iterator it = _physical_audio_inputs.begin ();
it != _physical_audio_inputs.end();
++it)
{
- memcpy((*it)->buffer(), *buffer, copied_bytes);
+ ARDOUR::copy_vector ((*it)->buffer(), *buffer, nframes);
++buffer;
}
#else
@@ -1247,7 +1276,6 @@ WavesAudioBackend::__instantiate (const std::string& arg1, const std::string& ar
LARGE_INTEGER Frequency;
QueryPerformanceFrequency(&Frequency);
__performance_counter_frequency = Frequency.QuadPart;
- std::cout << "__performance_counter_frequency:" << __performance_counter_frequency << std::endl;
#endif
return 0;
diff --git a/libs/backends/wavesaudio/waves_audiobackend.h b/libs/backends/wavesaudio/waves_audiobackend.h
index ad40d09..74322b1 100644
--- a/libs/backends/wavesaudio/waves_audiobackend.h
+++ b/libs/backends/wavesaudio/waves_audiobackend.h
@@ -93,8 +93,6 @@ class WavesMidiPort;
virtual std::vector<uint32_t> available_buffer_sizes (const std::string& device) const;
- virtual uint32_t default_buffer_size (const std::string& device) const;
-
virtual uint32_t available_input_channel_count (const std::string& device) const;
virtual uint32_t available_output_channel_count (const std::string& device) const;
diff --git a/libs/backends/wavesaudio/waves_audioport.cc b/libs/backends/wavesaudio/waves_audioport.cc
index 4ded37d..4918025 100644
--- a/libs/backends/wavesaudio/waves_audioport.cc
+++ b/libs/backends/wavesaudio/waves_audioport.cc
@@ -18,13 +18,21 @@
*/
#include "waves_audioport.h"
+#include "ardour/runtime_functions.h"
+#include "pbd/malign.h"
using namespace ARDOUR;
WavesAudioPort::WavesAudioPort (const std::string& port_name, PortFlags flags)
: WavesDataPort (port_name, flags)
{
- memset (_buffer, 0, sizeof (_buffer));
+ aligned_malloc ((void**)&_buffer, MAX_BUFFER_SIZE_BYTES, 32 /*32 byte alignment*/);
+ memset (_buffer, 0, MAX_BUFFER_SIZE_BYTES);
+}
+
+WavesAudioPort::~WavesAudioPort ()
+{
+ aligned_free (_buffer);
}
@@ -40,14 +48,19 @@ void* WavesAudioPort::get_buffer (pframes_t nframes)
* Base class WavesDataPort takes is supposed to provide enough consistentcy
* of the connections.
*/
- for (memcpy (_buffer, ((const WavesAudioPort*)*it)->const_buffer (), nframes * sizeof (Sample)), ++it;
- it != get_connections ().end ();
- ++it) {
- Sample* tgt = buffer ();
- const Sample* src = ((const WavesAudioPort*)*it)->const_buffer ();
- for (uint32_t frame = 0; frame < nframes; ++frame, ++tgt, ++src) {
- *tgt += *src;
- }
+
+ // get first buffer data
+ // use optimized function to fill the buffer intialy
+ ARDOUR::copy_vector (_buffer, ((const WavesAudioPort*)*it)->const_buffer (), nframes);
+ ++it;
+
+ // mix the rest
+ for (; it != get_connections ().end (); ++it) {
+ Sample* tgt = buffer ();
+ const Sample* src = ((const WavesAudioPort*)*it)->const_buffer ();
+
+ // use otimized function to mix the buffers
+ ARDOUR::mix_buffers_no_gain (tgt, src, nframes);
}
}
}
@@ -59,4 +72,4 @@ void
WavesAudioPort::_wipe_buffer()
{
memset (_buffer, 0, sizeof (_buffer));
-}
\ No newline at end of file
+}
diff --git a/libs/backends/wavesaudio/waves_audioport.h b/libs/backends/wavesaudio/waves_audioport.h
index 5b4ab52..d658dba 100644
--- a/libs/backends/wavesaudio/waves_audioport.h
+++ b/libs/backends/wavesaudio/waves_audioport.h
@@ -35,7 +35,7 @@ public:
WavesAudioPort (const std::string& port_name, PortFlags flags);
- virtual ~WavesAudioPort () { };
+ virtual ~WavesAudioPort ();
virtual DataType type () const { return DataType::AUDIO; };
@@ -49,7 +49,7 @@ protected:
private:
- Sample _buffer[MAX_BUFFER_SIZE_SAMPLES];
+ Sample *_buffer;
};
} // namespace
diff --git a/libs/backends/wavesaudio/waves_dataport.cc b/libs/backends/wavesaudio/waves_dataport.cc
index d1dacc9..b5485ac 100644
--- a/libs/backends/wavesaudio/waves_dataport.cc
+++ b/libs/backends/wavesaudio/waves_dataport.cc
@@ -35,7 +35,7 @@ WavesDataPort::WavesDataPort (const std::string& inport_name, PortFlags inflags)
WavesDataPort::~WavesDataPort ()
{
- disconnect_all ();
+ _disconnect_all ();
}
@@ -67,7 +67,7 @@ int WavesDataPort::connect (WavesDataPort *port)
}
if (is_connected (port)) {
- std::cerr << "WavesDataPort::connect (): the ports are already connected!" << std::endl;
+ // std::cerr << "WavesDataPort::connect (): the ports are already connected!" << std::endl;
return -1;
}
@@ -115,8 +115,7 @@ void WavesDataPort::_disconnect (WavesDataPort *port, bool api_call)
port->_disconnect (this, false);
}
- if (is_input() && _connections.empty())
- {
+ if (is_input() && _connections.empty()) {
_wipe_buffer();
}
}
@@ -124,13 +123,21 @@ void WavesDataPort::_disconnect (WavesDataPort *port, bool api_call)
void WavesDataPort::disconnect_all ()
{
+ _disconnect_all ();
+
+ if (is_input()) {
+ _wipe_buffer();
+ }
+}
+
+void WavesDataPort::_disconnect_all ()
+{
while (!_connections.empty ()) {
_connections.back ()->_disconnect (this, false);
_connections.pop_back ();
}
}
-
bool WavesDataPort::is_physically_connected () const
{
for (std::vector<WavesDataPort*>::const_iterator it = _connections.begin (); it != _connections.end (); ++it) {
diff --git a/libs/backends/wavesaudio/waves_dataport.h b/libs/backends/wavesaudio/waves_dataport.h
index 1b2f26f..a5b8243 100644
--- a/libs/backends/wavesaudio/waves_dataport.h
+++ b/libs/backends/wavesaudio/waves_dataport.h
@@ -106,6 +106,7 @@ private:
std::vector<WavesDataPort*> _connections;
void _connect (WavesDataPort* port, bool api_call);
+ void _disconnect_all ();
void _disconnect (WavesDataPort* port, bool api_call);
};
diff --git a/libs/backends/wavesaudio/waves_midi_device.cc b/libs/backends/wavesaudio/waves_midi_device.cc
index 25d06da..9bb6661 100644
--- a/libs/backends/wavesaudio/waves_midi_device.cc
+++ b/libs/backends/wavesaudio/waves_midi_device.cc
@@ -18,6 +18,12 @@
*/
#include <iostream>
+
+#include "pbd/error.h"
+#include "pbd/debug.h"
+#include "pbd/compose.h"
+#include "pbd/stacktrace.h"
+
#include "waves_midi_device.h"
#include "waves_midi_event.h"
@@ -27,6 +33,7 @@
#define QUEUE_LENGTH 1024
using namespace ARDOUR;
+using namespace PBD;
WavesMidiDevice::WavesMidiDevice (const std::string& device_name)
: _pm_input_id (pmNoDevice)
@@ -61,14 +68,16 @@ WavesMidiDevice::WavesMidiDevice (const std::string& device_name)
WavesMidiDevice::~WavesMidiDevice ()
{
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiDevice::~WavesMidiDevice ():" << name () << std::endl;
- close ();
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ("WavesMidiDevice::~WavesMidiDevice (): %1\n", name()));
+ close ();
}
int
WavesMidiDevice::open (PmTimeProcPtr time_proc, void* time_info)
{
- if (is_input () ) {
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ("WavesMidiDevice::open (): %1", name ()));
+
+ if (is_input () ) {
// COMMENTED DBG LOGS */ std::cout << "WavesMidiDevice::open (): INPUT" << _pm_input_id << "-[" << name () << "]" << std::endl;
if (!_input_pm_stream) {
@@ -78,26 +87,26 @@ WavesMidiDevice::open (PmTimeProcPtr time_proc, void* time_info)
_input_queue = Pm_QueueCreate (QUEUE_LENGTH, sizeof (const WavesMidiEvent*));
// COMMENTED DBG LOGS */ std::cout << " DONE : " << std::endl;
if (NULL == _input_queue) {
- std::cerr << "WavesMidiDevice::open (): _input_queue = Pm_QueueCreate () failed for " << _pm_input_id << "-[" << name () << "]!" << std::endl;
- return -1;
+ std::cerr << "WavesMidiDevice::open (): _input_queue = Pm_QueueCreate () failed for " << _pm_input_id << "-[" << name () << "]!" << std::endl;
+ return -1;
}
}
// create stream
// COMMENTED DBG LOGS */ std::cout << " going to Pm_OpenInput : " << std::endl;
- if (pmNoError != Pm_OpenInput (&_input_pm_stream,
- _pm_input_id,
- NULL,
- 1024,
- time_proc,
- time_info)) {
- // COMMENTED DBG LOGS */ std::cout << " DONE : " << std::endl;
- char* err_msg = new char[256];
- Pm_GetHostErrorText(err_msg, 256);
- std::cerr << "WavesMidiDevice::open (): Pm_OpenInput () failed for " << _pm_input_id << "-[" << name () << "]!" << std::endl;
- std::cerr << " Port Midi Host Error: " << err_msg << std::endl;
- close ();
- return -1;
- }
+ if (pmNoError != Pm_OpenInput (&_input_pm_stream,
+ _pm_input_id,
+ NULL,
+ 1024,
+ time_proc,
+ time_info)) {
+ // COMMENTED DBG LOGS */ std::cout << " DONE : " << std::endl;
+ char* err_msg = new char[256];
+ Pm_GetHostErrorText(err_msg, 256);
+ std::cerr << "WavesMidiDevice::open (): Pm_OpenInput () failed for " << _pm_input_id << "-[" << name () << "]!" << std::endl;
+ std::cerr << " Port Midi Host Error: " << err_msg << std::endl;
+ close ();
+ return -1;
+ }
// COMMENTED DBG LOGS */ std::cout << " DONE : " << std::endl;
}
}
@@ -142,6 +151,7 @@ WavesMidiDevice::open (PmTimeProcPtr time_proc, void* time_info)
void
WavesMidiDevice::close ()
{
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ("WavesMidiDevice::close (): %1\n", name ()));
WavesMidiEvent *waves_midi_event;
// save _input_pm_stream and _output_pm_stream to local buf
@@ -197,114 +207,123 @@ WavesMidiDevice::close ()
void
WavesMidiDevice::do_io ()
{
- read_midi ();
- write_midi ();
+ read_midi ();
+ write_midi ();
}
void
WavesMidiDevice::read_midi ()
{
- if (NULL == _input_pm_stream) {
- return;
- }
-
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiDevice::_read_midi (): " << _pm_device_id << "-[" << name () << "]" << std::endl;
-
- while (Pm_Poll (_input_pm_stream) > 0) {
- PmEvent pm_event; // just one message at a time
- int result = Pm_Read (_input_pm_stream, &pm_event, 1);
- if (result < 0) {
- std::cerr << "WavesMidiDevice::_read_midi (): Pm_Read () failed (" << result << ") for [" << name () << "]!" << std::endl;
- break;
- }
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiDevice::_read_midi (): " << _pm_device_id << "-[" << name () << "] evt-tm:" << pm_event.timestamp << std::endl;
- if (_incomplete_waves_midi_event == NULL ) {
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiDevice::_read_midi (): " << _pm_device_id << "-[" << name () << "] : new _incomplete_waves_midi_event" << std::endl;
- _incomplete_waves_midi_event = new WavesMidiEvent (pm_event.timestamp);
+ if (NULL == _input_pm_stream) {
+ return;
}
- WavesMidiEvent *nested_pm_event = _incomplete_waves_midi_event->append_data (pm_event);
- if (nested_pm_event) {
- Pm_Enqueue (_input_queue, &nested_pm_event);
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiDevice::_read_midi (): " << _pm_device_id << "-[" << name () << "] : Pm_Enqueue (_input_queue, nested_pm_event)" << std::endl;
+ while (Pm_Poll (_input_pm_stream) > 0) {
+
+ PmEvent pm_event; // just one message at a time
+ int result = Pm_Read (_input_pm_stream, &pm_event, 1);
+
+ if (result < 0) {
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ("Pm_Read failed for (): [%1]\n", name()));
+ break;
+ }
+
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ("WavesMidiDevice::_read_midi (): [%1] evt-tm: %2\n", name(), pm_event.timestamp));
+
+ if (_incomplete_waves_midi_event == NULL ) {
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ("WavesMidiDevice::_read_midi (): [%1] new incomplete_waves_midi_event\n", name()));
+ _incomplete_waves_midi_event = new WavesMidiEvent (pm_event.timestamp);
+ }
+
+ WavesMidiEvent *nested_pm_event = _incomplete_waves_midi_event->append_data (pm_event);
+
+ if (nested_pm_event) {
+ Pm_Enqueue (_input_queue, &nested_pm_event);
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ("WavesMidiDevice::_read_midi (): [%1] : Pm_Enqueue (_input_queue, nested_pm_event)\n", name()));
+ }
+
+ switch ( _incomplete_waves_midi_event->state ()) {
+ case WavesMidiEvent::BROKEN:
+ delete _incomplete_waves_midi_event;
+ _incomplete_waves_midi_event = NULL;
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ("WavesMidiDevice::_read_midi (): [%1] : case WavesMidiEvent::BROKEN:\n", name()));
+ break;
+ case WavesMidiEvent::COMPLETE:
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ("WavesMidiDevice::_read_midi (): [%1] : Pm_Enqueue (_input_queue, _incomplete_waves_midi_event); %3\n", name (), _incomplete_waves_midi_event));
+
+ if (pmNoError != Pm_Enqueue (_input_queue, &_incomplete_waves_midi_event) ) {
+ char* err_msg = new char[256];
+ Pm_GetHostErrorText(err_msg, 256);
+ std::cerr << "WavesMidiDevice::read_midi (): Pm_Enqueue () failed for [" << name () << "]!" << std::endl;
+ std::cerr << "Error: " << err_msg << std::endl;
+ }
+
+ _incomplete_waves_midi_event = NULL;
+ break;
+ default:
+ break;
+ }
}
- switch ( _incomplete_waves_midi_event->state ()) {
- case WavesMidiEvent::BROKEN:
- delete _incomplete_waves_midi_event;
- _incomplete_waves_midi_event = NULL;
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiDevice::_read_midi (): " << _pm_device_id << "-[" << name () << "] : case WavesMidiEvent::BROKEN:" << std::endl;
- break;
- case WavesMidiEvent::COMPLETE:
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiDevice::_read_midi (): " << _pm_device_id << "-[" << name () << "] : Pm_Enqueue (_input_queue, _incomplete_waves_midi_event); " << std::hex << (void*)_incomplete_waves_midi_event << std::dec << std::endl;
- Pm_Enqueue (_input_queue, &_incomplete_waves_midi_event);
- _incomplete_waves_midi_event = NULL;
- break;
- default:
- break;
- }
- }
}
-
void
WavesMidiDevice::write_midi ()
{
- if (NULL == _output_pm_stream) {
- return;
- }
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiDevice::_write_midi (): " << _pm_device_id << "-[" << name () << "]" << std::endl;
-
- PmError err;
- WavesMidiEvent *waves_midi_event;
-
- while (1 == Pm_Dequeue (_output_queue, &waves_midi_event)) {
- if (waves_midi_event->sysex ()) {
- // LATENCY compensation
- err = Pm_WriteSysEx (_output_pm_stream, waves_midi_event->timestamp () - LATENCY, waves_midi_event->data ());
- if (0 > err) {
- std::cout << "WavesMidiDevice::write_event_to_device (): [" << name () << "] Pm_WriteSysEx () failed (" << err << ")!" << std::endl;
- };
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiDevice::_write_midi (): SYSEX used, ev->tm:" << waves_midi_event->timestamp () - LATENCY << std::endl;
+ if (NULL == _output_pm_stream) {
+ return;
}
- else
- {
- err = Pm_WriteShort (_output_pm_stream, waves_midi_event->timestamp () - LATENCY, * (PmMessage*)waves_midi_event->data ());
- if (0 > err) {
- std::cout << "WavesMidiDevice::write_event_to_device (): [" << name () << "] Pm_WriteShort () failed (" << err << ")!" << std::endl;
- }
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiDevice::_write_midi (): SHORTMSG used, ev->tm:" << waves_midi_event->timestamp () - LATENCY << std::endl;
+
+ PmError err;
+ WavesMidiEvent *waves_midi_event;
+
+ while (1 == Pm_Dequeue (_output_queue, &waves_midi_event)) {
+ if (waves_midi_event->sysex ()) {
+ // LATENCY compensation
+ err = Pm_WriteSysEx (_output_pm_stream, waves_midi_event->timestamp () - LATENCY, waves_midi_event->data ());
+ if (0 > err) {
+ std::cerr << "WavesMidiDevice::write_event_to_device (): [" << name () << "] Pm_WriteSysEx () failed (" << err << ")!" << std::endl;
+ };
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ("WavesMidiDevice::_write_midi (): SYSEX used, ev->tm: %1", waves_midi_event->timestamp () - LATENCY));
+ }
+ else
+ {
+ err = Pm_WriteShort (_output_pm_stream, waves_midi_event->timestamp () - LATENCY, * (PmMessage*)waves_midi_event->data ());
+ if (0 > err) {
+ error << "WavesMidiDevice::write_event_to_device (): [" << name () << "] Pm_WriteShort () failed (" << err << ")!" << endmsg;
+ }
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ("WavesMidiDevice::_write_midi (): SHORTMSG used, ev->tm: %1\n", waves_midi_event->timestamp () - LATENCY));
+ }
}
- }
- return;
-}
+ return;
+}
+
int
WavesMidiDevice::enqueue_output_waves_midi_event (const WavesMidiEvent* waves_midi_event)
{
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiDevice::enqueue_output_waves_midi_event (): " << _pm_device_id << "-[" << name () << "]" << std::endl;
-
- if (waves_midi_event == NULL) {
- std::cerr << "WavesMidiDevice::put_event_to_callback (): 'waves_midi_event' is NULL!" << std::endl;
- return -1;
- }
-
- PmError err = Pm_Enqueue (_output_queue, &waves_midi_event);
-
- if (0 > err) {
- std::cerr << "WavesMidiDevice::put_event_to_callback (): Pm_Enqueue () failed (" << err << ")!" << std::endl;
- return -1;
- };
-
- return 0;
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ("WavesMidiDevice::enqueue_output_waves_midi_event () [%1]\n", name()));
+
+ if (waves_midi_event == NULL) {
+ error << "WavesMidiDevice::put_event_to_callback (): 'waves_midi_event' is NULL!" << endmsg;
+ return -1;
+ }
+
+ PmError err = Pm_Enqueue (_output_queue, &waves_midi_event);
+
+ if (0 > err) {
+ error << "WavesMidiDevice::put_event_to_callback (): Pm_Enqueue () failed (" << err << ")!" << endmsg;
+ return -1;
+ };
+
+ return 0;
}
WavesMidiEvent*
WavesMidiDevice::dequeue_input_waves_midi_event ()
{
- WavesMidiEvent* waves_midi_event;
- if (Pm_Dequeue (_input_queue, &waves_midi_event) == 1) {
- return waves_midi_event;
- }
- return NULL;
+ WavesMidiEvent* waves_midi_event;
+ if (Pm_Dequeue (_input_queue, &waves_midi_event) == 1) {
+ return waves_midi_event;
+ }
+ return NULL;
}
-
diff --git a/libs/backends/wavesaudio/waves_midi_device_manager.cc b/libs/backends/wavesaudio/waves_midi_device_manager.cc
index dcc5fa0..344deee 100644
--- a/libs/backends/wavesaudio/waves_midi_device_manager.cc
+++ b/libs/backends/wavesaudio/waves_midi_device_manager.cc
@@ -54,7 +54,7 @@ WavesMidiDeviceManager::~WavesMidiDeviceManager ()
int
WavesMidiDeviceManager::start ()
{
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiDeviceManager::stream ():" << std::endl;
+ // COMMENTED DBG LOGS */ std::cout << "WavesMidiDeviceManager::start ():" << std::endl;
if ( _active == true ) {
return -1;
}
@@ -77,7 +77,7 @@ WavesMidiDeviceManager::start ()
int
WavesMidiDeviceManager::stream (bool yn)
{
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiDeviceManager::stream ():" << std::endl;
+ // COMMENTED DBG LOGS */ std::cout << "WavesMidiDeviceManager::stream (" << (yn?"true":"false") << "):" << std::endl;
if (!_active) {
std::cerr << "WavesMidiDeviceManager::stream (): the midi device manager is not started up !" << std::endl;
return -1;
@@ -88,7 +88,8 @@ WavesMidiDeviceManager::stream (bool yn)
}
if (yn) {
- if ( Pt_Start (1, __portmidi_callback, this) != ptNoError) {
+ // __portmidi_callback will be called once per 50 msec
+ if ( Pt_Start (50, __portmidi_callback, this) != ptNoError) {
std::cerr << "WavesMidiDeviceManager::stream (): Pt_Start () failed!" << std::endl;
return -1;
}
@@ -130,7 +131,7 @@ WavesMidiDeviceManager::stop ()
void
WavesMidiDeviceManager::__portmidi_callback (PtTimestamp timestamp, void * userData)
{
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiDeviceManager::__portmidi_callback ():" << std::endl;
+ // COMMENTED FREQUENT DBG LOGS */ std::cout << "WavesMidiDeviceManager::__portmidi_callback ():" << std::endl;
WavesMidiDeviceManager *dm = (WavesMidiDeviceManager *)userData;
if (dm == NULL) {
@@ -149,8 +150,10 @@ WavesMidiDeviceManager::_portmidi_callback (PtTimestamp timestamp)
if ((_input_device_count != midiInGetNumDevs ()) || (_output_device_count != midiOutGetNumDevs ())) {
_audiobackend._changed_midi_devices ();
- return;
- }
+ // COMMENTED DBG LOGS */ std::cout << "WavesMidiDeviceManager::_portmidi_callback ():" << std::endl;
+ // COMMENTED DBG LOGS */ std::cout << " _input_device_count ?= midiInGetNumDevs () :" << _input_device_count << " ?= " << midiInGetNumDevs () << std::endl;
+ // COMMENTED DBG LOGS */ std::cout << " _output_device_count ?= midiOutGetNumDevs () :" << _output_device_count << " ?= " << midiOutGetNumDevs () << std::endl;
+ }
}
void WavesMidiDeviceManager::do_read ()
@@ -178,6 +181,7 @@ WavesMidiDeviceManager::__get_time_ms (void *time_info)
WavesMidiDevice* WavesMidiDeviceManager::_get_device (const std::string& name)
{
+ // COMMENTED DBG LOGS */ std::cout << "WavesMidiDeviceManager::_get_device ():" << std::endl;
for (size_t i = 0; i < _devices.size (); i++) {
if (name == _devices[i]->name ()) {
return _devices[i];
@@ -190,12 +194,23 @@ WavesMidiDevice* WavesMidiDeviceManager::_get_device (const std::string& name)
int
WavesMidiDeviceManager::_create_devices ()
{
+ // COMMENTED DBG LOGS */ std::cout << "WavesMidiDeviceManager::_create_devices () :" << std::endl;
int count = Pm_CountDevices ();
for (int i = 0; i < count; i++) {
const PmDeviceInfo* pm_device_info = Pm_GetDeviceInfo (i);
-
+ // COMMENTED DBG LOGS */ std::cout << " interf : " << pm_device_info->interf << std::endl;
+ // COMMENTED DBG LOGS */ std::cout << " name : " << pm_device_info->name << std::endl;
+ // COMMENTED DBG LOGS */ std::cout << " input : " << pm_device_info->input << std::endl;
+ // COMMENTED DBG LOGS */ std::cout << " output : " << pm_device_info->output << std::endl;
+ // COMMENTED DBG LOGS */ std::cout << " opened : " << pm_device_info->opened << std::endl;
+#if defined (PLATFORM_WINDOWS)
+ if (strncmp (pm_device_info->name, "Microsoft", strlen ("Microsoft")) == 0) {
+ // COMMENTED DBG LOGS */ std::cout << " skipping anything from Microsoft :" << pm_device_info->name << std::endl;
+ continue;
+ }
+#endif
if (pm_device_info == NULL) {
std::cerr << "WavesMidiDeviceManager::_create_devices (): Pm_GetDeviceInfo (" << i << ") failed!" << std::endl;
continue;
diff --git a/libs/backends/wavesaudio/waves_midi_event.cc b/libs/backends/wavesaudio/waves_midi_event.cc
index 7960cb4..f75946c 100644
--- a/libs/backends/wavesaudio/waves_midi_event.cc
+++ b/libs/backends/wavesaudio/waves_midi_event.cc
@@ -16,10 +16,15 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+
+#include "pbd/debug.h"
+#include "pbd/compose.h"
+
#include "memory.h"
#include "waves_midi_event.h"
using namespace ARDOUR;
+using namespace PBD;
WavesMidiEvent::WavesMidiEvent (PmTimestamp timestamp)
: _size (0)
@@ -37,13 +42,27 @@ WavesMidiEvent::WavesMidiEvent (PmTimestamp timestamp, const uint8_t* data, size
, _data (data && datalen ? new uint8_t[ (datalen < sizeof (PmMessage)) ? sizeof (PmMessage) : datalen] : NULL)
, _state (data && datalen ? COMPLETE : BROKEN)
{
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiEvent::WavesMidiEvent (const WavesMidiEvent& source) : Size=" << _size << "---" << datalen << std::endl;
- if (_state == COMPLETE) {
- // COMMENTED DBG LOGS */ std::cout << "\t\t\t Allocated Size=" << ((datalen < sizeof (PmMessage)) ? sizeof (PmMessage) : datalen) << std::endl;
- memcpy (_data, data, datalen);
- }
-}
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ( "WavesMidiEvent::WavesMidiEvent (const WavesMidiEvent& source) : Size=%1---%2\n", _size, datalen));
+ if (_state == COMPLETE) {
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ( "\t\t\t Allocated Size=%1\n", ((datalen < sizeof (PmMessage)) ? sizeof (PmMessage) : datalen)));
+ memcpy (_data, data, datalen);
+
+#ifndef NDEBUG
+ if (DEBUG_ENABLED (DEBUG::WavesMIDI)) {
+ DEBUG_STR_DECL(a);
+ for (size_t i=0; i < datalen; ++i) {
+ DEBUG_STR_APPEND(a,std::hex);
+ DEBUG_STR_APPEND(a,"0x");
+ DEBUG_STR_APPEND(a,(int)data[i]);
+ DEBUG_STR_APPEND(a,' ');
+ }
+ DEBUG_STR_APPEND(a,'\n');
+ DEBUG_TRACE (DEBUG::WavesMIDI, DEBUG_STR(a).str());
+ }
+#endif
+ }
+}
WavesMidiEvent::WavesMidiEvent (const WavesMidiEvent& source)
: _size (source.size ())
@@ -51,11 +70,25 @@ WavesMidiEvent::WavesMidiEvent (const WavesMidiEvent& source)
, _data ((source.size () && source.const_data ()) ? new uint8_t[ (source.size () < sizeof (PmMessage)) ? sizeof (PmMessage) : source.size ()] : NULL)
, _state (source.state () )
{
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiEvent::WavesMidiEvent (const WavesMidiEvent& source) : Size=" << _size << "---" << source.size () << std::endl;
- // COMMENTED DBG LOGS */ std::cout << "\t\t\t Allocated Size=" << ((source.size () < sizeof (PmMessage)) ? sizeof (PmMessage) : source.size ()) << std::endl;
- if (_data && source.const_data ()) {
- memcpy (_data, source.const_data (), source.size ());
- }
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ( "WavesMidiEvent::WavesMidiEvent (const WavesMidiEvent& source) : Size=%1---%2\n", _size, source.size ()));
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ( "\t\t\t Allocated Size=%1\n", ((source.size () < sizeof (PmMessage)) ? sizeof (PmMessage) : source.size ())));
+ if (_data && source.const_data ()) {
+ memcpy (_data, source.const_data (), source.size ());
+
+#ifndef NDEBUG
+ if (DEBUG_ENABLED (DEBUG::WavesMIDI)) {
+ DEBUG_STR_DECL(a);
+ for (size_t i=0; i < source.size(); ++i) {
+ DEBUG_STR_APPEND(a,std::hex);
+ DEBUG_STR_APPEND(a,"0x");
+ DEBUG_STR_APPEND(a,(int)source.const_data()[i]);
+ DEBUG_STR_APPEND(a,' ');
+ }
+ DEBUG_STR_APPEND(a,'\n');
+ DEBUG_TRACE (DEBUG::WavesMIDI, DEBUG_STR(a).str());
+ }
+#endif
+ }
}
@@ -67,74 +100,78 @@ WavesMidiEvent::~WavesMidiEvent ()
WavesMidiEvent *WavesMidiEvent::append_data (const PmEvent &midi_event)
{
- switch ( _state ) {
+ switch ( _state ) {
case INCOMPLETE:
- break;
- default:
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiEvent::append_data (): NO case INCOMPLETE" << std::endl;
- _state = BROKEN;
- return NULL;
- }
-
- size_t message_size = _midi_message_size (midi_event.message);
- uint8_t message_status = Pm_MessageStatus (midi_event.message);
-
- if (_data == NULL) { // This is a first event to add
- bool sysex = (message_status == SYSEX);
- _data = new unsigned char [sysex ? PM_DEFAULT_SYSEX_BUFFER_SIZE : sizeof (PmMessage)];
- if (!sysex)
- {
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiEvent::append_data (): SHORT MSG" << std::endl;
- * (PmMessage*)_data = 0;
- switch (message_size) {
- case 1:
- case 3:
- _size = message_size;
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiEvent::append_data (): size = " << _size << std::endl;
break;
- default:
- // COMMENTED DBG LOGS */ std::cout << "WavesMidiEvent::append_data (): WRONG MESSAGE SIZE (" << message_size << ") in the message: ";
- // COMMENTED DBG LOGS */ std::cout << std::hex << (int) ((unsigned char*)&midi_event)[0] << " " << (int) ((unsigned char*)&midi_event)[1] << " " << (int) ((unsigned char*)&midi_event)[2] << " " << (int) ((unsigned char*)&midi_event)[3] << std::dec << std::endl;
- _state = BROKEN;
+ default:
+ DEBUG_TRACE (DEBUG::WavesMIDI, "WavesMidiEvent::append_data (): NO case INCOMPLETE\n");
+ _state = BROKEN;
return NULL;
- }
- // COMMENTED DBG LOGS */ std::cout << "\t size = " << _size << std::endl;
- memcpy (_data, &midi_event.message, _size);
- // COMMENTED DBG LOGS */ std::cout << "\t\t size = " << _size << std::endl;
- _state = COMPLETE;
- // COMMENTED DBG LOGS */ std::cout << "\t\t\t size = " << _size << std::endl;
- return NULL;
}
- }
-
- // Now let's parse to sysex msg
- if (message_status >= REAL_TIME_FIRST) { // Nested Real Time MIDI event
- WavesMidiEvent *waves_midi_message = new WavesMidiEvent (midi_event.timestamp);
- waves_midi_message->append_data (midi_event);
- return waves_midi_message;
- }
-
- if (message_status >= STATUS_FIRST && (message_status != EOX) && _size) { // Certainly it's a broken SYSEX case
- WavesMidiEvent *waves_midi_message = new WavesMidiEvent (midi_event.timestamp);
- waves_midi_message->append_data (midi_event);
- return waves_midi_message;
- }
+
+ size_t message_size = _midi_message_size (midi_event.message);
+ uint8_t message_status = Pm_MessageStatus (midi_event.message);
+
+ if (_data == NULL) { // This is a first event to add
+ bool sysex = (message_status == SYSEX);
+ _data = new unsigned char [sysex ? PM_DEFAULT_SYSEX_BUFFER_SIZE : sizeof (PmMessage)];
+ if (!sysex)
+ {
+ DEBUG_TRACE (DEBUG::WavesMIDI, "WavesMidiEvent::append_data (): SHORT MSG\n");
+ * (PmMessage*)_data = 0;
+ switch (message_size) {
+ case 1:
+ case 2:
+ case 3:
+ _size = message_size;
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ( "WavesMidiEvent::append_data (): size = %1\n", _size));
+ break;
+ default:
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ( "WavesMidiEvent::append_data (): WRONG MESSAGE SIZE (%1 not %2) %3 [%4 %5 %6 %7] %8\n",
+ message_size,
+ std::hex,
+ (int) ((unsigned char*)&midi_event)[0],
+ (int) ((unsigned char*)&midi_event)[1],
+ (int) ((unsigned char*)&midi_event)[2],
+ (int) ((unsigned char*)&midi_event)[3],
+ std::dec));
+ _state = BROKEN;
+ return NULL;
+ }
+ memcpy (_data, &midi_event.message, _size);
+ _state = COMPLETE;
+ DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ( "\t\t\t size = %1\n", _size));
+ return NULL;
+ }
+ }
+
+ // Now let's parse to sysex msg
+ if (message_status >= REAL_TIME_FIRST) { // Nested Real Time MIDI event
+ WavesMidiEvent *waves_midi_message = new WavesMidiEvent (midi_event.timestamp);
+ waves_midi_message->append_data (midi_event);
+ return waves_midi_message;
+ }
+
+ if (message_status >= STATUS_FIRST && (message_status != EOX) && _size) { // Certainly it's a broken SYSEX case
+ WavesMidiEvent *waves_midi_message = new WavesMidiEvent (midi_event.timestamp);
+ waves_midi_message->append_data (midi_event);
+ return waves_midi_message;
+ }
- const uint8_t* source_data ((uint8_t*)&midi_event.message);
-
- for (size_t i = 0; i < sizeof (midi_event.message); ++i) {
- _data[_size] = source_data[i];
- _size++;
+ const uint8_t* source_data ((uint8_t*)&midi_event.message);
- if (source_data[i] == EOX) { // Ended SYSEX message
- _state = COMPLETE;
- return NULL;
+ for (size_t i = 0; i < sizeof (midi_event.message); ++i) {
+ _data[_size] = source_data[i];
+ _size++;
+
+ if (source_data[i] == EOX) { // Ended SYSEX message
+ _state = COMPLETE;
+ return NULL;
+ }
}
- }
- return NULL;
+ return NULL;
}
-
size_t WavesMidiEvent::_midi_message_size (PmMessage midi_message)
{
static int high_lengths[] = {
diff --git a/libs/backends/wavesaudio/wavesapi/BasicTypes/WUDefines.h b/libs/backends/wavesaudio/wavesapi/BasicTypes/WUDefines.h
index 3bfb1d7..1279b33 100644
--- a/libs/backends/wavesaudio/wavesapi/BasicTypes/WUDefines.h
+++ b/libs/backends/wavesaudio/wavesapi/BasicTypes/WUDefines.h
@@ -63,7 +63,7 @@
#define WIN_ONLY(__Something_only_for_windows__)
#define MAC_ONLY(__Something_only_for_mac__) __Something_only_for_mac__
- #if defined(i386) || defined(__i386) || defined(__i386__) || defined (__ppc__)
+ #if defined(i386) || defined(__i386) || defined(__i386__)
#define kNumArchBits 32
#endif
#if defined(__x86_64) || defined(__x86_64__)
diff --git a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRAudioDeviceManager.cpp b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRAudioDeviceManager.cpp
index cddc218..138810f 100644
--- a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRAudioDeviceManager.cpp
+++ b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRAudioDeviceManager.cpp
@@ -339,6 +339,12 @@ bool WCMRAudioDevice::Streaming ()
//**********************************************************************************************
WTErr WCMRAudioDevice::SetStreaming (bool newState)
{
+ // We must notify angine about our intention to start streming
+ // so Engine will provide all the initializations in the first audio callback
+ if (newState) {
+ m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::DeviceStartsStreaming);
+ }
+
//This will most likely be overridden, the base class simply
//changes the member.
m_IsStreaming = newState;
@@ -355,10 +361,10 @@ WTErr WCMRAudioDevice::ResetDevice ()
WTErr err = SetStreaming(false);
if (err == eNoErr)
- SetActive(false);
+ err = SetActive(false);
if (err == eNoErr && wasActive)
- SetActive(true);
+ err = SetActive(true);
if (err == eNoErr && wasStreaming)
SetStreaming(true);
diff --git a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRAudioDeviceManager.h b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRAudioDeviceManager.h
index 99aba05..6821f25 100644
--- a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRAudioDeviceManager.h
+++ b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRAudioDeviceManager.h
@@ -57,9 +57,9 @@ struct DeviceInfo
DeviceID m_DeviceId;
std::string m_DeviceName;
std::vector<int> m_AvailableSampleRates;
+ std::vector<int> m_AvailableBufferSizes;
unsigned int m_MaxInputChannels;
unsigned int m_MaxOutputChannels;
- unsigned int m_DefaultBufferSize;
DeviceInfo():
m_DeviceId(-1), m_DeviceName("Unknown"), m_MaxInputChannels(0), m_MaxOutputChannels(0)
@@ -127,7 +127,7 @@ class WCMRAudioDeviceManagerClient
float *acdOutputBuffer;
size_t acdFrames;
int64_t acdSampleTime;
- int64_t acdCycleStartTimeNanos;
+ uint64_t acdCycleStartTimeNanos;
};
virtual void AudioDeviceManagerNotification (NotificationReason WCUNUSEDPARAM(reason), void *WCUNUSEDPARAM(pParam)) {}
@@ -199,7 +199,6 @@ protected:
std::vector<std::string> m_OutputChannels; ///< List of output channel names.
std::vector<int> m_SamplingRates; ///< List of available sampling rates.
std::vector<int> m_BufferSizes; ///< List of available buffer sizes.
- int m_DefaultBufferSize; ///soundcard preferred buffer size
int m_CurrentSamplingRate; ///< Currently selected sampling rate.
int m_CurrentBufferSize; ///< Currently selected buffer size.
diff --git a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRCoreAudioDeviceManager.cpp b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRCoreAudioDeviceManager.cpp
index 8cfa096..f7f05d7 100644
--- a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRCoreAudioDeviceManager.cpp
+++ b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRCoreAudioDeviceManager.cpp
@@ -39,7 +39,7 @@ static const int gAllBufferSizes[] =
///< The default SR.
static const int DEFAULT_SR = 44100;
///< The default buffer size.
-static const int DEFAULT_BUFFERSIZE = 128;
+static const int DEFAULT_BUFFERSIZE = 1024;
static const int NONE_DEVICE_ID = -1;
@@ -115,7 +115,6 @@ WCMRCoreAudioDevice::WCMRCoreAudioDevice (WCMRCoreAudioDeviceManager *pManager,
m_CurrentSamplingRate = DEFAULT_SR;
m_CurrentBufferSize = DEFAULT_BUFFERSIZE;
- m_DefaultBufferSize = DEFAULT_BUFFERSIZE;
m_StopRequested = true;
m_pInputData = NULL;
@@ -248,6 +247,9 @@ WTErr WCMRCoreAudioDevice::UpdateDeviceInfo ()
WTErr retVal = eNoErr;
+ // Some devices change the ID during restart
+ WTErr errId = UpdateDeviceId();
+
// Update all devices parts regardless of errors
WTErr errName = UpdateDeviceName();
WTErr errIn = UpdateDeviceInputs();
@@ -258,7 +260,7 @@ WTErr WCMRCoreAudioDevice::UpdateDeviceInfo ()
errSR = UpdateDeviceSampleRates();
errBS = UpdateDeviceBufferSizes();
- if(errName != eNoErr || errIn != eNoErr || errOut != eNoErr || errSR != eNoErr || errBS != eNoErr)
+ if(errId != eNoErr || errName != eNoErr || errIn != eNoErr || errOut != eNoErr || errSR != eNoErr || errBS != eNoErr)
{
retVal = eCoreAudioFailed;
}
@@ -266,6 +268,70 @@ WTErr WCMRCoreAudioDevice::UpdateDeviceInfo ()
return retVal;
}
+
+WTErr WCMRCoreAudioDevice::UpdateDeviceId()
+{
+ //Get device count...
+ UInt32 propSize = 0;
+ WTErr retVal = eNoErr;
+ OSStatus osErr = AudioHardwareGetPropertyInfo (kAudioHardwarePropertyDevices, &propSize, NULL);
+ ASSERT_ERROR(osErr, "AudioHardwareGetProperty 1");
+ if (WUIsError(osErr))
+ throw osErr;
+
+ size_t numDevices = propSize / sizeof (AudioDeviceID);
+ AudioDeviceID* deviceIDs = new AudioDeviceID[numDevices];
+
+ //retrieve the device IDs
+ propSize = numDevices * sizeof (AudioDeviceID);
+ osErr = AudioHardwareGetProperty (kAudioHardwarePropertyDevices, &propSize, deviceIDs);
+ ASSERT_ERROR(osErr, "Error while getting audio devices: AudioHardwareGetProperty 2");
+ if (WUIsError(osErr))
+ throw osErr;
+
+ //now add the ones that are not there...
+ for (size_t deviceIndex = 0; deviceIndex < numDevices; deviceIndex++)
+ {
+ DeviceInfo* pDevInfo = 0;
+
+ //Get device name and create new DeviceInfo entry
+ //Get property name size.
+ osErr = AudioDeviceGetPropertyInfo(deviceIDs[deviceIndex], 0, 0, kAudioDevicePropertyDeviceName, &propSize, NULL);
+ if (osErr == kAudioHardwareNoError)
+ {
+ //Get property: name.
+ char* deviceName = new char[propSize];
+ osErr = AudioDeviceGetProperty(deviceIDs[deviceIndex], 0, 0, kAudioDevicePropertyDeviceName, &propSize, deviceName);
+ if (osErr == kAudioHardwareNoError)
+ {
+ if ( (m_DeviceName == deviceName) &&
+ (m_DeviceID != deviceIDs[deviceIndex]) ) {
+
+ m_DeviceID = deviceIDs[deviceIndex];
+
+ m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::DeviceDebugInfo, (void *)"Current device has changed it's id.");
+ }
+ }
+ else
+ {
+ retVal = eCoreAudioFailed;
+ DEBUG_MSG("Failed to get device name. Device ID: " << m_DeviceID);
+ }
+
+ delete [] deviceName;
+ }
+ else
+ {
+ retVal = eCoreAudioFailed;
+ DEBUG_MSG("Failed to get device name prop Info. Device ID: " << m_DeviceID);
+ }
+ }
+
+ delete [] deviceIDs;
+ return retVal;
+}
+
+
//**********************************************************************************************
// WCMRCoreAudioDevice::UpdateDeviceName
//
@@ -881,8 +947,6 @@ WTErr WCMRCoreAudioDevice::SetAndCheckCurrentSamplingRate (int newRate)
propSize = sizeof (Float64);
err = AudioDeviceSetProperty(m_DeviceID, NULL, 0, 0, kAudioDevicePropertyNominalSampleRate, propSize, &newNominalRate);
- m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::DeviceDebugInfo, (void *)"Changed the Sampling Rate.");
-
if (err != kAudioHardwareNoError)
{
retVal = eCoreAudioFailed;
@@ -926,6 +990,8 @@ WTErr WCMRCoreAudioDevice::SetAndCheckCurrentSamplingRate (int newRate)
// If sample rate actually changed
if (tryAgain != 0)
{
+ m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::DeviceDebugInfo, (void *)"Changed the Sampling Rate.");
+
// Update member with new rate
m_CurrentSamplingRate = newRate;
@@ -936,12 +1002,28 @@ WTErr WCMRCoreAudioDevice::SetAndCheckCurrentSamplingRate (int newRate)
// If sample rate did not change after time out
else
{
- // Update member with last read value
- m_CurrentSamplingRate = static_cast<int>(actualSamplingRate);
+ // Check if current device sample rate is supported
+ bool found = false;
+ for(int i = 0; gAllSampleRates[i] > 0; i++)
+ {
+ if (fabs(gAllSampleRates[i] - actualSamplingRate) < 0.01) {
+ found = true;
+ }
+ }
- char debugMsg[128];
- snprintf (debugMsg, sizeof(debugMsg), "Unable to change SR, even after waiting for %d milliseconds", actualWait * PROPERTY_CHANGE_SLEEP_TIME_MILLISECONDS);
- m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::DeviceDebugInfo, (void *)debugMsg);
+ if (found) {
+ // Update member with last read value
+ m_CurrentSamplingRate = static_cast<int>(actualSamplingRate);
+
+ char debugMsg[128];
+ snprintf (debugMsg, sizeof(debugMsg), "Unable to change SR, even after waiting for %d milliseconds", actualWait * PROPERTY_CHANGE_SLEEP_TIME_MILLISECONDS);
+ m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::DeviceDebugInfo, (void *)debugMsg);
+
+ float sample_rate_update = actualSamplingRate;
+ m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::SamplingRateChanged, (void *)&sample_rate_update);
+ } else {
+ retVal = eGenericErr;
+ }
}
}
@@ -1731,7 +1813,6 @@ WTErr WCMRCoreAudioDevice::TearDownAUHAL()
}
-
//**********************************************************************************************
// WCMRCoreAudioDevice::SetActive
//
@@ -1799,7 +1880,6 @@ WTErr WCMRCoreAudioDevice::SetActive (bool newState)
m_IgnoreThisDrop = true;
UpdateDeviceInfo();
-
}
m_IsActive = newState;
@@ -1909,6 +1989,9 @@ WTErr WCMRCoreAudioDevice::SetStreaming (bool newState)
m_IOProcThreadPort = 0;
m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::DeviceDebugInfo, (void *)"Starting AUHAL.");
+ // Prepare for streaming - tell Engine to do the initialization for process callback
+ m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::DeviceStartsStreaming);
+
if (m_UseMultithreading)
{
//set thread constraints...
@@ -1924,6 +2007,7 @@ WTErr WCMRCoreAudioDevice::SetStreaming (bool newState)
if(err)
{
DEBUG_MSG( "Failed to start AudioUnit, err " << err );
+ m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::DeviceDebugInfo, (void *)"Failed to start AudioUnit.");
retVal = eGenericErr;
goto Exit;
}
@@ -2554,7 +2638,7 @@ WTErr WCMRCoreAudioDeviceManager::getDeviceAvailableSampleRates(DeviceID deviceI
return retVal;
}
-
+
WTErr WCMRCoreAudioDeviceManager::getDeviceMaxInputChannels(DeviceID deviceId, unsigned int& inputChannels)
{
@@ -2862,7 +2946,6 @@ WTErr WCMRCoreAudioDeviceManager::updateDeviceListImpl()
if (eNoErr != err)
{
std::cout << "API::PortAudioDeviceManager::updateDeviceListImpl: Device list update error: "<< err << std::endl;
- return err;
}
if (m_CurrentDevice)
@@ -2876,6 +2959,15 @@ WTErr WCMRCoreAudioDeviceManager::updateDeviceListImpl()
NotifyClient (WCMRAudioDeviceManagerClient::IODeviceDisconnected);
return err;
}
+
+ WCMRCoreAudioDevice* current_device = dynamic_cast<WCMRCoreAudioDevice*>(m_CurrentDevice);
+
+ if ( current_device &&
+ (current_device->DeviceID() != devInfo.m_DeviceId ) )
+ {
+ NotifyClient (WCMRAudioDeviceManagerClient::RequestReset);
+ return err;
+ }
}
NotifyClient (WCMRAudioDeviceManagerClient::DeviceListChanged);
diff --git a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRCoreAudioDeviceManager.h b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRCoreAudioDeviceManager.h
index a3269f6..8bbd7d8 100644
--- a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRCoreAudioDeviceManager.h
+++ b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRCoreAudioDeviceManager.h
@@ -138,6 +138,7 @@ protected:
#endif //WV_USE_TONE_GEN
WTErr UpdateDeviceInfo ();
+ WTErr UpdateDeviceId ();
WTErr UpdateDeviceName();
WTErr UpdateDeviceInputs();
WTErr UpdateDeviceOutputs();
@@ -167,8 +168,7 @@ protected:
static OSStatus StaticPropertyChangeProc (AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput,
AudioDevicePropertyID inPropertyID, void *inClientData);
void PropertyChangeProc (AudioDevicePropertyID inPropertyID);
-
- void resetAudioDevice();
+
private:
};
diff --git a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRNativeAudio.cpp b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRNativeAudio.cpp
index 7bea0b3..2e0490b 100644
--- a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRNativeAudio.cpp
+++ b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRNativeAudio.cpp
@@ -35,6 +35,9 @@
//**********************************************************************************************
WCMRNativeAudioNoneDevice::WCMRNativeAudioNoneDevice (WCMRAudioDeviceManager *pManager)
: WCMRNativeAudioDevice (pManager, false /*useMultiThreading*/)
+#ifndef PTW32_VERSION
+ , m_SilenceThread(0)
+#endif
#if defined (PLATFORM_WINDOWS)
, _waitableTimerForUsleep (CreateWaitableTimer(NULL, TRUE, NULL))
#endif
@@ -64,7 +67,6 @@ WCMRNativeAudioNoneDevice::WCMRNativeAudioNoneDevice (WCMRAudioDeviceManager *pM
}
_m_inputBuffer = new float[__m_NumInputChannels * m_BufferSizes.back()];
_m_outputBuffer = new float[__m_NumOutputChannels * m_BufferSizes.back()];
- m_DefaultBufferSize = m_BufferSizes.back();
m_CurrentBufferSize = m_BufferSizes.back();
}
diff --git a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRPortAudioDeviceManager.cpp b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRPortAudioDeviceManager.cpp
index 7816fcb..35ac18c 100644
--- a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRPortAudioDeviceManager.cpp
+++ b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRPortAudioDeviceManager.cpp
@@ -118,7 +118,6 @@ WCMRPortAudioDevice::WCMRPortAudioDevice (WCMRPortAudioDeviceManager *pManager,
m_PortAudioStream = NULL;
m_CurrentSamplingRate = DEFAULT_SR;
m_CurrentBufferSize = DEFAULT_BUFFERSIZE;
- m_DefaultBufferSize = DEFAULT_BUFFERSIZE;
m_StopRequested = true;
m_pInputData = NULL;
@@ -362,7 +361,6 @@ void WCMRPortAudioDevice::updateDeviceInfo (bool callerIsWaiting/*=false*/)
{
std::cout << "API::Device " << m_DeviceName << " Buffers: " << minSize << " " << maxSize << " " << preferredSize << std::endl;
- m_DefaultBufferSize = preferredSize;
m_BufferSizes.push_back (preferredSize);
useDefaultBuffers = false;
}
@@ -901,6 +899,9 @@ void WCMRPortAudioDevice::startStreaming (bool callerIsWaiting/*=false*/)
unsigned int inChannelCount = pDeviceInfo->maxInputChannels;
unsigned int outChannelCount = pDeviceInfo->maxOutputChannels;
+ // Prepare for streaming - tell Engine to do the initialization for process callback
+ m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::DeviceStartsStreaming);
+
paErr = Pa_StartStream( m_PortAudioStream );
if(paErr == paNoError)
@@ -1043,8 +1044,7 @@ void WCMRPortAudioDevice::resetDevice (bool callerIsWaiting /*=false*/ )
// Resume streaming if the device was streaming before
if(wasStreaming && m_lastErr == eNoErr && m_ConnectionStatus == DeviceAvailable)
{
- // Notify the Application to prepare for the stream start
- m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::DeviceStartsStreaming);
+ // start streaming
startStreaming();
}
} else {
@@ -1076,24 +1076,29 @@ long WCMRPortAudioDevice::ASIOMessageHook (long selector, long WCUNUSEDPARAM(val
case kAsioResyncRequest:
m_ResyncRequested++;
std::cout << "\t\t\tWCMRPortAudioDevice::ASIOMessageHook -- kAsioResyncRequest" << std::endl;
- m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::RequestReset);
break;
case kAsioLatenciesChanged:
m_BufferSizeChangeRequested++;
std::cout << "\t\t\tWCMRPortAudioDevice::ASIOMessageHook -- kAsioLatenciesChanged" << std::endl;
- m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::RequestReset);
+ if (m_ResetRequested == 0) {
+ m_ResetRequested++;
+ m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::RequestReset);
+ }
break;
case kAsioBufferSizeChange:
m_BufferSizeChangeRequested++;
std::cout << "\t\t\tWCMRPortAudioDevice::ASIOMessageHook -- m_BufferSizeChangeRequested" << std::endl;
- m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::RequestReset);
+ if (m_ResetRequested == 0) {
+ m_ResetRequested++;
+ m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::RequestReset);
+ }
break;
case kAsioResetRequest:
- m_ResetRequested++;
std::cout << "\t\t\tWCMRPortAudioDevice::ASIOMessageHook -- kAsioResetRequest" << std::endl;
+ m_ResetRequested++;
m_pMyManager->NotifyClient (WCMRAudioDeviceManagerClient::RequestReset);
break;
@@ -1540,6 +1545,32 @@ WTErr WCMRPortAudioDeviceManager::getDeviceAvailableSampleRates(DeviceID deviceI
}
+WTErr WCMRPortAudioDeviceManager::getDeviceAvailableBufferSizes(DeviceID deviceId, std::vector<int>& buffers)
+{
+ WTErr retVal = eNoErr;
+
+ buffers.clear();
+
+ //make PA request to get actual device buffer sizes
+ long minSize, maxSize, preferredSize, granularity;
+
+ PaError paErr = PaAsio_GetAvailableBufferSizes(deviceId, &minSize, &maxSize, &preferredSize, &granularity);
+
+ //for Windows ASIO devices we always use prefferes buffer size ONLY
+ if (paNoError == paErr )
+ {
+ buffers.push_back(preferredSize);
+ }
+ else
+ {
+ retVal = eAsioFailed;
+ std::cout << "API::PortAudioDeviceManager::GetBufferSizes: error: " << Pa_GetErrorText (paErr) << " getting buffer sizes for device: "<< deviceId << std::endl;
+ }
+
+ return retVal;
+}
+
+
WTErr WCMRPortAudioDeviceManager::generateDeviceListImpl()
{
std::cout << "API::PortAudioDeviceManager::Generating device list" << std::endl;
@@ -1586,6 +1617,7 @@ WTErr WCMRPortAudioDeviceManager::generateDeviceListImpl()
DeviceInfo *pDevInfo = new DeviceInfo(thisDeviceID, pPaDeviceInfo->name);
if (pDevInfo)
{
+ //Get available sample rates
std::vector<int> availableSampleRates;
WTErr wErr = WCMRPortAudioDeviceManager::getDeviceAvailableSampleRates(thisDeviceID, availableSampleRates);
@@ -1600,6 +1632,19 @@ WTErr WCMRPortAudioDeviceManager::generateDeviceListImpl()
pDevInfo->m_MaxInputChannels = pPaDeviceInfo->maxInputChannels;
pDevInfo->m_MaxOutputChannels = pPaDeviceInfo->maxOutputChannels;
+ //Get available buffer sizes
+ std::vector<int> availableBuffers;
+ wErr = getDeviceAvailableBufferSizes(thisDeviceID, availableBuffers);
+
+ if (wErr != eNoErr)
+ {
+ DEBUG_MSG ("Failed to get device available buffer sizes. Device ID: " << m_DeviceID);
+ delete pDevInfo;
+ continue; //proceed to the next device
+ }
+
+ pDevInfo->m_AvailableBufferSizes = availableBuffers;
+
//Now check if this device is acceptable according to current input/output settings
bool bRejectDevice = false;
switch(m_eAudioDeviceFilter)
@@ -1681,7 +1726,7 @@ WTErr WCMRPortAudioDeviceManager::getDeviceSampleRatesImpl(const std::string & d
if (m_CurrentDevice && deviceName == m_CurrentDevice->DeviceName() )
{
- sampleRates.assign(m_CurrentDevice->SamplingRates().begin(), m_CurrentDevice->SamplingRates().end() );
+ sampleRates=m_CurrentDevice->SamplingRates();
return retVal;
}
@@ -1690,7 +1735,7 @@ WTErr WCMRPortAudioDeviceManager::getDeviceSampleRatesImpl(const std::string & d
if (eNoErr == retVal)
{
- sampleRates.assign(devInfo.m_AvailableSampleRates.begin(), devInfo.m_AvailableSampleRates.end() );
+ sampleRates=devInfo.m_AvailableSampleRates;
}
else
{
@@ -1710,44 +1755,28 @@ WTErr WCMRPortAudioDeviceManager::getDeviceBufferSizesImpl(const std::string & d
//first check if the request has been made for None device
if (deviceName == m_NoneDevice->DeviceName() )
{
- buffers.assign(m_NoneDevice->BufferSizes().begin(), m_NoneDevice->BufferSizes().end() );
+ buffers=m_NoneDevice->BufferSizes();
return retVal;
}
if (m_CurrentDevice && deviceName == m_CurrentDevice->DeviceName() )
{
- buffers.assign(m_CurrentDevice->BufferSizes().begin(), m_CurrentDevice->BufferSizes().end() );
+ buffers=m_CurrentDevice->BufferSizes();
return retVal;
}
- Pa_Initialize();
-
DeviceInfo devInfo;
retVal = GetDeviceInfoByName(deviceName, devInfo);
if (eNoErr == retVal)
{
- //make PA request to get actual device buffer sizes
- long minSize, maxSize, preferredSize, granularity;
- PaError paErr = PaAsio_GetAvailableBufferSizes(devInfo.m_DeviceId, &minSize, &maxSize, &preferredSize, &granularity);
-
- //for Windows ASIO devices we always use prefferes buffer size ONLY
- if (paNoError == paErr )
- {
- buffers.push_back(preferredSize);
- }
- else
- {
- retVal = eAsioFailed;
- std::cout << "API::PortAudioDeviceManager::GetBufferSizes: error: " << Pa_GetErrorText (paErr) << " getting buffer sizes for device: "<< deviceName << std::endl;
- }
+ std::cout << "API::PortAudioDeviceManager::GetBufferSizes: got buffer :"<< devInfo.m_AvailableBufferSizes.front() << std::endl;
+ buffers = devInfo.m_AvailableBufferSizes;
}
else
{
std::cout << "API::PortAudioDeviceManager::GetBufferSizes: Device not found: "<< deviceName << std::endl;
}
- Pa_Terminate();
-
return retVal;
}
diff --git a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRPortAudioDeviceManager.h b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRPortAudioDeviceManager.h
index 8f099ec..da20274 100644
--- a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRPortAudioDeviceManager.h
+++ b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRPortAudioDeviceManager.h
@@ -172,6 +172,7 @@ protected:
private:
// helper functions for this class only
WTErr getDeviceAvailableSampleRates(DeviceID deviceId, std::vector<int>& sampleRates);
+ WTErr getDeviceAvailableBufferSizes(DeviceID deviceId, std::vector<int>& buffers);
WCMRAudioDevice* m_NoneDevice;
};
diff --git a/libs/backends/wavesaudio/wscript b/libs/backends/wavesaudio/wscript
index 1303791..89fe65b 100644
--- a/libs/backends/wavesaudio/wscript
+++ b/libs/backends/wavesaudio/wscript
@@ -88,10 +88,10 @@ def build(bld):
obj.use = 'libardour libpbd'
if bld.env['build_target'] == 'mingw':
obj.uselib = ['PORTAUDIO']
- obj.cxxflags = [ '-fPIC' ]
- obj.cflags = [ '-fPIC', '-fms-extensions' ]
+ obj.cxxflags = [ bld.env['compiler_flags_dict']['pic'] ]
+ obj.cflags = [ bld.env['compiler_flags_dict']['pic'], bld.env['compiler_flags_dict']['c-anonymous-union'] ]
else:
- obj.cflags = ['-fms-extensions' ]
+ obj.cflags = [ bld.env['compiler_flags_dict']['c-anonymous-union'] ]
obj.install_path = os.path.join(bld.env['LIBDIR'], 'backends')
if bld.env['build_target']== 'mingw':
diff --git a/libs/canvas/macosx/canvas/canvas.xcodeproj/project.pbxproj b/libs/canvas/macosx/canvas/canvas.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..868d680
--- /dev/null
+++ b/libs/canvas/macosx/canvas/canvas.xcodeproj/project.pbxproj
@@ -0,0 +1,224 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXFileReference section */
+ 4397596719CADB4300740098 /* arc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = arc.h; path = ../../canvas/arc.h; sourceTree = "<group>"; };
+ 4397596819CADB4300740098 /* arrow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = arrow.h; path = ../../canvas/arrow.h; sourceTree = "<group>"; };
+ 4397596919CADB4300740098 /* canvas.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = canvas.h; path = ../../canvas/canvas.h; sourceTree = "<group>"; };
+ 4397596A19CADB4300740098 /* circle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = circle.h; path = ../../canvas/circle.h; sourceTree = "<group>"; };
+ 4397596B19CADB4300740098 /* container.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = container.h; path = ../../canvas/container.h; sourceTree = "<group>"; };
+ 4397596C19CADB4300740098 /* curve.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = curve.h; path = ../../canvas/curve.h; sourceTree = "<group>"; };
+ 4397596D19CADB4300740098 /* debug.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = debug.h; path = ../../canvas/debug.h; sourceTree = "<group>"; };
+ 4397596E19CADB4300740098 /* fill.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fill.h; path = ../../canvas/fill.h; sourceTree = "<group>"; };
+ 4397596F19CADB4300740098 /* flag.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = flag.h; path = ../../canvas/flag.h; sourceTree = "<group>"; };
+ 4397597019CADB4300740098 /* fwd.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fwd.h; path = ../../canvas/fwd.h; sourceTree = "<group>"; };
+ 4397597119CADB4300740098 /* image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = image.h; path = ../../canvas/image.h; sourceTree = "<group>"; };
+ 4397597219CADB4300740098 /* interpolated_curve.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = interpolated_curve.h; path = ../../canvas/interpolated_curve.h; sourceTree = "<group>"; };
+ 4397597319CADB4300740098 /* item.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = item.h; path = ../../canvas/item.h; sourceTree = "<group>"; };
+ 4397597419CADB4300740098 /* line_set.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = line_set.h; path = ../../canvas/line_set.h; sourceTree = "<group>"; };
+ 4397597519CADB4300740098 /* line.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = line.h; path = ../../canvas/line.h; sourceTree = "<group>"; };
+ 4397597619CADB4300740098 /* lookup_table.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lookup_table.h; path = ../../canvas/lookup_table.h; sourceTree = "<group>"; };
+ 4397597719CADB4300740098 /* outline.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = outline.h; path = ../../canvas/outline.h; sourceTree = "<group>"; };
+ 4397597819CADB4300740098 /* pixbuf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pixbuf.h; path = ../../canvas/pixbuf.h; sourceTree = "<group>"; };
+ 4397597919CADB4300740098 /* poly_item.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = poly_item.h; path = ../../canvas/poly_item.h; sourceTree = "<group>"; };
+ 4397597A19CADB4300740098 /* poly_line.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = poly_line.h; path = ../../canvas/poly_line.h; sourceTree = "<group>"; };
+ 4397597B19CADB4300740098 /* polygon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = polygon.h; path = ../../canvas/polygon.h; sourceTree = "<group>"; };
+ 4397597C19CADB4300740098 /* rectangle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = rectangle.h; path = ../../canvas/rectangle.h; sourceTree = "<group>"; };
+ 4397597D19CADB4300740098 /* root_group.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = root_group.h; path = ../../canvas/root_group.h; sourceTree = "<group>"; };
+ 4397597E19CADB4300740098 /* ruler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ruler.h; path = ../../canvas/ruler.h; sourceTree = "<group>"; };
+ 4397597F19CADB4300740098 /* scroll_group.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = scroll_group.h; path = ../../canvas/scroll_group.h; sourceTree = "<group>"; };
+ 4397598019CADB4300740098 /* stateful_image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = stateful_image.h; path = ../../canvas/stateful_image.h; sourceTree = "<group>"; };
+ 4397598119CADB4300740098 /* text.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = text.h; path = ../../canvas/text.h; sourceTree = "<group>"; };
+ 4397598219CADB4300740098 /* tracking_text.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = tracking_text.h; path = ../../canvas/tracking_text.h; sourceTree = "<group>"; };
+ 4397598319CADB4300740098 /* types.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../../canvas/types.h; sourceTree = "<group>"; };
+ 4397598419CADB4300740098 /* utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../canvas/utils.h; sourceTree = "<group>"; };
+ 4397598519CADB4300740098 /* version.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = version.h; path = ../../canvas/version.h; sourceTree = "<group>"; };
+ 4397598619CADB4300740098 /* visibility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = visibility.h; path = ../../canvas/visibility.h; sourceTree = "<group>"; };
+ 4397598719CADB4300740098 /* wave_view.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = wave_view.h; path = ../../canvas/wave_view.h; sourceTree = "<group>"; };
+ 4397598819CADB4300740098 /* widget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = widget.h; path = ../../canvas/widget.h; sourceTree = "<group>"; };
+ 4397598919CADB4300740098 /* xfade_curve.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = xfade_curve.h; path = ../../canvas/xfade_curve.h; sourceTree = "<group>"; };
+ 4397598A19CADB4300740098 /* xml_ui.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = xml_ui.h; path = ../../canvas/xml_ui.h; sourceTree = "<group>"; };
+ 43A0170F19D56040007D3CE8 /* arc.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = arc.cc; path = ../../arc.cc; sourceTree = "<group>"; };
+ 43A0171019D56040007D3CE8 /* arrow.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = arrow.cc; path = ../../arrow.cc; sourceTree = "<group>"; };
+ 43A0171119D56040007D3CE8 /* canvas.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = canvas.cc; path = ../../canvas.cc; sourceTree = "<group>"; };
+ 43A0171219D56040007D3CE8 /* circle.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = circle.cc; path = ../../circle.cc; sourceTree = "<group>"; };
+ 43A0171319D56040007D3CE8 /* container.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = container.cc; path = ../../container.cc; sourceTree = "<group>"; };
+ 43A0171419D56040007D3CE8 /* curve.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = curve.cc; path = ../../curve.cc; sourceTree = "<group>"; };
+ 43A0171519D56040007D3CE8 /* debug.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = debug.cc; path = ../../debug.cc; sourceTree = "<group>"; };
+ 43A0171619D56040007D3CE8 /* fill.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = fill.cc; path = ../../fill.cc; sourceTree = "<group>"; };
+ 43A0171719D56040007D3CE8 /* flag.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = flag.cc; path = ../../flag.cc; sourceTree = "<group>"; };
+ 43A0171819D56040007D3CE8 /* image.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = image.cc; path = ../../image.cc; sourceTree = "<group>"; };
+ 43A0171919D56040007D3CE8 /* item.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = item.cc; path = ../../item.cc; sourceTree = "<group>"; };
+ 43A0171A19D56040007D3CE8 /* line_set.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = line_set.cc; path = ../../line_set.cc; sourceTree = "<group>"; };
+ 43A0171B19D56040007D3CE8 /* line.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = line.cc; path = ../../line.cc; sourceTree = "<group>"; };
+ 43A0171C19D56040007D3CE8 /* lookup_table.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = lookup_table.cc; path = ../../lookup_table.cc; sourceTree = "<group>"; };
+ 43A0171D19D56040007D3CE8 /* outline.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = outline.cc; path = ../../outline.cc; sourceTree = "<group>"; };
+ 43A0171E19D56040007D3CE8 /* pixbuf.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = pixbuf.cc; path = ../../pixbuf.cc; sourceTree = "<group>"; };
+ 43A0171F19D56040007D3CE8 /* poly_item.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = poly_item.cc; path = ../../poly_item.cc; sourceTree = "<group>"; };
+ 43A0172019D56040007D3CE8 /* poly_line.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = poly_line.cc; path = ../../poly_line.cc; sourceTree = "<group>"; };
+ 43A0172119D56040007D3CE8 /* polygon.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = polygon.cc; path = ../../polygon.cc; sourceTree = "<group>"; };
+ 43A0172219D56040007D3CE8 /* rectangle.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = rectangle.cc; path = ../../rectangle.cc; sourceTree = "<group>"; };
+ 43A0172319D56040007D3CE8 /* root_group.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = root_group.cc; path = ../../root_group.cc; sourceTree = "<group>"; };
+ 43A0172419D56040007D3CE8 /* ruler.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ruler.cc; path = ../../ruler.cc; sourceTree = "<group>"; };
+ 43A0172519D56040007D3CE8 /* scroll_group.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = scroll_group.cc; path = ../../scroll_group.cc; sourceTree = "<group>"; };
+ 43A0172619D56040007D3CE8 /* stateful_image.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = stateful_image.cc; path = ../../stateful_image.cc; sourceTree = "<group>"; };
+ 43A0172719D56040007D3CE8 /* text.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = text.cc; path = ../../text.cc; sourceTree = "<group>"; };
+ 43A0172819D56040007D3CE8 /* tracking_text.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = tracking_text.cc; path = ../../tracking_text.cc; sourceTree = "<group>"; };
+ 43A0172919D56040007D3CE8 /* types.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = types.cc; path = ../../types.cc; sourceTree = "<group>"; };
+ 43A0172A19D56040007D3CE8 /* utils.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = utils.cc; path = ../../utils.cc; sourceTree = "<group>"; };
+ 43A0172B19D56040007D3CE8 /* version.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = version.cc; path = ../../version.cc; sourceTree = "<group>"; };
+ 43A0172C19D56040007D3CE8 /* wave_view.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = wave_view.cc; path = ../../wave_view.cc; sourceTree = "<group>"; };
+ 43A0172D19D56040007D3CE8 /* widget.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = widget.cc; path = ../../widget.cc; sourceTree = "<group>"; };
+ 43A0172E19D56040007D3CE8 /* xfade_curve.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = xfade_curve.cc; path = ../../xfade_curve.cc; sourceTree = "<group>"; };
+ 43A0172F19D56040007D3CE8 /* xml_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = xml_ui.cc; path = ../../xml_ui.cc; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXGroup section */
+ 4397594919CADAFC00740098 = {
+ isa = PBXGroup;
+ children = (
+ 4397595719CADB1200740098 /* headers */,
+ 4397595619CADB0600740098 /* source */,
+ );
+ sourceTree = "<group>";
+ };
+ 4397595619CADB0600740098 /* source */ = {
+ isa = PBXGroup;
+ children = (
+ 43A0170F19D56040007D3CE8 /* arc.cc */,
+ 43A0171019D56040007D3CE8 /* arrow.cc */,
+ 43A0171119D56040007D3CE8 /* canvas.cc */,
+ 43A0171219D56040007D3CE8 /* circle.cc */,
+ 43A0171319D56040007D3CE8 /* container.cc */,
+ 43A0171419D56040007D3CE8 /* curve.cc */,
+ 43A0171519D56040007D3CE8 /* debug.cc */,
+ 43A0171619D56040007D3CE8 /* fill.cc */,
+ 43A0171719D56040007D3CE8 /* flag.cc */,
+ 43A0171819D56040007D3CE8 /* image.cc */,
+ 43A0171919D56040007D3CE8 /* item.cc */,
+ 43A0171A19D56040007D3CE8 /* line_set.cc */,
+ 43A0171B19D56040007D3CE8 /* line.cc */,
+ 43A0171C19D56040007D3CE8 /* lookup_table.cc */,
+ 43A0171D19D56040007D3CE8 /* outline.cc */,
+ 43A0171E19D56040007D3CE8 /* pixbuf.cc */,
+ 43A0171F19D56040007D3CE8 /* poly_item.cc */,
+ 43A0172019D56040007D3CE8 /* poly_line.cc */,
+ 43A0172119D56040007D3CE8 /* polygon.cc */,
+ 43A0172219D56040007D3CE8 /* rectangle.cc */,
+ 43A0172319D56040007D3CE8 /* root_group.cc */,
+ 43A0172419D56040007D3CE8 /* ruler.cc */,
+ 43A0172519D56040007D3CE8 /* scroll_group.cc */,
+ 43A0172619D56040007D3CE8 /* stateful_image.cc */,
+ 43A0172719D56040007D3CE8 /* text.cc */,
+ 43A0172819D56040007D3CE8 /* tracking_text.cc */,
+ 43A0172919D56040007D3CE8 /* types.cc */,
+ 43A0172A19D56040007D3CE8 /* utils.cc */,
+ 43A0172B19D56040007D3CE8 /* version.cc */,
+ 43A0172C19D56040007D3CE8 /* wave_view.cc */,
+ 43A0172D19D56040007D3CE8 /* widget.cc */,
+ 43A0172E19D56040007D3CE8 /* xfade_curve.cc */,
+ 43A0172F19D56040007D3CE8 /* xml_ui.cc */,
+ );
+ name = source;
+ sourceTree = "<group>";
+ };
+ 4397595719CADB1200740098 /* headers */ = {
+ isa = PBXGroup;
+ children = (
+ 4397596719CADB4300740098 /* arc.h */,
+ 4397596819CADB4300740098 /* arrow.h */,
+ 4397596919CADB4300740098 /* canvas.h */,
+ 4397596A19CADB4300740098 /* circle.h */,
+ 4397596B19CADB4300740098 /* container.h */,
+ 4397596C19CADB4300740098 /* curve.h */,
+ 4397596D19CADB4300740098 /* debug.h */,
+ 4397596E19CADB4300740098 /* fill.h */,
+ 4397596F19CADB4300740098 /* flag.h */,
+ 4397597019CADB4300740098 /* fwd.h */,
+ 4397597119CADB4300740098 /* image.h */,
+ 4397597219CADB4300740098 /* interpolated_curve.h */,
+ 4397597319CADB4300740098 /* item.h */,
+ 4397597419CADB4300740098 /* line_set.h */,
+ 4397597519CADB4300740098 /* line.h */,
+ 4397597619CADB4300740098 /* lookup_table.h */,
+ 4397597719CADB4300740098 /* outline.h */,
+ 4397597819CADB4300740098 /* pixbuf.h */,
+ 4397597919CADB4300740098 /* poly_item.h */,
+ 4397597A19CADB4300740098 /* poly_line.h */,
+ 4397597B19CADB4300740098 /* polygon.h */,
+ 4397597C19CADB4300740098 /* rectangle.h */,
+ 4397597D19CADB4300740098 /* root_group.h */,
+ 4397597E19CADB4300740098 /* ruler.h */,
+ 4397597F19CADB4300740098 /* scroll_group.h */,
+ 4397598019CADB4300740098 /* stateful_image.h */,
+ 4397598119CADB4300740098 /* text.h */,
+ 4397598219CADB4300740098 /* tracking_text.h */,
+ 4397598319CADB4300740098 /* types.h */,
+ 4397598419CADB4300740098 /* utils.h */,
+ 4397598519CADB4300740098 /* version.h */,
+ 4397598619CADB4300740098 /* visibility.h */,
+ 4397598719CADB4300740098 /* wave_view.h */,
+ 4397598819CADB4300740098 /* widget.h */,
+ 4397598919CADB4300740098 /* xfade_curve.h */,
+ 4397598A19CADB4300740098 /* xml_ui.h */,
+ );
+ name = headers;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXProject section */
+ 4397594A19CADAFC00740098 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0510;
+ };
+ buildConfigurationList = 4397594D19CADAFC00740098 /* Build configuration list for PBXProject "canvas" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 4397594919CADAFC00740098;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ );
+ };
+/* End PBXProject section */
+
+/* Begin XCBuildConfiguration section */
+ 4397594E19CADAFC00740098 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ 4397594F19CADAFC00740098 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 4397594D19CADAFC00740098 /* Build configuration list for PBXProject "canvas" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 4397594E19CADAFC00740098 /* Debug */,
+ 4397594F19CADAFC00740098 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 4397594A19CADAFC00740098 /* Project object */;
+}
diff --git a/libs/canvas/stateful_image.cc b/libs/canvas/stateful_image.cc
index b62da9c..f5cc76d 100644
--- a/libs/canvas/stateful_image.cc
+++ b/libs/canvas/stateful_image.cc
@@ -101,7 +101,7 @@ StatefulImage::load_states (const XMLNode& node)
error << _("no ID for state") << endmsg;
continue;
}
- sscanf (prop->value().c_str(), "%zd", &id);
+ sscanf (prop->value().c_str(), "%" G_GSIZE_FORMAT, &id);
if ((prop = (*i)->property ("image")) == 0) {
error << _("no image for state") << endmsg;
diff --git a/libs/canvas/wave_view.cc b/libs/canvas/wave_view.cc
index 809ea4e..e8db7d8 100644
--- a/libs/canvas/wave_view.cc
+++ b/libs/canvas/wave_view.cc
@@ -152,7 +152,7 @@ WaveView::debug_name() const
void
WaveView::image_ready ()
{
- DEBUG_TRACE (DEBUG::WaveView, string_compose ("queue draw for %1 at %2 (vis = %3 bbox = %4 CR %5)\n", this, g_get_monotonic_time(), visible(), _bounding_box, current_request));
+ DEBUG_TRACE (DEBUG::WaveView, string_compose ("queue draw for %1 at %2 (vis = %3 CR %4)\n", this, g_get_monotonic_time(), visible(), current_request));
redraw ();
}
@@ -737,6 +737,7 @@ WaveView::draw_image (Cairo::RefPtr<Cairo::ImageSurface>& image, PeakData* _peak
boost::shared_ptr<WaveViewCache::Entry>
WaveView::cache_request_result (boost::shared_ptr<WaveViewThreadRequest> req) const
{
+
boost::shared_ptr<WaveViewCache::Entry> ret (new WaveViewCache::Entry (req->channel,
req->height,
req->amplitude,
@@ -983,6 +984,12 @@ WaveView::generate_image (boost::shared_ptr<WaveViewThreadRequest> req, bool in_
if (peaks_read > 0) {
+ /* region amplitude will have been used to generate the
+ * peak values already, but not the visual-only
+ * amplitude_above_axis. So apply that here before
+ * rendering.
+ */
+
if (_amplitude_above_axis != 1.0) {
for (framecnt_t i = 0; i < n_peaks; ++i) {
peaks[i].max *= _amplitude_above_axis;
diff --git a/libs/canvas/wscript b/libs/canvas/wscript
index 3d741ec..67d26ea 100644
--- a/libs/canvas/wscript
+++ b/libs/canvas/wscript
@@ -80,7 +80,8 @@ def build(bld):
obj = bld.stlib(features = 'cxx cxxstlib', source=canvas_sources)
obj.cxxflags = [ '-fPIC' ]
obj.cflags = [ '-fPIC' ]
-
+ obj.defines = [ ]
+
obj.export_includes = ['.']
obj.includes = ['.']
obj.uselib = 'SIGCPP CAIROMM GTKMM BOOST'
diff --git a/libs/canvas/xfade_curve.cc b/libs/canvas/xfade_curve.cc
index d82e6ab..0d7d7a5 100644
--- a/libs/canvas/xfade_curve.cc
+++ b/libs/canvas/xfade_curve.cc
@@ -30,13 +30,19 @@ using namespace ArdourCanvas;
using std::min;
using std::max;
+#ifdef USE_TRACKS_CODE_FEATURES
+static const bool show_bg_fades = false;
+#else
+static const bool show_bg_fades = true;
+#endif
+
XFadeCurve::XFadeCurve (Canvas* c)
: Item (c)
, points_per_segment (32)
, _xfadeposition (Start)
, _outline_color (0x000000ff)
, _fill_color (0x22448880)
- , show_background_fade (true)
+ , show_background_fade (show_bg_fades)
{
}
@@ -46,7 +52,7 @@ XFadeCurve::XFadeCurve (Canvas* c, XFadePosition pos)
, _xfadeposition (pos)
, _outline_color (0x000000ff)
, _fill_color (0x22448880)
- , show_background_fade (true)
+ , show_background_fade (show_bg_fades)
{
}
@@ -56,7 +62,7 @@ XFadeCurve::XFadeCurve (Item* parent)
, _xfadeposition (Start)
, _outline_color (0x000000ff)
, _fill_color (0x22448880)
- , show_background_fade (true)
+ , show_background_fade (show_bg_fades)
{
}
@@ -66,7 +72,7 @@ XFadeCurve::XFadeCurve (Item* parent, XFadePosition pos)
, _xfadeposition (pos)
, _outline_color (0x000000ff)
, _fill_color (0x22448880)
- , show_background_fade (true)
+ , show_background_fade (show_bg_fades)
{
}
diff --git a/libs/evoral/evoral/ControlList.hpp b/libs/evoral/evoral/ControlList.hpp
index 7a82826..82868cd 100644
--- a/libs/evoral/evoral/ControlList.hpp
+++ b/libs/evoral/evoral/ControlList.hpp
@@ -124,8 +124,8 @@ public:
void slide (iterator before, double distance);
void shift (double before, double distance);
- virtual void add (double when, double value, bool with_guards=true, bool with_default=true);
- virtual void editor_add (double when, double value);
+ virtual void add (double when, double value, bool with_guards=true, bool with_initial=true);
+ virtual void editor_add (double when, double value, bool with_guard);
void fast_simple_add (double when, double value);
diff --git a/libs/evoral/src/ControlList.cpp b/libs/evoral/src/ControlList.cpp
index a2f3aa4..5118744 100644
--- a/libs/evoral/src/ControlList.cpp
+++ b/libs/evoral/src/ControlList.cpp
@@ -399,7 +399,7 @@ ControlList::add_guard_point (double when)
most_recent_insert_iterator = lower_bound (_events.begin(), _events.end(), &cp, time_comparator);
double eval_value = unlocked_eval (insert_position);
-
+
if (most_recent_insert_iterator == _events.end()) {
DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 insert iterator at end, adding eval-value there %2\n", this, eval_value));
@@ -407,7 +407,7 @@ ControlList::add_guard_point (double when)
/* leave insert iterator at the end */
} else if ((*most_recent_insert_iterator)->when == when) {
-
+
DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 insert iterator at existing point, setting eval-value there %2\n", this, eval_value));
/* most_recent_insert_iterator points to a control event
@@ -415,15 +415,15 @@ ControlList::add_guard_point (double when)
nothing to do.
... except ...
-
+
advance most_recent_insert_iterator so that the "real"
insert occurs in the right place, since it
points to the control event just inserted.
*/
-
+
++most_recent_insert_iterator;
} else {
-
+
/* insert a new control event at the right spot
*/
@@ -431,7 +431,7 @@ ControlList::add_guard_point (double when)
this, eval_value, (*most_recent_insert_iterator)->when));
most_recent_insert_iterator = _events.insert (most_recent_insert_iterator, new ControlEvent (when, eval_value));
-
+
/* advance most_recent_insert_iterator so that the "real"
* insert occurs in the right place, since it
* points to the control event just inserted.
@@ -452,7 +452,7 @@ ControlList::in_write_pass () const
}
void
-ControlList::editor_add (double when, double value)
+ControlList::editor_add (double when, double value, bool with_guard)
{
/* this is for making changes from a graphical line editor
*/
@@ -464,11 +464,19 @@ ControlList::editor_add (double when, double value)
*/
if (when >= 1) {
- _events.insert (_events.end(), new ControlEvent (0, _default_value));
- DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 added default value %2 at zero\n", this, _default_value));
+ _events.insert (_events.end(), new ControlEvent (0, value));
+ DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 added value %2 at zero\n", this, value));
}
}
+ insert_position = when;
+ if (with_guard) {
+ if (when > 64) {
+ add_guard_point (when - 64);
+ }
+ maybe_add_insert_guard (when);
+ }
+
ControlEvent cp (when, 0.0f);
iterator i = lower_bound (_events.begin(), _events.end(), &cp, time_comparator);
DEBUG_TRACE (DEBUG::ControlList, string_compose ("editor_add: actually add when= %1 value= %2\n", when, value));
@@ -491,9 +499,9 @@ ControlList::maybe_add_insert_guard (double when)
new control point so that our insert will happen correctly. */
most_recent_insert_iterator = _events.insert (
most_recent_insert_iterator,
- new ControlEvent (when + 1, (*most_recent_insert_iterator)->value));
+ new ControlEvent (when + 64, (*most_recent_insert_iterator)->value));
DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 added insert guard point @ %2 = %3\n",
- this, when+1,
+ this, when + 64,
(*most_recent_insert_iterator)->value));
}
}
@@ -546,7 +554,7 @@ ControlList::erase_from_iterator_to (iterator iter, double when)
}
void
-ControlList::add (double when, double value, bool with_guards, bool with_default)
+ControlList::add (double when, double value, bool with_guards, bool with_initial)
{
/* this is for making changes from some kind of user interface or
control surface (GUI, MIDI, OSC etc)
@@ -561,12 +569,12 @@ ControlList::add (double when, double value, bool with_guards, bool with_default
ControlEvent cp (when, 0.0f);
iterator insertion_point;
- if (_events.empty() && with_default) {
+ if (_events.empty() && with_initial) {
/* empty: add an "anchor" point if the point we're adding past time 0 */
if (when >= 1) {
- _events.insert (_events.end(), new ControlEvent (0, _default_value));
+ _events.insert (_events.end(), new ControlEvent (0, value));
DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 added default value %2 at zero\n", this, _default_value));
}
}
@@ -628,10 +636,10 @@ ControlList::add (double when, double value, bool with_guards, bool with_default
if ((*most_recent_insert_iterator)->value != value) {
DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 reset existing point to new value %2\n", this, value));
- /* only one point allowed per time point, so just
- * reset the value here.
+ /* only one point allowed per time point, so add a guard point
+ * before it if needed then reset the value of the point.
*/
-
+
(*most_recent_insert_iterator)->value = value;
/* if we modified the final value, then its as
@@ -649,10 +657,35 @@ ControlList::add (double when, double value, bool with_guards, bool with_default
} else {
DEBUG_TRACE (DEBUG::ControlList, string_compose ("@%1 insert new point at %2 at iterator at %3\n", this, when, (*most_recent_insert_iterator)->when));
-
- const bool done = maybe_insert_straight_line (when, value);
+ bool done = false;
+ /* check for possible straight line here until maybe_insert_straight_line () handles the insert iterator properly*/
+ if (most_recent_insert_iterator != _events.begin ()) {
+ bool have_point2 = false;
+ --most_recent_insert_iterator;
+ const bool have_point1 = (*most_recent_insert_iterator)->value == value;
+
+ if (most_recent_insert_iterator != _events.begin ()) {
+ --most_recent_insert_iterator;
+ have_point2 = (*most_recent_insert_iterator)->value == value;
+ ++most_recent_insert_iterator;
+ }
+
+ if (have_point1 && have_point2) {
+ (*most_recent_insert_iterator)->when = when;
+ done = true;
+ } else {
+ ++most_recent_insert_iterator;
+ }
+ }
+ //done = maybe_insert_straight_line (when, value) || done;
+ /* if the transport is stopped, add guard points (?) */
+ if (!done && !_in_write_pass && when > 64) {
+ add_guard_point (when - 64);
+ maybe_add_insert_guard (when);
+ }
+
if (with_guards) {
- maybe_add_insert_guard(when);
+ maybe_add_insert_guard (when);
}
if (!done) {
diff --git a/libs/evoral/src/libsmf/smf.h b/libs/evoral/src/libsmf/smf.h
index cbc7035..e5b76ee 100644
--- a/libs/evoral/src/libsmf/smf.h
+++ b/libs/evoral/src/libsmf/smf.h
@@ -394,7 +394,7 @@ int smf_extract_vlq(const unsigned char *buf, const size_t buffer_length, uint32
/* Routines for loading SMF files. */
smf_t *smf_load(FILE *) WARN_UNUSED_RESULT;
-smf_t *smf_load_from_memory(const void *buffer, const size_t buffer_length) WARN_UNUSED_RESULT;
+smf_t *smf_load_from_memory(void *buffer, const size_t buffer_length) WARN_UNUSED_RESULT;
/* Routine for writing SMF files. */
int smf_save(smf_t *smf, FILE *file) WARN_UNUSED_RESULT;
diff --git a/libs/evoral/src/libsmf/smf_decode.c b/libs/evoral/src/libsmf/smf_decode.c
index 031577c..d527cf1 100644
--- a/libs/evoral/src/libsmf/smf_decode.c
+++ b/libs/evoral/src/libsmf/smf_decode.c
@@ -277,7 +277,7 @@ smf_event_decode_metadata(const smf_event_t *event)
break;
case 0x7F:
- off += snprintf(buf + off, BUFFER_SIZE - off, "Proprietary (aka Sequencer) Event, length %zu",
+ off += snprintf(buf + off, BUFFER_SIZE - off, "Proprietary (aka Sequencer) Event, length %" G_GSIZE_FORMAT,
event->midi_buffer_length);
break;
diff --git a/libs/evoral/src/libsmf/smf_load.c b/libs/evoral/src/libsmf/smf_load.c
index 1db09a7..eeedcc3 100644
--- a/libs/evoral/src/libsmf/smf_load.c
+++ b/libs/evoral/src/libsmf/smf_load.c
@@ -873,14 +873,14 @@ load_file_into_buffer(void **file_buffer, size_t *file_buffer_length, FILE* stre
* \return SMF or NULL, if loading failed.
*/
smf_t *
-smf_load_from_memory(const void *buffer, const size_t buffer_length)
+smf_load_from_memory(void *buffer, const size_t buffer_length)
{
int i;
int ret;
smf_t *smf = smf_new();
- smf->file_buffer = (void *)buffer;
+ smf->file_buffer = (void *) buffer;
smf->file_buffer_length = buffer_length;
smf->next_chunk_offset = 0;
diff --git a/libs/evoral/src/libsmf/smf_save.c b/libs/evoral/src/libsmf/smf_save.c
index 05c6641..937409a 100644
--- a/libs/evoral/src/libsmf/smf_save.c
+++ b/libs/evoral/src/libsmf/smf_save.c
@@ -519,7 +519,7 @@ smf_validate(smf_t *smf)
assert(event);
if (!smf_event_is_valid(event)) {
- g_critical("Event #%zu on track #%d is invalid.", eventno, trackno);
+ g_critical("Event #%" G_GSIZE_FORMAT " on track #%d is invalid.", eventno, trackno);
return (-5);
}
diff --git a/libs/fst/vstwin.c b/libs/fst/vstwin.c
index fe0afa7..3a1f624 100644
--- a/libs/fst/vstwin.c
+++ b/libs/fst/vstwin.c
@@ -377,7 +377,7 @@ fst_run_editor (VSTState* fst, void* window_parent)
if (fst->windows_window == NULL) {
HMODULE hInst;
HWND window;
- struct ERect* er;
+ struct ERect* er = NULL;
if (!(fst->plugin->flags & effFlagsHasEditor)) {
fst_error ("Plugin \"%s\" has no editor", fst->handle->name);
@@ -424,9 +424,10 @@ fst_run_editor (VSTState* fst, void* window_parent)
fst->plugin->dispatcher (fst->plugin, effEditOpen, 0, 0, fst->windows_window, 0 );
fst->plugin->dispatcher (fst->plugin, effEditGetRect, 0, 0, &er, 0 );
- fst->width = er->right-er->left;
- fst->height = er->bottom-er->top;
-
+ if (er != NULL) {
+ fst->width = er->right - er->left;
+ fst->height = er->bottom - er->top;
+ }
fst->been_activated = TRUE;
diff --git a/libs/gtkmm2ext/MSVCgtkmm2ext/gtkmm2ext.vcproj b/libs/gtkmm2ext/MSVCgtkmm2ext/gtkmm2ext.vcproj
index 00513e6..0fe12e1 100644
--- a/libs/gtkmm2ext/MSVCgtkmm2ext/gtkmm2ext.vcproj
+++ b/libs/gtkmm2ext/MSVCgtkmm2ext/gtkmm2ext.vcproj
@@ -342,6 +342,10 @@
>
</File>
<File
+ RelativePath="..\fader.cc"
+ >
+ </File>
+ <File
RelativePath="..\fastmeter.cc"
>
</File>
@@ -548,6 +552,10 @@
>
</File>
<File
+ RelativePath="..\gtkmm2ext\fader.h"
+ >
+ </File>
+ <File
RelativePath="..\gtkmm2ext\fastmeter.h"
>
</File>
diff --git a/libs/gtkmm2ext/actions.cc b/libs/gtkmm2ext/actions.cc
index 666ac29..60ca2f0 100644
--- a/libs/gtkmm2ext/actions.cc
+++ b/libs/gtkmm2ext/actions.cc
@@ -139,11 +139,11 @@ ActionManager::lookup_entry (const ustring accel_path, Gtk::AccelKey& key)
}
struct SortActionsByLabel {
- bool operator() (Glib::RefPtr<Gtk::Action> a, Glib::RefPtr<Gtk::Action> b) {
- ustring astr = a->get_accel_path();
- ustring bstr = b->get_accel_path();
- return astr < bstr;
- }
+ bool operator() (Glib::RefPtr<Gtk::Action> a, Glib::RefPtr<Gtk::Action> b) {
+ ustring astr = a->get_accel_path();
+ ustring bstr = b->get_accel_path();
+ return astr < bstr;
+ }
};
void
@@ -289,71 +289,63 @@ struct ActionState {
typedef std::vector<ActionState> ActionStates;
-static std::stack<boost::shared_ptr<ActionStates> > state_stack;
+static ActionStates action_states_to_restore;
+static bool actions_disabled = false;
-static boost::shared_ptr<ActionStates>
-get_action_state ()
+void
+ActionManager::save_action_states ()
{
- boost::shared_ptr<ActionStates> state = boost::shared_ptr<ActionStates>(new ActionStates);
-
/* the C++ API for functions used here appears to be broken in
gtkmm2.6, so we fall back to the C level.
*/
-
GList* list = gtk_ui_manager_get_action_groups (ActionManager::ui_manager->gobj());
GList* node;
GList* acts;
for (node = list; node; node = g_list_next (node)) {
-
+
GtkActionGroup* group = (GtkActionGroup*) node->data;
-
- /* first pass: collect them all */
-
- typedef std::list<Glib::RefPtr<Gtk::Action> > action_list;
- action_list the_acts;
-
+
for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) {
GtkAction* action = (GtkAction*) acts->data;
-
- state->push_back (ActionState (action, gtk_action_get_sensitive (action)));
+ action_states_to_restore.push_back (ActionState (action, gtk_action_get_sensitive (action)));
}
}
-
- return state;
}
void
-ActionManager::push_action_state ()
+ActionManager::enable_active_actions ()
{
- state_stack.push (get_action_state());
-}
-
-void
-ActionManager::pop_action_state ()
-{
- if (state_stack.empty()) {
- warning << string_compose (_("programming error: %1"), X_("ActionManager::pop_action_state called with empty stack")) << endmsg;
- return;
+ if (!actions_disabled) {
+ return ;
}
- boost::shared_ptr<ActionStates> as = state_stack.top ();
- state_stack.pop ();
-
- for (ActionStates::iterator i = as->begin(); i != as->end(); ++i) {
- gtk_action_set_sensitive ((*i).action, (*i).sensitive);
+ for (ActionStates::iterator i = action_states_to_restore.begin(); i != action_states_to_restore.end(); ++i) {
+ if ((*i).action && (*i).sensitive) {
+ gtk_action_set_sensitive ((*i).action, true);
+ }
}
+
+ action_states_to_restore.clear ();
+ actions_disabled = false;
}
void
-ActionManager::disable_all_actions ()
+ActionManager::disable_active_actions ()
{
- push_action_state ();
- boost::shared_ptr<ActionStates> as = state_stack.top ();
+ if (actions_disabled == true ) {
+ return ;
+ }
+ // save all action's states to action_states_to_restore
+ save_action_states ();
- for (ActionStates::iterator i = as->begin(); i != as->end(); ++i) {
- gtk_action_set_sensitive ((*i).action, false);
+ // set all action's states disabled
+ for (ActionStates::iterator i = action_states_to_restore.begin(); i != action_states_to_restore.end(); ++i) {
+ if ((*i).sensitive) {
+ gtk_action_set_sensitive ((*i).action, false);
+ }
}
+ actions_disabled = true;
}
void
@@ -464,8 +456,24 @@ ActionManager::get_action_from_name (const char* name)
void
ActionManager::set_sensitive (vector<RefPtr<Action> >& actions, bool state)
{
- for (vector<RefPtr<Action> >::iterator i = actions.begin(); i != actions.end(); ++i) {
- (*i)->set_sensitive (state);
+ // if actions weren't disabled
+ if (!actions_disabled) {
+ for (vector<RefPtr<Action> >::iterator i = actions.begin(); i != actions.end(); ++i) {
+ (*i)->set_sensitive (state);
+ }
+ }
+ else {
+ // actions were disabled
+ // so we should just set necessary action's states in action_states_to_restore
+ for (vector<RefPtr<Action> >::iterator i = actions.begin(); i != actions.end(); ++i) {
+ // go through action_states_to_restore and set state of actions
+ for (ActionStates::iterator j = action_states_to_restore.begin(); j != action_states_to_restore.end(); ++j) {
+ // all actions should have their individual name, so we can use it for comparison
+ if (gtk_action_get_name ((*j).action) == (*i)->get_name ()) {
+ (*j).sensitive = state;
+ }
+ }
+ }
}
}
@@ -503,10 +511,10 @@ ActionManager::set_toggleaction_state (string n, bool s)
const char* action_name = last_slash + 1;
- RefPtr<Action> act = get_action (group_name, action_name);
+ RefPtr<Action> act = get_action (group_name, action_name);
if (act) {
- RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
- tact->set_active (s);
+ RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
+ tact->set_active (s);
} else {
error << string_compose (_("Unknown action name: %1"), name) << endmsg;
}
diff --git a/libs/gtkmm2ext/application.cc b/libs/gtkmm2ext/application.cc
index 54efb47..eb1cea1 100644
--- a/libs/gtkmm2ext/application.cc
+++ b/libs/gtkmm2ext/application.cc
@@ -59,6 +59,12 @@ Application::ready ()
}
void
+Application::hide ()
+{
+ gtk_application_hide ();
+}
+
+void
Application::cleanup ()
{
gtk_application_cleanup ();
diff --git a/libs/gtkmm2ext/auto_spin.cc b/libs/gtkmm2ext/auto_spin.cc
index 0f4c371..2c70cb4 100644
--- a/libs/gtkmm2ext/auto_spin.cc
+++ b/libs/gtkmm2ext/auto_spin.cc
@@ -143,6 +143,30 @@ AutoSpin::button_press (GdkEventButton *ev)
return TRUE;
}
+gint
+AutoSpin::scroll_event (GdkEventScroll *ev)
+{
+ stop_spinning (0);
+
+ gfloat increment = step_increment;
+
+ if (ev->state & Keyboard::TertiaryModifier) {
+ increment = page_increment;
+ }
+
+ switch (ev->direction) {
+ case GDK_SCROLL_DOWN:
+ case GDK_SCROLL_LEFT:
+ adjust_value (-increment);
+ break;
+ case GDK_SCROLL_RIGHT:
+ case GDK_SCROLL_UP:
+ adjust_value (increment);
+ break;
+ }
+ return TRUE;
+}
+
void
AutoSpin::start_spinning (bool decrement, bool page)
{
diff --git a/libs/gtkmm2ext/cairo_widget.cc b/libs/gtkmm2ext/cairo_widget.cc
index 2ffb2b4..aa8f883 100644
--- a/libs/gtkmm2ext/cairo_widget.cc
+++ b/libs/gtkmm2ext/cairo_widget.cc
@@ -65,6 +65,99 @@ CairoWidget::on_button_press_event (GdkEventButton*)
return false;
}
+
+#ifdef USE_TRACKS_CODE_FEATURES
+
+/* This is Tracks version of this method.
+
+ The use of get_visible_window() in this method is an abuse of the GDK/GTK
+ semantics. It can and may break on different GDK backends, and uses a
+ side-effect/unintended behaviour in GDK/GTK to try to accomplish something
+ which should be done differently. I (Paul) have confirmed this with the GTK
+ development team.
+
+ For this reason, this code is not acceptable for ordinary merging into the Ardour libraries.
+
+ Ardour Developers: you are not obligated to maintain the internals of this
+ implementation in the face of build-time environment changes (e.g. -D
+ defines etc).
+*/
+
+bool
+CairoWidget::on_expose_event (GdkEventExpose *ev)
+{
+ cairo_rectangle_t expose_area;
+ expose_area.width = ev->area.width;
+ expose_area.height = ev->area.height;
+
+#ifdef USE_CAIRO_IMAGE_SURFACE_FOR_CAIRO_WIDGET
+ Cairo::RefPtr<Cairo::Context> cr;
+ if (get_visible_window ()) {
+ expose_area.x = 0;
+ expose_area.y = 0;
+ if (!_image_surface) {
+ _image_surface = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, get_width(), get_height());
+ }
+ cr = Cairo::Context::create (_image_surface);
+ } else {
+ expose_area.x = ev->area.x;
+ expose_area.y = ev->area.y;
+ cr = get_window()->create_cairo_context ();
+ }
+#else
+ expose_area.x = ev->area.x;
+ expose_area.y = ev->area.y;
+ Cairo::RefPtr<Cairo::Context> cr = get_window()->create_cairo_context ();
+#endif
+
+ cr->rectangle (expose_area.x, expose_area.y, expose_area.width, expose_area.height);
+ cr->clip ();
+
+ /* paint expose area the color of the parent window bg
+ */
+
+ if (get_visible_window ()) {
+ Gdk::Color bg (get_parent_bg());
+ cr->rectangle (expose_area.x, expose_area.y, expose_area.width, expose_area.height);
+ cr->set_source_rgb (bg.get_red_p(), bg.get_green_p(), bg.get_blue_p());
+ cr->fill ();
+ }
+
+ render (cr->cobj(), &expose_area);
+
+#ifdef USE_CAIRO_IMAGE_SURFACE_FOR_CAIRO_WIDGET
+ if(get_visible_window ()) {
+ _image_surface->flush();
+ /* now blit our private surface back to the GDK one */
+
+ Cairo::RefPtr<Cairo::Context> cairo_context = get_window()->create_cairo_context ();
+
+ cairo_context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+ cairo_context->clip ();
+ cairo_context->set_source (_image_surface, ev->area.x, ev->area.y);
+ cairo_context->set_operator (Cairo::OPERATOR_OVER);
+ cairo_context->paint ();
+ }
+#endif
+
+ Gtk::Widget* child = get_child ();
+
+ if (child) {
+ propagate_expose (*child, ev);
+ }
+
+ return true;
+}
+
+#else
+
+/* Ardour mainline: not using Tracks code features.
+
+ Tracks Developers: please do not modify this version of
+ ::on_expose_event(). The version used by Tracks is before the preceding
+ #else and contains hacks required for the Tracks GUI to work.
+*/
+
bool
CairoWidget::on_expose_event (GdkEventExpose *ev)
{
@@ -126,10 +219,12 @@ CairoWidget::on_expose_event (GdkEventExpose *ev)
#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
}
#endif
-
+
return true;
}
+#endif
+
/** Marks the widget as dirty, so that render () will be called on
* the next GTK expose event.
*/
diff --git a/libs/gtkmm2ext/click_box.cc b/libs/gtkmm2ext/click_box.cc
index 63ab3db..7b2e67d 100644
--- a/libs/gtkmm2ext/click_box.cc
+++ b/libs/gtkmm2ext/click_box.cc
@@ -63,6 +63,13 @@ ClickBox::button_press_handler (GdkEventButton* ev)
}
bool
+ClickBox::on_scroll_event (GdkEventScroll* ev)
+{
+ AutoSpin::scroll_event (ev);
+ return true;
+}
+
+bool
ClickBox::button_release_handler (GdkEventButton* ev)
{
switch (ev->button) {
@@ -81,6 +88,7 @@ void
ClickBox::set_label ()
{
char buf[32];
+ int width, height;
bool const h = _printer (buf, get_adjustment());
if (!h) {
@@ -89,7 +97,17 @@ ClickBox::set_label ()
}
layout->set_text (buf);
- layout->get_pixel_size (twidth, theight);
+ layout->get_pixel_size (width, height);
+
+ if (twidth < width && (width > 50)) {
+ /* override GenericPluginUI::build_control_ui()
+ * Gtkmm2ext::set_size_request_to_display_given_text ("g9999999")
+ * see http://tracker.ardour.org/view.php?id=6499
+ */
+ set_size_request (std::min (300, width + 6), height + 4);
+ }
+
+ twidth = width; theight = height;
queue_draw ();
}
diff --git a/libs/gtkmm2ext/fader.cc b/libs/gtkmm2ext/fader.cc
new file mode 100755
index 0000000..0fedd33
--- /dev/null
+++ b/libs/gtkmm2ext/fader.cc
@@ -0,0 +1,448 @@
+/*
+ Copyright (C) 2014 Waves Audio Ltd.
+
+ 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.
+
+ $Id: fastmeter.h 570 2006-06-07 21:21:21Z sampo $
+*/
+
+
+#include <iostream>
+
+#include "pbd/stacktrace.h"
+
+#include "gtkmm2ext/fader.h"
+#include "gtkmm2ext/keyboard.h"
+#include "gtkmm2ext/rgb_macros.h"
+#include "gtkmm2ext/utils.h"
+#include "pbd/failed_constructor.h"
+#include "pbd/file_utils.h"
+#include "ardour/filesystem_paths.h"
+
+using namespace Gtkmm2ext;
+using namespace Gtk;
+using namespace std;
+
+#define CORNER_RADIUS 4
+#define CORNER_SIZE 2
+#define CORNER_OFFSET 1
+#define FADER_RESERVE 5
+
+
+static void get_closest_point_on_line(double xa, double ya, double xb, double yb, double xp, double yp, double& xl, double& yl )
+{
+ // Storing vector A->B
+ double a_to_b_x = xb - xa;
+ double a_to_b_y = yb - ya;
+
+ // Storing vector A->P
+ double a_to_p_x = xp - xa;
+ double a_to_p_y = yp - ya;
+
+
+ // Basically finding the squared magnitude
+ // of a_to_b
+ double atb2 = a_to_b_x * a_to_b_x + a_to_b_y * a_to_b_y;
+
+ // The dot product of a_to_p and a_to_b
+ double atp_dot_atb = a_to_p_x * a_to_b_x + a_to_p_y * a_to_b_y;
+
+ // The normalized "distance" from a to
+ // your closest point
+ double t = atp_dot_atb / atb2;
+
+ // Add the distance to A, moving
+ // towards B
+ double x = xa + a_to_b_x * t;
+ double y = ya + a_to_b_y * t;
+
+ if ((xa != xb)) {
+ if ((x < xa) && (x < xb)) {
+ if (xa < xb) {
+ x = xa;
+ y = ya;
+ } else {
+ x = xb;
+ y = yb;
+ }
+ } else if ((x > xa) && (x > xb)) {
+ if (xb > xa) {
+ x = xb;
+ y = yb;
+ } else {
+ x = xa;
+ y = ya;
+ }
+ }
+ } else {
+ if ((y < ya) && (y < yb)) {
+ if (ya < yb) {
+ x = xa;
+ y = ya;
+ } else {
+ x = xb;
+ y = yb;
+ }
+ } else if ((y > ya) && (y > yb)) {
+ if (yb > ya) {
+ x = xb;
+ y = yb;
+ } else {
+ x = xa;
+ y = ya;
+ }
+ }
+ }
+
+ xl = x;
+ yl = y;
+}
+
+Fader::Fader (Gtk::Adjustment& adj,
+ const Glib::RefPtr<Gdk::Pixbuf>& face_pixbuf,
+ const Glib::RefPtr<Gdk::Pixbuf>& active_face_pixbuf,
+ const Glib::RefPtr<Gdk::Pixbuf>& underlay_pixbuf,
+ const Glib::RefPtr<Gdk::Pixbuf>& handle_pixbuf,
+ const Glib::RefPtr<Gdk::Pixbuf>& active_handle_pixbuf,
+ int min_pos_x,
+ int min_pos_y,
+ int max_pos_x,
+ int max_pos_y,
+ bool read_only)
+ : adjustment (adj)
+ , _face_pixbuf (face_pixbuf)
+ , _active_face_pixbuf (active_face_pixbuf)
+ , _underlay_pixbuf (underlay_pixbuf)
+ , _handle_pixbuf (handle_pixbuf)
+ , _active_handle_pixbuf (active_handle_pixbuf)
+ , _min_pos_x (min_pos_x)
+ , _min_pos_y (min_pos_y)
+ , _max_pos_x (max_pos_x)
+ , _max_pos_y (max_pos_y)
+ , _grab_window (0)
+ , _touch_cursor (0)
+ , _dragging (false)
+ , _default_value (adjustment.get_value())
+ , _read_only (read_only)
+{
+ update_unity_position ();
+
+ if (!_read_only) {
+ add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK|Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK);
+ }
+
+ adjustment.signal_value_changed().connect (mem_fun (*this, &Fader::adjustment_changed));
+ adjustment.signal_changed().connect (mem_fun (*this, &Fader::adjustment_changed));
+ CairoWidget::set_size_request(_face_pixbuf->get_width(), _face_pixbuf->get_height());
+}
+
+Fader::~Fader ()
+{
+ if (_touch_cursor) {
+ delete _touch_cursor;
+ }
+}
+
+void
+Fader::get_image_scales (double &x_scale, double &y_scale)
+{
+ int pbwidth = _face_pixbuf->get_width ();
+ int pbheight = _face_pixbuf->get_height ();
+ int width = get_width ();
+ int height = get_height ();
+
+ if ((width != pbwidth) || (height != pbheight)) {
+ x_scale = double (width) / double (pbwidth);
+ if (x_scale == 0.0) {
+ x_scale = 1.0;
+ }
+ y_scale = double (height) / double (pbheight);
+ if (y_scale == 0.0) {
+ y_scale = 1.0;
+ }
+ } else {
+ x_scale = y_scale = 1.0;
+ }
+}
+
+void
+Fader::set_touch_cursor (const Glib::RefPtr<Gdk::Pixbuf>& touch_cursor)
+{
+ _touch_cursor = new Gdk::Cursor (Gdk::Display::get_default(), touch_cursor, 12, 12);
+}
+
+void
+Fader::render (cairo_t* cr, cairo_rectangle_t*)
+{
+
+ double xscale = 1.0;
+ double yscale = 1.0;
+
+ get_image_scales (xscale, yscale);
+
+ cairo_matrix_t matrix;
+ cairo_get_matrix (cr, &matrix);
+ cairo_matrix_scale (&matrix, xscale, yscale);
+ cairo_set_matrix (cr, &matrix);
+
+ get_handle_position (_last_drawn_x, _last_drawn_y);
+
+ if (_underlay_pixbuf != 0) {
+ gdk_cairo_set_source_pixbuf (cr,
+ _underlay_pixbuf->gobj(),
+ (_last_drawn_x - (int)((_underlay_pixbuf->get_width() * xscale) / 2.0 + 0.5)) / xscale,
+ (_last_drawn_y - (int)((_underlay_pixbuf->get_height() * yscale) / 2.0 + 0.5)) / yscale);
+ cairo_paint (cr);
+ }
+
+ gdk_cairo_set_source_pixbuf (cr,
+ ((get_state () == Gtk::STATE_ACTIVE) && (_active_face_pixbuf != 0)) ?
+ _active_face_pixbuf->gobj() :
+ _face_pixbuf->gobj(),
+ 0,
+ 0);
+ cairo_paint (cr);
+
+ const Glib::RefPtr<Gdk::Pixbuf> handle_pixbuf (_dragging ? _active_handle_pixbuf : _handle_pixbuf);
+ gdk_cairo_set_source_pixbuf (cr,
+ handle_pixbuf->gobj(),
+ (_last_drawn_x - (int)((handle_pixbuf->get_width() * xscale) / 2.0 + 0.5)) / xscale,
+ (_last_drawn_y - (int)((handle_pixbuf->get_height() * yscale) / 2.0 + 0.5)) / yscale);
+ cairo_paint (cr);
+}
+
+void
+Fader::on_size_request (GtkRequisition* req)
+{
+ req->width = _face_pixbuf->get_width();
+ req->height = _face_pixbuf->get_height();
+}
+
+void
+Fader::on_size_allocate (Gtk::Allocation& alloc)
+{
+ CairoWidget::on_size_allocate(alloc);
+ update_unity_position ();
+}
+
+bool
+Fader::on_button_press_event (GdkEventButton* ev)
+{
+ focus_handler();
+
+ if (_read_only) {
+ return false;
+ }
+
+ if (ev->type != GDK_BUTTON_PRESS) {
+ return false;
+ }
+
+ if (ev->button != 1 && ev->button != 2) {
+ return false;
+ }
+
+ if (_touch_cursor) {
+ get_window()->set_cursor (*_touch_cursor);
+ }
+
+ _grab_start_mouse_x = ev->x;
+ _grab_start_mouse_y = ev->y;
+ get_handle_position (_grab_start_handle_x, _grab_start_handle_y);
+
+ double xscale = 1.0;
+ double yscale = 1.0;
+
+ get_image_scales (xscale, yscale);
+
+ double hw = _handle_pixbuf->get_width() * xscale;
+ double hh = _handle_pixbuf->get_height() * yscale;
+
+ if ((ev->x < (_grab_start_handle_x - hw/2)) || (ev->x > (_grab_start_handle_x + hw/2)) || (ev->y < (_grab_start_handle_y - hh/2)) || (ev->y > (_grab_start_handle_y + hh/2))) {
+ return false;
+ }
+
+ double ev_pos_x;
+ double ev_pos_y;
+
+ get_closest_point_on_line(_min_pos_x, _min_pos_y,
+ _max_pos_x, _max_pos_y,
+ ev->x, ev->y,
+ ev_pos_x, ev_pos_y );
+ add_modal_grab ();
+
+ _grab_window = ev->window;
+ _dragging = true;
+
+ gdk_pointer_grab(ev->window,false,
+ GdkEventMask (Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK),
+ NULL,
+ NULL,
+ ev->time);
+
+ queue_draw();
+
+ return true;
+}
+
+bool
+Fader::on_button_release_event (GdkEventButton* ev)
+{
+ if (_read_only) {
+ return false;
+ }
+
+ if (_touch_cursor) {
+ get_window()->set_cursor ();
+ }
+
+ if (_dragging) { //temp
+ remove_modal_grab();
+ _dragging = false;
+ gdk_pointer_ungrab (GDK_CURRENT_TIME);
+ queue_draw ();
+ }
+ return false;
+}
+
+bool
+Fader::on_scroll_event (GdkEventScroll* ev)
+{
+ if (_read_only) {
+ return false;
+ }
+
+ int step_factor = 1;
+
+ switch (ev->direction) {
+ case GDK_SCROLL_RIGHT:
+ case GDK_SCROLL_UP:
+#ifdef __APPLE__
+ if ( ev->state & GDK_SHIFT_MASK ) {
+ step_factor = -1;
+ } else {
+ step_factor = 1;
+ }
+#else
+ step_factor = 1;
+#endif
+ break;
+ case GDK_SCROLL_LEFT:
+ case GDK_SCROLL_DOWN:
+#ifdef __APPLE__
+ if ( ev->state & GDK_SHIFT_MASK ) {
+ step_factor = 1;
+ } else {
+ step_factor = -1;
+ }
+#else
+ step_factor = -1;
+#endif
+ break;
+ default:
+ return false;
+ }
+ adjustment.set_value (adjustment.get_value() + step_factor * (adjustment.get_step_increment() ));
+ return true;
+}
+
+bool
+Fader::on_motion_notify_event (GdkEventMotion* ev)
+{
+ if (_read_only) {
+ return false;
+ }
+
+ if (_dragging) {
+ double ev_pos_x;
+ double ev_pos_y;
+
+ if (ev->window != _grab_window) {
+ _grab_window = ev->window;
+ return true;
+ }
+
+ get_closest_point_on_line(_min_pos_x, _min_pos_y,
+ _max_pos_x, _max_pos_y,
+ _grab_start_handle_x + (ev->x - _grab_start_mouse_x), _grab_start_handle_y + (ev->y - _grab_start_mouse_y),
+ ev_pos_x, ev_pos_y );
+
+ double const fract = sqrt((ev_pos_x - _min_pos_x) * (ev_pos_x - _min_pos_x) +
+ (ev_pos_y - _min_pos_y) * (ev_pos_y - _min_pos_y)) /
+ sqrt((double)((_max_pos_x - _min_pos_x) * (_max_pos_x - _min_pos_x) +
+ (_max_pos_y - _min_pos_y) * (_max_pos_y - _min_pos_y)));
+
+ adjustment.set_value (adjustment.get_lower() + (adjustment.get_upper() - adjustment.get_lower()) * fract);
+ }
+ return true;
+}
+
+void
+Fader::adjustment_changed ()
+{
+ double handle_x;
+ double handle_y;
+ get_handle_position (handle_x, handle_y);
+
+ if ((handle_x != _last_drawn_x) || (handle_y != _last_drawn_y)) {
+ queue_draw ();
+ }
+}
+
+/** @return pixel offset of the current value from the right or bottom of the fader */
+void
+Fader::get_handle_position (double& x, double& y)
+{
+ double fract = (adjustment.get_value () - adjustment.get_lower()) / ((adjustment.get_upper() - adjustment.get_lower()));
+
+ x = (int)(_min_pos_x + (_max_pos_x - _min_pos_x) * fract);
+ y = (int)(_min_pos_y + (_max_pos_y - _min_pos_y) * fract);
+}
+
+bool
+Fader::on_enter_notify_event (GdkEventCrossing*)
+{
+ _hovering = true;
+ Keyboard::magic_widget_grab_focus ();
+ queue_draw ();
+ return false;
+}
+
+bool
+Fader::on_leave_notify_event (GdkEventCrossing*)
+{
+ if (_read_only) {
+ return false;
+ }
+
+ if (!_dragging) {
+ _hovering = false;
+ Keyboard::magic_widget_drop_focus();
+ queue_draw ();
+ }
+ return false;
+}
+
+void
+Fader::set_default_value (float d)
+{
+ _default_value = d;
+ update_unity_position ();
+}
+
+void
+Fader::update_unity_position ()
+{
+}
diff --git a/libs/gtkmm2ext/gtk_ui.cc b/libs/gtkmm2ext/gtk_ui.cc
index b5319fb..c4df2b7 100644
--- a/libs/gtkmm2ext/gtk_ui.cc
+++ b/libs/gtkmm2ext/gtk_ui.cc
@@ -482,8 +482,40 @@ UI::do_request (UIRequest* req)
======================================================================*/
void
+UI::dump_errors (std::ostream& ostr)
+{
+ Glib::Threads::Mutex::Lock lm (error_lock);
+ ostr << endl << X_("Errors/Messages:") << endl;
+ for (list<string>::const_iterator i = error_stack.begin(); i != error_stack.end(); ++i) {
+ ostr << *i << endl;
+ }
+ ostr << endl;
+}
+
+void
UI::receive (Transmitter::Channel chn, const char *str)
{
+ {
+ Glib::Threads::Mutex::Lock lm (error_lock);
+ switch (chn) {
+ case Transmitter::Fatal:
+ error_stack.push_back (string (X_("FATAL: ")) + str);
+ break;
+ case Transmitter::Error:
+ error_stack.push_back (string (X_("ERROR: ")) + str);
+ break;
+ case Transmitter::Warning:
+ error_stack.push_back (string (X_("WARNING: ")) + str);
+ break;
+ case Transmitter::Info:
+ error_stack.push_back (string (X_("INFO: ")) + str);
+ break;
+ case Transmitter::Throw:
+ error_stack.push_back (string (X_("THROW: ")) + str);
+ break;
+ }
+ }
+
if (caller_is_ui_thread()) {
process_error_message (chn, str);
} else {
diff --git a/libs/gtkmm2ext/gtkapplication_quartz.mm b/libs/gtkmm2ext/gtkapplication_quartz.mm
index 932eaa7..5809355 100644
--- a/libs/gtkmm2ext/gtkapplication_quartz.mm
+++ b/libs/gtkmm2ext/gtkapplication_quartz.mm
@@ -573,7 +573,9 @@ idle_call_activate (gpointer data)
- (void) activate:(id) sender
{
UNUSED_PARAMETER(sender);
- g_idle_add (idle_call_activate, gtk_menu_item);
+ // Hot Fix. Increase Priority.
+ g_idle_add_full (G_PRIORITY_HIGH_IDLE, idle_call_activate, gtk_menu_item, NULL);
+// g_idle_add (idle_call_activate, gtk_menu_item);
}
@end
@@ -1221,7 +1223,7 @@ create_apple_menu ()
[menuitem release];
[_app_menu addItem: [NSMenuItem separatorItem]];
menuitem = [[NSMenuItem alloc] initWithTitle:@"Hide"
- action:@selector(hide:) keyEquivalent:@""];
+ action:@selector(hide:) keyEquivalent:@"h"];
[menuitem setTarget: NSApp];
[_app_menu addItem: menuitem];
[menuitem release];
@@ -1424,9 +1426,10 @@ namespace Gtk {
@end
- at interface GtkApplicationDelegate : NSObject
+ at interface GtkApplicationDelegate : NSObject
-(BOOL) application:(NSApplication*) app openFile:(NSString*) file;
- (NSApplicationTerminateReply) applicationShouldTerminate:(NSApplication *) app;
+- (void) startApp;
@end
@implementation GtkApplicationDelegate
@@ -1476,6 +1479,12 @@ gtk_application_ready ()
}
extern "C" void
+gtk_application_hide ()
+{
+ [NSApp performSelector:@selector(hide:)];
+}
+
+extern "C" void
gtk_application_cleanup()
{
_exiting = 1;
diff --git a/libs/gtkmm2ext/gtkapplication_win32.c b/libs/gtkmm2ext/gtkapplication_win32.c
index 78d538b..7dd9db4 100644
--- a/libs/gtkmm2ext/gtkapplication_win32.c
+++ b/libs/gtkmm2ext/gtkapplication_win32.c
@@ -47,3 +47,8 @@ void
gtk_application_ready (void)
{
}
+
+void
+gtk_application_hide (void)
+{
+}
diff --git a/libs/gtkmm2ext/gtkapplication_x11.c b/libs/gtkmm2ext/gtkapplication_x11.c
index 2b85677..6cf1055 100644
--- a/libs/gtkmm2ext/gtkapplication_x11.c
+++ b/libs/gtkmm2ext/gtkapplication_x11.c
@@ -50,3 +50,8 @@ void
gtk_application_ready (void)
{
}
+
+void
+gtk_application_hide (void)
+{
+}
diff --git a/libs/gtkmm2ext/gtkmm2ext/actions.h b/libs/gtkmm2ext/gtkmm2ext/actions.h
index d13a16f..9ed1480 100644
--- a/libs/gtkmm2ext/gtkmm2ext/actions.h
+++ b/libs/gtkmm2ext/gtkmm2ext/actions.h
@@ -94,9 +94,9 @@ namespace ActionManager {
LIBGTKMM2EXT_API extern void set_toggleaction_state (std::string, bool);
- LIBGTKMM2EXT_API extern void push_action_state ();
- LIBGTKMM2EXT_API extern void pop_action_state ();
- LIBGTKMM2EXT_API extern void disable_all_actions ();
+ LIBGTKMM2EXT_API extern void save_action_states ();
+ LIBGTKMM2EXT_API extern void enable_active_actions ();
+ LIBGTKMM2EXT_API extern void disable_active_actions ();
};
#endif /* __libgtkmm2ext_actions_h__ */
diff --git a/libs/gtkmm2ext/gtkmm2ext/application.h b/libs/gtkmm2ext/gtkmm2ext/application.h
index f0d029d..e66b6ea 100644
--- a/libs/gtkmm2ext/gtkmm2ext/application.h
+++ b/libs/gtkmm2ext/gtkmm2ext/application.h
@@ -45,6 +45,7 @@ public:
~Application ();
void ready ();
+ void hide ();
void cleanup ();
void set_menu_bar (Gtk::MenuShell&);
GtkApplicationMenuGroup* add_app_menu_group ();
diff --git a/libs/gtkmm2ext/gtkmm2ext/auto_spin.h b/libs/gtkmm2ext/gtkmm2ext/auto_spin.h
index 8a6c9ab..0f5a946 100644
--- a/libs/gtkmm2ext/gtkmm2ext/auto_spin.h
+++ b/libs/gtkmm2ext/gtkmm2ext/auto_spin.h
@@ -47,6 +47,7 @@ class LIBGTKMM2EXT_API AutoSpin
gint button_press (GdkEventButton *);
gint stop_spinning (GdkEventButton *ignored_but_here_for_clicked);
void start_spinning (bool decrementing, bool use_page);
+ gint scroll_event (GdkEventScroll *);
private:
Gtk::Adjustment &adjustment;
diff --git a/libs/gtkmm2ext/gtkmm2ext/click_box.h b/libs/gtkmm2ext/gtkmm2ext/click_box.h
index c2afa2d..3b7fd0f 100644
--- a/libs/gtkmm2ext/gtkmm2ext/click_box.h
+++ b/libs/gtkmm2ext/gtkmm2ext/click_box.h
@@ -57,6 +57,7 @@ class LIBGTKMM2EXT_API ClickBox : public Gtk::DrawingArea, public AutoSpin
void style_changed (const Glib::RefPtr<Gtk::Style> &);
bool button_press_handler (GdkEventButton *);
bool button_release_handler (GdkEventButton *);
+ bool on_scroll_event (GdkEventScroll*);
sigc::slot<bool, char *, Gtk::Adjustment &> _printer;
};
diff --git a/libs/gtkmm2ext/gtkmm2ext/fader.h b/libs/gtkmm2ext/gtkmm2ext/fader.h
new file mode 100755
index 0000000..84175d5
--- /dev/null
+++ b/libs/gtkmm2ext/gtkmm2ext/fader.h
@@ -0,0 +1,111 @@
+/*
+ Copyright (C) 2006 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 __gtkmm2ext_fader_h__
+#define __gtkmm2ext_fader_h__
+
+#include <cmath>
+#include <stdint.h>
+
+#include <gtkmm/adjustment.h>
+#include <gdkmm.h>
+#include <gtkmm2ext/binding_proxy.h>
+#include "gtkmm2ext/cairo_widget.h"
+
+#include <boost/shared_ptr.hpp>
+
+#include "gtkmm2ext/visibility.h"
+
+namespace Gtkmm2ext {
+
+class LIBGTKMM2EXT_API Fader : public CairoWidget
+{
+ public:
+ Fader (Gtk::Adjustment& adjustment,
+ const Glib::RefPtr<Gdk::Pixbuf>& face_pixbuf,
+ const Glib::RefPtr<Gdk::Pixbuf>& active_face_pixbuf,
+ const Glib::RefPtr<Gdk::Pixbuf>& underlay_pixbuf,
+ const Glib::RefPtr<Gdk::Pixbuf>& handle_pixbuf,
+ const Glib::RefPtr<Gdk::Pixbuf>& active_handle_pixbuf,
+ int min_pos_x,
+ int min_pos_y,
+ int max_pos_x,
+ int max_pos_y,
+ bool read_only);
+
+ virtual ~Fader ();
+
+ void set_controllable (boost::shared_ptr<PBD::Controllable> c) { binding_proxy.set_controllable (c); }
+ void set_default_value (float);
+ void set_touch_cursor (const Glib::RefPtr<Gdk::Pixbuf>& touch_cursor);
+ void get_image_scales (double &x_scale, double &y_scale);
+
+ protected:
+ void get_handle_position (double& x, double& y);
+
+ void on_size_request (GtkRequisition*);
+ void on_size_allocate (Gtk::Allocation& alloc);
+
+ void render (cairo_t* cr, cairo_rectangle_t*);
+ bool on_button_press_event (GdkEventButton*);
+ bool on_button_release_event (GdkEventButton*);
+ bool on_motion_notify_event (GdkEventMotion*);
+ bool on_scroll_event (GdkEventScroll* ev);
+ bool on_enter_notify_event (GdkEventCrossing* ev);
+ bool on_leave_notify_event (GdkEventCrossing* ev);
+
+ protected:
+ Gtk::Adjustment& adjustment;
+ BindingProxy binding_proxy;
+
+ private:
+
+ const Glib::RefPtr<Gdk::Pixbuf> _face_pixbuf;
+ const Glib::RefPtr<Gdk::Pixbuf> _active_face_pixbuf;
+ const Glib::RefPtr<Gdk::Pixbuf> _underlay_pixbuf;
+ const Glib::RefPtr<Gdk::Pixbuf> _handle_pixbuf;
+ const Glib::RefPtr<Gdk::Pixbuf> _active_handle_pixbuf;
+ int _min_pos_x;
+ int _min_pos_y;
+ int _max_pos_x;
+ int _max_pos_y;
+
+ bool _hovering;
+
+ GdkWindow* _grab_window;
+ Gdk::Cursor *_touch_cursor;
+
+ double _grab_start_mouse_x;
+ double _grab_start_mouse_y;
+ double _grab_start_handle_x;
+ double _grab_start_handle_y;
+ double _last_drawn_x;
+ double _last_drawn_y;
+ bool _dragging;
+ float _default_value;
+ bool _read_only;
+
+ void adjustment_changed ();
+ void update_unity_position ();
+};
+
+
+} /* namespace */
+
+#endif /* __gtkmm2ext_fader_h__ */
diff --git a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h
index 0a66acc..177adb0 100644
--- a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h
+++ b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h
@@ -138,6 +138,7 @@ class LIBGTKMM2EXT_API UI : public AbstractUI<UIRequest>
void flush_pending ();
void toggle_errors ();
void show_errors ();
+ void dump_errors (std::ostream&);
void touch_display (Touchable *);
void set_tip (Gtk::Widget &w, const gchar *tip);
void set_tip (Gtk::Widget &w, const std::string &tip);
@@ -166,7 +167,7 @@ class LIBGTKMM2EXT_API UI : public AbstractUI<UIRequest>
sigc::signal<void> theme_changed;
static bool just_hide_it (GdkEventAny *, Gtk::Window *);
-
+
protected:
virtual void handle_fatal (const char *);
virtual void display_message (const char *prefix, gint prefix_len,
@@ -195,6 +196,9 @@ class LIBGTKMM2EXT_API UI : public AbstractUI<UIRequest>
void process_error_message (Transmitter::Channel, const char *);
void do_quit ();
+ Glib::Threads::Mutex error_lock;
+ std::list<std::string> error_stack;
+
void color_selection_done (bool status);
bool color_selection_deleted (GdkEventAny *);
bool color_picked;
diff --git a/libs/gtkmm2ext/gtkmm2ext/gtkapplication.h b/libs/gtkmm2ext/gtkmm2ext/gtkapplication.h
index 83594fe..4e977de 100644
--- a/libs/gtkmm2ext/gtkmm2ext/gtkapplication.h
+++ b/libs/gtkmm2ext/gtkmm2ext/gtkapplication.h
@@ -34,6 +34,7 @@ typedef struct _GtkApplicationMenuGroup GtkApplicationMenuGroup;
LIBGTKMM2EXT_API int gtk_application_init (void);
LIBGTKMM2EXT_API void gtk_application_ready (void);
+LIBGTKMM2EXT_API void gtk_application_hide (void);
LIBGTKMM2EXT_API void gtk_application_cleanup (void);
LIBGTKMM2EXT_API void gtk_application_set_menu_bar (GtkMenuShell *menu_shell);
diff --git a/libs/gtkmm2ext/gtkmm2ext/persistent_tooltip.h b/libs/gtkmm2ext/gtkmm2ext/persistent_tooltip.h
index 6507bbb..9df2614 100644
--- a/libs/gtkmm2ext/gtkmm2ext/persistent_tooltip.h
+++ b/libs/gtkmm2ext/gtkmm2ext/persistent_tooltip.h
@@ -31,15 +31,17 @@ namespace Gtkmm2ext {
*/
class LIBGTKMM2EXT_API PersistentTooltip : public sigc::trackable
{
-public:
- PersistentTooltip (Gtk::Widget *, int margin_y = 0);
+ public:
+ PersistentTooltip (Gtk::Widget *, bool draggable = false, int margin_y = 0);
virtual ~PersistentTooltip ();
void set_tip (std::string);
-
+ void set_font (Pango::FontDescription font);
+ void set_center_alignment (bool align_to_center);
+
virtual bool dragging () const;
-private:
+ private:
bool timeout ();
void show ();
void hide ();
@@ -54,6 +56,10 @@ private:
Gtk::Window* _window;
/** Our label */
Gtk::Label* _label;
+
+ /** allow to drag
+ */
+ bool _draggable;
/** true if we are `dragging', in the sense that button 1
is being held over _target.
*/
@@ -62,6 +68,8 @@ private:
sigc::connection _timeout;
/** The tip text */
std::string _tip;
+ Pango::FontDescription _font;
+ bool _align_to_center;
int _margin_y;
};
diff --git a/libs/gtkmm2ext/gtkmm2ext/pixfader.h b/libs/gtkmm2ext/gtkmm2ext/pixfader.h
index f137a4e..0a31634 100644
--- a/libs/gtkmm2ext/gtkmm2ext/pixfader.h
+++ b/libs/gtkmm2ext/gtkmm2ext/pixfader.h
@@ -58,6 +58,7 @@ class LIBGTKMM2EXT_API PixFader : public CairoWidget
void on_size_allocate (Gtk::Allocation& alloc);
void render (cairo_t *, cairo_rectangle_t*);
+ bool on_grab_broken_event (GdkEventGrabBroken*);
bool on_button_press_event (GdkEventButton*);
bool on_button_release_event (GdkEventButton*);
bool on_motion_notify_event (GdkEventMotion*);
diff --git a/libs/gtkmm2ext/gtkmm2ext/utils.h b/libs/gtkmm2ext/gtkmm2ext/utils.h
index 5832c91..6ed5d77 100644
--- a/libs/gtkmm2ext/gtkmm2ext/utils.h
+++ b/libs/gtkmm2ext/gtkmm2ext/utils.h
@@ -54,6 +54,7 @@ namespace Gtkmm2ext {
LIBGTKMM2EXT_API std::string fit_to_pixels (const std::string&, int pixel_width, Pango::FontDescription& font, int& actual_width, bool with_ellipses = false);
LIBGTKMM2EXT_API std::pair<std::string, double> fit_to_pixels (cairo_t *, std::string, double);
LIBGTKMM2EXT_API int pixel_width (const std::string& str, Pango::FontDescription& font);
+ LIBGTKMM2EXT_API void pixel_size (const std::string& str, Pango::FontDescription& font, int& width, int& height);
LIBGTKMM2EXT_API void get_ink_pixel_size (Glib::RefPtr<Pango::Layout>,
int& width, int& height);
@@ -100,6 +101,8 @@ namespace Gtkmm2ext {
LIBGTKMM2EXT_API void get_popdown_strings (Gtk::ComboBoxText&,
std::vector<std::string>&);
+ LIBGTKMM2EXT_API size_t get_popdown_string_count (Gtk::ComboBoxText&);
+
LIBGTKMM2EXT_API bool contains_value (Gtk::ComboBoxText&,
const std::string);
diff --git a/libs/gtkmm2ext/macosx/gtkmm2ext/gtkmm2ext.xcodeproj/project.pbxproj b/libs/gtkmm2ext/macosx/gtkmm2ext/gtkmm2ext.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..c7d7540
--- /dev/null
+++ b/libs/gtkmm2ext/macosx/gtkmm2ext/gtkmm2ext.xcodeproj/project.pbxproj
@@ -0,0 +1,254 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXFileReference section */
+ 4397599D19CB06D100740098 /* actions.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = actions.cc; path = ../../actions.cc; sourceTree = "<group>"; };
+ 4397599E19CB06D100740098 /* application.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = application.cc; path = ../../application.cc; sourceTree = "<group>"; };
+ 4397599F19CB06D100740098 /* auto_spin.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = auto_spin.cc; path = ../../auto_spin.cc; sourceTree = "<group>"; };
+ 439759A019CB06D100740098 /* barcontroller.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = barcontroller.cc; path = ../../barcontroller.cc; sourceTree = "<group>"; };
+ 439759A119CB06D100740098 /* bindable_button.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = bindable_button.cc; path = ../../bindable_button.cc; sourceTree = "<group>"; };
+ 439759A219CB06D100740098 /* binding_proxy.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = binding_proxy.cc; path = ../../binding_proxy.cc; sourceTree = "<group>"; };
+ 439759A319CB06D100740098 /* bindings.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = bindings.cc; path = ../../bindings.cc; sourceTree = "<group>"; };
+ 439759A419CB06D100740098 /* cairo_packer.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = cairo_packer.cc; path = ../../cairo_packer.cc; sourceTree = "<group>"; };
+ 439759A519CB06D100740098 /* cairo_widget.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = cairo_widget.cc; path = ../../cairo_widget.cc; sourceTree = "<group>"; };
+ 439759A619CB06D100740098 /* cairocell.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = cairocell.cc; path = ../../cairocell.cc; sourceTree = "<group>"; };
+ 439759A719CB06D100740098 /* cell_renderer_color_selector.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = cell_renderer_color_selector.cc; path = ../../cell_renderer_color_selector.cc; sourceTree = "<group>"; };
+ 439759A819CB06D100740098 /* cell_renderer_pixbuf_multi.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = cell_renderer_pixbuf_multi.cc; path = ../../cell_renderer_pixbuf_multi.cc; sourceTree = "<group>"; };
+ 439759A919CB06D100740098 /* cell_renderer_pixbuf_toggle.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = cell_renderer_pixbuf_toggle.cc; path = ../../cell_renderer_pixbuf_toggle.cc; sourceTree = "<group>"; };
+ 439759AA19CB06D100740098 /* choice.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = choice.cc; path = ../../choice.cc; sourceTree = "<group>"; };
+ 439759AB19CB06D100740098 /* click_box.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = click_box.cc; path = ../../click_box.cc; sourceTree = "<group>"; };
+ 439759AC19CB06D100740098 /* cursors.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = cursors.cc; path = ../../cursors.cc; sourceTree = "<group>"; };
+ 439759AD19CB06D100740098 /* debug.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = debug.cc; path = ../../debug.cc; sourceTree = "<group>"; };
+ 439759AE19CB06D100740098 /* dndtreeview.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = dndtreeview.cc; path = ../../dndtreeview.cc; sourceTree = "<group>"; };
+ 439759AF19CB06D100740098 /* fader.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = fader.cc; path = ../../fader.cc; sourceTree = "<group>"; };
+ 439759B019CB06D100740098 /* fastmeter.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = fastmeter.cc; path = ../../fastmeter.cc; sourceTree = "<group>"; };
+ 439759B119CB06D100740098 /* focus_entry.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = focus_entry.cc; path = ../../focus_entry.cc; sourceTree = "<group>"; };
+ 439759B219CB06D100740098 /* grouped_buttons.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = grouped_buttons.cc; path = ../../grouped_buttons.cc; sourceTree = "<group>"; };
+ 439759B319CB06D100740098 /* gtk_ui.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = gtk_ui.cc; path = ../../gtk_ui.cc; sourceTree = "<group>"; };
+ 439759B419CB06D100740098 /* gtkapplication_quartz.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = gtkapplication_quartz.mm; path = ../../gtkapplication_quartz.mm; sourceTree = "<group>"; };
+ 439759B519CB06D100740098 /* gtkapplication_win32.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = gtkapplication_win32.c; path = ../../gtkapplication_win32.c; sourceTree = "<group>"; };
+ 439759B619CB06D100740098 /* gtkapplication_x11.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = gtkapplication_x11.c; path = ../../gtkapplication_x11.c; sourceTree = "<group>"; };
+ 439759B719CB06D100740098 /* gtkapplication.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = gtkapplication.c; path = ../../gtkapplication.c; sourceTree = "<group>"; };
+ 439759B819CB06D100740098 /* idle_adjustment.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = idle_adjustment.cc; path = ../../idle_adjustment.cc; sourceTree = "<group>"; };
+ 439759B919CB06D100740098 /* keyboard.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = keyboard.cc; path = ../../keyboard.cc; sourceTree = "<group>"; };
+ 439759BB19CB070500740098 /* actions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = actions.h; path = ../../gtkmm2ext/actions.h; sourceTree = "<group>"; };
+ 439759BC19CB070500740098 /* activatable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = activatable.h; path = ../../gtkmm2ext/activatable.h; sourceTree = "<group>"; };
+ 439759BD19CB070500740098 /* application.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = application.h; path = ../../gtkmm2ext/application.h; sourceTree = "<group>"; };
+ 439759BE19CB070500740098 /* auto_spin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = auto_spin.h; path = ../../gtkmm2ext/auto_spin.h; sourceTree = "<group>"; };
+ 439759BF19CB070500740098 /* barcontroller.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = barcontroller.h; path = ../../gtkmm2ext/barcontroller.h; sourceTree = "<group>"; };
+ 439759C019CB070500740098 /* bindable_button.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = bindable_button.h; path = ../../gtkmm2ext/bindable_button.h; sourceTree = "<group>"; };
+ 439759C119CB070500740098 /* binding_proxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = binding_proxy.h; path = ../../gtkmm2ext/binding_proxy.h; sourceTree = "<group>"; };
+ 439759C219CB070500740098 /* bindings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = bindings.h; path = ../../gtkmm2ext/bindings.h; sourceTree = "<group>"; };
+ 439759C319CB070500740098 /* cairo_packer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cairo_packer.h; path = ../../gtkmm2ext/cairo_packer.h; sourceTree = "<group>"; };
+ 439759C419CB070500740098 /* cairo_widget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cairo_widget.h; path = ../../gtkmm2ext/cairo_widget.h; sourceTree = "<group>"; };
+ 439759C519CB070500740098 /* cairocell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cairocell.h; path = ../../gtkmm2ext/cairocell.h; sourceTree = "<group>"; };
+ 439759C619CB070500740098 /* cell_renderer_color_selector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cell_renderer_color_selector.h; path = ../../gtkmm2ext/cell_renderer_color_selector.h; sourceTree = "<group>"; };
+ 439759C719CB070500740098 /* cell_renderer_pixbuf_multi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cell_renderer_pixbuf_multi.h; path = ../../gtkmm2ext/cell_renderer_pixbuf_multi.h; sourceTree = "<group>"; };
+ 439759C819CB070500740098 /* cell_renderer_pixbuf_toggle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cell_renderer_pixbuf_toggle.h; path = ../../gtkmm2ext/cell_renderer_pixbuf_toggle.h; sourceTree = "<group>"; };
+ 439759C919CB070500740098 /* choice.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = choice.h; path = ../../gtkmm2ext/choice.h; sourceTree = "<group>"; };
+ 439759CA19CB070500740098 /* click_box.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = click_box.h; path = ../../gtkmm2ext/click_box.h; sourceTree = "<group>"; };
+ 439759CB19CB070500740098 /* cursors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cursors.h; path = ../../gtkmm2ext/cursors.h; sourceTree = "<group>"; };
+ 439759CC19CB070500740098 /* debug.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = debug.h; path = ../../gtkmm2ext/debug.h; sourceTree = "<group>"; };
+ 439759CD19CB070500740098 /* dndtreeview.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = dndtreeview.h; path = ../../gtkmm2ext/dndtreeview.h; sourceTree = "<group>"; };
+ 439759CE19CB070500740098 /* dndvbox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = dndvbox.h; path = ../../gtkmm2ext/dndvbox.h; sourceTree = "<group>"; };
+ 439759CF19CB070500740098 /* doi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = doi.h; path = ../../gtkmm2ext/doi.h; sourceTree = "<group>"; };
+ 439759D019CB070500740098 /* fader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fader.h; path = ../../gtkmm2ext/fader.h; sourceTree = "<group>"; };
+ 439759D119CB070500740098 /* fastmeter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fastmeter.h; path = ../../gtkmm2ext/fastmeter.h; sourceTree = "<group>"; };
+ 439759D219CB070500740098 /* focus_entry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = focus_entry.h; path = ../../gtkmm2ext/focus_entry.h; sourceTree = "<group>"; };
+ 439759D319CB070500740098 /* grouped_buttons.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = grouped_buttons.h; path = ../../gtkmm2ext/grouped_buttons.h; sourceTree = "<group>"; };
+ 439759D419CB070500740098 /* gtk_ui.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = gtk_ui.h; path = ../../gtkmm2ext/gtk_ui.h; sourceTree = "<group>"; };
+ 439759D519CB070500740098 /* gtkapplication-private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "gtkapplication-private.h"; path = "../../gtkmm2ext/gtkapplication-private.h"; sourceTree = "<group>"; };
+ 439759D619CB070500740098 /* gtkapplication.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = gtkapplication.h; path = ../../gtkmm2ext/gtkapplication.h; sourceTree = "<group>"; };
+ 439759D719CB070500740098 /* gtkutils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = gtkutils.h; path = ../../gtkmm2ext/gtkutils.h; sourceTree = "<group>"; };
+ 439759D819CB070500740098 /* gui_thread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = gui_thread.h; path = ../../gtkmm2ext/gui_thread.h; sourceTree = "<group>"; };
+ 439759D919CB070500740098 /* idle_adjustment.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = idle_adjustment.h; path = ../../gtkmm2ext/idle_adjustment.h; sourceTree = "<group>"; };
+ 439759DA19CB070500740098 /* keyboard.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = keyboard.h; path = ../../gtkmm2ext/keyboard.h; sourceTree = "<group>"; };
+ 439759DB19CB070500740098 /* motionfeedback.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = motionfeedback.h; path = ../../gtkmm2ext/motionfeedback.h; sourceTree = "<group>"; };
+ 439759DC19CB070500740098 /* paths_dialog.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = paths_dialog.h; path = ../../gtkmm2ext/paths_dialog.h; sourceTree = "<group>"; };
+ 439759DD19CB070500740098 /* persistent_tooltip.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = persistent_tooltip.h; path = ../../gtkmm2ext/persistent_tooltip.h; sourceTree = "<group>"; };
+ 439759DE19CB070500740098 /* pixfader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pixfader.h; path = ../../gtkmm2ext/pixfader.h; sourceTree = "<group>"; };
+ 439759DF19CB070500740098 /* pixscroller.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pixscroller.h; path = ../../gtkmm2ext/pixscroller.h; sourceTree = "<group>"; };
+ 439759E019CB070500740098 /* popup.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = popup.h; path = ../../gtkmm2ext/popup.h; sourceTree = "<group>"; };
+ 439759E119CB070500740098 /* prolooks-helpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "prolooks-helpers.h"; path = "../../gtkmm2ext/prolooks-helpers.h"; sourceTree = "<group>"; };
+ 439759E219CB070500740098 /* prompter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = prompter.h; path = ../../gtkmm2ext/prompter.h; sourceTree = "<group>"; };
+ 439759E319CB070500740098 /* rgb_macros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = rgb_macros.h; path = ../../gtkmm2ext/rgb_macros.h; sourceTree = "<group>"; };
+ 439759E419CB070500740098 /* scroomer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = scroomer.h; path = ../../gtkmm2ext/scroomer.h; sourceTree = "<group>"; };
+ 439759E519CB070500740098 /* selector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = selector.h; path = ../../gtkmm2ext/selector.h; sourceTree = "<group>"; };
+ 439759E619CB070500740098 /* slider_controller.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = slider_controller.h; path = ../../gtkmm2ext/slider_controller.h; sourceTree = "<group>"; };
+ 439759E719CB070500740098 /* stateful_button.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = stateful_button.h; path = ../../gtkmm2ext/stateful_button.h; sourceTree = "<group>"; };
+ 439759E819CB070500740098 /* sync-menu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "sync-menu.h"; path = "../../gtkmm2ext/sync-menu.h"; sourceTree = "<group>"; };
+ 439759E919CB070500740098 /* tearoff.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = tearoff.h; path = ../../gtkmm2ext/tearoff.h; sourceTree = "<group>"; };
+ 439759EA19CB070500740098 /* textviewer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = textviewer.h; path = ../../gtkmm2ext/textviewer.h; sourceTree = "<group>"; };
+ 439759EB19CB070500740098 /* treeutils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = treeutils.h; path = ../../gtkmm2ext/treeutils.h; sourceTree = "<group>"; };
+ 439759EC19CB070500740098 /* utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../gtkmm2ext/utils.h; sourceTree = "<group>"; };
+ 439759ED19CB070500740098 /* version.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = version.h; path = ../../gtkmm2ext/version.h; sourceTree = "<group>"; };
+ 439759EE19CB070500740098 /* visibility_tracker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = visibility_tracker.h; path = ../../gtkmm2ext/visibility_tracker.h; sourceTree = "<group>"; };
+ 439759EF19CB070500740098 /* visibility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = visibility.h; path = ../../gtkmm2ext/visibility.h; sourceTree = "<group>"; };
+ 439759F019CB070500740098 /* widget_state.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = widget_state.h; path = ../../gtkmm2ext/widget_state.h; sourceTree = "<group>"; };
+ 439759F119CB070500740098 /* window_title.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = window_title.h; path = ../../gtkmm2ext/window_title.h; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXGroup section */
+ 4397598F19CB06AC00740098 = {
+ isa = PBXGroup;
+ children = (
+ 439759BA19CB06F000740098 /* headers */,
+ 4397599C19CB06B200740098 /* source */,
+ );
+ sourceTree = "<group>";
+ };
+ 4397599C19CB06B200740098 /* source */ = {
+ isa = PBXGroup;
+ children = (
+ 4397599D19CB06D100740098 /* actions.cc */,
+ 4397599E19CB06D100740098 /* application.cc */,
+ 4397599F19CB06D100740098 /* auto_spin.cc */,
+ 439759A019CB06D100740098 /* barcontroller.cc */,
+ 439759A119CB06D100740098 /* bindable_button.cc */,
+ 439759A219CB06D100740098 /* binding_proxy.cc */,
+ 439759A319CB06D100740098 /* bindings.cc */,
+ 439759A419CB06D100740098 /* cairo_packer.cc */,
+ 439759A519CB06D100740098 /* cairo_widget.cc */,
+ 439759A619CB06D100740098 /* cairocell.cc */,
+ 439759A719CB06D100740098 /* cell_renderer_color_selector.cc */,
+ 439759A819CB06D100740098 /* cell_renderer_pixbuf_multi.cc */,
+ 439759A919CB06D100740098 /* cell_renderer_pixbuf_toggle.cc */,
+ 439759AA19CB06D100740098 /* choice.cc */,
+ 439759AB19CB06D100740098 /* click_box.cc */,
+ 439759AC19CB06D100740098 /* cursors.cc */,
+ 439759AD19CB06D100740098 /* debug.cc */,
+ 439759AE19CB06D100740098 /* dndtreeview.cc */,
+ 439759AF19CB06D100740098 /* fader.cc */,
+ 439759B019CB06D100740098 /* fastmeter.cc */,
+ 439759B119CB06D100740098 /* focus_entry.cc */,
+ 439759B219CB06D100740098 /* grouped_buttons.cc */,
+ 439759B319CB06D100740098 /* gtk_ui.cc */,
+ 439759B419CB06D100740098 /* gtkapplication_quartz.mm */,
+ 439759B519CB06D100740098 /* gtkapplication_win32.c */,
+ 439759B619CB06D100740098 /* gtkapplication_x11.c */,
+ 439759B719CB06D100740098 /* gtkapplication.c */,
+ 439759B819CB06D100740098 /* idle_adjustment.cc */,
+ 439759B919CB06D100740098 /* keyboard.cc */,
+ );
+ name = source;
+ sourceTree = "<group>";
+ };
+ 439759BA19CB06F000740098 /* headers */ = {
+ isa = PBXGroup;
+ children = (
+ 439759BB19CB070500740098 /* actions.h */,
+ 439759BC19CB070500740098 /* activatable.h */,
+ 439759BD19CB070500740098 /* application.h */,
+ 439759BE19CB070500740098 /* auto_spin.h */,
+ 439759BF19CB070500740098 /* barcontroller.h */,
+ 439759C019CB070500740098 /* bindable_button.h */,
+ 439759C119CB070500740098 /* binding_proxy.h */,
+ 439759C219CB070500740098 /* bindings.h */,
+ 439759C319CB070500740098 /* cairo_packer.h */,
+ 439759C419CB070500740098 /* cairo_widget.h */,
+ 439759C519CB070500740098 /* cairocell.h */,
+ 439759C619CB070500740098 /* cell_renderer_color_selector.h */,
+ 439759C719CB070500740098 /* cell_renderer_pixbuf_multi.h */,
+ 439759C819CB070500740098 /* cell_renderer_pixbuf_toggle.h */,
+ 439759C919CB070500740098 /* choice.h */,
+ 439759CA19CB070500740098 /* click_box.h */,
+ 439759CB19CB070500740098 /* cursors.h */,
+ 439759CC19CB070500740098 /* debug.h */,
+ 439759CD19CB070500740098 /* dndtreeview.h */,
+ 439759CE19CB070500740098 /* dndvbox.h */,
+ 439759CF19CB070500740098 /* doi.h */,
+ 439759D019CB070500740098 /* fader.h */,
+ 439759D119CB070500740098 /* fastmeter.h */,
+ 439759D219CB070500740098 /* focus_entry.h */,
+ 439759D319CB070500740098 /* grouped_buttons.h */,
+ 439759D419CB070500740098 /* gtk_ui.h */,
+ 439759D519CB070500740098 /* gtkapplication-private.h */,
+ 439759D619CB070500740098 /* gtkapplication.h */,
+ 439759D719CB070500740098 /* gtkutils.h */,
+ 439759D819CB070500740098 /* gui_thread.h */,
+ 439759D919CB070500740098 /* idle_adjustment.h */,
+ 439759DA19CB070500740098 /* keyboard.h */,
+ 439759DB19CB070500740098 /* motionfeedback.h */,
+ 439759DC19CB070500740098 /* paths_dialog.h */,
+ 439759DD19CB070500740098 /* persistent_tooltip.h */,
+ 439759DE19CB070500740098 /* pixfader.h */,
+ 439759DF19CB070500740098 /* pixscroller.h */,
+ 439759E019CB070500740098 /* popup.h */,
+ 439759E119CB070500740098 /* prolooks-helpers.h */,
+ 439759E219CB070500740098 /* prompter.h */,
+ 439759E319CB070500740098 /* rgb_macros.h */,
+ 439759E419CB070500740098 /* scroomer.h */,
+ 439759E519CB070500740098 /* selector.h */,
+ 439759E619CB070500740098 /* slider_controller.h */,
+ 439759E719CB070500740098 /* stateful_button.h */,
+ 439759E819CB070500740098 /* sync-menu.h */,
+ 439759E919CB070500740098 /* tearoff.h */,
+ 439759EA19CB070500740098 /* textviewer.h */,
+ 439759EB19CB070500740098 /* treeutils.h */,
+ 439759EC19CB070500740098 /* utils.h */,
+ 439759ED19CB070500740098 /* version.h */,
+ 439759EE19CB070500740098 /* visibility_tracker.h */,
+ 439759EF19CB070500740098 /* visibility.h */,
+ 439759F019CB070500740098 /* widget_state.h */,
+ 439759F119CB070500740098 /* window_title.h */,
+ );
+ name = headers;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXProject section */
+ 4397599019CB06AC00740098 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0510;
+ };
+ buildConfigurationList = 4397599319CB06AC00740098 /* Build configuration list for PBXProject "gtkmm2ext" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 4397598F19CB06AC00740098;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ );
+ };
+/* End PBXProject section */
+
+/* Begin XCBuildConfiguration section */
+ 4397599419CB06AC00740098 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ 4397599519CB06AC00740098 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 4397599319CB06AC00740098 /* Build configuration list for PBXProject "gtkmm2ext" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 4397599419CB06AC00740098 /* Debug */,
+ 4397599519CB06AC00740098 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 4397599019CB06AC00740098 /* Project object */;
+}
diff --git a/libs/gtkmm2ext/persistent_tooltip.cc b/libs/gtkmm2ext/persistent_tooltip.cc
index d9ccfa1..88be6ef 100644
--- a/libs/gtkmm2ext/persistent_tooltip.cc
+++ b/libs/gtkmm2ext/persistent_tooltip.cc
@@ -21,6 +21,8 @@
#include <gtkmm/label.h>
#include "gtkmm2ext/persistent_tooltip.h"
+#include "pbd/stacktrace.h"
+
#include "i18n.h"
using namespace std;
@@ -28,11 +30,13 @@ using namespace Gtk;
using namespace Gtkmm2ext;
/** @param target The widget to provide the tooltip for */
-PersistentTooltip::PersistentTooltip (Gtk::Widget* target, int margin_y)
+PersistentTooltip::PersistentTooltip (Gtk::Widget* target, bool draggable, int margin_y)
: _target (target)
, _window (0)
, _label (0)
+ , _draggable (draggable)
, _maybe_dragging (false)
+ , _align_to_center (true)
, _margin_y (margin_y)
{
target->signal_enter_notify_event().connect (sigc::mem_fun (*this, &PersistentTooltip::enter), false);
@@ -97,7 +101,7 @@ PersistentTooltip::release (GdkEventButton* ev)
bool
PersistentTooltip::dragging () const
{
- return _maybe_dragging;
+ return _maybe_dragging && _draggable;
}
void
@@ -114,6 +118,7 @@ PersistentTooltip::show ()
if (_tip.empty()) {
return;
}
+
if (!_window) {
_window = new Window (WINDOW_POPUP);
_window->set_name (X_("ContrastingPopup"));
@@ -121,6 +126,7 @@ PersistentTooltip::show ()
_window->set_decorated (false);
_label = manage (new Label);
+ _label->modify_font (_font);
_label->set_use_markup (true);
_window->set_border_width (6);
@@ -136,19 +142,32 @@ PersistentTooltip::show ()
set_tip (_tip);
if (!_window->is_visible ()) {
- int rx, ry, sw;
- sw= gdk_screen_width();
- _target->get_window()->get_origin (rx, ry);
- _window->move (rx, ry + _target->get_height() + _margin_y);
- _window->present ();
+ int rx, ry;
+ int sw = gdk_screen_width ();
+ _target->get_window()->get_origin (rx, ry);
+
/* the window needs to be realized first
* for _window->get_width() to be correct.
*/
+
+
if (sw < rx + _window->get_width()) {
+ /* right edge of window would be off the right edge of
+ the screen, so don't show it in the usual place.
+ */
rx = sw - _window->get_width();
- _window->move (rx, ry + _target->get_height());
+ _window->move (rx, ry + _target->get_height() + _margin_y);
+ } else {
+ if (_align_to_center) {
+ _window->move (rx + (_target->get_width () - _window->get_width ()) / 2, ry + _target->get_height());
+ } else {
+ _window->move (rx, ry + _target->get_height());
+ }
}
+
+ _window->present ();
+
}
}
@@ -161,3 +180,19 @@ PersistentTooltip::set_tip (string t)
_label->set_markup (t);
}
}
+
+void
+PersistentTooltip::set_font (Pango::FontDescription font)
+{
+ _font = font;
+
+ if (_label) {
+ _label->modify_font (_font);
+ }
+}
+
+void
+PersistentTooltip::set_center_alignment (bool align_to_center)
+{
+ _align_to_center = align_to_center;
+}
diff --git a/libs/gtkmm2ext/pixfader.cc b/libs/gtkmm2ext/pixfader.cc
index b140d7b..1e814fd 100644
--- a/libs/gtkmm2ext/pixfader.cc
+++ b/libs/gtkmm2ext/pixfader.cc
@@ -71,7 +71,7 @@ PixFader::PixFader (Gtk::Adjustment& adj, int orientation, int fader_length, int
_adjustment.signal_value_changed().connect (mem_fun (*this, &PixFader::adjustment_changed));
_adjustment.signal_changed().connect (mem_fun (*this, &PixFader::adjustment_changed));
-
+ signal_grab_broken_event ().connect (mem_fun (*this, &PixFader::on_grab_broken_event));
if (_orien == VERT) {
CairoWidget::set_size_request(_girth, _span);
} else {
@@ -366,6 +366,18 @@ PixFader::on_size_allocate (Gtk::Allocation& alloc)
}
bool
+PixFader::on_grab_broken_event (GdkEventGrabBroken* ev)
+{
+ if (_dragging) {
+ remove_modal_grab();
+ _dragging = false;
+ gdk_pointer_ungrab (GDK_CURRENT_TIME);
+ StopGesture ();
+ }
+ return (_tweaks & NoButtonForward) ? true : false;
+}
+
+bool
PixFader::on_button_press_event (GdkEventButton* ev)
{
if (ev->type != GDK_BUTTON_PRESS) {
diff --git a/libs/gtkmm2ext/utils.cc b/libs/gtkmm2ext/utils.cc
index 03396a4..f1616f1 100644
--- a/libs/gtkmm2ext/utils.cc
+++ b/libs/gtkmm2ext/utils.cc
@@ -322,6 +322,16 @@ Gtkmm2ext::get_popdown_strings (Gtk::ComboBoxText& cr, std::vector<std::string>&
}
}
+size_t
+Gtkmm2ext::get_popdown_string_count (Gtk::ComboBoxText& cr)
+{
+ Glib::RefPtr<const Gtk::TreeModel> m = cr.get_model();
+ if (!m) {
+ return 0;
+ }
+ return m->children().size();
+}
+
bool
Gtkmm2ext::contains_value (Gtk::ComboBoxText& cr, const std::string text)
{
@@ -705,6 +715,18 @@ Gtkmm2ext::pixel_width (const string& str, Pango::FontDescription& font)
return width;
}
+void
+Gtkmm2ext::pixel_size (const string& str, Pango::FontDescription& font, int& width, int& height)
+{
+ Gtk::Label foo;
+ Glib::RefPtr<Pango::Layout> layout = foo.create_pango_layout ("");
+
+ layout->set_font_description (font);
+ layout->set_text (str);
+
+ Gtkmm2ext::get_ink_pixel_size (layout, width, height);
+}
+
#if 0
string
Gtkmm2ext::fit_to_pixels (const string& str, int pixel_width, Pango::FontDescription& font, int& actual_width, bool with_ellipses)
diff --git a/libs/gtkmm2ext/fastmeter.cc b/libs/gtkmm2ext/waves_fastmeter.cc
similarity index 85%
copy from libs/gtkmm2ext/fastmeter.cc
copy to libs/gtkmm2ext/waves_fastmeter.cc
index 3d28253..d97a92a 100644
--- a/libs/gtkmm2ext/fastmeter.cc
+++ b/libs/gtkmm2ext/waves_fastmeter.cc
@@ -61,7 +61,7 @@ FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len,
)
: pixheight(0)
, pixwidth(0)
- , _styleflags(styleflags)
+ , _styleflags(1)
, orientation(o)
, hold_cnt(hold)
, hold_state(0)
@@ -101,8 +101,8 @@ FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len,
set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
- pixrect.x = 1;
- pixrect.y = 1;
+ pixrect.x = 0;
+ pixrect.y = 0;
if (!len) {
len = 250;
@@ -110,21 +110,21 @@ FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len,
if (orientation == Vertical) {
pixheight = len;
pixwidth = dimen;
- fgpattern = request_vertical_meter(pixwidth + 2, pixheight + 2, _clr, _stp, _styleflags);
- bgpattern = request_vertical_background (pixwidth + 2, pixheight + 2, _bgc, false);
+ fgpattern = request_vertical_meter(pixwidth, pixheight, _clr, _stp, _styleflags);
+ bgpattern = request_vertical_background (pixwidth, pixheight, _bgc, false);
} else {
pixheight = dimen;
pixwidth = len;
- fgpattern = request_horizontal_meter(pixwidth + 2, pixheight + 2, _clr, _stp, _styleflags);
- bgpattern = request_horizontal_background (pixwidth + 2, pixheight + 2, _bgc, false);
+ fgpattern = request_horizontal_meter(pixwidth, pixheight, _clr, _stp, _styleflags);
+ bgpattern = request_horizontal_background (pixwidth, pixheight, _bgc, false);
}
pixrect.width = pixwidth;
pixrect.height = pixheight;
- request_width = pixrect.width + 2;
- request_height= pixrect.height + 2;
+ request_width = pixrect.width;
+ request_height= pixrect.height;
clear ();
}
@@ -134,18 +134,23 @@ FastMeter::~FastMeter ()
}
void
-FastMeter::flush_pattern_cache () {
+FastMeter::flush_pattern_cache ()
+{
Pattern10Map::iterator i1;
PatternBgMap::iterator ib;
+
for (ib = hb_pattern_cache.begin(); ib != hb_pattern_cache.end(); ++ib) {
hb_pattern_cache.erase(ib);
}
+
for (i1 = hm_pattern_cache.begin(); i1 != hm_pattern_cache.end(); ++i1) {
hm_pattern_cache.erase(i1);
}
+
for (ib = vb_pattern_cache.begin(); ib != vb_pattern_cache.end(); ++ib) {
vb_pattern_cache.erase(ib);
}
+
for (i1 = vm_pattern_cache.begin(); i1 != vm_pattern_cache.end(); ++i1) {
vm_pattern_cache.erase(i1);
}
@@ -372,13 +377,13 @@ FastMeter::request_vertical_meter(
Cairo::RefPtr<Cairo::Pattern>
FastMeter::request_vertical_background(
- int width, int height, int *bgc, bool shade)
+ int width, int height, int *bgc, bool /*shade */)
{
height = max(height, min_pattern_metric_size);
height = min(height, max_pattern_metric_size);
height += 2;
- const PatternBgMapKey key (width, height, bgc[0], bgc[1], shade);
+ const PatternBgMapKey key (width, height, bgc[0], bgc[1], false);
PatternBgMap::iterator i;
if ((i = vb_pattern_cache.find (key)) != vb_pattern_cache.end()) {
return i->second;
@@ -386,7 +391,7 @@ FastMeter::request_vertical_background(
// TODO flush pattern cache if it gets too large
Cairo::RefPtr<Cairo::Pattern> p = generate_meter_background (
- width, height, bgc, shade, false);
+ width, height, bgc, false, false);
vb_pattern_cache[key] = p;
return p;
@@ -420,13 +425,13 @@ FastMeter::request_horizontal_meter(
Cairo::RefPtr<Cairo::Pattern>
FastMeter::request_horizontal_background(
- int width, int height, int *bgc, bool shade)
+ int width, int height, int *bgc, bool /* shade */)
{
width = max(width, min_pattern_metric_size);
width = min(width, max_pattern_metric_size);
width += 2;
- const PatternBgMapKey key (width, height, bgc[0], bgc[1], shade);
+ const PatternBgMapKey key (width, height, bgc[0], bgc[1], false);
PatternBgMap::iterator i;
if ((i = hb_pattern_cache.find (key)) != hb_pattern_cache.end()) {
return i->second;
@@ -434,7 +439,7 @@ FastMeter::request_horizontal_background(
// TODO flush pattern cache if it gets too large
Cairo::RefPtr<Cairo::Pattern> p = generate_meter_background (
- height, width, bgc, shade, true);
+ height, width, bgc, false, true);
hb_pattern_cache[key] = p;
@@ -517,9 +522,9 @@ FastMeter::vertical_size_allocate (Gtk::Allocation &alloc)
if (pixheight != h) {
fgpattern = request_vertical_meter (request_width, h, _clr, _stp, _styleflags);
- bgpattern = request_vertical_background (request_width, h, highlight ? _bgh : _bgc, highlight);
- pixheight = h - 2;
- pixwidth = request_width - 2;
+ bgpattern = request_vertical_background (request_width, h, highlight ? _bgh : _bgc, false);
+ pixheight = h;
+ pixwidth = request_width;
}
CairoWidget::on_size_allocate (alloc);
@@ -542,9 +547,9 @@ FastMeter::horizontal_size_allocate (Gtk::Allocation &alloc)
if (pixwidth != w) {
fgpattern = request_horizontal_meter (w, request_height, _clr, _stp, _styleflags);
- bgpattern = request_horizontal_background (w, request_height, highlight ? _bgh : _bgc, highlight);
- pixwidth = w - 2;
- pixheight = request_height - 2;
+ bgpattern = request_horizontal_background (w, request_height, highlight ? _bgh : _bgc, false);
+ pixwidth = w;
+ pixheight = request_height;
}
CairoWidget::on_size_allocate (alloc);
@@ -564,13 +569,12 @@ void
FastMeter::vertical_expose (cairo_t* cr, cairo_rectangle_t* area)
{
gint top_of_meter;
- GdkRectangle intersection;
- GdkRectangle background;
- GdkRectangle eventarea;
+ // GdkRectangle background;
+ // GdkRectangle eventarea;
- cairo_set_source_rgb (cr, 0, 0, 0); // black
- rounded_rectangle (cr, 0, 0, pixwidth + 2, pixheight + 2, 2);
- cairo_stroke (cr);
+ //cairo_set_source_rgb (cr, 0, 0, 0); // black
+ //rounded_rectangle (cr, 0, 0, pixwidth + 2, pixheight + 2, 2);
+ //cairo_stroke (cr);
top_of_meter = (gint) floor (pixheight * current_level);
@@ -578,44 +582,52 @@ FastMeter::vertical_expose (cairo_t* cr, cairo_rectangle_t* area)
*/
pixrect.height = top_of_meter;
- pixrect.y = 1 + pixheight - top_of_meter;
-
- background.x = 1;
- background.y = 1;
- background.width = pixrect.width;
- background.height = pixheight - top_of_meter;
-
- eventarea.x = area->x;
- eventarea.y = area->y;
- eventarea.width = area->width;
- eventarea.height = area->height;
-
- if (gdk_rectangle_intersect (&background, &eventarea, &intersection)) {
- cairo_set_source (cr, bgpattern->cobj());
- cairo_rectangle (cr, intersection.x, intersection.y, intersection.width, intersection.height);
- cairo_fill (cr);
- }
-
- if (gdk_rectangle_intersect (&pixrect, &eventarea, &intersection)) {
+ pixrect.y = pixheight - top_of_meter;
+
+ // background.x = 0;
+ // background.y = 0;
+ // background.width = pixrect.width;
+ // background.height = pixheight - top_of_meter;
+
+ // eventarea.x = area->x;
+ // eventarea.y = area->y;
+ // eventarea.width = area->width;
+ // eventarea.height = area->height;
+
+ // Switching to CAIRO we would like to draw on the container's bkg.
+ // if (gdk_rectangle_intersect (&background, &eventarea, &intersection)) {
+ // cairo_set_source (cr, bgpattern->cobj());
+ // cairo_rectangle (cr, intersection.x, intersection.y, intersection.width, intersection.height);
+ // cairo_fill (cr);
+ // }
+
+ // MEMO: Normaly MATURE OS clips so called invalidated rects itself making APP free of
+ // heavy operations which OS does with graphic HW
+
+ // NOTE FROM PAUL: GTK does clip already. The invalidated rect isn't the only area
+ // we want to clip to however, which is why this object/class is called FastMeter.
+ // I have left stuff commented out as I found it when I merged from Ardour in August 2014,
+ // but this commenting and the previous MEMO comment represent a misunderstanding
+ // of what this code is doing.
+
+ // if (gdk_rectangle_intersect (&pixrect, &eventarea, &intersection)) {
// draw the part of the meter image that we need. the area we draw is bounded "in reverse" (top->bottom)
- cairo_set_source (cr, fgpattern->cobj());
- cairo_rectangle (cr, intersection.x, intersection.y, intersection.width, intersection.height);
+ //cairo_set_source (cr, fgpattern->cobj());
+ cairo_set_source_rgba (cr, 0.69, 0.69, 0.69, 1);
+ cairo_rectangle (cr, pixrect.x, pixrect.y, pixrect.width, pixrect.height);
cairo_fill (cr);
- }
+ //}
// draw peak bar
if (hold_state) {
- last_peak_rect.x = 1;
+ last_peak_rect.x = 0;
last_peak_rect.width = pixwidth;
- last_peak_rect.y = max(1, 1 + pixheight - (int) floor (pixheight * current_peak));
- if (_styleflags & 2) { // LED stripes
- last_peak_rect.y = max(0, (last_peak_rect.y & (~1)));
- }
+ last_peak_rect.y = max(0, pixheight - (gint) floor (pixheight * current_peak));
if (bright_hold || (_styleflags & 2)) {
- last_peak_rect.height = max(0, min(3, pixheight - last_peak_rect.y - 1 ));
+ last_peak_rect.height = max(0, min(3, pixheight - last_peak_rect.y ));
} else {
- last_peak_rect.height = max(0, min(2, pixheight - last_peak_rect.y - 1 ));
+ last_peak_rect.height = max(0, min(2, pixheight - last_peak_rect.y ));
}
cairo_set_source (cr, fgpattern->cobj());
@@ -637,13 +649,10 @@ void
FastMeter::horizontal_expose (cairo_t* cr, cairo_rectangle_t* area)
{
gint right_of_meter;
- GdkRectangle intersection;
- GdkRectangle background;
- GdkRectangle eventarea;
- cairo_set_source_rgb (cr, 0, 0, 0); // black
- rounded_rectangle (cr, 0, 0, pixwidth + 2, pixheight + 2, 2);
- cairo_stroke (cr);
+ //cairo_set_source_rgb (cr, 0, 0, 0); // black
+ //rounded_rectangle (cr, 0, 0, pixwidth + 2, pixheight + 2, 2);
+ //cairo_stroke (cr);
right_of_meter = (gint) floor (pixwidth * current_level);
@@ -652,28 +661,6 @@ FastMeter::horizontal_expose (cairo_t* cr, cairo_rectangle_t* area)
pixrect.width = right_of_meter;
- background.x = 1 + right_of_meter;
- background.y = 1;
- background.width = pixwidth - right_of_meter;
- background.height = pixheight;
-
- eventarea.x = area->x;
- eventarea.y = area->y;
- eventarea.width = area->width;
- eventarea.height = area->height;
-
- if (gdk_rectangle_intersect (&background, &eventarea, &intersection)) {
- cairo_set_source (cr, bgpattern->cobj());
- cairo_rectangle (cr, intersection.x, intersection.y, intersection.width, intersection.height);
- cairo_fill (cr);
- }
-
- if (gdk_rectangle_intersect (&pixrect, &eventarea, &intersection)) {
- cairo_set_source (cr, fgpattern->cobj());
- cairo_rectangle (cr, intersection.x, intersection.y, intersection.width, intersection.height);
- cairo_fill (cr);
- }
-
// draw peak bar
if (hold_state) {
@@ -730,9 +717,7 @@ FastMeter::set (float lvl, float peak)
current_level = lvl;
- const float pixscale = (orientation == Vertical) ? pixheight : pixwidth;
-#define PIX(X) floor(pixscale * (X))
- if (PIX(current_level) == PIX(old_level) && PIX(current_peak) == PIX(old_peak) && (hold_state == 0 || peak != -1)) {
+ if (current_level == old_level && current_peak == old_peak && (hold_state == 0 || peak != -1)) {
return;
}
@@ -757,10 +742,10 @@ FastMeter::queue_vertical_redraw (const Glib::RefPtr<Gdk::Window>& win, float ol
gint new_top = (gint) floor (pixheight * current_level);
- rect.x = 1;
+ rect.x = 0;
rect.width = pixwidth;
rect.height = new_top;
- rect.y = 1 + pixheight - new_top;
+ rect.y = pixheight - new_top;
if (current_level > old_level) {
/* colored/pixbuf got larger, just draw the new section */
@@ -809,10 +794,7 @@ FastMeter::queue_vertical_redraw (const Glib::RefPtr<Gdk::Window>& win, float ol
queue = true;
}
rect.x = 1;
- rect.y = max(1, 1 + pixheight - (int) floor (pixheight * current_peak));
- if (_styleflags & 2) { // LED stripes
- rect.y = max(0, (rect.y & (~1)));
- }
+ rect.y = max(1, 1 + pixheight - (gint) floor (pixheight * current_peak));
if (bright_hold || (_styleflags & 2)) {
rect.height = max(0, min(3, pixheight - last_peak_rect.y -1 ));
} else {
@@ -910,9 +892,9 @@ FastMeter::set_highlight (bool onoff)
}
highlight = onoff;
if (orientation == Vertical) {
- bgpattern = request_vertical_background (pixwidth + 2, pixheight + 2, highlight ? _bgh : _bgc, highlight);
+ bgpattern = request_vertical_background (pixwidth + 2, pixheight + 2, highlight ? _bgh : _bgc, false);
} else {
- bgpattern = request_horizontal_background (pixwidth + 2, pixheight + 2, highlight ? _bgh : _bgc, highlight);
+ bgpattern = request_horizontal_background (pixwidth + 2, pixheight + 2, highlight ? _bgh : _bgc, false);
}
queue_draw ();
}
diff --git a/libs/gtkmm2ext/wscript b/libs/gtkmm2ext/wscript
index bbe4ae5..b7545c3 100644
--- a/libs/gtkmm2ext/wscript
+++ b/libs/gtkmm2ext/wscript
@@ -41,7 +41,6 @@ gtkmm2ext_sources = [
'debug.cc',
'dndtreeview.cc',
'emscale.cc',
- 'fastmeter.cc',
'focus_entry.cc',
'grouped_buttons.cc',
'gtk_ui.cc',
@@ -85,12 +84,18 @@ def configure(conf):
def build(bld):
+ sources = gtkmm2ext_sources
+ if bld.is_tracks_build():
+ sources += [ 'waves_fastmeter.cc', 'fader.cc' ]
+ else:
+ sources += [ 'fastmeter.cc' ]
+
if bld.is_defined ('INTERNAL_SHARED_LIBS'):
- obj = bld.shlib(features = 'c cxx cshlib cxxshlib', source=gtkmm2ext_sources)
+ obj = bld.shlib(features = 'c cxx cshlib cxxshlib', source=sources)
# defines for this library
obj.defines = [ 'LIBGTKMM2EXT_DLL_EXPORTS', 'ABSTRACT_UI_EXPORTS' ]
else:
- obj = bld.stlib(features = 'c cxx cstlib cxxstlib', source=gtkmm2ext_sources)
+ obj = bld.stlib(features = 'c cxx cstlib cxxstlib', source=sources)
obj.cxxflags = [ '-fPIC' ]
obj.defines = [ ]
@@ -99,7 +104,7 @@ def build(bld):
obj.name = 'libgtkmm2ext'
obj.target = 'gtkmm2ext'
obj.uselib = 'GTKMM GTK GTKOSX OSX GDK'
- obj.use = [ 'libpbd' ]
+ obj.use = [ 'libpbd', 'libardour' ]
obj.vnum = GTKMM2EXT_LIB_VERSION
obj.install_path = bld.env['LIBDIR']
obj.defines += [
diff --git a/libs/midi++2/macosx/midi++.xcodeproj/project.pbxproj b/libs/midi++2/macosx/midi++.xcodeproj/midi++.xcodeproj/project.pbxproj
similarity index 100%
copy from libs/midi++2/macosx/midi++.xcodeproj/project.pbxproj
copy to libs/midi++2/macosx/midi++.xcodeproj/midi++.xcodeproj/project.pbxproj
diff --git a/libs/panners/1in2out/panner_1in2out.cc b/libs/panners/1in2out/panner_1in2out.cc
index 2d5489f..50c058b 100644
--- a/libs/panners/1in2out/panner_1in2out.cc
+++ b/libs/panners/1in2out/panner_1in2out.cc
@@ -51,6 +51,7 @@
#include "ardour/buffer_set.h"
#include "ardour/audio_buffer.h"
#include "ardour/pannable.h"
+#include "ardour/profile.h"
#include "i18n.h"
#include "panner_1in2out.h"
@@ -75,8 +76,10 @@ extern "C" ARDOURPANNER_API PanPluginDescriptor* panner_descriptor () { return
Panner1in2out::Panner1in2out (boost::shared_ptr<Pannable> p)
: Panner (p)
{
- if (!_pannable->has_state()) {
+ if (!Profile->get_trx () ) {
+ if (!_pannable->has_state ()) {
_pannable->pan_azimuth_control->set_value (0.5);
+ }
}
update ();
diff --git a/libs/panners/wscript b/libs/panners/wscript
index f3ce6e6..feedfa3 100644
--- a/libs/panners/wscript
+++ b/libs/panners/wscript
@@ -1,14 +1,15 @@
#!/usr/bin/env python
from waflib.extras import autowaf as autowaf
+from waflib import Options
import os
# Mandatory variables
top = '.'
out = 'build'
-panners = [ '2in2out', '1in2out', 'vbap', 'stereobalance' ]
def options(opt):
+
autowaf.set_options(opt)
def sub_config_and_use(conf, name, has_objects = True):
@@ -19,9 +20,19 @@ def configure(conf):
autowaf.set_recursive()
autowaf.configure(conf)
+ if conf.is_tracks_build():
+ panners = [ '1in2out', 'vbap', 'stereobalance' ]
+ else:
+ panners = [ '2in2out', '1in2out', 'vbap', 'stereobalance' ]
+
for i in panners:
sub_config_and_use(conf, i)
def build(bld):
+ if bld.is_tracks_build():
+ panners = [ '1in2out', 'vbap', 'stereobalance' ]
+ else:
+ panners = [ '2in2out', '1in2out', 'vbap', 'stereobalance' ]
+
for i in panners:
bld.recurse(i)
diff --git a/libs/pbd/MSVCpbd/pbd.vcproj b/libs/pbd/MSVCpbd/pbd.vcproj
index 07bb5fa..e03b18a 100644
--- a/libs/pbd/MSVCpbd/pbd.vcproj
+++ b/libs/pbd/MSVCpbd/pbd.vcproj
@@ -62,7 +62,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="$(DllPrefix)giomm32$(GlibmmDllSuffix)D.lib $(DllPrefix)glibmm32$(GlibmmDllSuffix)D.lib pthreadVCE2.lib $(DllPrefix)gio32$(GlibDllSuffix)D.lib $(DllPrefix)glib32$(GlibDllSuffix)D.lib $(DllPrefix)gobject32$(GlibDllSuffix)D.lib $(DllPrefix)sigc++32-2.0D.lib libxml2D.lib libsndfile-1D.lib intlD.lib ws2_32.lib"
+ AdditionalDependencies="$(DllPrefix)giomm32$(GlibmmDllSuffix)D.lib $(DllPrefix)glibmm32$(GlibmmDllSuffix)D.lib pthreadVCE2.lib $(DllPrefix)gio32$(GlibDllSuffix)D.lib $(DllPrefix)glib32$(GlibDllSuffix)D.lib $(DllPrefix)gobject32$(GlibDllSuffix)D.lib $(DllPrefix)sigc++32-2.0D.lib libxml2D.lib libsndfile-1D.lib intlD.lib ws2_32.lib dbghelp.lib"
OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32D.dll"
AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
GenerateDebugInformation="true"
diff --git a/libs/pbd/cartesian.cc b/libs/pbd/cartesian.cc
index def1786..c228cf3 100644
--- a/libs/pbd/cartesian.cc
+++ b/libs/pbd/cartesian.cc
@@ -41,13 +41,12 @@ PBD::spherical_to_cartesian (double azi, double ele, double len, double& x, doub
void
PBD::cartesian_to_spherical (double x, double y, double z, double& azimuth, double& elevation, double& length)
{
-#if 1
/* converts cartesian coordinates to cylindrical in degrees*/
double rho, theta, phi;
rho = sqrt (x*x + y*y + z*z);
- phi = acos (1.0/rho);
+ //phi = acos (1.0 / rho);
theta = atan2 (y, x);
/* XXX for now, clamp phi to zero */
@@ -67,46 +66,5 @@ PBD::cartesian_to_spherical (double x, double y, double z, double& azimuth, doub
}
length = rho;
-#else
- /* converts cartesian coordinates to cylindrical in degrees*/
-
- const double atorad = 2.0 * M_PI / 360.0;
- double atan_y_per_x, atan_x_pl_y_per_z;
- double distance;
-
- if (x == 0.0) {
- atan_y_per_x = M_PI / 2;
- } else {
- atan_y_per_x = atan2 (y,x);
- }
-
- if (y < 0.0) {
- /* below x-axis: atan2 returns 0 .. -PI (negative) so convert to degrees and ADD to 180 */
- azimuth = 180.0 + (atan_y_per_x / (M_PI/180.0) + 180.0);
- } else {
- /* above x-axis: atan2 returns 0 .. +PI so convert to degrees */
- azimuth = atan_y_per_x / atorad;
- }
-
- distance = sqrt (x*x + y*y);
-
- if (z == 0.0) {
- atan_x_pl_y_per_z = 0.0;
- } else {
- atan_x_pl_y_per_z = atan2 (z,distance);
- }
-
- if (distance == 0.0) {
- if (z < 0.0) {
- atan_x_pl_y_per_z = -M_PI/2.0;
- } else if (z > 0.0) {
- atan_x_pl_y_per_z = M_PI/2.0;
- }
- }
-
- elevation = atan_x_pl_y_per_z / atorad;
-
- // distance = sqrtf (x*x + y*y + z*z);
-#endif
}
diff --git a/libs/pbd/debug.cc b/libs/pbd/debug.cc
index 25ebb64..b42e7f0 100644
--- a/libs/pbd/debug.cc
+++ b/libs/pbd/debug.cc
@@ -54,6 +54,24 @@ DebugBits PBD::DEBUG::AbstractUI = PBD::new_debug_bit ("abstractui");
DebugBits PBD::DEBUG::FileUtils = PBD::new_debug_bit ("fileutils");
DebugBits PBD::DEBUG::Configuration = PBD::new_debug_bit ("configuration");
+/* These are debug bits that are used by backends. Since these are loaded dynamically,
+ after command-line parsing, defining them in code that is part of the backend
+ doesn't make them available for command line parsing. Put them here.
+
+ This is sort of a hack, because it means that the debug bits aren't defined
+ with the code in which they are relevant. But providing access to debug bits
+ from dynamically loaded code, for use in command line parsing, is way above the pay grade
+ of this debug tracing scheme.
+*/
+DebugBits PBD::DEBUG::BackendMIDI = PBD::new_debug_bit ("BackendMIDI");
+DebugBits PBD::DEBUG::BackendAudio = PBD::new_debug_bit ("BackendAudio");
+DebugBits PBD::DEBUG::BackendTiming = PBD::new_debug_bit ("BackendTiming");
+DebugBits PBD::DEBUG::BackendThreads = PBD::new_debug_bit ("BackendThreads");
+
+
+DebugBits PBD::DEBUG::WavesMIDI = PBD::new_debug_bit ("WavesMIDI");
+DebugBits PBD::DEBUG::WavesAudio = PBD::new_debug_bit ("WavesAudio");
+
DebugBits PBD::debug_bits;
DebugBits
diff --git a/libs/pbd/file_utils.cc b/libs/pbd/file_utils.cc
index 25d6759..a83d116 100644
--- a/libs/pbd/file_utils.cc
+++ b/libs/pbd/file_utils.cc
@@ -343,6 +343,17 @@ copy_recurse(const std::string & from_path, const std::string & to_dir)
}
}
+bool
+touch_file (const std::string& path)
+{
+ int fd = g_open (path.c_str(), O_RDWR|O_CREAT, 0660);
+ if (fd >= 0) {
+ close (fd);
+ return true;
+ }
+ return false;
+}
+
std::string
get_absolute_path (const std::string & p)
{
diff --git a/libs/pbd/fpu.cc b/libs/pbd/fpu.cc
index 4db7acd..13f0ea6 100644
--- a/libs/pbd/fpu.cc
+++ b/libs/pbd/fpu.cc
@@ -29,6 +29,7 @@
#include <intrin.h>
#endif
+#include "pbd/compose.h"
#include "pbd/fpu.h"
#include "pbd/error.h"
@@ -37,145 +38,231 @@
using namespace PBD;
using namespace std;
-FPU::FPU ()
+FPU* FPU::_instance (0);
+
+#if ( (defined __x86_64__) || (defined __i386__) || (defined _M_X64) || (defined _M_IX86) ) // ARCH_X86
+#ifndef PLATFORM_WINDOWS
+
+/* use __cpuid() as the name to match the MSVC/mingw intrinsic */
+
+static void
+__cpuid(int regs[4], int cpuid_leaf)
{
- unsigned long cpuflags = 0;
+ int eax, ebx, ecx, edx;
+ asm volatile (
+#if defined(__i386__)
+ "pushl %%ebx;\n\t"
+#endif
+ "movl %4, %%eax;\n\t"
+ "cpuid;\n\t"
+ "movl %%eax, %0;\n\t"
+ "movl %%ebx, %1;\n\t"
+ "movl %%ecx, %2;\n\t"
+ "movl %%edx, %3;\n\t"
+#if defined(__i386__)
+ "popl %%ebx;\n\t"
+#endif
+ :"=m" (eax), "=m" (ebx), "=m" (ecx), "=m" (edx)
+ :"r" (cpuid_leaf)
+ :"%eax",
+#if !defined(__i386__)
+ "%ebx",
+#endif
+ "%ecx", "%edx");
+
+ regs[0] = eax;
+ regs[1] = ebx;
+ regs[2] = ecx;
+ regs[3] = edx;
+}
+
+#endif /* !PLATFORM_WINDOWS */
- _flags = Flags (0);
+#ifndef COMPILER_MSVC
+
+static uint64_t
+_xgetbv (uint32_t xcr)
+{
+#ifdef __APPLE__
+ /* it would be nice to make this work on OS X but as long we use veclib,
+ we don't really need to know about SSE/AVX on that platform.
+ */
+ return 0;
+#else
+ uint32_t eax, edx;
+ __asm__ volatile ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (xcr));
+ return (static_cast<uint64_t>(edx) << 32) | eax;
+#endif
+}
+
+#endif /* !COMPILER_MSVC */
+#endif /* ARCH_X86 */
+
+#ifndef _XCR_XFEATURE_ENABLED_MASK
+#define _XCR_XFEATURE_ENABLED_MASK 0
+#endif
+
+FPU*
+FPU::instance()
+{
+ if (!_instance) {
+ _instance = new FPU;
+ }
+
+ return _instance;
+}
+
+FPU::FPU ()
+ : _flags ((Flags) 0)
+{
+ if (_instance) {
+ error << _("FPU object instantiated more than once") << endmsg;
+ }
#if !( (defined __x86_64__) || (defined __i386__) || (defined _M_X64) || (defined _M_IX86) ) // !ARCH_X86
+ /* Non-Intel architecture, nothing to do here */
return;
#else
-#ifdef PLATFORM_WINDOWS
+ /* Get the CPU vendor just for kicks */
- // Get CPU flags using Microsoft function
- // It works for both 64 and 32 bit systems
- // no need to use assembler for getting info from register, this function does this for us
- int cpuInfo[4];
- __cpuid (cpuInfo, 1);
- cpuflags = cpuInfo[3];
+ // __cpuid with an InfoType argument of 0 returns the number of
+ // valid Ids in CPUInfo[0] and the CPU identification string in
+ // the other three array elements. The CPU identification string is
+ // not in linear order. The code below arranges the information
+ // in a human readable form. The human readable order is CPUInfo[1] |
+ // CPUInfo[3] | CPUInfo[2]. CPUInfo[2] and CPUInfo[3] are swapped
+ // before using memcpy to copy these three array elements to cpu_string.
-#else
+ int cpu_info[4];
+ char cpu_string[48];
+ string cpu_vendor;
-#ifndef _LP64 /* *nix; 32 bit version. This odd macro constant is required because we need something that identifies this as a 32 bit
- build on Linux and on OS X. Anything that serves this purpose will do, but this is the best thing we've identified
- so far.
- */
-
- asm volatile (
- "mov $1, %%eax\n"
- "pushl %%ebx\n"
- "cpuid\n"
- "movl %%edx, %0\n"
- "popl %%ebx\n"
- : "=r" (cpuflags)
- :
- : "%eax", "%ecx", "%edx"
- );
+ __cpuid (cpu_info, 0);
+
+ int num_ids = cpu_info[0];
+ std::swap(cpu_info[2], cpu_info[3]);
+ memcpy(cpu_string, &cpu_info[1], 3 * sizeof(cpu_info[1]));
+ cpu_vendor.assign(cpu_string, 3 * sizeof(cpu_info[1]));
+
+ info << string_compose (_("CPU vendor: %1"), cpu_vendor) << endmsg;
+
+ if (num_ids > 0) {
-#else /* *nix; 64 bit version */
+ /* Now get CPU/FPU flags */
- /* asm notes: although we explicitly save&restore rbx, we must tell
- gcc that ebx,rbx is clobbered so that it doesn't try to use it as an intermediate
- register when storing rbx. gcc 4.3 didn't make this "mistake", but gcc 4.4
- does, at least on x86_64.
- */
-
- asm volatile (
- "pushq %%rbx\n"
- "movq $1, %%rax\n"
- "cpuid\n"
- "movq %%rdx, %0\n"
- "popq %%rbx\n"
- : "=r" (cpuflags)
- :
- : "%rax", "%rbx", "%rcx", "%rdx"
- );
-
-#endif /* _LP64 */
-#endif /* PLATFORM_WINDOWS */
-
- if (cpuflags & (1<<25)) {
- _flags = Flags (_flags | (HasSSE|HasFlushToZero));
- }
+ __cpuid (cpu_info, 1);
- if (cpuflags & (1<<26)) {
- _flags = Flags (_flags | HasSSE2);
- }
+ if ((cpu_info[2] & (1<<27)) /* AVX */ &&
+ (cpu_info[2] & (1<<28) /* (OS)XSAVE */) &&
+ (_xgetbv (_XCR_XFEATURE_ENABLED_MASK) & 0x6)) { /* OS really supports XSAVE */
+ info << _("AVX-capable processor") << endmsg;
+ _flags = Flags (_flags | (HasAVX) );
+ }
+
+ if (cpu_info[3] & (1<<25)) {
+ _flags = Flags (_flags | (HasSSE|HasFlushToZero));
+ }
+
+ if (cpu_info[3] & (1<<26)) {
+ _flags = Flags (_flags | HasSSE2);
+ }
- if (cpuflags & (1 << 24)) {
+ /* Figure out CPU/FPU denormal handling capabilities */
+
+ if (cpu_info[3] & (1 << 24)) {
- char** fxbuf = 0;
+ char** fxbuf = 0;
- /* DAZ wasn't available in the first version of SSE. Since
- setting a reserved bit in MXCSR causes a general protection
- fault, we need to be able to check the availability of this
- feature without causing problems. To do this, one needs to
- set up a 512-byte area of memory to save the SSE state to,
- using fxsave, and then one needs to inspect bytes 28 through
- 31 for the MXCSR_MASK value. If bit 6 is set, DAZ is
- supported, otherwise, it isn't.
- */
+ /* DAZ wasn't available in the first version of SSE. Since
+ setting a reserved bit in MXCSR causes a general protection
+ fault, we need to be able to check the availability of this
+ feature without causing problems. To do this, one needs to
+ set up a 512-byte area of memory to save the SSE state to,
+ using fxsave, and then one needs to inspect bytes 28 through
+ 31 for the MXCSR_MASK value. If bit 6 is set, DAZ is
+ supported, otherwise, it isn't.
+ */
#ifndef HAVE_POSIX_MEMALIGN
# ifdef PLATFORM_WINDOWS
- fxbuf = (char **) _aligned_malloc (sizeof (char *), 16);
- assert (fxbuf);
- *fxbuf = (char *) _aligned_malloc (512, 16);
- assert (*fxbuf);
+ fxbuf = (char **) _aligned_malloc (sizeof (char *), 16);
+ assert (fxbuf);
+ *fxbuf = (char *) _aligned_malloc (512, 16);
+ assert (*fxbuf);
# else
# warning using default malloc for aligned memory
- fxbuf = (char **) malloc (sizeof (char *));
- assert (fxbuf);
- *fxbuf = (char *) malloc (512);
- assert (*fxbuf);
+ fxbuf = (char **) malloc (sizeof (char *));
+ assert (fxbuf);
+ *fxbuf = (char *) malloc (512);
+ assert (*fxbuf);
# endif
#else
- (void) posix_memalign ((void **) &fxbuf, 16, sizeof (char *));
- assert (fxbuf);
- (void) posix_memalign ((void **) fxbuf, 16, 512);
- assert (*fxbuf);
+ (void) posix_memalign ((void **) &fxbuf, 16, sizeof (char *));
+ assert (fxbuf);
+ (void) posix_memalign ((void **) fxbuf, 16, 512);
+ assert (*fxbuf);
#endif
- memset (*fxbuf, 0, 512);
+ memset (*fxbuf, 0, 512);
#ifdef COMPILER_MSVC
- char *buf = *fxbuf;
- __asm {
- mov eax, buf
- fxsave [eax]
- };
+ char *buf = *fxbuf;
+ __asm {
+ mov eax, buf
+ fxsave [eax]
+ };
#else
- asm volatile (
- "fxsave (%0)"
- :
- : "r" (*fxbuf)
- : "memory"
- );
+ asm volatile (
+ "fxsave (%0)"
+ :
+ : "r" (*fxbuf)
+ : "memory"
+ );
#endif
- uint32_t mxcsr_mask = *((uint32_t*) &((*fxbuf)[28]));
+ uint32_t mxcsr_mask = *((uint32_t*) &((*fxbuf)[28]));
- /* if the mask is zero, set its default value (from intel specs) */
+ /* if the mask is zero, set its default value (from intel specs) */
- if (mxcsr_mask == 0) {
- mxcsr_mask = 0xffbf;
- }
+ if (mxcsr_mask == 0) {
+ mxcsr_mask = 0xffbf;
+ }
- if (mxcsr_mask & (1<<6)) {
- _flags = Flags (_flags | HasDenormalsAreZero);
- }
+ if (mxcsr_mask & (1<<6)) {
+ _flags = Flags (_flags | HasDenormalsAreZero);
+ }
#if !defined HAVE_POSIX_MEMALIGN && defined PLATFORM_WINDOWS
- _aligned_free (*fxbuf);
- _aligned_free (fxbuf);
+ _aligned_free (*fxbuf);
+ _aligned_free (fxbuf);
#else
- free (*fxbuf);
- free (fxbuf);
+ free (*fxbuf);
+ free (fxbuf);
#endif
+ }
+
+ /* finally get the CPU brand */
+
+ __cpuid (cpu_info, 0x80000000);
+
+ const int parameter_end = 0x80000004;
+ string cpu_brand;
+
+ if (cpu_info[0] >= parameter_end) {
+ char* cpu_string_ptr = cpu_string;
+
+ for (int parameter = 0x80000002; parameter <= parameter_end &&
+ cpu_string_ptr < &cpu_string[sizeof(cpu_string)]; parameter++) {
+ __cpuid(cpu_info, parameter);
+ memcpy(cpu_string_ptr, cpu_info, sizeof(cpu_info));
+ cpu_string_ptr += sizeof(cpu_info);
+ }
+ cpu_brand.assign(cpu_string, cpu_string_ptr - cpu_string);
+ info << string_compose (_("CPU brand: %1"), cpu_brand) << endmsg;
+ }
}
-#endif
+#endif /* !ARCH_X86 */
}
FPU::~FPU ()
diff --git a/libs/pbd/macosx/pbd.xcodeproj/project.pbxproj b/libs/pbd/macosx/pbd.xcodeproj/pbd.xcodeproj/project.pbxproj
similarity index 97%
copy from libs/pbd/macosx/pbd.xcodeproj/project.pbxproj
copy to libs/pbd/macosx/pbd.xcodeproj/pbd.xcodeproj/project.pbxproj
index 535d16b..8487e53 100644
--- a/libs/pbd/macosx/pbd.xcodeproj/project.pbxproj
+++ b/libs/pbd/macosx/pbd.xcodeproj/pbd.xcodeproj/project.pbxproj
@@ -7,6 +7,8 @@
objects = {
/* Begin PBXBuildFile section */
+ 43D8CBC91A6E6B0E00ABE168 /* signals.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43D8CBC71A6E6B0E00ABE168 /* signals.cc */; };
+ 43D8CBCA1A6E6B0E00ABE168 /* signals.h in Headers */ = {isa = PBXBuildFile; fileRef = 43D8CBC81A6E6B0E00ABE168 /* signals.h */; };
6941206F0B8A34AB00AF661E /* base_ui.cc in Sources */ = {isa = PBXBuildFile; fileRef = 694120270B8A34AB00AF661E /* base_ui.cc */; };
694120700B8A34AB00AF661E /* basename.cc in Sources */ = {isa = PBXBuildFile; fileRef = 694120280B8A34AB00AF661E /* basename.cc */; };
694120710B8A34AB00AF661E /* command.cc in Sources */ = {isa = PBXBuildFile; fileRef = 694120290B8A34AB00AF661E /* command.cc */; };
@@ -95,6 +97,8 @@
/* Begin PBXFileReference section */
089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
32BAE0B70371A74B00C91783 /* pbd_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pbd_Prefix.pch; sourceTree = "<group>"; };
+ 43D8CBC71A6E6B0E00ABE168 /* signals.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = signals.cc; path = ../signals.cc; sourceTree = "<group>"; };
+ 43D8CBC81A6E6B0E00ABE168 /* signals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = signals.h; sourceTree = "<group>"; };
694120270B8A34AB00AF661E /* base_ui.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = base_ui.cc; path = ../base_ui.cc; sourceTree = SOURCE_ROOT; };
694120280B8A34AB00AF661E /* basename.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = basename.cc; path = ../basename.cc; sourceTree = SOURCE_ROOT; };
694120290B8A34AB00AF661E /* command.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = command.cc; path = ../command.cc; sourceTree = SOURCE_ROOT; };
@@ -245,6 +249,7 @@
08FB77ACFE841707C02AAC07 /* Source */ = {
isa = PBXGroup;
children = (
+ 43D8CBC71A6E6B0E00ABE168 /* signals.cc */,
69C63C140B9369CB00BC0BCA /* strreplace.cc */,
694120270B8A34AB00AF661E /* base_ui.cc */,
694120280B8A34AB00AF661E /* basename.cc */,
@@ -281,6 +286,7 @@
694120360B8A34AB00AF661E /* pbd */ = {
isa = PBXGroup;
children = (
+ 43D8CBC81A6E6B0E00ABE168 /* signals.h */,
69C63C180B9369DE00BC0BCA /* replace_all.h */,
694120380B8A34AB00AF661E /* abstract_ui.cc */,
694120390B8A34AB00AF661E /* abstract_ui.h */,
@@ -386,6 +392,7 @@
694120A70B8A34AB00AF661E /* transmitter.h in Headers */,
694120A80B8A34AB00AF661E /* undo.h in Headers */,
694120A90B8A34AB00AF661E /* whitespace.h in Headers */,
+ 43D8CBCA1A6E6B0E00ABE168 /* signals.h in Headers */,
694120AA0B8A34AB00AF661E /* xml++.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -418,8 +425,15 @@
/* Begin PBXProject section */
0867D690FE84028FC02AAC07 /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ };
buildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "pbd" */;
+ compatibilityVersion = "Xcode 2.4";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 0867D691FE84028FC02AAC07 /* pbd */;
productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */;
projectDirPath = "";
@@ -456,6 +470,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 43D8CBC91A6E6B0E00ABE168 /* signals.cc in Sources */,
69C63C2B0B936A6E00BC0BCA /* version.cc in Sources */,
6941206F0B8A34AB00AF661E /* base_ui.cc in Sources */,
69C63C150B9369CB00BC0BCA /* strreplace.cc in Sources */,
diff --git a/libs/pbd/macosx/pbd.xcodeproj/project.pbxproj b/libs/pbd/macosx/pbd.xcodeproj/project.pbxproj
index 535d16b..8487e53 100644
--- a/libs/pbd/macosx/pbd.xcodeproj/project.pbxproj
+++ b/libs/pbd/macosx/pbd.xcodeproj/project.pbxproj
@@ -7,6 +7,8 @@
objects = {
/* Begin PBXBuildFile section */
+ 43D8CBC91A6E6B0E00ABE168 /* signals.cc in Sources */ = {isa = PBXBuildFile; fileRef = 43D8CBC71A6E6B0E00ABE168 /* signals.cc */; };
+ 43D8CBCA1A6E6B0E00ABE168 /* signals.h in Headers */ = {isa = PBXBuildFile; fileRef = 43D8CBC81A6E6B0E00ABE168 /* signals.h */; };
6941206F0B8A34AB00AF661E /* base_ui.cc in Sources */ = {isa = PBXBuildFile; fileRef = 694120270B8A34AB00AF661E /* base_ui.cc */; };
694120700B8A34AB00AF661E /* basename.cc in Sources */ = {isa = PBXBuildFile; fileRef = 694120280B8A34AB00AF661E /* basename.cc */; };
694120710B8A34AB00AF661E /* command.cc in Sources */ = {isa = PBXBuildFile; fileRef = 694120290B8A34AB00AF661E /* command.cc */; };
@@ -95,6 +97,8 @@
/* Begin PBXFileReference section */
089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
32BAE0B70371A74B00C91783 /* pbd_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pbd_Prefix.pch; sourceTree = "<group>"; };
+ 43D8CBC71A6E6B0E00ABE168 /* signals.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = signals.cc; path = ../signals.cc; sourceTree = "<group>"; };
+ 43D8CBC81A6E6B0E00ABE168 /* signals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = signals.h; sourceTree = "<group>"; };
694120270B8A34AB00AF661E /* base_ui.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = base_ui.cc; path = ../base_ui.cc; sourceTree = SOURCE_ROOT; };
694120280B8A34AB00AF661E /* basename.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = basename.cc; path = ../basename.cc; sourceTree = SOURCE_ROOT; };
694120290B8A34AB00AF661E /* command.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = command.cc; path = ../command.cc; sourceTree = SOURCE_ROOT; };
@@ -245,6 +249,7 @@
08FB77ACFE841707C02AAC07 /* Source */ = {
isa = PBXGroup;
children = (
+ 43D8CBC71A6E6B0E00ABE168 /* signals.cc */,
69C63C140B9369CB00BC0BCA /* strreplace.cc */,
694120270B8A34AB00AF661E /* base_ui.cc */,
694120280B8A34AB00AF661E /* basename.cc */,
@@ -281,6 +286,7 @@
694120360B8A34AB00AF661E /* pbd */ = {
isa = PBXGroup;
children = (
+ 43D8CBC81A6E6B0E00ABE168 /* signals.h */,
69C63C180B9369DE00BC0BCA /* replace_all.h */,
694120380B8A34AB00AF661E /* abstract_ui.cc */,
694120390B8A34AB00AF661E /* abstract_ui.h */,
@@ -386,6 +392,7 @@
694120A70B8A34AB00AF661E /* transmitter.h in Headers */,
694120A80B8A34AB00AF661E /* undo.h in Headers */,
694120A90B8A34AB00AF661E /* whitespace.h in Headers */,
+ 43D8CBCA1A6E6B0E00ABE168 /* signals.h in Headers */,
694120AA0B8A34AB00AF661E /* xml++.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -418,8 +425,15 @@
/* Begin PBXProject section */
0867D690FE84028FC02AAC07 /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ };
buildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "pbd" */;
+ compatibilityVersion = "Xcode 2.4";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 0867D691FE84028FC02AAC07 /* pbd */;
productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */;
projectDirPath = "";
@@ -456,6 +470,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 43D8CBC91A6E6B0E00ABE168 /* signals.cc in Sources */,
69C63C2B0B936A6E00BC0BCA /* version.cc in Sources */,
6941206F0B8A34AB00AF661E /* base_ui.cc in Sources */,
69C63C150B9369CB00BC0BCA /* strreplace.cc in Sources */,
diff --git a/libs/pbd/malign.cc b/libs/pbd/malign.cc
index a11a23f..4be9f0a 100644
--- a/libs/pbd/malign.cc
+++ b/libs/pbd/malign.cc
@@ -38,6 +38,15 @@ static const int CPU_CACHE_ALIGN = 16; /* arguably 32 on most arches, but it mat
int cache_aligned_malloc (void** memptr, size_t size)
{
#ifndef HAVE_POSIX_MEMALIGN
+#ifdef PLATFORM_WINDOWS
+ if (((*memptr) = _aligned_malloc (size, CPU_CACHE_ALIGN)) == 0) {
+ fatal << string_compose (_("Memory allocation error: malloc (%1 * %2) failed (%3)"),
+ CPU_CACHE_ALIGN, size, strerror (errno)) << endmsg;
+ return errno;
+ } else {
+ return 0;
+ }
+#else
if (((*memptr) = malloc (size)) == 0) {
fatal << string_compose (_("Memory allocation error: malloc (%1 * %2) failed (%3)"),
CPU_CACHE_ALIGN, size, strerror (errno)) << endmsg;
@@ -45,6 +54,7 @@ int cache_aligned_malloc (void** memptr, size_t size)
} else {
return 0;
}
+#endif
#else
if (posix_memalign (memptr, CPU_CACHE_ALIGN, size)) {
fatal << string_compose (_("Memory allocation error: posix_memalign (%1 * %2) failed (%3)"),
@@ -54,3 +64,51 @@ int cache_aligned_malloc (void** memptr, size_t size)
return 0;
#endif
}
+
+void cache_aligned_free (void* memptr)
+{
+#ifdef PLATFORM_WINDOWS
+ _aligned_free (memptr);
+#else
+ free (memptr);
+#endif
+}
+
+int aligned_malloc (void** memptr, size_t size, size_t alignment)
+{
+#ifndef HAVE_POSIX_MEMALIGN
+#ifdef PLATFORM_WINDOWS
+ if (((*memptr) = _aligned_malloc (size, alignment)) == 0) {
+ fatal << string_compose (_("Memory allocation error: malloc (%1 * %2) failed (%3)"),
+ alignment, size, strerror (errno)) << endmsg;
+ return errno;
+ } else {
+ return 0;
+ }
+#else
+ if (((*memptr) = malloc (size)) == 0) {
+ fatal << string_compose (_("Memory allocation error: malloc (%1 * %2) failed (%3)"),
+ alignment, size, strerror (errno)) << endmsg;
+ return errno;
+ } else {
+ return 0;
+ }
+#endif
+#else
+ if (posix_memalign (memptr, alignment, size)) {
+ fatal << string_compose (_("Memory allocation error: posix_memalign (%1 * %2) failed (%3)"),
+ alignment, size, strerror (errno)) << endmsg;
+ }
+
+ return 0;
+#endif
+}
+
+void aligned_free (void* memptr)
+{
+#ifdef PLATFORM_WINDOWS
+ _aligned_free (memptr);
+#else
+ free (memptr);
+#endif
+}
diff --git a/libs/pbd/pbd/atomic_counter.h b/libs/pbd/pbd/atomic_counter.h
index 1e1998e..019ff85 100644
--- a/libs/pbd/pbd/atomic_counter.h
+++ b/libs/pbd/pbd/atomic_counter.h
@@ -41,7 +41,7 @@ public:
gint get() const
{
- return g_atomic_int_get (&m_value);
+ return g_atomic_int_get (const_cast<gint*>(&m_value));
}
void set (gint new_value)
@@ -90,7 +90,7 @@ public:
private:
// Has to be mutable when using the apple version of gcc.
- mutable volatile gint m_value;
+ gint m_value;
};
diff --git a/libs/pbd/pbd/debug.h b/libs/pbd/pbd/debug.h
index e4fa525..cc3fbdc 100644
--- a/libs/pbd/pbd/debug.h
+++ b/libs/pbd/pbd/debug.h
@@ -28,9 +28,13 @@
#include "pbd/libpbd_visibility.h"
#include "pbd/timing.h"
+#if defined(COMPILER_MSVC) && !defined(PTW32_VERSION)
+#include <ardourext/pthread.h> // Gets us 'PTW32_VERSION'
+#endif
+
namespace PBD {
- typedef std::bitset<64> DebugBits;
+ typedef std::bitset<128> DebugBits;
LIBPBD_API extern DebugBits debug_bits;
LIBPBD_API DebugBits new_debug_bit (const char* name);
@@ -51,6 +55,16 @@ namespace PBD {
LIBPBD_API extern DebugBits AbstractUI;
LIBPBD_API extern DebugBits Configuration;
LIBPBD_API extern DebugBits FileUtils;
+
+ LIBPBD_API extern DebugBits BackendMIDI;
+ LIBPBD_API extern DebugBits BackendAudio;
+ LIBPBD_API extern DebugBits BackendTiming;
+ LIBPBD_API extern DebugBits BackendThreads;
+
+ /* See notes in ../debug.cc on why these are defined here */
+
+ LIBPBD_API extern DebugBits WavesMIDI;
+ LIBPBD_API extern DebugBits WavesAudio;
}
}
diff --git a/libs/pbd/pbd/file_utils.h b/libs/pbd/pbd/file_utils.h
index 761d8d4..b55b9fd 100644
--- a/libs/pbd/pbd/file_utils.h
+++ b/libs/pbd/pbd/file_utils.h
@@ -182,6 +182,14 @@ LIBPBD_API void copy_files(const std::string & from_path, const std::string & to
LIBPBD_API void copy_recurse(const std::string & from_path, const std::string & to_dir);
/**
+ * Update the access and modification times of file at @path, creating file if it
+ * doesn't already exist.
+ * @path file path to touch
+ * @return true if file exists or was created and access time updated.
+ */
+LIBPBD_API bool touch_file (const std::string& path);
+
+/**
* Take a (possibly) relative path and make it absolute
* @return An absolute path
*/
diff --git a/libs/pbd/pbd/fpu.h b/libs/pbd/pbd/fpu.h
index 6627951..4ab1a83 100644
--- a/libs/pbd/pbd/fpu.h
+++ b/libs/pbd/pbd/fpu.h
@@ -30,20 +30,27 @@ class LIBPBD_API FPU {
HasFlushToZero = 0x1,
HasDenormalsAreZero = 0x2,
HasSSE = 0x4,
- HasSSE2 = 0x8
+ HasSSE2 = 0x8,
+ HasAVX = 0x10
};
public:
- FPU ();
~FPU ();
+ static FPU* instance();
+
bool has_flush_to_zero () const { return _flags & HasFlushToZero; }
bool has_denormals_are_zero () const { return _flags & HasDenormalsAreZero; }
bool has_sse () const { return _flags & HasSSE; }
bool has_sse2 () const { return _flags & HasSSE2; }
+ bool has_avx () const { return _flags & HasAVX; }
private:
Flags _flags;
+
+ static FPU* _instance;
+
+ FPU ();
};
}
diff --git a/libs/pbd/pbd/malign.h b/libs/pbd/pbd/malign.h
index 07f42f5..09d182f 100644
--- a/libs/pbd/pbd/malign.h
+++ b/libs/pbd/pbd/malign.h
@@ -24,6 +24,10 @@
#include "pbd/libpbd_visibility.h"
-LIBPBD_API int cache_aligned_malloc (void** memptr, size_t size);
+LIBPBD_API int cache_aligned_malloc (void** memptr, size_t size);
+LIBPBD_API void cache_aligned_free (void* memptr);
+
+LIBPBD_API int aligned_malloc (void** memptr, size_t size, size_t alignment);
+LIBPBD_API void aligned_free (void* memptr);
#endif /* __pbd_malign_h__ */
diff --git a/libs/pbd/pbd/pool.h b/libs/pbd/pbd/pool.h
index cfd782a..aff3f7e 100644
--- a/libs/pbd/pbd/pool.h
+++ b/libs/pbd/pbd/pool.h
@@ -129,7 +129,7 @@ class LIBPBD_API PerThreadPool
void create_per_thread_pool (std::string name, unsigned long item_size, unsigned long nitems);
CrossThreadPool* per_thread_pool (bool must_exist = true);
-
+ bool has_per_thread_pool ();
void set_trash (RingBuffer<CrossThreadPool*>* t);
void add_to_trash (CrossThreadPool *);
diff --git a/libs/pbd/pool.cc b/libs/pbd/pool.cc
index 020f296..ccdb85b 100644
--- a/libs/pbd/pool.cc
+++ b/libs/pbd/pool.cc
@@ -175,6 +175,20 @@ PerThreadPool::create_per_thread_pool (string n, unsigned long isize, unsigned l
_key.set (new CrossThreadPool (n, isize, nitems, this));
}
+/** @return True if CrossThreadPool for the current thread exists,
+ * False otherwise
+ */
+bool
+PerThreadPool::has_per_thread_pool ()
+{
+ CrossThreadPool* p = _key.get();
+ if (p) {
+ return true;
+ }
+ return false;
+}
+
+
/** @return CrossThreadPool for the current thread, which must previously have been created by
* calling create_per_thread_pool in the current thread.
*/
diff --git a/libs/pbd/stacktrace.cc b/libs/pbd/stacktrace.cc
index c74dd94..181b7d1 100644
--- a/libs/pbd/stacktrace.cc
+++ b/libs/pbd/stacktrace.cc
@@ -20,10 +20,19 @@
#include "libpbd-config.h"
#include "pbd/stacktrace.h"
+#include "pbd/debug.h"
+#include "pbd/compose.h"
+#include "pbd/pthread_utils.h"
+
#include <cstdio>
#include <iostream>
#include <string>
+#ifdef PLATFORM_WINDOWS
+#include <windows.h>
+#include <dbghelp.h>
+#endif
+
void
PBD::trace_twb ()
{
@@ -103,6 +112,69 @@ PBD::stacktrace (std::ostream& out, int levels)
}
}
+#elif defined (PLATFORM_WINDOWS)
+
+#if defined DEBUG && !defined CaptureStackBackTrace
+#define CaptureStackBackTrace RtlCaptureStackBackTrace
+
+extern "C" {
+ __declspec(dllimport) USHORT WINAPI CaptureStackBackTrace (
+ ULONG FramesToSkip,
+ ULONG FramesToCapture,
+ PVOID *BackTrace,
+ PULONG BackTraceHash
+ );
+}
+#endif
+
+std::string
+PBD::demangle (std::string const & l) /* JE - !!!! 'PBD' namespace might possibly get removed (except it's still used in 'libs/canvas/item.cc') */
+{
+ return std::string();
+}
+
+void
+PBD::stacktrace( std::ostream& out, int)
+{
+#ifdef DEBUG
+ const size_t levels = 62; // does not support more then 62 levels of stacktrace
+ unsigned int i;
+ void * stack[ levels ];
+ unsigned short frames;
+ SYMBOL_INFO * symbol;
+ HANDLE process;
+
+ process = GetCurrentProcess();
+ out << "+++++Backtrace process: " << DEBUG_THREAD_SELF << std::endl;
+
+ SymInitialize( process, NULL, TRUE );
+
+ frames = CaptureStackBackTrace( 0, levels, stack, NULL );
+
+ out << "+++++Backtrace frames: " << frames << std::endl;
+
+ symbol = ( SYMBOL_INFO * )calloc( sizeof( SYMBOL_INFO ) + 256 * sizeof( char ), 1 );
+ symbol->MaxNameLen = 255;
+ symbol->SizeOfStruct = sizeof( SYMBOL_INFO );
+
+ for( i = 0; i < frames; i++ )
+ {
+ SymFromAddr( process, ( DWORD64 )( stack[ i ] ), 0, symbol );
+ out << string_compose( "%1: %2 - %3\n", frames - i - 1, symbol->Name, symbol->Address );
+ }
+
+ out.flush();
+
+ free( symbol );
+#endif
+}
+
+void
+c_stacktrace ()
+{
+ PBD::stacktrace (std::cout);
+}
+
#else
std::string
diff --git a/libs/pbd/system_exec.cc b/libs/pbd/system_exec.cc
index 721db98..abe5fd2 100644
--- a/libs/pbd/system_exec.cc
+++ b/libs/pbd/system_exec.cc
@@ -363,13 +363,10 @@ SystemExec::make_wargs(char **a) {
char **tmp = ++a;
while (tmp && *tmp) {
wa.append(" \"");
- std::string arg(*tmp);
- size_t start_pos = 0;
- while((start_pos = arg.find("\\", start_pos)) != std::string::npos) {
- arg.replace(start_pos, 1, "\\\\");
- start_pos += 2;
+ wa.append(*tmp);
+ if (strlen(*tmp) > 0 && (*tmp)[strlen(*tmp) - 1] == '\\') {
+ wa.append("\\");
}
- wa.append(arg);
wa.append("\"");
tmp++;
}
diff --git a/libs/pbd/test/filesystem_test.cc b/libs/pbd/test/filesystem_test.cc
index 2c2de94..31f6865 100644
--- a/libs/pbd/test/filesystem_test.cc
+++ b/libs/pbd/test/filesystem_test.cc
@@ -6,8 +6,11 @@
#include <unistd.h>
#include <stdlib.h>
+#include <fcntl.h>
+
#include <glibmm/miscutils.h>
#include <glibmm/fileutils.h>
+#include <glibmm/convert.h>
#include "pbd/file_utils.h"
#include "pbd/pathexpand.h"
@@ -105,11 +108,12 @@ FilesystemTest::testCopyFileUTF8Filename ()
cerr << "Copying " << i18n_files.size() << " test files from: "
<< i18n_path.to_string () << endl;
+ string output_dir = test_output_directory ("CopyFile");
+
for (vector<string>::iterator i = i18n_files.begin(); i != i18n_files.end(); ++i) {
string input_path = *i;
string output_file = Glib::path_get_basename(*i);
- string output_path = test_output_directory ("CopyFile");
- output_path = Glib::build_filename (output_path, output_file);
+ string output_path = Glib::build_filename (output_dir, output_file);
cerr << "Copying test file: " << input_path
<< " To " << output_path << endl;
@@ -119,6 +123,105 @@ FilesystemTest::testCopyFileUTF8Filename ()
}
void
+FilesystemTest::testOpenFileUTF8Filename ()
+{
+ vector<string> i18n_files;
+
+ Searchpath i18n_path (test_search_path ());
+ i18n_path.add_subdirectory_to_paths ("i18n_test");
+
+ PBD::find_files_matching_pattern (i18n_files, i18n_path, "*.tst");
+
+ CPPUNIT_ASSERT (i18n_files.size () == 8);
+
+ cerr << endl;
+ cerr << "Opening " << i18n_files.size ()
+ << " test files from: " << i18n_path.to_string () << endl;
+
+ // check that g_open will successfully open all the test files
+ for (vector<string>::iterator i = i18n_files.begin (); i != i18n_files.end ();
+ ++i) {
+ string input_path = *i;
+
+ cerr << "Opening file: " << input_path << " with g_open" << endl;
+
+ int fdgo = g_open (input_path.c_str(), O_RDONLY, 0444);
+
+ CPPUNIT_ASSERT (fdgo != -1);
+
+ if (fdgo >= 0) {
+ ::close (fdgo);
+ }
+ }
+
+#ifdef PLATFORM_WINDOWS
+ // This test is here to prove and remind us that using Glib::locale_from_utf8
+ // to convert a utf-8 encoded file path for use with ::open will not work
+ // for all file paths.
+ //
+ // It may be possible to convert a string that is utf-8 encoded that will not
+ // work with ::open(on windows) to a string that will work with ::open using
+ // Glib::locale_from_utf8 string if all the characters that are contained
+ // in the utf-8 string can be found/mapped in the system code page.
+ //
+ // European locales that only have a small amount of extra characters with
+ // accents/umlauts I'm guessing will be more likely succeed but CJK locales
+ // will almost certainly fail
+
+ bool conversion_failed = false;
+
+ for (vector<string>::iterator i = i18n_files.begin (); i != i18n_files.end ();
+ ++i) {
+ string input_path = *i;
+ cerr << "Opening file: " << input_path << " with locale_from_utf8 and ::open "
+ << endl;
+ string converted_input_path;
+ int fdo;
+
+ try {
+ // this will fail for utf8 that contains characters that aren't
+ // representable in the system code page
+ converted_input_path = Glib::locale_from_utf8 (input_path);
+ // conversion succeeded so we expect ::open to be successful if the
+ // current C library locale is the same as the system locale, which
+ // it should be as we haven't changed it.
+ fdo = ::open (converted_input_path.c_str (), O_RDONLY, 0444);
+ CPPUNIT_ASSERT (fdo != -1);
+
+ if (converted_input_path != input_path) {
+ cerr << "Character set conversion succeeded and strings differ for input "
+ "string: " << input_path << endl;
+ // file path must have contained non-ASCII characters that were mapped
+ // from the system code page so we would expect the original
+ // utf-8 file path to fail with ::open
+ int fd2 = ::open (input_path.c_str (), O_RDONLY, 0444);
+ CPPUNIT_ASSERT (fd2 == -1);
+ }
+
+ } catch (const Glib::ConvertError& err) {
+ cerr << "Character set conversion failed: " << err.what () << endl;
+ // I am confident that on Windows with the test data that no locale will
+ // have a system code page containing all the characters required
+ // and conversion will fail for at least one of the filenames
+ conversion_failed = true;
+ // CPPUNIT_ASSERT (err.code() == ?);
+
+ // conversion failed so we expect the original utf-8 string to fail
+ // with ::open on Windows as the file path will not exist
+ fdo = ::open (input_path.c_str (), O_RDONLY, 0444);
+ CPPUNIT_ASSERT (fdo == -1);
+ }
+
+ if (fdo >= 0) {
+ ::close (fdo);
+ }
+ }
+ // we expect at least one conversion failure with the filename test data
+ CPPUNIT_ASSERT (conversion_failed);
+#endif
+}
+
+void
FilesystemTest::testFindFilesMatchingPattern ()
{
vector<string> patch_files;
diff --git a/libs/pbd/test/filesystem_test.h b/libs/pbd/test/filesystem_test.h
index 180149d..c200bb2 100644
--- a/libs/pbd/test/filesystem_test.h
+++ b/libs/pbd/test/filesystem_test.h
@@ -7,6 +7,7 @@ class FilesystemTest : public CppUnit::TestFixture
CPPUNIT_TEST (testPathIsWithin);
CPPUNIT_TEST (testCopyFileASCIIFilename);
CPPUNIT_TEST (testCopyFileUTF8Filename);
+ CPPUNIT_TEST (testOpenFileUTF8Filename);
CPPUNIT_TEST (testFindFilesMatchingPattern);
CPPUNIT_TEST (testClearDirectory);
CPPUNIT_TEST (testRemoveDirectory);
@@ -17,6 +18,7 @@ public:
void testPathIsWithin ();
void testCopyFileASCIIFilename ();
void testCopyFileUTF8Filename ();
+ void testOpenFileUTF8Filename ();
void testFindFilesMatchingPattern ();
void testClearDirectory ();
void testRemoveDirectory ();
diff --git a/libs/pbd/test/xml_test.cc b/libs/pbd/test/xml_test.cc
new file mode 100644
index 0000000..c32cf96
--- /dev/null
+++ b/libs/pbd/test/xml_test.cc
@@ -0,0 +1,79 @@
+#include "xml_test.h"
+
+#include <glib.h>
+#include <glib/gstdio.h>
+
+#include <unistd.h>
+#include <stdlib.h>
+
+#ifdef PLATFORM_WINDOWS
+#include <fcntl.h>
+#endif
+
+#include <glibmm/miscutils.h>
+#include <glibmm/fileutils.h>
+#include <glibmm/convert.h>
+
+#include <libxml/xpath.h>
+
+#include "pbd/file_utils.h"
+
+#include "test_common.h"
+
+using namespace std;
+using namespace PBD;
+
+CPPUNIT_TEST_SUITE_REGISTRATION (XMLTest);
+
+namespace {
+
+xmlChar* xml_version = xmlCharStrdup("1.0");
+
+bool
+write_xml(const string& filename)
+{
+ xmlDocPtr doc;
+ int result;
+
+ xmlKeepBlanksDefault(0);
+ doc = xmlNewDoc(xml_version);
+
+ result = xmlSaveFormatFileEnc(filename.c_str(), doc, "UTF-8", 1);
+
+ xmlFreeDoc(doc);
+
+ if (result == -1) {
+ return false;
+ }
+ return true;
+}
+
+}
+
+void
+XMLTest::testXMLFilenameEncoding ()
+{
+ vector<string> i18n_files;
+
+ Searchpath i18n_path(test_search_path());
+ i18n_path.add_subdirectory_to_paths("i18n_test");
+
+ PBD::find_files_matching_pattern (i18n_files, i18n_path, "*.tst");
+
+ CPPUNIT_ASSERT (i18n_files.size() == 8);
+
+ string output_dir = test_output_directory ("XMLFilenameEncodingUTF8");
+
+ // This is testing that libxml expects the filename encoding to be utf-8
+ // on Windows and that writing the xml files should be successful for all
+ // the filenames in the test data set but it should also work for other
+ // platforms as well
+ for (vector<string>::iterator i = i18n_files.begin (); i != i18n_files.end ();
+ ++i) {
+ string input_path = *i;
+ string output_filename = Glib::path_get_basename (input_path);
+ string output_path = Glib::build_filename (output_dir, output_filename);
+
+ CPPUNIT_ASSERT (write_xml (output_path));
+ }
+}
diff --git a/libs/canvas/test/xml.h b/libs/pbd/test/xml_test.h
similarity index 62%
copy from libs/canvas/test/xml.h
copy to libs/pbd/test/xml_test.h
index fbe606c..43619d3 100644
--- a/libs/canvas/test/xml.h
+++ b/libs/pbd/test/xml_test.h
@@ -4,14 +4,9 @@
class XMLTest : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE (XMLTest);
- CPPUNIT_TEST (get);
- CPPUNIT_TEST (set);
+ CPPUNIT_TEST (testXMLFilenameEncoding);
CPPUNIT_TEST_SUITE_END ();
public:
- void get ();
- void set ();
-
-private:
- void check (std::string const &);
+ void testXMLFilenameEncoding ();
};
diff --git a/libs/pbd/wscript b/libs/pbd/wscript
index 8f947fb..b12210b 100644
--- a/libs/pbd/wscript
+++ b/libs/pbd/wscript
@@ -96,7 +96,8 @@ def configure(conf):
conf.check(function_name='getmntent', header_name='mntent.h', define_name='HAVE_GETMNTENT',mandatory=False)
conf.check(header_name='execinfo.h', define_name='HAVE_EXECINFO',mandatory=False)
conf.check(header_name='unistd.h', define_name='HAVE_UNISTD',mandatory=False)
- conf.check_cc(function_name='posix_memalign', header_name='stdlib.h', cflags='-D_XOPEN_SOURCE=600', define_name='HAVE_POSIX_MEMALIGN', mandatory=False)
+ if not Options.options.ppc:
+ conf.check_cc(function_name='posix_memalign', header_name='stdlib.h', cflags='-D_XOPEN_SOURCE=600', define_name='HAVE_POSIX_MEMALIGN', mandatory=False)
conf.check(function_name='localtime_r', header_name='time.h', define_name='HAVE_LOCALTIME_R',mandatory=False)
conf.write_config_header('libpbd-config.h', remove=False)
@@ -145,6 +146,7 @@ def build(bld):
if bld.env['build_target'] == 'x86_64':
obj.defines += [ 'USE_X86_64_ASM' ]
if bld.env['build_target'] == 'mingw':
+ obj.defines += [ 'NO_POSIX_MEMALIGN' ]
obj.source += [ 'windows_special_dirs.cc' ]
obj.uselib += ' OLE'
@@ -160,6 +162,7 @@ def build(bld):
test/timer_test.cc
test/convert_test.cc
test/filesystem_test.cc
+ test/xml_test.cc
test/test_common.cc
'''.split()
testobj.target = 'run-tests'
diff --git a/libs/ptformat/MSVCptformat/ptformat.vcproj b/libs/ptformat/MSVCptformat/ptformat.vcproj
new file mode 100644
index 0000000..55623e3
--- /dev/null
+++ b/libs/ptformat/MSVCptformat/ptformat.vcproj
@@ -0,0 +1,296 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="ptformat"
+ ProjectGUID="{A0955F90-3AB8-4192-9ADB-5C4FDE6083AC}"
+ RootNamespace="ptformat"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug 32|Win32"
+ OutputDirectory="$(ProjectDir)\$(ConfigurationName)\bin"
+ IntermediateDirectory="$(ProjectDir)\$(ConfigurationName)\obj\$(ProjectName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="..\..\..\MSVCMixbus3\MSVCMixbus3.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
+ Optimization="0"
+ AdditionalIncludeDirectories="..;..\..\pbd;"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_PTFORMAT;LIBPTFORMAT_DLL_EXPORTS;NOMINMAX;INCLUDE_ARDOUR_MISCELLANEOUS=1;USE_CAIRO_IMAGE_SURFACE;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ MinimalRebuild="true"
+ RuntimeLibrary="3"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ CompileAs="2"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="pthreadVCE2.lib ws2_32.lib"
+ OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32-0D.dll"
+ AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /Y "$(OutDir)\$(TargetName).dll" "$(Debug32TargetFolder)\$(TargetName).dll"
copy /Y "$(OutDir)\$(TargetName).dll" "$(Debug32TestSuiteFolder)\$(TargetName).dll"
copy /Y "$(OutDir)\$(TargetName).lib" "$(GenericWin32LibraryFolder)\$(TargetName).lib"
"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release 32|Win32"
+ OutputDirectory="$(ProjectDir)\$(ConfigurationName)\bin"
+ IntermediateDirectory="$(ProjectDir)\$(ConfigurationName)\obj\$(ProjectName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="..\..\..\MSVCMixbus3\MSVCMixbus3.vsprops"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..;..\..\pbd;"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_PTFORMAT;LIBPTFORMAT_DLL_EXPORTS;NOMINMAX;INCLUDE_ARDOUR_MISCELLANEOUS=1;USE_CAIRO_IMAGE_SURFACE;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ StringPooling="false"
+ RuntimeLibrary="2"
+ EnableEnhancedInstructionSet="1"
+ WarningLevel="3"
+ CompileAs="2"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="pthreadVCE2.lib ws2_32.lib"
+ OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32-0.dll"
+ AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
+ SubSystem="2"
+ OptimizeReferences="2"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /Y "$(OutDir)\$(TargetName).dll" "$(Release32TargetFolder)\$(TargetName).dll"
copy /Y "$(OutDir)\$(TargetName).dll" "$(Release32TestSuiteFolder)\$(TargetName).dll"
copy /Y "$(OutDir)\$(TargetName).lib" "$(GenericWin32LibraryFolder)\$(TargetName).lib"
"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release 32 with Debugging Capability|Win32"
+ OutputDirectory="$(ProjectDir)\$(ConfigurationName)\bin"
+ IntermediateDirectory="$(ProjectDir)\$(ConfigurationName)\obj\$(ProjectName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="..\..\..\MSVCMixbus3\MSVCMixbus3.vsprops"
+ CharacterSet="2"
+ WholeProgramOptimization="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
+ Optimization="0"
+ AdditionalIncludeDirectories="..;..\..\pbd;"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_PTFORMAT;LIBPTFORMAT_DLL_EXPORTS;NOMINMAX;INCLUDE_ARDOUR_MISCELLANEOUS=1;USE_CAIRO_IMAGE_SURFACE;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ StringPooling="false"
+ RuntimeLibrary="2"
+ EnableEnhancedInstructionSet="1"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ CompileAs="2"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="pthreadVCE2.lib ws2_32.lib"
+ OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32-0RDC.dll"
+ AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /Y "$(OutDir)\$(TargetName).dll" "$(Release32TestSuiteFolder)\$(TargetName).dll"
copy /Y "$(OutDir)\$(TargetName).lib" "$(GenericWin32LibraryFolder)\$(TargetName).lib"
"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ptfformat.cc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ptfformat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ptformat\visibility.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/libs/ptformat/ptfformat.cc b/libs/ptformat/ptfformat.cc
new file mode 100644
index 0000000..bed4bad
--- /dev/null
+++ b/libs/ptformat/ptfformat.cc
@@ -0,0 +1,1299 @@
+/*
+ Copyright (C) 2015 Damien Zammit
+ Copyright (C) 2015 Robin Gareus
+
+ 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 3 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.
+
+*/
+
+#include "ptfformat.h"
+
+#include <stdio.h>
+#include <string>
+#include <string.h>
+#include <assert.h>
+
+using namespace std;
+
+static const uint32_t baselut[16] = {
+ 0xaaaaaaaa, 0xaa955555, 0xa9554aaa, 0xa552a955,
+ 0xb56ad5aa, 0x95a95a95, 0x94a5294a, 0x9696b4b5,
+ 0xd2d25a5a, 0xd24b6d25, 0xdb6db6da, 0xd9249b6d,
+ 0xc9b64d92, 0xcd93264d, 0xccd99b32, 0xcccccccd
+};
+
+static const uint32_t xorlut[16] = {
+ 0x00000000, 0x00000b00, 0x000100b0, 0x00b0b010,
+ 0x010b0b01, 0x0b10b10b, 0x01bb101b, 0x0111bbbb,
+ 0x1111bbbb, 0x1bbb10bb, 0x1bb0bb0b, 0xbb0b0bab,
+ 0xbab0b0ba, 0xb0abaaba, 0xba0aabaa, 0xbaaaaaaa
+};
+
+static uint32_t swapbytes32 (const uint32_t v) {
+ uint32_t rv = 0;
+ rv |= ((v >> 0) & 0xf) << 28;
+ rv |= ((v >> 4) & 0xf) << 24;
+ rv |= ((v >> 8) & 0xf) << 20;
+ rv |= ((v >> 12) & 0xf) << 16;
+ rv |= ((v >> 16) & 0xf) << 12;
+ rv |= ((v >> 20) & 0xf) << 8;
+ rv |= ((v >> 24) & 0xf) << 4;
+ rv |= ((v >> 28) & 0xf) << 0;
+ return rv;
+}
+
+static uint64_t gen_secret (int i) {
+ assert (i > 0 && i < 256);
+ int iwrap = i & 0x7f; // wrap at 0x80;
+ uint32_t xor_lo = 0; // 0x40 flag
+ int idx; // mirror at 0x40;
+
+ if (iwrap & 0x40) {
+ xor_lo = 0x1;
+ idx = 0x80 - iwrap;
+ } else {
+ idx = iwrap;
+ }
+
+ int i16 = (idx >> 1) & 0xf;
+ if (idx & 0x20) {
+ i16 = 15 - i16;
+ }
+
+ uint32_t lo = baselut [i16];
+ uint32_t xk = xorlut [i16];
+
+ if (idx & 0x20) {
+ lo ^= 0xaaaaaaab;
+ xk ^= 0x10000000;
+ }
+ uint32_t hi = swapbytes32 (lo) ^ xk;
+ return ((uint64_t)hi << 32) | (lo ^ xor_lo);
+}
+
+PTFFormat::PTFFormat() {
+}
+
+PTFFormat::~PTFFormat() {
+ if (ptfunxored) {
+ free(ptfunxored);
+ }
+}
+
+bool
+PTFFormat::foundin(std::string haystack, std::string needle) {
+ size_t found = haystack.find(needle);
+ if (found != std::string::npos) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/* Return values: 0 success
+ 0x01 to 0xff value of missing lut
+ -1 could not open file as ptf
+*/
+int
+PTFFormat::load(std::string path, int64_t targetsr) {
+ FILE *fp;
+ unsigned char xxor[256];
+ unsigned char ct;
+ unsigned char px;
+ uint64_t key;
+ uint16_t i;
+ int j;
+ int inv;
+ unsigned char message;
+
+ if (! (fp = fopen(path.c_str(), "rb"))) {
+ return -1;
+ }
+
+ fseek(fp, 0, SEEK_END);
+ len = ftell(fp);
+ if (len < 0x40) {
+ fclose(fp);
+ return -1;
+ }
+ fseek(fp, 0x40, SEEK_SET);
+ fread(&c0, 1, 1, fp);
+ fread(&c1, 1, 1, fp);
+
+ // For version <= 7 support:
+ version = c0 & 0x0f;
+ c0 = c0 & 0xc0;
+
+ if (! (ptfunxored = (unsigned char*) malloc(len * sizeof(unsigned char)))) {
+ /* Silently fail -- out of memory*/
+ fclose(fp);
+ ptfunxored = 0;
+ return -1;
+ }
+
+ fseek(fp, 0x0, SEEK_SET);
+
+ switch (c0) {
+ case 0x00:
+ // Success! easy one
+ xxor[0] = c0;
+ xxor[1] = c1;
+ //fprintf(stderr, "%02x %02x", c0, c1);
+
+ for (i = 2; i < 64; i++) {
+ xxor[i] = (xxor[i-1] + c1 - c0) & 0xff;
+ //fprintf(stderr, "%02x ", xxor[i]);
+ }
+ px = xxor[0];
+ fread(&ct, 1, 1, fp);
+ message = px ^ ct;
+ ptfunxored[0] = message;
+ px = xxor[1];
+ fread(&ct, 1, 1, fp);
+ message = px ^ ct;
+ ptfunxored[1] = message;
+ i = 2;
+ j = 2;
+ while (fread(&ct, 1, 1, fp) != 0) {
+ if (i%64 == 0) {
+ i = 0;
+ }
+ message = xxor[i] ^ ct;
+ ptfunxored[j] = message;
+ i++;
+ j++;
+ }
+ break;
+ case 0x80:
+ //Success! easy two
+ xxor[0] = c0;
+ xxor[1] = c1;
+ for (i = 2; i < 256; i++) {
+ if (i%64 == 0) {
+ xxor[i] = c0;
+ } else {
+ xxor[i] = ((xxor[i-1] + c1 - c0) & 0xff);
+ }
+ }
+ for (i = 0; i < 64; i++) {
+ xxor[i] ^= 0x80;
+ }
+ for (i = 128; i < 192; i++) {
+ xxor[i] ^= 0x80;
+ }
+ px = xxor[0];
+ fread(&ct, 1, 1, fp);
+ message = px ^ ct;
+ ptfunxored[0] = message;
+ px = xxor[1];
+ fread(&ct, 1, 1, fp);
+ message = px ^ ct;
+ ptfunxored[1] = message;
+ i = 2;
+ j = 2;
+ while (fread(&ct, 1, 1, fp) != 0) {
+ if (i%256 == 0) {
+ i = 0;
+ }
+ message = xxor[i] ^ ct;
+ ptfunxored[j] = message;
+ i++;
+ j++;
+ }
+ break;
+ case 0x40:
+ case 0xc0:
+ xxor[0] = c0;
+ xxor[1] = c1;
+ for (i = 2; i < 256; i++) {
+ if (i%64 == 0) {
+ xxor[i] = c0;
+ } else {
+ xxor[i] = ((xxor[i-1] + c1 - c0) & 0xff);
+ }
+ }
+
+ key = gen_secret(c1);
+ for (i = 0; i < 64; i++) {
+ xxor[i] ^= (((key >> i) & 1) * 2 * 0x40) + 0x40;
+ }
+ for (i = 128; i < 192; i++) {
+ inv = (((key >> (i-128)) & 1) == 1) ? 1 : 3;
+ xxor[i] ^= (inv * 0x40);
+ }
+
+ for (i = 192; i < 256; i++) {
+ xxor[i] ^= 0x80;
+ }
+ px = xxor[0];
+ fread(&ct, 1, 1, fp);
+ message = px ^ ct;
+ ptfunxored[0] = message;
+ px = xxor[1];
+ fread(&ct, 1, 1, fp);
+ message = px ^ ct;
+ ptfunxored[1] = message;
+ i = 2;
+ j = 2;
+ while (fread(&ct, 1, 1, fp) != 0) {
+ if (i%256 == 0) {
+ i = 0;
+ }
+ message = xxor[i] ^ ct;
+ ptfunxored[j] = message;
+ i++;
+ j++;
+ }
+ break;
+ break;
+ default:
+ //Should not happen, failed c[0] c[1]
+ return -1;
+ break;
+ }
+ fclose(fp);
+ targetrate = targetsr;
+ parse();
+ return 0;
+}
+
+void
+PTFFormat::unxor10(void)
+{
+ key10a = ptfunxored[0x9f];
+ key10b = ptfunxored[0x9e] - ptfunxored[0x9b];
+ int j, k, currkey;
+
+ k = 0x1000;
+ for (j = k; j < k + 0x1000 && j < len; j++) {
+ ptfunxored[j] ^= key10a;
+ }
+ k = 0x2000;
+ for (j = k; j < k + 0x1000 && j < len; j++) {
+ ptfunxored[j] ^= key10b;
+ }
+ currkey = key10b;
+ while (k < len) {
+ k += 0x1000;
+ currkey = (key10a + currkey) & 0xff;
+ for (j = k; j < k + 0x1000 && j < len; j++) {
+ ptfunxored[j] ^= currkey;
+ }
+ }
+}
+
+void
+PTFFormat::parse(void) {
+ version = (version == 0) ? ptfunxored[61] : version;
+
+ if (version == 5) {
+ parse5header();
+ setrates();
+ parseaudio5();
+ parserest5();
+ } else if (version == 7) {
+ parse7header();
+ setrates();
+ parseaudio();
+ parserest89();
+ } else if (version == 8) {
+ parse8header();
+ setrates();
+ parseaudio();
+ parserest89();
+ } else if (version == 9) {
+ parse9header();
+ setrates();
+ parseaudio();
+ parserest89();
+ } else if (version == 10) {
+ unxor10();
+ parse10header();
+ setrates();
+ parseaudio();
+ parserest10();
+ } else {
+ // Should not occur
+ }
+}
+
+void
+PTFFormat::setrates(void) {
+ ratefactor = 1.f;
+ if (sessionrate != 0) {
+ ratefactor = (float)targetrate / sessionrate;
+ }
+}
+
+void
+PTFFormat::parse5header(void) {
+ int k;
+
+ // Find session sample rate
+ k = 0x100;
+ while (k < len) {
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x00) &&
+ (ptfunxored[k+2] == 0x02)) {
+ break;
+ }
+ k++;
+ }
+
+ sessionrate = 0;
+ sessionrate |= ptfunxored[k+12] << 16;
+ sessionrate |= ptfunxored[k+13] << 8;
+ sessionrate |= ptfunxored[k+14];
+}
+
+void
+PTFFormat::parse7header(void) {
+ int k;
+
+ // Find session sample rate
+ k = 0x100;
+ while (k < len) {
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x00) &&
+ (ptfunxored[k+2] == 0x05)) {
+ break;
+ }
+ k++;
+ }
+
+ sessionrate = 0;
+ sessionrate |= ptfunxored[k+12] << 16;
+ sessionrate |= ptfunxored[k+13] << 8;
+ sessionrate |= ptfunxored[k+14];
+}
+
+void
+PTFFormat::parse8header(void) {
+ int k;
+
+ // Find session sample rate
+ k = 0;
+ while (k < len) {
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x05)) {
+ break;
+ }
+ k++;
+ }
+
+ sessionrate = 0;
+ sessionrate |= ptfunxored[k+11];
+ sessionrate |= ptfunxored[k+12] << 8;
+ sessionrate |= ptfunxored[k+13] << 16;
+}
+
+void
+PTFFormat::parse9header(void) {
+ int k;
+
+ // Find session sample rate
+ k = 0x100;
+ while (k < len) {
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x06)) {
+ break;
+ }
+ k++;
+ }
+
+ sessionrate = 0;
+ sessionrate |= ptfunxored[k+11];
+ sessionrate |= ptfunxored[k+12] << 8;
+ sessionrate |= ptfunxored[k+13] << 16;
+}
+
+void
+PTFFormat::parse10header(void) {
+ int k;
+
+ // Find session sample rate
+ k = 0;
+ while (k < len) {
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x09)) {
+ break;
+ }
+ k++;
+ }
+
+ sessionrate = 0;
+ sessionrate |= ptfunxored[k+11];
+ sessionrate |= ptfunxored[k+12] << 8;
+ sessionrate |= ptfunxored[k+13] << 16;
+}
+
+void
+PTFFormat::parserest5(void) {
+ int i, j, k;
+ int regionspertrack, lengthofname;
+ int startbytes, lengthbytes, offsetbytes;
+ uint16_t tracknumber = 0;
+ uint16_t findex;
+ uint16_t rindex;
+
+ k = 0;
+ for (i = 0; i < 5; i++) {
+ while (k < len) {
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x00) &&
+ (ptfunxored[k+2] == 0x03)) {
+ break;
+ }
+ k++;
+ }
+ k++;
+ }
+ k--;
+
+ for (i = 0; i < 2; i++) {
+ while (k > 0) {
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x00) &&
+ (ptfunxored[k+2] == 0x01)) {
+ break;
+ }
+ k--;
+ }
+ k--;
+ }
+ k++;
+
+ rindex = 0;
+ while (k < len) {
+ if ( (ptfunxored[k ] == 0xff) &&
+ (ptfunxored[k+1] == 0xff)) {
+ break;
+ }
+ while (k < len) {
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x00) &&
+ (ptfunxored[k+2] == 0x01)) {
+ break;
+ }
+ k++;
+ }
+
+ lengthofname = ptfunxored[k+12];
+ if (ptfunxored[k+13] == 0x5a) {
+ k++;
+ break;
+ }
+ char name[256] = {0};
+ for (j = 0; j < lengthofname; j++) {
+ name[j] = ptfunxored[k+13+j];
+ }
+ name[j] = '\0';
+ regionspertrack = ptfunxored[k+13+j+3];
+ for (i = 0; i < regionspertrack; i++) {
+ while (k < len) {
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x00) &&
+ (ptfunxored[k+2] == 0x03)) {
+ break;
+ }
+ k++;
+ }
+ j = k+16;
+ startbytes = (ptfunxored[j+3] & 0xf0) >> 4;
+ lengthbytes = (ptfunxored[j+2] & 0xf0) >> 4;
+ offsetbytes = (ptfunxored[j+1] & 0xf0) >> 4;
+ //somethingbytes = (ptfunxored[j+1] & 0xf);
+ findex = ptfunxored[k+14];
+ j--;
+ uint32_t start = 0;
+ switch (startbytes) {
+ case 4:
+ start |= (uint32_t)(ptfunxored[j+8] << 24);
+ case 3:
+ start |= (uint32_t)(ptfunxored[j+7] << 16);
+ case 2:
+ start |= (uint32_t)(ptfunxored[j+6] << 8);
+ case 1:
+ start |= (uint32_t)(ptfunxored[j+5]);
+ default:
+ break;
+ }
+ j+=startbytes;
+ uint32_t length = 0;
+ switch (lengthbytes) {
+ case 4:
+ length |= (uint32_t)(ptfunxored[j+8] << 24);
+ case 3:
+ length |= (uint32_t)(ptfunxored[j+7] << 16);
+ case 2:
+ length |= (uint32_t)(ptfunxored[j+6] << 8);
+ case 1:
+ length |= (uint32_t)(ptfunxored[j+5]);
+ default:
+ break;
+ }
+ j+=lengthbytes;
+ uint32_t sampleoffset = 0;
+ switch (offsetbytes) {
+ case 4:
+ sampleoffset |= (uint32_t)(ptfunxored[j+8] << 24);
+ case 3:
+ sampleoffset |= (uint32_t)(ptfunxored[j+7] << 16);
+ case 2:
+ sampleoffset |= (uint32_t)(ptfunxored[j+6] << 8);
+ case 1:
+ sampleoffset |= (uint32_t)(ptfunxored[j+5]);
+ default:
+ break;
+ }
+ j+=offsetbytes;
+
+ //printf("name=`%s` start=%04x length=%04x offset=%04x findex=%d\n", name,start,length,sampleoffset,findex);
+
+ std::string filename = string(name) + extension;
+ wav_t f = {
+ filename,
+ findex,
+ (int64_t)(start*ratefactor),
+ (int64_t)(length*ratefactor),
+ };
+
+ vector<wav_t>::iterator begin = audiofiles.begin();
+ vector<wav_t>::iterator finish = audiofiles.end();
+ vector<wav_t>::iterator found;
+ // Add file to lists
+ if ((found = std::find(begin, finish, f)) != finish) {
+ region_t r = {
+ name,
+ rindex,
+ (int64_t)(start*ratefactor),
+ (int64_t)(sampleoffset*ratefactor),
+ (int64_t)(length*ratefactor),
+ *found,
+ };
+ regions.push_back(r);
+ vector<track_t>::iterator ti;
+ vector<track_t>::iterator bt = tracks.begin();
+ vector<track_t>::iterator et = tracks.end();
+ track_t tr = { name, 0, 0, r };
+ if ((ti = std::find(bt, et, tr)) != et) {
+ tracknumber = (*ti).index;
+ } else {
+ tracknumber = tracks.size() + 1;
+ }
+ track_t t = {
+ name,
+ (uint16_t)tracknumber,
+ uint8_t(0),
+ r
+ };
+ tracks.push_back(t);
+ } else {
+ region_t r = {
+ name,
+ rindex,
+ (int64_t)(start*ratefactor),
+ (int64_t)(sampleoffset*ratefactor),
+ (int64_t)(length*ratefactor),
+ f,
+ };
+ regions.push_back(r);
+ vector<track_t>::iterator ti;
+ vector<track_t>::iterator bt = tracks.begin();
+ vector<track_t>::iterator et = tracks.end();
+ track_t tr = { name, 0, 0, r };
+ if ((ti = std::find(bt, et, tr)) != et) {
+ tracknumber = (*ti).index;
+ } else {
+ tracknumber = tracks.size() + 1;
+ }
+ track_t t = {
+ name,
+ (uint16_t)tracknumber,
+ uint8_t(0),
+ r
+ };
+ tracks.push_back(t);
+ }
+ rindex++;
+ k++;
+ }
+ k++;
+ }
+}
+
+void
+PTFFormat::parseaudio5(void) {
+ int i,k,l;
+ int lengthofname, wavnumber;
+
+ // Find end of wav file list
+ k = 0;
+ while (k < len) {
+ if ( (ptfunxored[k ] == 0x5f) &&
+ (ptfunxored[k+1] == 0x50) &&
+ (ptfunxored[k+2] == 0x35)) {
+ break;
+ }
+ k++;
+ }
+ k++;
+ while (k < len) {
+ if ( (ptfunxored[k ] == 0x5f) &&
+ (ptfunxored[k+1] == 0x50) &&
+ (ptfunxored[k+2] == 0x35)) {
+ break;
+ }
+ k++;
+ }
+
+ // Find actual wav names
+ uint16_t numberofwavs = ptfunxored[k-23];
+ char wavname[256];
+ for (i = k; i < len; i++) {
+ if ( (ptfunxored[i ] == 'F') &&
+ (ptfunxored[i+1] == 'i') &&
+ (ptfunxored[i+2] == 'l') &&
+ (ptfunxored[i+3] == 'e') &&
+ (ptfunxored[i+4] == 's')) {
+ break;
+ }
+ }
+
+ wavnumber = 0;
+ i+=16;
+ while (i < len && numberofwavs > 0) {
+ i++;
+ if ( (ptfunxored[i ] == 0x5a) &&
+ (ptfunxored[i+1] == 0x00) &&
+ (ptfunxored[i+2] == 0x05)) {
+ break;
+ }
+ lengthofname = ptfunxored[i];
+ i++;
+ l = 0;
+ while (l < lengthofname) {
+ wavname[l] = ptfunxored[i+l];
+ l++;
+ }
+ i+=lengthofname + 4;
+ wavname[l] = 0;
+ if (foundin(wavname, ".wav")) {
+ extension = string(".wav");
+ } else if (foundin(wavname, ".aif")) {
+ extension = string(".aif");
+ } else {
+ extension = string("");
+ }
+
+ std::string wave = string(wavname);
+ wav_t f = { wave, (uint16_t)(wavnumber++), 0, 0 };
+
+ if (foundin(wave, string(".grp"))) {
+ continue;
+ }
+
+ actualwavs.push_back(f);
+ audiofiles.push_back(f);
+ //printf("done\n");
+ numberofwavs--;
+ i += 7;
+ }
+}
+
+void
+PTFFormat::parseaudio(void) {
+ int i,j,k,l;
+
+ // Find end of wav file list
+ k = 0;
+ while (k < len) {
+ if ( (ptfunxored[k ] == 0xff) &&
+ (ptfunxored[k+1] == 0xff) &&
+ (ptfunxored[k+2] == 0xff) &&
+ (ptfunxored[k+3] == 0xff)) {
+ break;
+ }
+ k++;
+ }
+
+ // Find actual wav names
+ bool first = true;
+ uint16_t numberofwavs;
+ char wavname[256];
+ for (i = k; i > 4; i--) {
+ if ( ((ptfunxored[i ] == 'W') || (ptfunxored[i ] == 'A')) &&
+ ((ptfunxored[i-1] == 'A') || (ptfunxored[i-1] == 'I')) &&
+ ((ptfunxored[i-2] == 'V') || (ptfunxored[i-2] == 'F')) &&
+ ((ptfunxored[i-3] == 'E') || (ptfunxored[i-3] == 'F'))) {
+ j = i-4;
+ l = 0;
+ while (ptfunxored[j] != '\0') {
+ wavname[l] = ptfunxored[j];
+ l++;
+ j--;
+ }
+ wavname[l] = 0;
+ if (ptfunxored[i] == 'W') {
+ extension = string(".wav");
+ } else {
+ extension = string(".aif");
+ }
+ //uint8_t playlist = ptfunxored[j-8];
+
+ if (first) {
+ first = false;
+ for (j = k; j > 4; j--) {
+ if ( (ptfunxored[j ] == 0x01) &&
+ (ptfunxored[j-1] == 0x5a)) {
+
+ numberofwavs = 0;
+ numberofwavs |= (uint32_t)(ptfunxored[j-2] << 24);
+ numberofwavs |= (uint32_t)(ptfunxored[j-3] << 16);
+ numberofwavs |= (uint32_t)(ptfunxored[j-4] << 8);
+ numberofwavs |= (uint32_t)(ptfunxored[j-5]);
+ //printf("%d wavs\n", numberofwavs);
+ break;
+ }
+ k--;
+ }
+ }
+
+ std::string wave = string(wavname);
+ std::reverse(wave.begin(), wave.end());
+ wav_t f = { wave, (uint16_t)(numberofwavs - 1), 0, 0 };
+
+ if (foundin(wave, string(".grp"))) {
+ continue;
+ }
+
+ actualwavs.push_back(f);
+
+ numberofwavs--;
+ if (numberofwavs <= 0)
+ break;
+ }
+ }
+}
+
+void
+PTFFormat::parserest89(void) {
+ int i,j,k,l;
+ // Find Regions
+ uint8_t startbytes = 0;
+ uint8_t lengthbytes = 0;
+ uint8_t offsetbytes = 0;
+ uint8_t somethingbytes = 0;
+ uint8_t skipbytes = 0;
+
+ k = 0;
+ while (k < len) {
+ if ( (ptfunxored[k ] == 'S') &&
+ (ptfunxored[k+1] == 'n') &&
+ (ptfunxored[k+2] == 'a') &&
+ (ptfunxored[k+3] == 'p')) {
+ break;
+ }
+ k++;
+ }
+ uint16_t rindex = 0;
+ uint32_t findex = 0;
+ for (i = k; i < len-70; i++) {
+ if ( (ptfunxored[i ] == 0x5a) &&
+ (ptfunxored[i+1] == 0x0a)) {
+ break;
+ }
+ if ( (ptfunxored[i ] == 0x5a) &&
+ (ptfunxored[i+1] == 0x0c)) {
+
+ uint8_t lengthofname = ptfunxored[i+9];
+
+ char name[256] = {0};
+ for (j = 0; j < lengthofname; j++) {
+ name[j] = ptfunxored[i+13+j];
+ }
+ name[j] = '\0';
+ j += i+13;
+ //uint8_t disabled = ptfunxored[j];
+
+ offsetbytes = (ptfunxored[j+1] & 0xf0) >> 4;
+ lengthbytes = (ptfunxored[j+2] & 0xf0) >> 4;
+ startbytes = (ptfunxored[j+3] & 0xf0) >> 4;
+ somethingbytes = (ptfunxored[j+3] & 0xf);
+ skipbytes = ptfunxored[j+4];
+ findex = ptfunxored[j+5
+ +startbytes
+ +lengthbytes
+ +offsetbytes
+ +somethingbytes
+ +skipbytes
+ +40];
+ /*rindex = ptfunxored[j+5
+ +startbytes
+ +lengthbytes
+ +offsetbytes
+ +somethingbytes
+ +skipbytes
+ +24];
+ */
+ uint32_t sampleoffset = 0;
+ switch (offsetbytes) {
+ case 4:
+ sampleoffset |= (uint32_t)(ptfunxored[j+8] << 24);
+ case 3:
+ sampleoffset |= (uint32_t)(ptfunxored[j+7] << 16);
+ case 2:
+ sampleoffset |= (uint32_t)(ptfunxored[j+6] << 8);
+ case 1:
+ sampleoffset |= (uint32_t)(ptfunxored[j+5]);
+ default:
+ break;
+ }
+ j+=offsetbytes;
+ uint32_t length = 0;
+ switch (lengthbytes) {
+ case 4:
+ length |= (uint32_t)(ptfunxored[j+8] << 24);
+ case 3:
+ length |= (uint32_t)(ptfunxored[j+7] << 16);
+ case 2:
+ length |= (uint32_t)(ptfunxored[j+6] << 8);
+ case 1:
+ length |= (uint32_t)(ptfunxored[j+5]);
+ default:
+ break;
+ }
+ j+=lengthbytes;
+ uint32_t start = 0;
+ switch (startbytes) {
+ case 4:
+ start |= (uint32_t)(ptfunxored[j+8] << 24);
+ case 3:
+ start |= (uint32_t)(ptfunxored[j+7] << 16);
+ case 2:
+ start |= (uint32_t)(ptfunxored[j+6] << 8);
+ case 1:
+ start |= (uint32_t)(ptfunxored[j+5]);
+ default:
+ break;
+ }
+ j+=startbytes;
+ /*
+ uint32_t something = 0;
+ switch (somethingbytes) {
+ case 4:
+ something |= (uint32_t)(ptfunxored[j+8] << 24);
+ case 3:
+ something |= (uint32_t)(ptfunxored[j+7] << 16);
+ case 2:
+ something |= (uint32_t)(ptfunxored[j+6] << 8);
+ case 1:
+ something |= (uint32_t)(ptfunxored[j+5]);
+ default:
+ break;
+ }
+ j+=somethingbytes;
+ */
+ std::string filename = string(name) + extension;
+ wav_t f = {
+ filename,
+ 0,
+ (int64_t)(start*ratefactor),
+ (int64_t)(length*ratefactor),
+ };
+
+ f.index = findex;
+ //printf("something=%d\n", something);
+
+ vector<wav_t>::iterator begin = actualwavs.begin();
+ vector<wav_t>::iterator finish = actualwavs.end();
+ vector<wav_t>::iterator found;
+ // Add file to list only if it is an actual wav
+ if ((found = std::find(begin, finish, f)) != finish) {
+ audiofiles.push_back(f);
+ // Also add plain wav as region
+ region_t r = {
+ name,
+ rindex,
+ (int64_t)(start*ratefactor),
+ (int64_t)(sampleoffset*ratefactor),
+ (int64_t)(length*ratefactor),
+ f
+ };
+ regions.push_back(r);
+ // Region only
+ } else {
+ if (foundin(filename, string(".grp"))) {
+ continue;
+ }
+ region_t r = {
+ name,
+ rindex,
+ (int64_t)(start*ratefactor),
+ (int64_t)(sampleoffset*ratefactor),
+ (int64_t)(length*ratefactor),
+ f
+ };
+ regions.push_back(r);
+ }
+ rindex++;
+ }
+ }
+
+ while (k < len) {
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x03)) {
+ break;
+ }
+ k++;
+ }
+ while (k < len) {
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x02)) {
+ break;
+ }
+ k++;
+ }
+ k++;
+
+ // Tracks
+ uint32_t offset;
+ uint32_t tracknumber = 0;
+ uint32_t regionspertrack = 0;
+ for (;k < len; k++) {
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x04)) {
+ break;
+ }
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x02)) {
+
+ uint8_t lengthofname = 0;
+ lengthofname = ptfunxored[k+9];
+ if (lengthofname == 0x5a) {
+ continue;
+ }
+ track_t tr;
+
+ regionspertrack = (uint8_t)(ptfunxored[k+13+lengthofname]);
+
+ //printf("regions/track=%d\n", regionspertrack);
+ char name[256] = {0};
+ for (j = 0; j < lengthofname; j++) {
+ name[j] = ptfunxored[j+k+13];
+ }
+ name[j] = '\0';
+ tr.name = string(name);
+ tr.index = tracknumber++;
+
+ for (j = k; regionspertrack > 0 && j < len; j++) {
+ for (l = j; l < len; l++) {
+ if ( (ptfunxored[l ] == 0x5a) &&
+ (ptfunxored[l+1] == 0x07)) {
+ j = l;
+ break;
+ }
+ }
+
+
+ if (regionspertrack == 0) {
+ // tr.reg.index = (uint8_t)ptfunxored[j+13+lengthofname+5];
+ break;
+ } else {
+
+ tr.reg.index = (uint8_t)(ptfunxored[l+11]);
+ vector<region_t>::iterator begin = regions.begin();
+ vector<region_t>::iterator finish = regions.end();
+ vector<region_t>::iterator found;
+ if ((found = std::find(begin, finish, tr.reg)) != finish) {
+ tr.reg = (*found);
+ }
+ i = l+16;
+ offset = 0;
+ offset |= (uint32_t)(ptfunxored[i+3] << 24);
+ offset |= (uint32_t)(ptfunxored[i+2] << 16);
+ offset |= (uint32_t)(ptfunxored[i+1] << 8);
+ offset |= (uint32_t)(ptfunxored[i]);
+ tr.reg.startpos = (int64_t)(offset*ratefactor);
+ if (tr.reg.length > 0) {
+ tracks.push_back(tr);
+ }
+ regionspertrack--;
+ }
+ }
+ }
+ }
+}
+
+void
+PTFFormat::parserest10(void) {
+ int i,j,k,l;
+ // Find Regions
+ uint8_t startbytes = 0;
+ uint8_t lengthbytes = 0;
+ uint8_t offsetbytes = 0;
+ uint8_t somethingbytes = 0;
+ uint8_t skipbytes = 0;
+
+ k = 0;
+ while (k < len) {
+ if ( (ptfunxored[k ] == 'S') &&
+ (ptfunxored[k+1] == 'n') &&
+ (ptfunxored[k+2] == 'a') &&
+ (ptfunxored[k+3] == 'p')) {
+ break;
+ }
+ k++;
+ }
+ for (i = k; i < len-70; i++) {
+ if ( (ptfunxored[i ] == 0x5a) &&
+ (ptfunxored[i+1] == 0x02)) {
+ k = i;
+ break;
+ }
+ }
+ k++;
+ for (i = k; i < len-70; i++) {
+ if ( (ptfunxored[i ] == 0x5a) &&
+ (ptfunxored[i+1] == 0x02)) {
+ k = i;
+ break;
+ }
+ }
+ k++;
+ uint16_t rindex = 0;
+ uint32_t findex = 0;
+ for (i = k; i < len-70; i++) {
+ if ( (ptfunxored[i ] == 0x5a) &&
+ (ptfunxored[i+1] == 0x08)) {
+ break;
+ }
+ if ( (ptfunxored[i ] == 0x5a) &&
+ (ptfunxored[i+1] == 0x01)) {
+
+ uint8_t lengthofname = ptfunxored[i+9];
+ if (ptfunxored[i+13] == 0x5a) {
+ continue;
+ }
+ char name[256] = {0};
+ for (j = 0; j < lengthofname; j++) {
+ name[j] = ptfunxored[i+13+j];
+ }
+ name[j] = '\0';
+ j += i+13;
+ //uint8_t disabled = ptfunxored[j];
+ //printf("%s\n", name);
+
+ offsetbytes = (ptfunxored[j+1] & 0xf0) >> 4;
+ lengthbytes = (ptfunxored[j+2] & 0xf0) >> 4;
+ startbytes = (ptfunxored[j+3] & 0xf0) >> 4;
+ somethingbytes = (ptfunxored[j+3] & 0xf);
+ skipbytes = ptfunxored[j+4];
+ findex = ptfunxored[j+5
+ +startbytes
+ +lengthbytes
+ +offsetbytes
+ +somethingbytes
+ +skipbytes
+ +37];
+ /*rindex = ptfunxored[j+5
+ +startbytes
+ +lengthbytes
+ +offsetbytes
+ +somethingbytes
+ +skipbytes
+ +24];
+ */
+ uint32_t sampleoffset = 0;
+ switch (offsetbytes) {
+ case 4:
+ sampleoffset |= (uint32_t)(ptfunxored[j+8] << 24);
+ case 3:
+ sampleoffset |= (uint32_t)(ptfunxored[j+7] << 16);
+ case 2:
+ sampleoffset |= (uint32_t)(ptfunxored[j+6] << 8);
+ case 1:
+ sampleoffset |= (uint32_t)(ptfunxored[j+5]);
+ default:
+ break;
+ }
+ j+=offsetbytes;
+ uint32_t length = 0;
+ switch (lengthbytes) {
+ case 4:
+ length |= (uint32_t)(ptfunxored[j+8] << 24);
+ case 3:
+ length |= (uint32_t)(ptfunxored[j+7] << 16);
+ case 2:
+ length |= (uint32_t)(ptfunxored[j+6] << 8);
+ case 1:
+ length |= (uint32_t)(ptfunxored[j+5]);
+ default:
+ break;
+ }
+ j+=lengthbytes;
+ uint32_t start = 0;
+ switch (startbytes) {
+ case 4:
+ start |= (uint32_t)(ptfunxored[j+8] << 24);
+ case 3:
+ start |= (uint32_t)(ptfunxored[j+7] << 16);
+ case 2:
+ start |= (uint32_t)(ptfunxored[j+6] << 8);
+ case 1:
+ start |= (uint32_t)(ptfunxored[j+5]);
+ default:
+ break;
+ }
+ j+=startbytes;
+ /*
+ uint32_t something = 0;
+ switch (somethingbytes) {
+ case 4:
+ something |= (uint32_t)(ptfunxored[j+8] << 24);
+ case 3:
+ something |= (uint32_t)(ptfunxored[j+7] << 16);
+ case 2:
+ something |= (uint32_t)(ptfunxored[j+6] << 8);
+ case 1:
+ something |= (uint32_t)(ptfunxored[j+5]);
+ default:
+ break;
+ }
+ j+=somethingbytes;
+ */
+ std::string filename = string(name) + extension;
+ wav_t f = {
+ filename,
+ 0,
+ (int64_t)(start*ratefactor),
+ (int64_t)(length*ratefactor),
+ };
+
+ if (strlen(name) == 0) {
+ continue;
+ }
+ if (length == 0) {
+ continue;
+ }
+ f.index = findex;
+ //printf("something=%d\n", something);
+
+ vector<wav_t>::iterator begin = actualwavs.begin();
+ vector<wav_t>::iterator finish = actualwavs.end();
+ vector<wav_t>::iterator found;
+ // Add file to list only if it is an actual wav
+ if ((found = std::find(begin, finish, f)) != finish) {
+ audiofiles.push_back(f);
+ // Also add plain wav as region
+ region_t r = {
+ name,
+ rindex,
+ (int64_t)(start*ratefactor),
+ (int64_t)(sampleoffset*ratefactor),
+ (int64_t)(length*ratefactor),
+ f
+ };
+ regions.push_back(r);
+ // Region only
+ } else {
+ if (foundin(filename, string(".grp"))) {
+ continue;
+ }
+ region_t r = {
+ name,
+ rindex,
+ (int64_t)(start*ratefactor),
+ (int64_t)(sampleoffset*ratefactor),
+ (int64_t)(length*ratefactor),
+ f
+ };
+ regions.push_back(r);
+ }
+ rindex++;
+ //printf("%s\n", name);
+ }
+ }
+ // Tracks
+ uint32_t offset;
+ uint32_t tracknumber = 0;
+ uint32_t regionspertrack = 0;
+ for (;k < len; k++) {
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x08)) {
+ break;
+ }
+ }
+ k++;
+ for (;k < len; k++) {
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x04)) {
+ break;
+ }
+ if ( (ptfunxored[k ] == 0x5a) &&
+ (ptfunxored[k+1] == 0x02)) {
+
+ uint8_t lengthofname = 0;
+ lengthofname = ptfunxored[k+9];
+ if (lengthofname == 0x5a) {
+ continue;
+ }
+ track_t tr;
+
+ regionspertrack = (uint8_t)(ptfunxored[k+13+lengthofname]);
+
+ //printf("regions/track=%d\n", regionspertrack);
+ char name[256] = {0};
+ for (j = 0; j < lengthofname; j++) {
+ name[j] = ptfunxored[j+k+13];
+ }
+ name[j] = '\0';
+ tr.name = string(name);
+ tr.index = tracknumber++;
+
+ for (j = k; regionspertrack > 0 && j < len; j++) {
+ for (l = j; l < len; l++) {
+ if ( (ptfunxored[l ] == 0x5a) &&
+ (ptfunxored[l+1] == 0x08)) {
+ j = l+1;
+ break;
+ }
+ }
+
+
+ if (regionspertrack == 0) {
+ // tr.reg.index = (uint8_t)ptfunxored[j+13+lengthofname+5];
+ break;
+ } else {
+
+ tr.reg.index = (uint8_t)(ptfunxored[l+11]);
+ vector<region_t>::iterator begin = regions.begin();
+ vector<region_t>::iterator finish = regions.end();
+ vector<region_t>::iterator found;
+ if ((found = std::find(begin, finish, tr.reg)) != finish) {
+ tr.reg = (*found);
+ }
+ i = l+16;
+ offset = 0;
+ offset |= (uint32_t)(ptfunxored[i+3] << 24);
+ offset |= (uint32_t)(ptfunxored[i+2] << 16);
+ offset |= (uint32_t)(ptfunxored[i+1] << 8);
+ offset |= (uint32_t)(ptfunxored[i]);
+ tr.reg.startpos = (int64_t)(offset*ratefactor);
+ if (tr.reg.length > 0) {
+ tracks.push_back(tr);
+ }
+ regionspertrack--;
+ }
+ }
+ }
+ }
+}
diff --git a/libs/ptformat/ptfformat.h b/libs/ptformat/ptfformat.h
new file mode 100644
index 0000000..be7076d
--- /dev/null
+++ b/libs/ptformat/ptfformat.h
@@ -0,0 +1,136 @@
+/*
+ Copyright (C) 2015 Damien Zammit
+
+ 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 3 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.
+
+*/
+#ifndef PTFFORMAT_H
+#define PTFFORMAT_H
+
+#include <string>
+#include <algorithm>
+#include <vector>
+#include <stdint.h>
+
+#include "ptformat/visibility.h"
+
+class LIBPTFORMAT_API PTFFormat {
+public:
+ PTFFormat();
+ ~PTFFormat();
+
+ /* Return values: 0 success
+ -1 could not open file as ptf
+ */
+ int load(std::string path, int64_t targetsr);
+
+ typedef struct wav {
+ std::string filename;
+ uint16_t index;
+
+ int64_t posabsolute;
+ int64_t length;
+
+ bool operator ==(const struct wav& other) {
+ return (this->filename == other.filename ||
+ this->index == other.index);
+ }
+
+ } wav_t;
+
+ typedef struct region {
+ std::string name;
+ uint16_t index;
+ int64_t startpos;
+ int64_t sampleoffset;
+ int64_t length;
+ wav_t wave;
+
+ bool operator ==(const struct region& other) {
+ return (this->index == other.index);
+ }
+ } region_t;
+
+ typedef struct track {
+ std::string name;
+ uint16_t index;
+ uint8_t playlist;
+ region_t reg;
+
+ bool operator ==(const struct track& other) {
+ return (this->name == other.name);
+ }
+ } track_t;
+
+ std::vector<wav_t> audiofiles;
+ std::vector<region_t> regions;
+ std::vector<track_t> tracks;
+
+ static bool regionexistsin(std::vector<region_t> reg, uint16_t index) {
+ std::vector<region_t>::iterator begin = reg.begin();
+ std::vector<region_t>::iterator finish = reg.end();
+ std::vector<region_t>::iterator found;
+
+ wav_t w = { std::string(""), 0, 0, 0 };
+ region_t r = { std::string(""), index, 0, 0, 0, w };
+
+ if ((found = std::find(begin, finish, r)) != finish) {
+ return true;
+ }
+ return false;
+ }
+
+ static bool wavexistsin(std::vector<wav_t> wv, uint16_t index) {
+ std::vector<wav_t>::iterator begin = wv.begin();
+ std::vector<wav_t>::iterator finish = wv.end();
+ std::vector<wav_t>::iterator found;
+
+ wav_t w = { std::string(""), index, 0, 0 };
+
+ if ((found = std::find(begin, finish, w)) != finish) {
+ return true;
+ }
+ return false;
+ }
+
+ int64_t sessionrate;
+ int64_t targetrate;
+ uint8_t version;
+
+ unsigned char c0;
+ unsigned char c1;
+ unsigned char *ptfunxored;
+ int len;
+
+private:
+ bool foundin(std::string haystack, std::string needle);
+ void parse(void);
+ void unxor10(void);
+ void setrates(void);
+ void parse5header(void);
+ void parse7header(void);
+ void parse8header(void);
+ void parse9header(void);
+ void parse10header(void);
+ void parserest5(void);
+ void parserest89(void);
+ void parserest10(void);
+ void parseaudio5(void);
+ void parseaudio(void);
+ std::vector<wav_t> actualwavs;
+ float ratefactor;
+ std::string extension;
+ unsigned char key10a;
+ unsigned char key10b;
+};
+
+
+#endif
diff --git a/libs/ptformat/ptformat/visibility.h b/libs/ptformat/ptformat/visibility.h
new file mode 100644
index 0000000..d1569c6
--- /dev/null
+++ b/libs/ptformat/ptformat/visibility.h
@@ -0,0 +1,45 @@
+/*
+ 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 __libptformat_visibility_h__
+#define __libptformat_visibility_h__
+
+#if defined(COMPILER_MSVC)
+ #define LIBPTFORMAT_DLL_IMPORT __declspec(dllimport)
+ #define LIBPTFORMAT_DLL_EXPORT __declspec(dllexport)
+ #define LIBPTFORMAT_DLL_LOCAL
+#else
+ #define LIBPTFORMAT_DLL_IMPORT __attribute__ ((visibility ("default")))
+ #define LIBPTFORMAT_DLL_EXPORT __attribute__ ((visibility ("default")))
+ #define LIBPTFORMAT_DLL_LOCAL __attribute__ ((visibility ("hidden")))
+#endif
+
+#ifdef LIBPTFORMAT_STATIC // libptformat is not a DLL
+ #define LIBPTFORMAT_API
+ #define LIBPTFORMAT_LOCAL
+#else
+ #ifdef LIBPTFORMAT_DLL_EXPORTS // defined if we are building the libptformat DLL (instead of using it)
+ #define LIBPTFORMAT_API LIBPTFORMAT_DLL_EXPORT
+ #else
+ #define LIBPTFORMAT_API LIBPTFORMAT_DLL_IMPORT
+ #endif
+ #define LIBPTFORMAT_LOCAL LIBPTFORMAT_DLL_LOCAL
+#endif
+
+#endif /* __libptformat_visibility_h__ */
diff --git a/libs/ptformat/wscript b/libs/ptformat/wscript
new file mode 100644
index 0000000..4d38123
--- /dev/null
+++ b/libs/ptformat/wscript
@@ -0,0 +1,44 @@
+#!/usr/bin/env python
+from waflib.extras import autowaf as autowaf
+import os
+
+# Version of this package (even if built as a child)
+LIBPTFORMAT_VERSION = '0.0.0'
+
+# Library version (UNIX style major, minor, micro)
+# major increment <=> incompatible changes
+# minor increment <=> compatible changes (additions)
+# micro increment <=> no interface changes
+LIBPTFORMAT_LIB_VERSION = '0.0.0'
+
+# Variables for 'waf dist'
+APPNAME = 'libptformat'
+VERSION = LIBPTFORMAT_VERSION
+
+# Mandatory variables
+top = '.'
+out = 'build'
+
+def options(opt):
+ autowaf.set_options(opt)
+
+def configure(conf):
+ conf.load('compiler_cxx')
+ autowaf.configure(conf)
+
+def build(bld):
+ # Library
+ obj = bld(features = 'cxx cxxshlib')
+ obj.source = 'ptfformat.cc'
+ obj.export_includes = ['.']
+ obj.includes = ['.']
+ obj.name = 'libptformat'
+ obj.target = 'ptformat'
+ obj.use = 'libardour'
+ autowaf.ensure_visible_symbols (obj, True)
+ obj.vnum = LIBPTFORMAT_LIB_VERSION
+ obj.install_path = bld.env['LIBDIR']
+ obj.defines = [ 'LIBPTFORMAT_DLL_EXPORTS' ]
+
+def shutdown():
+ autowaf.shutdown()
diff --git a/libs/qm-dsp/dsp/onsets/PeakPicking.cpp b/libs/qm-dsp/dsp/onsets/PeakPicking.cpp
index 55f56b4..b46c54b 100644
--- a/libs/qm-dsp/dsp/onsets/PeakPicking.cpp
+++ b/libs/qm-dsp/dsp/onsets/PeakPicking.cpp
@@ -97,8 +97,6 @@ int PeakPicking::quadEval( vector<double> &src, vector<int> &idx )
vector <double> m_poly;
vector <double> m_err;
- double p;
-
m_poly.push_back(0);
m_poly.push_back(0);
m_poly.push_back(0);
@@ -128,8 +126,6 @@ int PeakPicking::quadEval( vector<double> &src, vector<int> &idx )
m_maxFit.push_back(selMax);
}
- p = TPolyFit::PolyFit2( m_err, m_maxFit, m_poly);
-
double f = m_poly[0];
double h = m_poly[2];
diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
index 85a8140..0ed6a90 100644
--- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
+++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
@@ -30,6 +30,7 @@
#include "pbd/failed_constructor.h"
#include "pbd/file_utils.h"
#include "pbd/xml++.h"
+#include "pbd/compose.h"
#include "midi++/port.h"
@@ -40,6 +41,7 @@
#include "ardour/midi_ui.h"
#include "ardour/rc_configuration.h"
#include "ardour/midiport_manager.h"
+#include "ardour/debug.h"
#include "generic_midi_control_protocol.h"
#include "midicontrollable.h"
@@ -174,6 +176,7 @@ GenericMidiControlProtocol::reload_maps ()
void
GenericMidiControlProtocol::drop_all ()
{
+ DEBUG_TRACE (DEBUG::GenericMidi, "Drop all bindings\n");
Glib::Threads::Mutex::Lock lm (pending_lock);
Glib::Threads::Mutex::Lock lm2 (controllables_lock);
@@ -201,6 +204,7 @@ GenericMidiControlProtocol::drop_all ()
void
GenericMidiControlProtocol::drop_bindings ()
{
+ DEBUG_TRACE (DEBUG::GenericMidi, "Drop bindings, leave learned\n");
Glib::Threads::Mutex::Lock lm2 (controllables_lock);
for (MIDIControllables::iterator i = controllables.begin(); i != controllables.end(); ) {
@@ -295,6 +299,7 @@ GenericMidiControlProtocol::start_learning (Controllable* c)
}
Glib::Threads::Mutex::Lock lm2 (controllables_lock);
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Learn binding: Controlable number: %1\n", c));
MIDIControllables::iterator tmp;
for (MIDIControllables::iterator i = controllables.begin(); i != controllables.end(); ) {
@@ -346,7 +351,6 @@ GenericMidiControlProtocol::start_learning (Controllable* c)
pending_controllables.push_back (element);
}
-
mc->learn_about_external_control ();
return true;
}
@@ -421,6 +425,7 @@ GenericMidiControlProtocol::delete_binding (PBD::Controllable* control)
}
}
+// This next function seems unused
void
GenericMidiControlProtocol::create_binding (PBD::Controllable* control, int pos, int control_number)
{
@@ -453,11 +458,70 @@ GenericMidiControlProtocol::create_binding (PBD::Controllable* control, int pos,
// Update the MIDI Controllable based on the the pos param
// Here is where a table lookup for user mappings could go; for now we'll just wing it...
mc->bind_midi(channel, MIDI::controller, value);
-
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Create binding: Channel: %1 Controller: %2 Value: %3 \n", channel, MIDI::controller, value));
controllables.push_back (mc);
}
}
+void
+GenericMidiControlProtocol::check_used_event (int pos, int control_number)
+{
+ Glib::Threads::Mutex::Lock lm2 (controllables_lock);
+
+ MIDI::channel_t channel = (pos & 0xf);
+ MIDI::byte value = control_number;
+
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("checking for used event: Channel: %1 Controller: %2 value: %3\n", (int) channel, (pos & 0xf0), (int) value));
+
+ // Remove any old binding for this midi channel/type/value pair
+ // Note: can't use delete_binding() here because we don't know the specific controllable we want to remove, only the midi information
+ for (MIDIControllables::iterator iter = controllables.begin(); iter != controllables.end();) {
+ MIDIControllable* existingBinding = (*iter);
+ if ( (existingBinding->get_control_type() & 0xf0 ) == (pos & 0xf0) && (existingBinding->get_control_channel() & 0xf ) == channel ) {
+ if ( ((int) existingBinding->get_control_additional() == (int) value) || ((pos & 0xf0) == MIDI::pitchbend)) {
+ DEBUG_TRACE (DEBUG::GenericMidi, "checking: found match, delete old binding.\n");
+ delete existingBinding;
+ iter = controllables.erase (iter);
+ } else {
+ ++iter;
+ }
+ } else {
+ ++iter;
+ }
+ }
+
+ for (MIDIFunctions::iterator iter = functions.begin(); iter != functions.end();) {
+ MIDIFunction* existingBinding = (*iter);
+ if ( (existingBinding->get_control_type() & 0xf0 ) == (pos & 0xf0) && (existingBinding->get_control_channel() & 0xf ) == channel ) {
+ if ( ((int) existingBinding->get_control_additional() == (int) value) || ((pos & 0xf0) == MIDI::pitchbend)) {
+ DEBUG_TRACE (DEBUG::GenericMidi, "checking: found match, delete old binding.\n");
+ delete existingBinding;
+ iter = functions.erase (iter);
+ } else {
+ ++iter;
+ }
+ } else {
+ ++iter;
+ }
+ }
+
+ for (MIDIActions::iterator iter = actions.begin(); iter != actions.end();) {
+ MIDIAction* existingBinding = (*iter);
+ if ( (existingBinding->get_control_type() & 0xf0 ) == (pos & 0xf0) && (existingBinding->get_control_channel() & 0xf ) == channel ) {
+ if ( ((int) existingBinding->get_control_additional() == (int) value) || ((pos & 0xf0) == MIDI::pitchbend)) {
+ DEBUG_TRACE (DEBUG::GenericMidi, "checking: found match, delete old binding.\n");
+ delete existingBinding;
+ iter = actions.erase (iter);
+ } else {
+ ++iter;
+ }
+ } else {
+ ++iter;
+ }
+ }
+
+}
+
XMLNode&
GenericMidiControlProtocol::get_state ()
{
@@ -530,13 +594,22 @@ GenericMidiControlProtocol::set_state (const XMLNode& node, int version)
pending_controllables.clear ();
}
+ // midi map has to be loaded first so learned binding can go on top
+ if ((prop = node.property ("binding")) != 0) {
+ for (list<MapInfo>::iterator x = map_info.begin(); x != map_info.end(); ++x) {
+ if (prop->value() == (*x).name) {
+ load_bindings ((*x).path);
+ break;
+ }
+ }
+ }
+
/* Load up specific bindings from the
* <Controls><MidiControllable>...</MidiControllable><Controls> section
*/
{
Glib::Threads::Mutex::Lock lm2 (controllables_lock);
- controllables.clear ();
nlist = node.children(); // "Controls"
if (!nlist.empty()) {
@@ -548,6 +621,7 @@ GenericMidiControlProtocol::set_state (const XMLNode& node, int version)
if ((prop = (*niter)->property ("id")) != 0) {
ID id = prop->value ();
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Relearned binding for session: Control ID: %1\n", id.to_s()));
Controllable* c = Controllable::by_id (id);
if (c) {
@@ -560,7 +634,7 @@ GenericMidiControlProtocol::set_state (const XMLNode& node, int version)
} else {
warning << string_compose (
_("Generic MIDI control: controllable %1 not found in session (ignored)"),
- id) << endmsg;
+ id.to_s()) << endmsg;
}
}
}
@@ -568,15 +642,6 @@ GenericMidiControlProtocol::set_state (const XMLNode& node, int version)
}
}
- if ((prop = node.property ("binding")) != 0) {
- for (list<MapInfo>::iterator x = map_info.begin(); x != map_info.end(); ++x) {
- if (prop->value() == (*x).name) {
- load_bindings ((*x).path);
- break;
- }
- }
- }
-
return 0;
}
@@ -597,6 +662,7 @@ GenericMidiControlProtocol::get_feedback () const
int
GenericMidiControlProtocol::load_bindings (const string& xmlpath)
{
+ DEBUG_TRACE (DEBUG::GenericMidi, "Load bindings: Reading midi map\n");
XMLTree state_tree;
if (!state_tree.read (xmlpath.c_str())) {
@@ -632,6 +698,7 @@ GenericMidiControlProtocol::load_bindings (const string& xmlpath)
drop_all ();
+ DEBUG_TRACE (DEBUG::GenericMidi, "Loading bindings\n");
for (citer = children.begin(); citer != children.end(); ++citer) {
if ((*citer)->name() == "DeviceInfo") {
@@ -705,6 +772,7 @@ GenericMidiControlProtocol::create_binding (const XMLNode& node)
MIDI::eventType ev;
int intval;
bool momentary;
+ MIDIControllable::Encoder encoder = MIDIControllable::No_enc;
if ((prop = node.property (X_("ctl"))) != 0) {
ev = MIDI::controller;
@@ -714,6 +782,18 @@ GenericMidiControlProtocol::create_binding (const XMLNode& node)
ev = MIDI::program;
} else if ((prop = node.property (X_("pb"))) != 0) {
ev = MIDI::pitchbend;
+ } else if ((prop = node.property (X_("enc-l"))) != 0) {
+ encoder = MIDIControllable::Enc_L;
+ ev = MIDI::controller;
+ } else if ((prop = node.property (X_("enc-r"))) != 0) {
+ encoder = MIDIControllable::Enc_R;
+ ev = MIDI::controller;
+ } else if ((prop = node.property (X_("enc-2"))) != 0) {
+ encoder = MIDIControllable::Enc_2;
+ ev = MIDI::controller;
+ } else if ((prop = node.property (X_("enc-b"))) != 0) {
+ encoder = MIDIControllable::Enc_B;
+ ev = MIDI::controller;
} else {
return 0;
}
@@ -753,6 +833,7 @@ GenericMidiControlProtocol::create_binding (const XMLNode& node)
return 0;
}
+ mc->set_encoder (encoder);
mc->bind_midi (channel, ev, detail);
return mc;
diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.h b/libs/surfaces/generic_midi/generic_midi_control_protocol.h
index a4a51b7..bb38a48 100644
--- a/libs/surfaces/generic_midi/generic_midi_control_protocol.h
+++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.h
@@ -71,6 +71,8 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
int load_bindings (const std::string&);
void drop_bindings ();
+
+ void check_used_event (int, int);
std::string current_binding() const { return _current_binding; }
diff --git a/libs/surfaces/generic_midi/midiaction.cc b/libs/surfaces/generic_midi/midiaction.cc
index e537122..8dfbef9 100644
--- a/libs/surfaces/generic_midi/midiaction.cc
+++ b/libs/surfaces/generic_midi/midiaction.cc
@@ -19,11 +19,14 @@
#include <cstring>
#include "midi++/port.h"
+#include "pbd/compose.h"
+#include "ardour/debug.h"
#include "midiaction.h"
#include "generic_midi_control_protocol.h"
using namespace MIDI;
+using namespace PBD;
MIDIAction::MIDIAction (MIDI::Parser& p)
: MIDIInvokable (p)
@@ -44,6 +47,7 @@ MIDIAction::init (GenericMidiControlProtocol& ui, const std::string& invokable_n
void
MIDIAction::execute ()
{
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Action: '%1'\n", _invokable_name));
_ui->access_action (_invokable_name);
}
diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc
index 1d96a07..21b2b96 100644
--- a/libs/surfaces/generic_midi/midicontrollable.cc
+++ b/libs/surfaces/generic_midi/midicontrollable.cc
@@ -26,6 +26,7 @@
#include "pbd/controllable_descriptor.h"
#include "pbd/xml++.h"
#include "pbd/stacktrace.h"
+#include "pbd/compose.h"
#include "midi++/types.h" // Added by JE - 06-01-2009. All instances of 'byte' changed to 'MIDI::byte' (for clarification)
#include "midi++/port.h"
@@ -35,6 +36,7 @@
#include "ardour/automation_control.h"
#include "ardour/midi_ui.h"
#include "ardour/utils.h"
+#include "ardour/debug.h"
#include "midicontrollable.h"
#include "generic_midi_control_protocol.h"
@@ -52,6 +54,7 @@ MIDIControllable::MIDIControllable (GenericMidiControlProtocol* s, MIDI::Parser&
, _momentary (m)
{
_learned = false; /* from URI */
+ _encoder = No_enc;
setting = false;
last_value = 0; // got a better idea ?
last_controllable_value = 0.0f;
@@ -70,6 +73,7 @@ MIDIControllable::MIDIControllable (GenericMidiControlProtocol* s, MIDI::Parser&
set_controllable (&c);
_learned = true; /* from controllable */
+ _encoder = No_enc;
setting = false;
last_value = 0; // got a better idea ?
last_controllable_value = 0.0f;
@@ -186,8 +190,9 @@ MIDIControllable::control_to_midi (float val)
val = actl->internal_to_interface(val);
}
}
-
- return (val - control_min) / control_range * max_value_for_type ();
+ // fiddle value of max so value doesn't jump from 125 to 127 for 1.0
+ // otherwise decrement won't work.
+ return (val - control_min) / control_range * (max_value_for_type () - 1);
}
float
@@ -195,7 +200,7 @@ MIDIControllable::midi_to_control (int val)
{
/* fiddle with MIDI value so that we get an odd number of integer steps
and can thus represent "middle" precisely as 0.5. this maps to
- the range 0..+1.0
+ the range 0..+1.0 (0 to 126)
*/
float fv = (val == 0 ? 0 : float (val - 1) / (max_value_for_type() - 1));
@@ -268,10 +273,13 @@ MIDIControllable::midi_sense_note (Parser &, EventTwoBytes *msg, bool /*is_on*/)
if (!controllable->is_toggle()) {
if (control_additional == msg->note_number) {
controllable->set_value (midi_to_control (msg->velocity));
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Note %1 value %2 %3\n", (int) msg->note_number, (float) midi_to_control (msg->velocity), current_uri() ));
}
} else {
if (control_additional == msg->note_number) {
- controllable->set_value (controllable->get_value() > 0.5f ? 0.0f : 1.0f);
+ float new_value = controllable->get_value() > 0.5f ? 0.0f : 1.0f;
+ controllable->set_value (new_value);
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Note %1 Value %2 %3\n", (int) msg->note_number, (float) new_value, current_uri()));
}
}
@@ -296,34 +304,74 @@ MIDIControllable::midi_sense_controller (Parser &, EventTwoBytes *msg)
if (control_additional == msg->controller_number) {
if (!controllable->is_toggle()) {
+ if (get_encoder() == No_enc) {
+ float new_value = msg->value;
+ float max_value = max(last_controllable_value, new_value);
+ float min_value = min(last_controllable_value, new_value);
+ float range = max_value - min_value;
+ float threshold = (float) _surface->threshold ();
+
+ bool const in_sync = (
+ range < threshold &&
+ controllable->get_value() <= midi_to_control(max_value) &&
+ controllable->get_value() >= midi_to_control(min_value)
+ );
+
+ /* If the surface is not motorised, we try to prevent jumps when
+ the MIDI controller and controllable are out of sync.
+ There might be a better way of doing this.
+ */
+
+ if (in_sync || _surface->motorised ()) {
+ controllable->set_value (midi_to_control (new_value));
+ }
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("MIDI CC %1 value %2 %3\n", (int) msg->controller_number, (float) midi_to_control(new_value), current_uri() ));
+
+ last_controllable_value = new_value;
+ } else {
+ int offset = (msg->value & 0x3f);
+ switch (get_encoder()) {
+ case Enc_L:
+ if (msg->value > 0x40) {
+ controllable->set_value (midi_to_control (last_value - offset + 1));
+ } else {
+ controllable->set_value (midi_to_control (last_value + offset + 1));
+ }
+ break;
+ case Enc_R:
+ if (msg->value > 0x40) {
+ controllable->set_value (midi_to_control (last_value + offset + 1));
+ } else {
+ controllable->set_value (midi_to_control (last_value - offset + 1));
+ }
+ break;
+ case Enc_2:
+ if (msg->value > 0x40) {
+ controllable->set_value (midi_to_control (last_value - (0x7f - msg->value) + 1));
+ } else {
+ controllable->set_value (midi_to_control (last_value + offset + 1));
+ }
+ break;
+ case Enc_B:
+ if (msg->value > 0x40) {
+ controllable->set_value (midi_to_control (last_value + offset + 1));
+ } else {
+ controllable->set_value (midi_to_control (last_value - (0x40 - offset)));
+ }
+ break;
+ default:
+ break;
+ }
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("MIDI CC %1 value %2 %3\n", (int) msg->controller_number, (int) last_value, current_uri() ));
- float new_value = msg->value;
- float max_value = max(last_controllable_value, new_value);
- float min_value = min(last_controllable_value, new_value);
- float range = max_value - min_value;
- float threshold = (float) _surface->threshold ();
-
- bool const in_sync = (
- range < threshold &&
- controllable->get_value() <= midi_to_control(max_value) &&
- controllable->get_value() >= midi_to_control(min_value)
- );
-
- /* If the surface is not motorised, we try to prevent jumps when
- the MIDI controller and controllable are out of sync.
- There might be a better way of doing this.
- */
-
- if (in_sync || _surface->motorised ()) {
- controllable->set_value (midi_to_control (new_value));
}
-
- last_controllable_value = new_value;
} else {
if (msg->value > 64.0f) {
controllable->set_value (1);
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Midi CC %1 value 1 %2\n", (int) msg->controller_number, current_uri()));
} else {
controllable->set_value (0);
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Midi CC %1 value 0 %2\n", (int) msg->controller_number, current_uri()));
}
}
@@ -339,11 +387,16 @@ MIDIControllable::midi_sense_program_change (Parser &, MIDI::byte msg)
return;
}
}
+ if (msg == control_additional) {
- if (!controllable->is_toggle()) {
- controllable->set_value (midi_to_control (msg));
- } else if (msg == control_additional) {
- controllable->set_value (controllable->get_value() > 0.5f ? 0.0f : 1.0f);
+ if (!controllable->is_toggle()) {
+ controllable->set_value (1.0);
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("MIDI program %1 value 1.0 %3\n", (int) msg, current_uri() ));
+ } else {
+ float new_value = controllable->get_value() > 0.5f ? 0.0f : 1.0f;
+ controllable->set_value (new_value);
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("MIDI program %1 value %2 %3\n", (int) msg, (float) new_value, current_uri()));
+ }
}
last_value = (MIDI::byte) (controllable->get_value() * 127.0); // to prevent feedback fights
@@ -360,8 +413,15 @@ MIDIControllable::midi_sense_pitchbend (Parser &, pitchbend_t pb)
if (!controllable->is_toggle()) {
controllable->set_value (midi_to_control (pb));
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("MIDI pitchbend %1 value %2 %3\n", (int) control_channel, (float) midi_to_control (pb), current_uri() ));
} else {
- controllable->set_value (controllable->get_value() > 0.5f ? 0.0f : 1.0f);
+ if (pb > 8065.0f) {
+ controllable->set_value (1);
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Midi pitchbend %1 value 1 %2\n", (int) control_channel, current_uri()));
+ } else {
+ controllable->set_value (0);
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Midi pitchbend %1 value 0 %2\n", (int) control_channel, current_uri()));
+ }
}
last_value = control_to_midi (controllable->get_value ());
@@ -376,6 +436,7 @@ MIDIControllable::midi_receiver (Parser &, MIDI::byte *msg, size_t /*len*/)
return;
}
+ _surface->check_used_event(msg[0], msg[1]);
bind_midi ((channel_t) (msg[0] & 0xf), eventType (msg[0] & 0xF0), msg[1]);
if (controllable) {
@@ -437,6 +498,7 @@ MIDIControllable::bind_midi (channel_t chn, eventType ev, MIDI::byte additional)
default:
break;
}
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Controlable: bind_midi: %1 on Channel %2 value %3 \n", _control_description, chn_i + 1, (int) additional));
}
MIDI::byte*
@@ -452,21 +514,28 @@ MIDIControllable::write_feedback (MIDI::byte* buf, int32_t& bufsize, bool /*forc
return buf;
}
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Feedback: %1 %2\n", control_description(), current_uri()));
+
*buf++ = (0xF0 & control_type) | (0xF & control_channel);
-
+ int ev_size = 3;
switch (control_type) {
case MIDI::pitchbend:
*buf++ = int (gm) & 127;
*buf++ = (int (gm) >> 7) & 127;
break;
+ case MIDI::program:
+ *buf++ = control_additional; /* program number */
+ ev_size = 2;
+ break;
default:
*buf++ = control_additional; /* controller number */
*buf++ = gm;
break;
}
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("MIDI out: Type %1 Channel %2 Bytes %3 %4\n", (int) control_type, (int) control_channel , (int) *(buf - 2), (int) *(buf - 1)));
last_value = gm;
- bufsize -= 3;
+ bufsize -= ev_size;
return buf;
}
diff --git a/libs/surfaces/generic_midi/midicontrollable.h b/libs/surfaces/generic_midi/midicontrollable.h
index aeed05d..1ea13ec 100644
--- a/libs/surfaces/generic_midi/midicontrollable.h
+++ b/libs/surfaces/generic_midi/midicontrollable.h
@@ -59,6 +59,14 @@ class MIDIControllable : public PBD::Stateful
uint32_t rid() const { return _rid; }
std::string what() const { return _what; }
+ enum Encoder {
+ No_enc,
+ Enc_R,
+ Enc_L,
+ Enc_2,
+ Enc_B,
+ };
+
MIDI::byte* write_feedback (MIDI::byte* buf, int32_t& bufsize, bool force = false);
void midi_rebind (MIDI::channel_t channel=-1);
@@ -75,7 +83,10 @@ class MIDIControllable : public PBD::Stateful
bool learned() const { return _learned; }
- MIDI::Parser& get_parser() { return _parser; }
+ Encoder get_encoder() const { return _encoder; }
+ void set_encoder (Encoder val) { _encoder = val; }
+
+ MIDI::Parser& get_parser() { return _parser; }
PBD::Controllable* get_controllable() const { return controllable; }
void set_controllable (PBD::Controllable*);
const std::string& current_uri() const { return _current_uri; }
@@ -109,6 +120,7 @@ class MIDIControllable : public PBD::Stateful
bool _momentary;
bool _is_gain_controller;
bool _learned;
+ Encoder _encoder;
int midi_msg_id; /* controller ID or note number */
PBD::ScopedConnection midi_sense_connection[2];
PBD::ScopedConnection midi_learn_connection;
diff --git a/libs/surfaces/generic_midi/midifunction.cc b/libs/surfaces/generic_midi/midifunction.cc
index b0dc95e..e2fb317 100644
--- a/libs/surfaces/generic_midi/midifunction.cc
+++ b/libs/surfaces/generic_midi/midifunction.cc
@@ -23,7 +23,12 @@
#include "midifunction.h"
#include "generic_midi_control_protocol.h"
+#include "pbd/compose.h"
+
+#include "ardour/debug.h"
+
using namespace MIDI;
+using namespace PBD;
MIDIFunction::MIDIFunction (MIDI::Parser& p)
: MIDIInvokable (p)
@@ -94,10 +99,12 @@ MIDIFunction::execute ()
switch (_function) {
case NextBank:
_ui->next_bank();
+ DEBUG_TRACE (DEBUG::GenericMidi, "Function: next_bank\n");
break;
case PrevBank:
_ui->prev_bank();
+ DEBUG_TRACE (DEBUG::GenericMidi, "Function: prev_bank\n");
break;
case SetBank:
@@ -105,39 +112,48 @@ MIDIFunction::execute ()
uint32_t bank;
sscanf (_argument.c_str(), "%d", &bank);
_ui->set_current_bank (bank);
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Function: set_current_bank = %1\n", (int) bank));
}
break;
case TransportStop:
_ui->transport_stop ();
+ DEBUG_TRACE (DEBUG::GenericMidi, "Function: transport_stop\n");
break;
case TransportRoll:
_ui->transport_play ();
+ DEBUG_TRACE (DEBUG::GenericMidi, "Function: transport_play\n");
break;
case TransportStart:
_ui->goto_start ();
+ DEBUG_TRACE (DEBUG::GenericMidi, "Function: goto_start\n");
break;
case TransportZero:
// need this in BasicUI
+ DEBUG_TRACE (DEBUG::GenericMidi, "Function: goto_zero-not implemented\n");
break;
case TransportEnd:
_ui->goto_end ();
+ DEBUG_TRACE (DEBUG::GenericMidi, "Function: goto_end\n");
break;
case TransportLoopToggle:
_ui->loop_toggle ();
+ DEBUG_TRACE (DEBUG::GenericMidi, "Function: loop_toggle\n");
break;
case TransportRecordEnable:
_ui->set_record_enable (true);
+ DEBUG_TRACE (DEBUG::GenericMidi, "Function: set_record_enable = true\n");
break;
case TransportRecordDisable:
_ui->set_record_enable (false);
+ DEBUG_TRACE (DEBUG::GenericMidi, "Function: set_record_enable = false\n");
break;
case Select:
@@ -145,6 +161,7 @@ MIDIFunction::execute ()
uint32_t rid;
sscanf (_argument.c_str(), "%d", &rid);
_ui->SetRouteSelection (rid);
+ DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Function: SetRouteSelection = %1\n", rid));
}
break;
case TrackSetMute:
@@ -165,6 +182,7 @@ MIDIFunction::execute ()
XMLNode&
MIDIFunction::get_state ()
{
+
XMLNode* node = new XMLNode ("MIDIFunction");
return *node;
}
diff --git a/libs/surfaces/mackie/device_info.cc b/libs/surfaces/mackie/device_info.cc
index a50d256..a4b967c 100644
--- a/libs/surfaces/mackie/device_info.cc
+++ b/libs/surfaces/mackie/device_info.cc
@@ -246,6 +246,8 @@ DeviceInfo::set_state (const XMLNode& node, int /* version */)
if ((prop = child->property ("value")) != 0) {
if ((_master_position = atoi (prop->value().c_str())) == 0) {
_master_position = 0;
+ } else if (_master_position > 0) {
+ _master_position --;
}
}
}
diff --git a/libs/surfaces/mackie/surface.cc b/libs/surfaces/mackie/surface.cc
index b918f67..6777d8e 100644
--- a/libs/surfaces/mackie/surface.cc
+++ b/libs/surfaces/mackie/surface.cc
@@ -97,7 +97,7 @@ Surface::Surface (MackieControlProtocol& mcp, const std::string& device_name, ui
/* lets use master_position instead */
uint32_t mp = _mcp.device_info().master_position();
if (_number == mp) {
- DEBUG_TRACE (DEBUG::MackieControl, "Surface is first. Might have global controls.\n");
+ DEBUG_TRACE (DEBUG::MackieControl, "Surface matches MasterPosition. Might have global controls.\n");
if (_mcp.device_info().has_global_controls()) {
init_controls ();
DEBUG_TRACE (DEBUG::MackieControl, "init_controls done\n");
@@ -508,6 +508,7 @@ Surface::handle_midi_controller_message (MIDI::Parser &, MIDI::EventTwoBytes* ev
_jog_wheel->jog_event (delta);
return;
}
+ // add external (pedal?) control here
return;
}
diff --git a/libs/timecode/src/time.cc b/libs/timecode/src/time.cc
index 1fd78c1..b3d6b15 100644
--- a/libs/timecode/src/time.cc
+++ b/libs/timecode/src/time.cc
@@ -770,7 +770,7 @@ sample_to_timecode (
if (!use_offset) {
timecode.negative = (sample < 0);
- offset_sample = llabs(sample);
+ offset_sample = ::llabs(sample);
} else {
if (offset_is_negative) {
offset_sample = sample + offset_samples;
diff --git a/mcp/bcf2000.device b/mcp/bcf2000.device
index f3207d8..ebfaf39 100644
--- a/mcp/bcf2000.device
+++ b/mcp/bcf2000.device
@@ -6,6 +6,7 @@
<TimecodeDisplay value="no"/>
<TwoCharacterDisplay value="yes"/>
<Extenders value="0"/>
+ <MasterPosition value="0"/>
<GlobalControls value="yes"/>
<JogWheel value="yes"/>
<TouchSenseFaders value="no"/>
diff --git a/mcp/cmc.device b/mcp/cmc.device
index b23c849..2e06a0a 100644
--- a/mcp/cmc.device
+++ b/mcp/cmc.device
@@ -2,6 +2,7 @@
<Name value="Steinberg CMC series"/>
<Strips value="1"/>
<Extenders value="0"/>
+ <MasterPosition value="0"/>
<MasterFader value="yes"/>
<TimecodeDisplay value="no"/>
<TwoCharacterDisplay value="no"/>
diff --git a/mcp/mc.device b/mcp/mc.device
index baa0711..11dc0e8 100644
--- a/mcp/mc.device
+++ b/mcp/mc.device
@@ -6,6 +6,7 @@
<TimecodeDisplay value="yes"/>
<TwoCharacterDisplay value="yes"/>
<Extenders value="0"/>
+ <MasterPosition value="0"/>
<GlobalControls value="yes"/>
<JogWheel value="yes"/>
<TouchSenseFaders value="yes"/>
diff --git a/mcp/mcpro.device b/mcp/mcpro.device
index 9ac1ed0..0ace09a 100644
--- a/mcp/mcpro.device
+++ b/mcp/mcpro.device
@@ -6,6 +6,7 @@
<TimecodeDisplay value="yes"/>
<TwoCharacterDisplay value="yes"/>
<Extenders value="0"/>
+ <MasterPosition value="0"/>
<GlobalControls value="yes"/>
<JogWheel value="yes"/>
<TouchSenseFaders value="yes"/>
diff --git a/mcp/mcproxt.device b/mcp/mcproxt.device
index 6bddee0..41361d0 100644
--- a/mcp/mcproxt.device
+++ b/mcp/mcproxt.device
@@ -6,6 +6,7 @@
<TimecodeDisplay value="yes"/>
<TwoCharacterDisplay value="yes"/>
<Extenders value="0"/>
+ <MasterPosition value="0"/>
<GlobalControls value="no"/>
<JogWheel value="no"/>
<TouchSenseFaders value="yes"/>
diff --git a/mcp/nucleus.device b/mcp/nucleus.device
index 1ab96c3..d9dbba4 100644
--- a/mcp/nucleus.device
+++ b/mcp/nucleus.device
@@ -3,6 +3,7 @@
<Name value="SSL Nucleus"/>
<Strips value="8"/>
<Extenders value="1"/>
+ <MasterPosition value="0"/>
<MasterFader value="no"/>
<TimecodeDisplay value="no"/>
<TwoCharacterDisplay value="yes"/>
diff --git a/mcp/qcon.device b/mcp/qcon.device
index 48c5390..37d618e 100644
--- a/mcp/qcon.device
+++ b/mcp/qcon.device
@@ -2,6 +2,7 @@
<Name value="Qcon"/>
<Strips value="8"/>
<Extenders value="0"/>
+ <MasterPosition value="0"/>
<MasterFader value="yes"/>
<TimecodeDisplay value="yes"/>
<TwoCharacterDisplay value="no"/>
diff --git a/midi_maps/midikb_wiimote.map b/midi_maps/midikb_wiimote.map
new file mode 100644
index 0000000..61b3fd0
--- /dev/null
+++ b/midi_maps/midikb_wiimote.map
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ArdourMIDIBindings version="1.0.0" name="WiiMote via midikb">
+
+<!-- OvenWerks June 27 2015 -->
+<!-- This tries to do what the old WiiMote setup in Ardour did -->
+<!-- B + A -->
+<Binding channel="1" note="16" action="Transport/ToggleRollForgetCapture"/>
+<!-- B + left -->
+<Binding channel="1" note="17" action="Editor/playhead-to-previous-region-boundary"/>
+<!-- B + right -->
+<Binding channel="1" note="18" action="Editor/playhead-to-next-region-boundary"/>
+<!-- B + up -->
+<Binding channel="1" note="19" action="Editor/jump-forward-to-mark"/>
+<!-- B + down -->
+<Binding channel="1" note="20" action="Editor/jump-backward-to-mark"/>
+<!-- B + home -->
+<Binding channel="1" note="21" action="Editor/add-location-from-playhead"/>
+<!-- B + minus -->
+<Binding channel="1" note="22" action="Transport/GotoStart"/>
+<!-- B + plus -->
+<Binding channel="1" note="23" action="Transport/GotoEnd"/>
+<!-- B + one Not used add as you wish -->
+<!--Binding channel="1" note="24" action=""/-->
+<!-- B + Two -->
+<Binding channel="1" note="25" function="rec-disable"/>
+
+<!-- A -->
+<Binding channel="1" note="32" action="Transport/ToggleRoll"/>
+<!-- left -->
+<Binding channel="1" note="33" action="Editor/nudge-playhead-backward"/>
+<!-- right -->
+<Binding channel="1" note="34" action="Editor/nudge-playhead-forward"/>
+<!-- up -->
+<Binding channel="1" note="35" action="Editor/select-prev-route"/>
+<!-- down -->
+<Binding channel="1" note="36" action="Editor/select-next-route"/>
+<!-- home -->
+<Binding channel="1" note="37" action="Editor/playhead-to-edit"/>
+<!-- minus -->
+<Binding channel="1" note="38" action="Editor/temporal-zoom-out"/>
+<!-- plus -->
+<Binding channel="1" note="39" action="Editor/temporal-zoom-in"/>
+<!-- one -->
+<Binding channel="1" note="40" action="Editor/track-record-enable-toggle"/>
+<!-- Two -->
+<Binding channel="1" note="41" function="rec-enable"/>
+
+
+
+
+</ArdourMIDIBindings>
diff --git a/patches/GdkQuartzWindow.patch b/patches/GdkQuartzWindow.patch
new file mode 100644
index 0000000..217c010
--- /dev/null
+++ b/patches/GdkQuartzWindow.patch
@@ -0,0 +1,44 @@
+--- old/gtk+-2.24.23/gdk/quartz/GdkQuartzWindow.c 2013-10-16 11:29:55.000000000 -0400
++++ new/gtk+-2.24.23/gdk/quartz/GdkQuartzWindow.c 2015-07-20 15:05:40.000000000 -0400
+@@ -625,6 +625,41 @@
+ event.dnd.send_event = FALSE;
+ event.dnd.context = _gdk_quartz_drag_source_context;
+
++ /* Check to see if the coordinates are inside a known GdkWindow */
++
++ GdkScreen* screen = gdk_window_get_screen (event.dnd.window);
++
++ if (screen)
++ {
++ GList* windows, *list;
++ gint gx, gy;
++
++ event.dnd.context->dest_window = NULL;
++
++ windows = gdk_screen_get_toplevel_windows (screen);
++ _gdk_quartz_window_nspoint_to_gdk_xy (aPoint, &gx, &gy);
++
++ for (list = windows; list; list = list->next)
++ {
++ GdkWindow* win = (GdkWindow*) list->data;
++ gint wx, wy;
++ gint ww, wh;
++
++ gdk_window_get_root_origin (win, &wx, &wy);
++ ww = gdk_window_get_width (win);
++ wh = gdk_window_get_height (win);
++
++ if (gx > wx &&
++ gy > wy &&
++ gx <= wx + ww &&
++ gy <= wy + wh)
++ {
++ /* found a toplevel GdkWindow at the drop position */
++ event.dnd.context->dest_window = win;
++ }
++ }
++ }
++
+ (*_gdk_event_func) (&event, _gdk_event_data);
+
+ g_object_unref (event.dnd.window);
diff --git a/patches/gtkdnd-quartz.patch b/patches/gtkdnd-quartz.patch
new file mode 100644
index 0000000..07723ad
--- /dev/null
+++ b/patches/gtkdnd-quartz.patch
@@ -0,0 +1,55 @@
+--- old/gtk+-2.24.23/gtk/gtkdnd-quartz.c 2013-10-16 11:29:55.000000000 -0400
++++ new/gtk+-2.24.23/gtk/gtkdnd-quartz.c 2015-07-20 14:53:33.000000000 -0400
+@@ -1928,16 +1928,29 @@
+ static gboolean
+ drag_drop_finished_idle_cb (gpointer data)
+ {
+- gtk_drag_source_info_destroy (data);
++ GtkDragSourceInfo* info = (GtkDragSourceInfo*) data;
++ if (info->success)
++ {
++ gtk_drag_source_info_destroy (data);
++ }
+ return FALSE;
+ }
+
+ static void
+-gtk_drag_drop_finished (GtkDragSourceInfo *info)
++gtk_drag_drop_finished (GtkDragSourceInfo *info, GtkDragResult result)
+ {
+- if (info->success && info->delete)
+- g_signal_emit_by_name (info->source_widget, "drag-data-delete",
+- info->context);
++ gboolean success = (result == GTK_DRAG_RESULT_SUCCESS);
++
++ if (!success) {
++ g_signal_emit_by_name (info->source_widget, "drag-failed",
++ info->context, GTK_DRAG_RESULT_NO_TARGET, &success);
++ }
++
++ if (success && info->delete) {
++ g_signal_emit_by_name (info->source_widget, "drag-data-delete",
++ info->context);
++ }
++
+
+ /* Workaround for the fact that the NS API blocks until the drag is
+ * over. This way the context is still valid when returning from
+@@ -1963,6 +1976,7 @@
+ {
+ GtkDragSourceInfo *info;
+ GdkDragContext *context;
++ GtkDragResult result;
+
+ g_return_if_fail (widget != NULL);
+ g_return_if_fail (event != NULL);
+@@ -1975,7 +1989,8 @@
+ switch (event->type)
+ {
+ case GDK_DROP_FINISHED:
+- gtk_drag_drop_finished (info);
++ result = (gdk_drag_context_get_dest_window (context) != NULL) ? GTK_DRAG_RESULT_SUCCESS : GTK_DRAG_RESULT_NO_TARGET;
++ gtk_drag_drop_finished (info, result);
+ break;
+ default:
+ g_assert_not_reached ();
diff --git a/system_config b/system_config
index d136ab9..02e4f1e 100644
--- a/system_config
+++ b/system_config
@@ -4,6 +4,7 @@
<Option name="auto-connect-standard-busses" value="1"/>
<Option name="output-auto-connect" value="2"/>
<Option name="input-auto-connect" value="1"/>
+ <Option name="tracks-auto-naming" value="1"/>
<Option name="trace-midi-input" value="0"/>
<Option name="trace-midi-output" value="0"/>
<Option name="send-mtc" value="0"/>
@@ -15,7 +16,7 @@
<Option name="mmc-send-device-id" value="0"/>
<Option name="initial-program-change" value="-1"/>
<Option name="display-first-midi-bank-as-zero" value="0"/>
- <Option name="inter-scene-gap-msecs" value="1"/>
+ <Option name="inter-scene-gap-frames" value="1"/>
<Option name="mtc-qf-speed-tolerance" value="5"/>
<Option name="timecode-sync-frame-rate" value="1"/>
<Option name="timecode-source-is-synced" value="0"/>
@@ -32,6 +33,7 @@
<Option name="minimum-disk-read-bytes" value="262144"/>
<Option name="minimum-disk-write-bytes" value="262144"/>
<Option name="midi-readahead" value="1"/>
+ <Option name="buffering-preset" value="1"/>
<Option name="capture-buffer-seconds" value="5"/>
<Option name="playback-buffer-seconds" value="5"/>
<Option name="midi-track-buffer-seconds" value="1"/>
@@ -84,9 +86,14 @@
<Option name="shuttle-speed-threshold" value="5"/>
<Option name="shuttle-behaviour" value="0"/>
<Option name="shuttle-units" value="0"/>
+ <Option name="shuttle-max-speed" value="8"/>
<Option name="locate-while-waiting-for-sync" value="0"/>
<Option name="disable-disarm-during-roll" value="0"/>
+ <Option name="auto-return-target-list" value="15"/>
<Option name="meter-falloff" value="13.3"/>
+ <Option name="meter-type-master" value="16"/>
+ <Option name="meter-type-track" value="4"/>
+ <Option name="meter-type-bus" value="4"/>
<Option name="auditioner-output-left" value="default"/>
<Option name="auditioner-output-right" value="default"/>
<Option name="replicate-missing-region-channels" value="0"/>
@@ -104,6 +111,7 @@
<Option name="processor-usage" value="-1"/>
<Option name="max-gain" value="2"/>
<Option name="max-recent-sessions" value="10"/>
+ <Option name="max-recent-templates" value="10"/>
<Option name="automation-thinning-factor" value="20"/>
<Option name="range-location-minimum" value="128"/>
<Option name="edit-mode" value="0"/>
@@ -112,6 +120,7 @@
<Option name="use-windows-vst" value="1"/>
<Option name="use-lxvst" value="1"/>
<Option name="discover-vst-on-start" value="0"/>
+ <Option name="verbose-plugin-scan" value="1"/>
<Option name="vst-scan-timeout" value="600"/>
<Option name="discover-audio-units" value="0"/>
<Option name="plugin-path-vst" value="@default@"/>
@@ -119,10 +128,11 @@
<Option name="denormal-protection" value="0"/>
<Option name="denormal-model" value="3"/>
<Option name="osx-pingback-url" value="http://community.ardour.org/pingback/osx/"/>
- <Option name="tutorial-manual-url" value="http://ardour.org/flossmanual"/>
+ <Option name="windows-pingback-url" value="http://community.ardour.org/pingback/windows/"/>
+ <Option name="tutorial-manual-url" value="http://ardour.org/tutorial"/>
<Option name="reference-manual-url" value="http://manual.ardour.org/"/>
<Option name="video-advanced-setup" value="0"/>
- <Option name="video-server-url" value="http://localhost:1554"/>
+ <Option name="video-server-url" value="http://127.0.0.1:1554"/>
<Option name="video-server-docroot" value="/"/>
<Option name="show-video-export-info" value="1"/>
<Option name="show-video-server-dialog" value="0"/>
diff --git a/tools/CrashReporter/CrashReporter.xcodeproj/TemplateIcon.icns b/tools/CrashReporter/CrashReporter.xcodeproj/CrashReporter.xcodeproj/TemplateIcon.icns
similarity index 100%
copy from tools/CrashReporter/CrashReporter.xcodeproj/TemplateIcon.icns
copy to tools/CrashReporter/CrashReporter.xcodeproj/CrashReporter.xcodeproj/TemplateIcon.icns
diff --git a/tools/CrashReporter/CrashReporter.xcodeproj/project.pbxproj b/tools/CrashReporter/CrashReporter.xcodeproj/CrashReporter.xcodeproj/project.pbxproj
similarity index 100%
copy from tools/CrashReporter/CrashReporter.xcodeproj/project.pbxproj
copy to tools/CrashReporter/CrashReporter.xcodeproj/CrashReporter.xcodeproj/project.pbxproj
diff --git a/tools/define_versions.sh b/tools/define_versions.sh
index 9acf95a..a0642ce 100644
--- a/tools/define_versions.sh
+++ b/tools/define_versions.sh
@@ -12,8 +12,26 @@ GIT_REV_REGEXP='([0-9][0-9]*)\.([0-9][0-9]*)\-?(rc[0-9]*)?-?([0-9][0-9]*)?(-g([a
major_version=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\1/"`
minor_version=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\2/"`
+
+# Tracks tags with "MAJOR.MINOR.MICRO"
+# Ardour doesn't use this
+
+micro_version=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\3/"`
+
+#
+# RC e.g. 8.1-rc3 (optional)
+# Tracks does not use -rcN based tagging
+#
rc=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\3/"`
+
+#
+# revision count since tag
+#
r=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\4/"`
+
+#
+# git short sha1 commit ID
+#
commit=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\6/"`
if [ "x$rc" != "x" ] ; then
diff --git a/tools/linux_packaging/ardour.sh.in b/tools/linux_packaging/ardour.sh.in
index aa84f08..21068da 100644
--- a/tools/linux_packaging/ardour.sh.in
+++ b/tools/linux_packaging/ardour.sh.in
@@ -25,11 +25,6 @@ BIN_DIR=$(dirname $(readlink -f $0))
INSTALL_DIR=$(dirname $BIN_DIR)
LIB_DIR=$INSTALL_DIR/lib
ETC_DIR=$INSTALL_DIR/etc
-USER_ARDOUR_DIR=$HOME/.config/ardour3
-
-if [ ! -d $USER_ARDOUR_DIR ] ; then
- mkdir -p $USER_ARDOUR_DIR || exit 1
-fi
# this triggers code in main() that will reset runtime environment variables
# to point to directories inside the ardour package
@@ -51,9 +46,9 @@ export LD_LIBRARY_PATH=$INSTALL_DIR/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
if [ "T" = "$DEBUG" ]; then
export ARDOUR_INSIDE_GDB=1
- exec gdb $INSTALL_DIR/bin/ardour-%VER%
+ exec gdb $INSTALL_DIR/bin/%EXENAME%-%VER%
else
- exec $INSTALL_DIR/bin/ardour-%VER% $ARGS
+ exec $INSTALL_DIR/bin/%EXENAME%-%VER% $ARGS
fi
diff --git a/tools/linux_packaging/build b/tools/linux_packaging/build
index d0f9a90..0915beb 100755
--- a/tools/linux_packaging/build
+++ b/tools/linux_packaging/build
@@ -22,6 +22,8 @@ if test -z "$CACHEDIR" -o ! -d "$CACHEDIR"; then
fi
MIXBUS=
+WITH_HARRISON_LV2=
+WITH_X42_LV2=
WITH_LADSPA=0
WITH_HARVID=
STRIP=all
@@ -29,6 +31,7 @@ PRINT_SYSDEPS=
WITH_NLS=
EXTERNAL_JACK=
VENDOR=Ardour ;
+EXENAME=ardour
BUILDTYPE=""
@@ -51,11 +54,14 @@ while [ $# -gt 0 ] ; do
--mixbus)
MIXBUS=1;
+ WITH_HARRISON_LV2=1 ;
+ WITH_X42_LV2=1 ;
WITH_NLS=1 ;
WITH_LADSPA=;
STRIP=all
APPNAME=Mixbus ;
- VENDOR=Harrison ;
+ VENDOR=Harrison ;
+ EXENAME=mixbus ;
shift ;;
--public)
WITH_NLS=1 ;
@@ -113,6 +119,7 @@ case `uname -m` in
echo "Architecture is x86"
ARCH='x86'
WARCH='i386'
+ HARCH='linux32'
ARCH_BITS='32-bit'
MULTIARCH='i386-linux-gnu'
;;
@@ -120,6 +127,7 @@ case `uname -m` in
echo "Architecture is x86_64"
ARCH='x86_64'
WARCH='x86_64'
+ HARCH='linux64'
ARCH_BITS='64-bit'
MULTIARCH='x86_64-linux-gnu'
;;
@@ -235,14 +243,13 @@ echo export 'PATH=/usr/local/bin:/opt/bin:$PATH' >> $ENVIRONMENT
# create startup helper script
-sed -e "/^%ENV%/r $ENVIRONMENT" -e '/^%ENV%/d' -e 's/%VER%/'"${release_version}"'/' < ardour.sh.in > $APPBIN/ardour${major_version}
-rm $ENVIRONMENT && chmod 775 $APPBIN/ardour${major_version}
-MAIN_EXECUTABLE=ardour-${release_version}
+sed -e "/^%ENV%/r $ENVIRONMENT" -e '/^%ENV%/d' -e 's/%VER%/'"${release_version}"'/;s/%EXENAME%/'"${EXENAME}"'/' < ardour.sh.in > $APPBIN/${EXENAME}${major_version}
+rm $ENVIRONMENT && chmod 775 $APPBIN/${EXENAME}${major_version}
echo "Copying ardour executable ...."
-cp $BUILD_ROOT/gtk2_ardour/$MAIN_EXECUTABLE $APPBIN
+cp -v $BUILD_ROOT/gtk2_ardour/ardour-${release_version} $APPBIN/${EXENAME}-${release_version}
if test x$STRIP = xall ; then
- strip $APPBIN/$MAIN_EXECUTABLE
+ strip $APPBIN/${EXENAME}-${release_version}
fi
# copy locale files
@@ -414,7 +421,7 @@ if test -f $BUILD_ROOT/libs/ardouralsautil/ardour-request-device; then
fi
OURLIBDIR=$BUILD_ROOT/libs
-OURLIBS=$OURLIBDIR/vamp-sdk:$OURLIBDIR/surfaces/control_protocol:$OURLIBDIR/ardour:$OURLIBDIR/midi++2:$OURLIBDIR/pbd:$OURLIBDIR/rubberband:$OURLIBDIR/soundtouch:$OURLIBDIR/gtkmm2ext:$OURLIBDIR/sigc++2:$OURLIBDIR/glibmm2:$OURLIBDIR/gtkmm2/atk:$OURLIBDIR/gtkmm2/pango:$OURLIBDIR/gtkmm2/gdk:$OURLIBDIR/gtkmm2/gtk:$OURLIBDIR/canvas:$OURLIBDIR/libsndfile:$OURLIBDIR/evoral:$OURLIBDIR/evoral/src/libsmf:$OURLIBDIR/audiographer:$OURLIBDIR/timecode:$OURLIBDIR/taglib:$OURLIBDIR/libltc:$OURLIBDIR/qm-dsp:$OURLIBDIR/ardouralsautil
+OURLIBS=$OURLIBDIR/vamp-sdk:$OURLIBDIR/surfaces/control_protocol:$OURLIBDIR/ardour:$OURLIBDIR/midi++2:$OURLIBDIR/pbd:$OURLIBDIR/rubberband:$OURLIBDIR/soundtouch:$OURLIBDIR/gtkmm2ext:$OURLIBDIR/sigc++2:$OURLIBDIR/glibmm2:$OURLIBDIR/gtkmm2/atk:$OURLIBDIR/gtkmm2/pango:$OURLIBDIR/gtkmm2/gdk:$OURLIBDIR/gtkmm2/gtk:$OURLIBDIR/canvas:$OURLIBDIR/libsndfile:$OURLIBDIR/evoral:$OURLIBDIR/evoral/src/libsmf:$OURLIBDIR/audiographer:$OURLIBDIR/timecode:$OURLIBDIR/taglib:$OURLIBDIR/libltc:$OURLIBDIR/qm-dsp:$OURLIBDIR/ardouralsautil:$OURLIBDIR/ptformat
echo $OURLIBS${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
@@ -424,7 +431,7 @@ deplibs=
while [ true ] ; do
missing=false
filelist=`find $APPLIB/ -type f`
- filelist="$APPBIN/$MAIN_EXECUTABLE $filelist"
+ filelist="$APPBIN/${EXENAME}-${release_version} $filelist"
for file in $filelist ; do
if ! file $file | grep -qs ELF ; then
@@ -572,26 +579,49 @@ done
################################################################################
### Mixbus plugins, etc
+if test x$WITH_HARRISON_LV2 != x ; then
+ echo "Adding Harrison LV2s"
+ mkdir -p $APPLIB/LV2
+
+ curl -s -S --fail -# \
+ -z "${CACHEDIR}/harrison_lv2s.${HARCH}.zip" \
+ -o "${CACHEDIR}/harrison_lv2s.${HARCH}.zip" \
+ http://www.harrisonconsoles.com/mixbus/mb3/${HARCH}/harrison_lv2s.zip
+ unzip -q -d "$APPLIB/LV2/" "${CACHEDIR}/harrison_lv2s.${HARCH}.zip"
+fi
+
if test -n "$MIXBUS"; then
+ echo "Adding Mixbus Channelstrip"
- mkdir -p $APPLIB/LV2
- METERS_VERSION=$(curl -s -S http://gareus.org/x42/linux/x42-meters.latest.txt)
+ mkdir -p $APPLIB/ladspa/strip/
+ curl -s -S --fail -# \
+ -z "${CACHEDIR}/harrison_channelstrip.${HARCH}.so" \
+ -o "${CACHEDIR}/harrison_channelstrip.${HARCH}.so" \
+ http://www.harrisonconsoles.com/mixbus/mb3/${HARCH}/harrison_channelstrip.so
+
+ cp "${CACHEDIR}/harrison_channelstrip.${HARCH}.so" \
+ $APPLIB/ladspa/strip/harrison_channelstrip.so
+ chmod +x $APPLIB/ladspa/strip/harrison_channelstrip.so
+fi
+
+if test x$WITH_X42_LV2 != x ; then
+ METERS_VERSION=$(curl -s -S http://x42-plugins.com/x42/linux/x42-meters.latest.txt)
rsync -a -q --partial \
- rsync://gareus.org/x42/linux/x42-meters-lv2-${WARCH}-${METERS_VERSION}.zip \
- "${SRCDIR}/x42-meters-lv2-linux-${WARCH}-${METERS_VERSION}.zip"
- unzip -d "$APPLIB/LV2/" "${SRCDIR}/x42-meters-lv2-linux-${WARCH}-${METERS_VERSION}.zip"
+ rsync://x42-plugins.com/x42/linux/x42-meters-lv2-linux-${WARCH}-${METERS_VERSION}.zip \
+ "${CACHEDIR}/x42-meters-lv2-linux-${WARCH}-${METERS_VERSION}.zip"
+ unzip -q -d "$APPLIB/LV2/" "${CACHEDIR}/x42-meters-lv2-linux-${WARCH}-${METERS_VERSION}.zip"
- SETBFREE_VERSION=$(curl -s -S http://gareus.org/x42/linux/setBfree.latest.txt)
+ SETBFREE_VERSION=$(curl -s -S http://x42-plugins.com/x42/linux/setBfree.latest.txt)
rsync -a -q --partial \
- rsync://gareus.org/x42/linux/setBfree-lv2-linux-${WARCH}-${SETBFREE_VERSION}.zip \
- "${SRCDIR}/setBfree-lv2-linux-${WARCH}-${SETBFREE_VERSION}.zip"
- unzip -d "$APPLIB/LV2/" "${SRCDIR}/setBfree-lv2-linux-${WARCH}-${SETBFREE_VERSION}.zip"
+ rsync://x42-plugins.com/x42/linux/setBfree-lv2-linux-${WARCH}-${SETBFREE_VERSION}.zip \
+ "${CACHEDIR}/setBfree-lv2-linux-${WARCH}-${SETBFREE_VERSION}.zip"
+ unzip -q -d "$APPLIB/LV2/" "${CACHEDIR}/setBfree-lv2-linux-${WARCH}-${SETBFREE_VERSION}.zip"
- MIDIFILTER_VERSION=$(curl -s -S http://gareus.org/x42/linux/x42-midifilter.latest.txt)
+ MIDIFILTER_VERSION=$(curl -s -S http://x42-plugins.com/x42/linux/x42-midifilter.latest.txt)
rsync -a -q --partial \
- rsync://gareus.org/x42/linux/x42-midifilter-lv2-linux-${WARCH}-${MIDIFILTER_VERSION}.zip \
- "${SRCDIR}/x42-midifilter-lv2-linux-${WARCH}-${MIDIFILTER_VERSION}.zip"
- unzip -d "$APPLIB/LV2/" "${SRCDIR}/x42-midifilter-lv2-linux-${WARCH}-${MIDIFILTER_VERSION}.zip"
+ rsync://x42-plugins.com/x42/linux/x42-midifilter-lv2-linux-${WARCH}-${MIDIFILTER_VERSION}.zip \
+ "${CACHEDIR}/x42-midifilter-lv2-linux-${WARCH}-${MIDIFILTER_VERSION}.zip"
+ unzip -q -d "$APPLIB/LV2/" "${CACHEDIR}/x42-midifilter-lv2-linux-${WARCH}-${MIDIFILTER_VERSION}.zip"
fi
################################################################################
@@ -630,7 +660,7 @@ chmod a+x $APPBIN/${APP_VER_NAME}.uninstall.sh
#
# Add the stage2.run script
#
-sed -e "s/%REPLACE_MAJOR_VERSION%/${major_version}/" < stage2.run.in > stage2.run
+sed -e "s/%REPLACE_MAJOR_VERSION%/${major_version}/;s/%REPLACE_PGM%/${APPNAME}/;s/%REPLACE_VENDOR%/${VENDOR}/;s/%REPLACE_EXE%/${EXENAME}/" < stage2.run.in > stage2.run
chmod a+x stage2.run
diff --git a/tools/linux_packaging/stage2.run.in b/tools/linux_packaging/stage2.run.in
index 87f2401..f3ea842 100755
--- a/tools/linux_packaging/stage2.run.in
+++ b/tools/linux_packaging/stage2.run.in
@@ -10,9 +10,9 @@
MAJOR_VERSION="%REPLACE_MAJOR_VERSION%"
-PGM_NAME="Ardour"
-PGM_VENDOR="Ardour"
-PGM_EXEC_FILE="ardour${MAJOR_VERSION}"
+PGM_NAME="%REPLACE_PGM%"
+PGM_VENDOR="%REPLACE_VENDOR%"
+PGM_EXEC_FILE="%REPLACE_EXE%${MAJOR_VERSION}"
THE_SHELL="/bin/sh"
@@ -351,7 +351,7 @@ LIB_ERROR="F"
LD_PATH=`pwd`/${BUNDLE_DIR}/lib
# check the main App
-LDD_RESULT=$(LD_LIBRARY_PATH=${LD_PATH} ldd ${BUNDLE_DIR}/bin/${PGM_NAME_LOWER}-* 2>&1 > /dev/null)
+LDD_RESULT=$(LD_LIBRARY_PATH=${LD_PATH} ldd ${BUNDLE_DIR}/bin/${PGM_NAME_LOWER}-* 2>&1 > /dev/null | grep -v "no version information")
if [ -n "$LDD_RESULT" ];
then
@@ -364,7 +364,7 @@ LIB_FILES=$(find ${BUNDLE_DIR}/lib -name "*.so")
for path in $LIB_FILES
do
- LDD_RESULT=$(LD_LIBRARY_PATH=${LD_PATH} ldd $path 2>&1 > /dev/null)
+ LDD_RESULT=$(LD_LIBRARY_PATH=${LD_PATH} ldd $path 2>&1 > /dev/null | grep -v "no version information")
if [ -n "$LDD_RESULT" ];
then
echo "$LDD_RESULT"
diff --git a/tools/osx_packaging/osx_build b/tools/osx_packaging/osx_build
index 757835b..75d0c18 100755
--- a/tools/osx_packaging/osx_build
+++ b/tools/osx_packaging/osx_build
@@ -18,6 +18,7 @@ SAE=
MIXBUS=
WITH_HARVID=1
WITH_HARRISON_LV2=
+WITH_X42_LV2=
WITH_LADSPA=1
STRIP=1
PRINT_SYSDEPS=
@@ -39,11 +40,13 @@ while [ $# -gt 0 ] ; do
APPNAME=Ardour ;
shift ;;
--mixbus) MIXBUS=1;
+ WITH_HARRISON_LV2=1 ;
+ WITH_X42_LV2=1 ;
WITH_NLS=1 ;
SAE= ;
WITH_LADSPA=;
STRIP= ;
- PRODUCT_PKG_DIR=MixBus;
+ PRODUCT_PKG_DIR=Mixbus;
APPNAME=Mixbus ;
shift ;;
--public) WITH_NLS= ;
@@ -400,6 +403,12 @@ if test -f $BUILD_ROOT/libs/vfork/ardour-exec-wrapper ; then
cp $BUILD_ROOT/libs/vfork/ardour-exec-wrapper $Frameworks/
fi
+# TODO check if this is still needed, even when building on 10.5
+if file $BUILD_ROOT/gtk2_ardour/ardour-$release_version | grep -q ppc; then
+STDCPP='|libstdc\+\+'
+else
+STDCPP=
+fi
while [ true ] ; do
missing=false
@@ -407,12 +416,16 @@ while [ true ] ; do
if ! file $file | grep -qs Mach-O ; then
continue
fi
+ # libffi contains "S" (other section symbols) that should not be stripped.
+ if [[ $file == *"libffi"* ]] ; then
+ continue
+ fi
if test x$STRIP != x ; then
strip -u -r -arch all $file &>/dev/null
fi
- deps=`otool -L $file | awk '{print $1}' | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | grep -v 'libjack\.' | grep -v "$(basename $file)"`
+ deps=`otool -L $file | awk '{print $1}' | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/$STDCPP)" | grep -v 'libjack\.' | grep -v "$(basename $file)"`
# echo -n "."
for dep in $deps ; do
base=`basename $dep`
@@ -481,7 +494,7 @@ fi
for exe in $executables; do
EXE=$APPROOT/MacOS/$exe
changes=""
- for lib in `otool -L $EXE | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
+ for lib in `otool -L $EXE | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/$STDCPP)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
base=`basename $lib`
changes="$changes -change $lib @executable_path/../lib/$base"
done
@@ -507,7 +520,7 @@ for libdir in $Frameworks $Frameworks/modules $Surfaces $Panners $Backends ; do
# change all the dependencies
changes=""
- for lib in `otool -L $dylib | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
+ for lib in `otool -L $dylib | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/$STDCPP)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
base=`basename $lib`
if echo $lib | grep -s libbase; then
changes="$changes -change $lib @executable_path/../$libbase/$base"
@@ -565,14 +578,26 @@ else
fi
+if file ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/$MAIN_EXECUTABLE | grep -q x86_64; then
+ OSX_ARCH=x86_64
+ OSX_BENSID=osx64
+elif file ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/$MAIN_EXECUTABLE | grep -q ppc; then
+ OSX_ARCH=ppc
+ OSX_BENSID=ppc
+else
+ OSX_ARCH=i386
+ OSX_BENSID=osx32
+fi
+
if test x$WITH_HARRISON_LV2 != x ; then
- if file ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/$MAIN_EXECUTABLE | grep -q x86_64; then
- OSX_ARCH=osx64
- else
- OSX_ARCH=osx32
- fi
- curl -s http://www.harrisonconsoles.com/mixbus/mb3/${OSX_ARCH}/harrison_lv2s.zip \
- | bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf -
+ curl -s -S --fail -# \
+ -z "${CACHEDIR}/harrison_lv2s.${OSX_BENSID}.zip" \
+ -o "${CACHEDIR}/harrison_lv2s.${OSX_BENSID}.zip" \
+ http://www.harrisonconsoles.com/mixbus/mb3/${OSX_BENSID}/harrison_lv2s.zip
+
+ mkdir -p "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2"
+ bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
+ "${CACHEDIR}/harrison_lv2s.${OSX_BENSID}.zip"
fi
if test x$WITH_HARVID != x ; then
@@ -598,6 +623,14 @@ if test x$WITH_HARVID != x ; then
cp -r "${JADEO}/Jadeo.app" "$PRODUCT_PKG_DIR/"
hdiutil detach "${JADEO}"
+ XJCONTENT=${PRODUCT_PKG_DIR}/Jadeo.app/Contents
+ HVLIBS=${PRODUCT_PKG_DIR}/$APPROOT/lib/harvid
+
+ for file in ${XJCONTENT}/MacOS/Jadeo-bin ${XJCONTENT}/Frameworks/*.dylib ${HVLIBS}/*.dylib ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/*harvid* ; do
+ lipo -extract_family ${OSX_ARCH} ${file} -output ${file}.thin && \
+ mv ${file}.thin ${file}
+ done
+
DMGWINBOTTOM=580
YPOS=$[ $DMGWINBOTTOM - 300 ]
XJADEOPOS="set position of item \"Jadeo.app\" of container window to {310, ${YPOS}}"
@@ -605,44 +638,51 @@ if test x$WITH_HARVID != x ; then
DMGBACKGROUND=${DMGBACKGROUND}xj
fi
-###################################################################
+################################################################################
### Mixbus plugins, etc
-if test -n "$MIXBUS"; then
+if test x$WITH_X42_LV2 != x ; then
echo "bundling x42 plugins"
- if file ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/$MAIN_EXECUTABLE | grep -q x86_64; then
- OSX_ARCH=x86_64
- else
- OSX_ARCH=i386
- fi
-
mkdir -p "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2"
- METERS_VERSION=$(curl -s -S http://gareus.org/x42/osx/x42-meters.latest.txt)
+ METERS_VERSION=$(curl -s -S http://x42-plugins.com/x42/osx/x42-meters.latest.txt)
rsync -a -q --partial \
- rsync://gareus.org/x42/osx/x42-meters-lv2-osx-${METERS_VERSION}.zip \
+ rsync://x42-plugins.com/x42/osx/x42-meters-lv2-osx-${METERS_VERSION}.zip \
"$CACHEDIR/x42-meters-lv2-osx-${METERS_VERSION}.zip"
bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
"$CACHEDIR/x42-meters-lv2-osx-${METERS_VERSION}.zip"
- SETBFREE_VERSION=$(curl -s -S http://gareus.org/x42/osx/setBfree.latest.txt)
+ SETBFREE_VERSION=$(curl -s -S http://x42-plugins.com/x42/osx/setBfree.latest.txt)
rsync -a -q --partial \
- rsync://gareus.org/x42/osx/setBfree-lv2-osx-${SETBFREE_VERSION}.zip \
+ rsync://x42-plugins.com/x42/osx/setBfree-lv2-osx-${SETBFREE_VERSION}.zip \
"$CACHEDIR/setBfree-lv2-osx-${SETBFREE_VERSION}.zip"
bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
"$CACHEDIR/setBfree-lv2-osx-${SETBFREE_VERSION}.zip"
- MIDIFILTER_VERSION=$(curl -s -S http://gareus.org/x42/osx/x42-midifilter.latest.txt)
+ MIDIFILTER_VERSION=$(curl -s -S http://x42-plugins.com/x42/osx/x42-midifilter.latest.txt)
rsync -a -q --partial \
- rsync://gareus.org/x42/osx/x42-midifilter-lv2-osx-${MIDIFILTER_VERSION}.zip \
+ rsync://x42-plugins.com/x42/osx/x42-midifilter-lv2-osx-${MIDIFILTER_VERSION}.zip \
"$CACHEDIR/x42-midifilter-lv2-osx-${MIDIFILTER_VERSION}.zip"
bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
"$CACHEDIR/x42-midifilter-lv2-osx-${MIDIFILTER_VERSION}.zip"
for file in ${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/*/*.dylib ; do
- lipo -thin ${OSX_ARCH} ${file} -output ${file}.thin
+ lipo -extract_family ${OSX_ARCH} ${file} -output ${file}.thin
mv ${file}.thin ${file}
done
+fi
+if test -n "$MIXBUS"; then
+ echo "deploying harrison tools for $OSX_BENSID"
+
+ mkdir -p "${PRODUCT_PKG_DIR}/${APPROOT}/lib/ladspa/strip"
+
+ curl -s -S --fail -# \
+ -z "${CACHEDIR}/harrison_channelstrip.${OSX_BENSID}.so" \
+ -o "${CACHEDIR}/harrison_channelstrip.${OSX_BENSID}.so" \
+ http://www.harrisonconsoles.com/mixbus/mb3/${OSX_BENSID}/harrison_channelstrip.so
+
+ cp "${CACHEDIR}/harrison_channelstrip.${OSX_BENSID}.so" \
+ "${PRODUCT_PKG_DIR}/${APPROOT}/lib/ladspa/strip/harrison_channelstrip.so"
fi
################################################################################
@@ -676,9 +716,8 @@ TMPDMG="${TMPDMG}.dmg"
trap "rm -rf $MNTPATH $TMPDMG ${TMPDMG}.dmg $ICNSTMP" EXIT
-hdiutil create -megabytes $DMGMEGABYTES "$TMPDMG"
+hdiutil create -megabytes $DMGMEGABYTES -fs HFS+ -volname "${VOLNAME}" "$TMPDMG"
DiskDevice=$(hdid -nomount "$TMPDMG" | grep Apple_HFS | cut -f 1 -d ' ')
-newfs_hfs -v "${VOLNAME}" "${DiskDevice}"
mount -t hfs -o nobrowse "${DiskDevice}" "${MNTPATH}"
cp -r ${PRODUCT_PKG_DIR}/* "${MNTPATH}" || exit
@@ -700,6 +739,7 @@ osascript << EOF
activate
tell disk "${DISKNAME}"
open
+ delay 2
set current view of container window to icon view
set toolbar visible of container window to false
set statusbar visible of container window to false
@@ -735,6 +775,7 @@ hdiutil eject "${DiskDevice}" || true
# Create a read-only version, use zlib compression
hdiutil convert -format UDZO "${TMPDMG}" -imagekey zlib-level=9 -o "${UC_DMG}"
+if test $(sw_vers -productVersion | cut -d '.' -f 2) -gt 5; then
echo "setting file icon ..."
cp ${PRODUCT_PKG_DIR}/$Resources/appIcon.icns ${ICNSTMP}.icns
@@ -744,6 +785,8 @@ Rez -append ${ICNSTMP}.rsrc -o "$UC_DMG"
SetFile -a C "$UC_DMG"
rm ${ICNSTMP}.icns ${ICNSTMP}.rsrc
+fi
+
rm -rf ${PRODUCT_PKG_DIR}
echo
diff --git a/tools/x-win/package.sh b/tools/x-win/package.sh
index 8a1da07..6575ced 100755
--- a/tools/x-win/package.sh
+++ b/tools/x-win/package.sh
@@ -115,6 +115,7 @@ cp build/libs/timecode/timecode.dll $DESTDIR/bin/
cp build/libs/qm-dsp/qmdsp-*.dll $DESTDIR/bin/
cp build/libs/canvas/canvas-*.dll $DESTDIR/bin/
cp build/libs/pbd/pbd-*.dll $DESTDIR/bin/
+cp build/libs/ptformat/ptformat-*.dll $DESTDIR/bin/
cp build/libs/audiographer/audiographer-*.dll $DESTDIR/bin/
cp build/libs/fst/ardour-vst-scanner.exe $DESTDIR/bin/ || true
cp `ls -t build/gtk2_ardour/ardour-*.exe | head -n1` $DESTDIR/bin/${PRODUCT_EXE}
@@ -124,6 +125,8 @@ cp build/libs/clearlooks-newer/clearlooks.dll $DESTDIR/lib/gtk-2.0/engines/libcl
cp $PREFIX/bin/*dll $DESTDIR/bin/
cp $PREFIX/lib/*dll $DESTDIR/bin/
+# special case libportaudio (wasapi), old stack has no wasapi and hence no .xp
+cp $PREFIX/bin/libportaudio-2.xp $DESTDIR/bin/ || cp $PREFIX/bin/libportaudio-2.dll $DESTDIR/bin/libportaudio-2.xp
rm -rf $DESTDIR/bin/libjack*.dll
cp `find build/libs/surfaces/ -iname "*.dll"` $ALIBDIR/surfaces/
@@ -174,8 +177,6 @@ echo " === bundle completed, cleaning up"
echo " === complete"
du -sh $DESTDIR
-( cd $DESTDIR ; find . ) > ${TMPDIR}/file_list.txt
-
################################################################################
### get video tools
if test -z "$NOVIDEOTOOLS"; then
@@ -225,29 +226,57 @@ fi
################################################################################
### Mixbus plugins, etc
-if test -n "$MIXBUS"; then
-
+if test -n "$MIXBUS"; then # TODO use separate variable
mkdir -p $ALIBDIR/LV2
- METERS_VERSION=$(curl -s -S http://gareus.org/x42/win/x42-meters.latest.txt)
+
+ echo "Adding x42 Plugins"
+
+ METERS_VERSION=$(curl -s -S http://x42-plugins.com/x42/win/x42-meters.latest.txt)
rsync -a -q --partial \
- rsync://gareus.org/x42/win/x42-meters-lv2-${WARCH}-${METERS_VERSION}.zip \
+ rsync://x42-plugins.com/x42/win/x42-meters-lv2-${WARCH}-${METERS_VERSION}.zip \
"${SRCDIR}/x42-meters-lv2-${WARCH}-${METERS_VERSION}.zip"
- unzip -d "$ALIBDIR/LV2/" "${SRCDIR}/x42-meters-lv2-${WARCH}-${METERS_VERSION}.zip"
+ unzip -q -d "$ALIBDIR/LV2/" "${SRCDIR}/x42-meters-lv2-${WARCH}-${METERS_VERSION}.zip"
- SETBFREE_VERSION=$(curl -s -S http://gareus.org/x42/win/setBfree.latest.txt)
+ SETBFREE_VERSION=$(curl -s -S http://x42-plugins.com/x42/win/setBfree.latest.txt)
rsync -a -q --partial \
- rsync://gareus.org/x42/win/setBfree-lv2-${WARCH}-${SETBFREE_VERSION}.zip \
+ rsync://x42-plugins.com/x42/win/setBfree-lv2-${WARCH}-${SETBFREE_VERSION}.zip \
"${SRCDIR}/setBfree-lv2-${WARCH}-${SETBFREE_VERSION}.zip"
- unzip -d "$ALIBDIR/LV2/" "${SRCDIR}/setBfree-lv2-${WARCH}-${SETBFREE_VERSION}.zip"
+ unzip -q -d "$ALIBDIR/LV2/" "${SRCDIR}/setBfree-lv2-${WARCH}-${SETBFREE_VERSION}.zip"
- MIDIFILTER_VERSION=$(curl -s -S http://gareus.org/x42/win/x42-midifilter.latest.txt)
+ MIDIFILTER_VERSION=$(curl -s -S http://x42-plugins.com/x42/win/x42-midifilter.latest.txt)
rsync -a -q --partial \
- rsync://gareus.org/x42/win/x42-midifilter-lv2-${WARCH}-${MIDIFILTER_VERSION}.zip \
+ rsync://x42-plugins.com/x42/win/x42-midifilter-lv2-${WARCH}-${MIDIFILTER_VERSION}.zip \
"${SRCDIR}/x42-midifilter-lv2-${WARCH}-${MIDIFILTER_VERSION}.zip"
- unzip -d "$ALIBDIR/LV2/" "${SRCDIR}/x42-midifilter-lv2-${WARCH}-${MIDIFILTER_VERSION}.zip"
+ unzip -q -d "$ALIBDIR/LV2/" "${SRCDIR}/x42-midifilter-lv2-${WARCH}-${MIDIFILTER_VERSION}.zip"
+fi
+
+if test -n "$MIXBUS"; then # TODO use separate variable
+ mkdir -p $ALIBDIR/LV2
+ echo "Including Harrison LV2s"
+
+ curl -s -S --fail -# \
+ -z "${SRCDIR}/harrison_lv2s.${WARCH}.zip" \
+ -o "${SRCDIR}/harrison_lv2s.${WARCH}.zip" \
+ http://www.harrisonconsoles.com/mixbus/mb3/${WARCH}/harrison_lv2s.zip
+ unzip -q -d "$ALIBDIR/LV2/" "${SRCDIR}/harrison_lv2s.${WARCH}.zip"
+fi
+
+if test -n "$MIXBUS"; then
+ echo "Deploying Harrison Mixbus Channelstrip"
+
+ mkdir -p $ALIBDIR/ladspa/strip
+ curl -s -S --fail -# \
+ -z "${SRCDIR}/harrison_channelstrip.${WARCH}.dll" \
+ -o "${SRCDIR}/harrison_channelstrip.${WARCH}.dll" \
+ http://www.harrisonconsoles.com/mixbus/mb3/${WARCH}/harrison_channelstrip.dll
+
+ cp "${SRCDIR}/harrison_channelstrip.${WARCH}.dll" \
+ "$ALIBDIR/ladspa/strip/harrison_channelstrip.dll"
fi
+( cd $DESTDIR ; find . ) > ${TMPDIR}/file_list.txt
+
################################################################################
echo " === Preparing Windows Installer"
NSISFILE=$DESTDIR/a3.nsis
@@ -276,6 +305,7 @@ cat >> $NSISFILE << EOF
!addincludedir "${this_script_dir}\\nsis"
!include MUI2.nsh
!include FileAssociation.nsh
+!include WinVer.nsh
Name "${PROGRAM_NAME}${PROGRAM_VERSION}"
OutFile "${OUTFILE}"
@@ -290,10 +320,10 @@ if test -n "$MIXBUS"; then
# TODO: proper welcome/finish text.
cat >> $NSISFILE << EOF
-!define MUI_FINISHPAGE_TITLE "Welcome to Mixbus"
-!define MUI_FINISHPAGE_TEXT "Thank you for choosing Harrison Mixbus."
-!define MUI_FINISHPAGE_LINK "Harrison Consoles Website"
-!define MUI_FINISHPAGE_LINK_LOCATION "http://harrisonconsoles.com"
+!define MUI_FINISHPAGE_TITLE "Welcome to Harrison Mixbus"
+!define MUI_FINISHPAGE_TEXT "Thanks for your purchase of Mixbus!\$\\r\$\\nYou will find the Mixbus application in the Start Menu (or the All Apps panel for Windows 8) \$\\r\$\\nClick the link below to view the Mixbus manual, and learn ways to get involved with the Mixbus community."
+!define MUI_FINISHPAGE_LINK "Mixbus Manual"
+!define MUI_FINISHPAGE_LINK_LOCATION "http://www.harrisonconsoles.com/mixbus/mixbus3-live-manual"
!define MUI_FINISHPAGE_NOREBOOTSUPPORT
EOF
@@ -375,6 +405,12 @@ Section "${PROGRAM_NAME}${PROGRAM_VERSION} (required)" SecMainProg
WriteRegDWORD HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_ID}-${WARCH}" "NoRepair" 1
WriteUninstaller "\$INSTDIR\uninstall.exe"
CreateShortCut "\$INSTDIR\\${PROGRAM_NAME}${PROGRAM_VERSION}.lnk" "\$INSTDIR\\bin\\${PRODUCT_EXE}" "" "\$INSTDIR\\bin\\${PRODUCT_EXE}" 0
+ \${If} \${AtMostWinXP}
+ Delete "\$INSTDIR\\bin\\libportaudio-2.dll"
+ Rename "\$INSTDIR\\bin\\libportaudio-2.xp" "\$INSTDIR\\bin\\libportaudio-2.dll"
+ \${Else}
+ Delete "\$INSTDIR\\bin\\libportaudio-2.xp"
+ \${EndIf}
\${registerExtension} "\$INSTDIR\\bin\\${STATEFILE_SUFFIX}" ".${PRODUCT_NAME}" "${PROGRAM_NAME} Session"
SectionEnd
EOF
diff --git a/wscript b/wscript
index 1626f84..3e72fbc 100644
--- a/wscript
+++ b/wscript
@@ -8,8 +8,9 @@ import subprocess
import sys
import platform as PLATFORM
from waflib.Tools import winres
-
+from waflib.Build import Context
from waflib.Build import BuildContext
+
class i18n(BuildContext):
cmd = 'i18n'
fun = 'i18n'
@@ -26,6 +27,10 @@ class i18n_mo(BuildContext):
cmd = 'i18n_mo'
fun = 'i18n_mo'
+def is_tracks_build(self, *k, **kw):
+ return self.env['PROGRAM_NAME'] == 'Tracks Live'
+
+Context.Context.is_tracks_build = is_tracks_build
compiler_flags_dictionaries= {
'gcc' : {
@@ -73,6 +78,12 @@ compiler_flags_dictionaries= {
'c99': '-std=c99',
# Flag to enable AT&T assembler syntax
'attasm': '-masm=att',
+ # Flags to make AVX instructions/intrinsics available
+ 'avx': '-mavx',
+ # Flags to generate position independent code, when needed to build a shared object
+ 'pic': '-fPIC',
+ # Flags required to compile C code with anonymous unions (only part of C11)
+ 'c-anonymous-union': '-fms-extensions',
},
'msvc' : {
'debuggable' : ['/DDEBUG', '/Od', '/Zi', '/MDd', '/Gd', '/EHsc'],
@@ -100,6 +111,10 @@ compiler_flags_dictionaries= {
'cxx-strict' : '',
'strict' : '',
'c99': '/TP',
+ 'attasm': '',
+ 'avx': '',
+ 'pic': '',
+ 'c-anonymous-union': '',
},
}
@@ -164,8 +179,12 @@ else:
MICRO = '0'
V = MAJOR + '.' + MINOR + '.' + MICRO
-VERSION = V
-PROGRAM_VERSION = MAJOR
+# Ensure that these are not unicode, which
+# can cause odd problems elsewhere. Note that
+# in python3, encode and decode do not return
+# strings, so we have to force the type.
+VERSION = str (V.encode ('ascii', 'ignore'))
+PROGRAM_VERSION = str (MAJOR.encode ('ascii', 'ignore'))
# Mandatory variables
top = '.'
@@ -176,6 +195,7 @@ children = [
'libs/qm-dsp',
'libs/vamp-plugins',
'libs/libltc',
+ 'libs/ptformat',
# core ardour libraries
'libs/pbd',
'libs/midi++2',
@@ -291,8 +311,12 @@ int main() { return 0; }''',
else:
compiler_name = 'gcc'
- flags_dict = compiler_flags_dictionaries[compiler_name]
-
+ flags_dict = compiler_flags_dictionaries[compiler_name]
+ # Save the compiler flags because we need them at build time
+ # when we need to add compiler specific flags in certain
+ # libraries
+ conf.env['compiler_flags_dict'] = flags_dict;
+
autowaf.set_basic_compiler_flags (conf,flags_dict)
if conf.options.asan:
@@ -412,12 +436,12 @@ int main() { return 0; }''',
if (re.search ("(x86_64|AMD64)", cpu) != None):
# on Windows sse is supported by 64 bit platforms only
build_host_supports_sse = True
-
+
# mingw GCC compiler to uses at&t (Unix specific) assembler dialect by default
# compiler_flags.append (["--mmnemonic=att", "msyntax=att")
compiler_flags.extend ([ flags_dict['sse'], flags_dict['fpmath-sse'], flags_dict['xmmintrinsics'], flags_dict['attasm'] ])
-
+
# end of processor-specific section
# optimization section
@@ -426,13 +450,13 @@ int main() { return 0; }''',
compiler_flags.append("-DBUILD_VECLIB_OPTIMIZATIONS");
conf.env.append_value('LINKFLAGS_OSX', ['-framework', 'Accelerate'])
elif conf.env['build_target'] == 'i686' or conf.env['build_target'] == 'x86_64':
- compiler_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
+ compiler_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
elif conf.env['build_target'] == 'mingw':
- # usability of the 64 bit windows assembler depends on the compiler target,
- # not the build host, which in turn can only be inferred from the name
- # of the compiler.
- if re.search ('/^x86_64/', str(conf.env['CC'])):
- compiler_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
+ # usability of the 64 bit windows assembler depends on the compiler target,
+ # not the build host, which in turn can only be inferred from the name
+ # of the compiler.
+ if re.search ('x86_64-w64', str(conf.env['CC'])) != None:
+ compiler_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
if not build_host_supports_sse:
print("\nWarning: you are building Ardour with SSE support even though your system does not support these instructions. (This may not be an error, especially if you are a package maintainer)")
@@ -558,6 +582,8 @@ int main() { return 0; }''',
compiler_flags.append ('-DPROGRAM_NAME="' + Options.options.program_name + '"')
compiler_flags.append ('-DPROGRAM_VERSION="' + PROGRAM_VERSION + '"')
+ conf.env['PROGRAM_NAME'] = Options.options.program_name
+
if opt.debug:
conf.env.append_value('CFLAGS', debug_flags)
conf.env.append_value('CXXFLAGS', debug_flags)
@@ -575,6 +601,9 @@ int main() { return 0; }''',
conf.env.append_value('CXXFLAGS', cxx_flags)
conf.env.append_value('LINKFLAGS', linker_flags)
+def is_tracks_build (conf):
+ return conf.env['PROGRAM_NAME'] == 'Tracks Live'
+
#----------------------------------------------------------------
# Waf stages
@@ -585,8 +614,6 @@ def options(opt):
autowaf.set_options(opt, debug_by_default=True)
opt.add_option('--program-name', type='string', action='store', default='Ardour', dest='program_name',
help='The user-visible name of the program being built')
- opt.add_option ('--trx', action='store_true', default=False, dest='trx_build',
- help='Whether to build for TRX')
opt.add_option('--arch', type='string', action='store', dest='arch',
help='Architecture-specific compiler FLAGS')
opt.add_option('--with-backends', type='string', action='store', default='jack', dest='with_backends',
@@ -680,6 +707,9 @@ def options(opt):
help='Turn on c++11 compiler flags (-std=c++11)')
opt.add_option('--address-sanitizer', action='store_true', default=False, dest='asan',
help='Turn on AddressSanitizer (requires GCC >= 4.8 or clang >= 3.1)')
+ opt.add_option('--ptformat', action='store_true', default=False, dest='ptformat',
+ help='Turn on PT session import option')
+
for i in children:
opt.recurse(i)
@@ -706,6 +736,7 @@ def configure(conf):
conf.env['VERSION'] = VERSION
conf.env['MAJOR'] = MAJOR
conf.env['MINOR'] = MINOR
+ conf.env['MICRO'] = MICRO
conf.line_just = 52
autowaf.set_recursive()
autowaf.configure(conf)
@@ -759,9 +790,6 @@ def configure(conf):
conf.env.append_value ('CXXFLAGS', '-DSILENCE_AFTER')
conf.define ('FREEBIE', 1)
- if Options.options.trx_build:
- conf.define ('TRX_BUILD', 1)
-
if Options.options.lv2dir:
conf.env['LV2DIR'] = Options.options.lv2dir
else:
@@ -889,7 +917,9 @@ def configure(conf):
lib='regex', uselib_store="REGEX", define_name='HAVE_REGEX_H')
# TODO put this only where it is needed
conf.env.append_value('LIB', 'regex')
-
+ # TODO this should only be necessary for a debug build
+ conf.env.append_value('LIB', 'dbghelp')
+
# work around GdkDrawable BitBlt performance issue on windows
# see http://gareus.org/wiki/ardour_windows_gdk_and_cairo
conf.env.append_value('CFLAGS', '-DUSE_CAIRO_IMAGE_SURFACE')
@@ -972,12 +1002,21 @@ def configure(conf):
conf.env['DEBUG_DENORMAL_EXCEPTION'] = True
if opts.build_tests:
autowaf.check_pkg(conf, 'cppunit', uselib_store='CPPUNIT', atleast_version='1.12.0', mandatory=True)
+ if opts.ptformat:
+ conf.define('PTFORMAT', 1)
+ conf.env['PTFORMAT'] = True
backends = opts.with_backends.split(',')
+
if not backends:
print("Must configure and build at least one backend")
sys.exit(1)
+ if conf.is_tracks_build():
+ # For Tracks, override backends on OS X or Windows
+ if sys.platform == 'darwin' or sys.platform == 'mingw' or sys.platform == 'msvc':
+ backends = [ 'wavesaudio' ]
+
conf.env['BACKENDS'] = backends
conf.env['BUILD_JACKBACKEND'] = any('jack' in b for b in backends)
conf.env['BUILD_ALSABACKEND'] = any('alsa' in b for b in backends)
@@ -1001,7 +1040,6 @@ def configure(conf):
print("ALSA Backend is only available on Linux")
sys.exit(1)
-
set_compiler_flags (conf, Options.options)
if sys.platform == 'darwin':
@@ -1065,6 +1103,7 @@ const char* const ardour_config_info = "\\n\\
write_config_text('Phone home', conf.is_defined('PHONE_HOME'))
write_config_text('Program name', opts.program_name)
write_config_text('Samplerate', conf.is_defined('HAVE_SAMPLERATE'))
+ write_config_text('PT format', conf.is_defined('PTFORMAT'))
# write_config_text('Soundtouch', conf.is_defined('HAVE_SOUNDTOUCH'))
write_config_text('Translation', opts.nls)
# write_config_text('Tranzport', opts.tranzport)
@@ -1101,9 +1140,11 @@ def build(bld):
# set up target directories
lwrcase_dirname = 'ardour' + bld.env['MAJOR']
- if bld.is_defined ('TRX_BUILD'):
+ if bld.is_tracks_build():
+ bld.env.append_value ('CXXFLAGS', '-DUSE_TRACKS_CODE_FEATURES')
+ bld.env.append_value ('CFLAGS', '-DUSE_TRACKS_CODE_FEATURES')
lwrcase_dirname = 'trx'
-
+
# configuration files go here
bld.env['CONFDIR'] = os.path.join(bld.env['SYSCONFDIR'], lwrcase_dirname)
# data files loaded at run time go here
--
ardour Debian packaging
More information about the pkg-multimedia-commits
mailing list