Merge branch 'master' into cairocanvas

This commit is contained in:
Paul Davis 2013-06-06 09:52:21 -04:00
commit ce8731b32d
28 changed files with 2858 additions and 2238 deletions

View file

@ -185,7 +185,8 @@ static const char* translators[] = {
\n\tRobert Schwede <schwede@ironshark.com>\ \n\tRobert Schwede <schwede@ironshark.com>\
\n\tBenjamin Scherrer <realhangman@web.de>\ \n\tBenjamin Scherrer <realhangman@web.de>\
\n\tEdgar Aichinger <edogawa@aon.at>\ \n\tEdgar Aichinger <edogawa@aon.at>\
\n\tRichard Oax <richard@pagliacciempire.de>\n"), \n\tRichard Oax <richard@pagliacciempire.de>\
\n\tRobin Gloster <robin@loc-com.de>\n"),
N_("Italian:\n\tFilippo Pappalardo <filippo@email.it>\n\tRaffaele Morelli <raffaele.morelli@gmail.com>\n"), N_("Italian:\n\tFilippo Pappalardo <filippo@email.it>\n\tRaffaele Morelli <raffaele.morelli@gmail.com>\n"),
N_("Portuguese:\n\tRui Nuno Capela <rncbc@rncbc.org>\n"), N_("Portuguese:\n\tRui Nuno Capela <rncbc@rncbc.org>\n"),
N_("Brazilian Portuguese:\n\tAlexander da Franca Fernandes <alexander@nautae.eti.br>\ N_("Brazilian Portuguese:\n\tAlexander da Franca Fernandes <alexander@nautae.eti.br>\

View file

@ -27,8 +27,6 @@
#include <cerrno> #include <cerrno>
#include <fstream> #include <fstream>
#include <boost/locale.hpp>
#include <stdint.h> #include <stdint.h>
#include <fcntl.h> #include <fcntl.h>
#include <signal.h> #include <signal.h>
@ -815,13 +813,13 @@ ARDOUR_UI::check_memory_locking ()
"runs out of memory. \n\n" "runs out of memory. \n\n"
"You can view the memory limit with 'ulimit -l', " "You can view the memory limit with 'ulimit -l', "
"and it is normally controlled by %2"), "and it is normally controlled by %2"),
PROGRAM_NAME).c_str(), PROGRAM_NAME,
#ifdef __FreeBSD__ #ifdef __FreeBSD__
X_("/etc/login.conf") X_("/etc/login.conf")
#else #else
X_(" /etc/security/limits.conf") X_(" /etc/security/limits.conf")
#endif #endif
); ).c_str());
msg.set_default_response (RESPONSE_OK); msg.set_default_response (RESPONSE_OK);

View file

@ -120,9 +120,7 @@ ExportTimespanSelector::add_range_to_selection (ARDOUR::Location const * loc)
ExportTimespanPtr span = _session->get_export_handler()->add_timespan(); ExportTimespanPtr span = _session->get_export_handler()->add_timespan();
std::string id; std::string id;
if (loc == state->session_range.get()) { if (loc == state->selection_range.get()) {
id = "session";
} else if (loc == state->selection_range.get()) {
id = "selection"; id = "selection";
} else { } else {
id = loc->id().to_s(); id = loc->id().to_s();
@ -367,9 +365,7 @@ ExportTimespanSelectorSingle::fill_range_list ()
if (!state) { return; } if (!state) { return; }
std::string id; std::string id;
if (!range_id.compare (X_("session"))) { if (!range_id.compare (X_("selection"))) {
id = state->session_range->id().to_s();
} else if (!range_id.compare (X_("selection"))) {
id = state->selection_range->id().to_s(); id = state->selection_range->id().to_s();
} else { } else {
id = range_id; id = range_id;
@ -459,9 +455,8 @@ ExportTimespanSelectorMultiple::set_selection_from_state ()
for (tree_it = range_list->children().begin(); tree_it != range_list->children().end(); ++tree_it) { for (tree_it = range_list->children().begin(); tree_it != range_list->children().end(); ++tree_it) {
Location * loc = tree_it->get_value (range_cols.location); Location * loc = tree_it->get_value (range_cols.location);
if ((!id.compare ("session") && loc == state->session_range.get()) || if ((id == "selection" && loc == state->selection_range.get()) ||
(!id.compare ("selection") && loc == state->selection_range.get()) || (id == loc->id().to_s())) {
(!id.compare (loc->id().to_s()))) {
tree_it->set_value (range_cols.selected, true); tree_it->set_value (range_cols.selected, true);
} }
} }

View file

@ -256,6 +256,10 @@ GenericPluginUI::build ()
continue; continue;
} }
if (plugin->describe_parameter (Evoral::Parameter(PluginAutomation, 0, i)) == X_("hidden")) {
continue;
}
ControlUI* cui; ControlUI* cui;
boost::shared_ptr<ARDOUR::AutomationControl> c boost::shared_ptr<ARDOUR::AutomationControl> c

View file

@ -1483,13 +1483,13 @@ MidiTimeAxisView::playback_channel_mode_changed ()
{ {
switch (midi_track()->get_playback_channel_mode()) { switch (midi_track()->get_playback_channel_mode()) {
case AllChannels: case AllChannels:
_playback_channel_status.set_markup (string_compose ("<b>%1</b>: <i>%2</i>", _("Play"), ("all"))); _playback_channel_status.set_markup (string_compose ("<b>%1</b>: <i>%2</i>", _("Play"), _("all")));
break; break;
case FilterChannels: case FilterChannels:
_playback_channel_status.set_markup (string_compose ("<b>%1</b>: <i>%2</i>", _("Play"), ("some"))); _playback_channel_status.set_markup (string_compose ("<b>%1</b>: <i>%2</i>", _("Play"), _("some")));
break; break;
case ForceChannel: case ForceChannel:
_playback_channel_status.set_markup (string_compose ("<b>%1</b>: <i>%2>%3</i>", _("Play"), ("all"), ffs (midi_track()->get_playback_channel_mask()))); _playback_channel_status.set_markup (string_compose ("<b>%1</b>: <i>%2>%3</i>", _("Play"), _("all"), ffs (midi_track()->get_playback_channel_mask())));
break; break;
} }
} }
@ -1499,13 +1499,13 @@ MidiTimeAxisView::capture_channel_mode_changed ()
{ {
switch (midi_track()->get_capture_channel_mode()) { switch (midi_track()->get_capture_channel_mode()) {
case AllChannels: case AllChannels:
_capture_channel_status.set_markup (string_compose ("<b>%1</b>: <i>%2</i>", _("Rec"), ("all"))); _capture_channel_status.set_markup (string_compose ("<b>%1</b>: <i>%2</i>", _("Rec"), _("all")));
break; break;
case FilterChannels: case FilterChannels:
_capture_channel_status.set_markup (string_compose ("<b>%1</b>: <i>%2</i>", _("Rec"), ("some"))); _capture_channel_status.set_markup (string_compose ("<b>%1</b>: <i>%2</i>", _("Rec"), _("some")));
break; break;
case ForceChannel: case ForceChannel:
_capture_channel_status.set_markup (string_compose ("<b>%1</b>: <i>%2>%3</i>", _("Rec"), ("all"), ffs (midi_track()->get_capture_channel_mask()))); _capture_channel_status.set_markup (string_compose ("<b>%1</b>: <i>%2>%3</i>", _("Rec"), _("all"), ffs (midi_track()->get_capture_channel_mask())));
break; break;
} }
} }

View file

@ -148,7 +148,7 @@ msgstr "Armand Klenk"
#: about.cc:153 #: about.cc:153
msgid "Julien de Kozak" msgid "Julien de Kozak"
msgstr "" msgstr "Julien de Kozak"
#: about.cc:154 #: about.cc:154
msgid "Matt Krai" msgid "Matt Krai"
@ -269,6 +269,7 @@ msgid ""
"\tBenjamin Scherrer <realhangman@web.de>\n" "\tBenjamin Scherrer <realhangman@web.de>\n"
"\tEdgar Aichinger <edogawa@aon.at>\n" "\tEdgar Aichinger <edogawa@aon.at>\n"
"\tRichard Oax <richard@pagliacciempire.de>\n" "\tRichard Oax <richard@pagliacciempire.de>\n"
"\Robin Gloster <robin@loc-com.de>\n"
msgstr "" msgstr ""
"Deutsch:\n" "Deutsch:\n"
"\tKarsten Petersen <kapet@kapet.de>\n" "\tKarsten Petersen <kapet@kapet.de>\n"
@ -277,6 +278,7 @@ msgstr ""
"\tBenjamin Scherrer <realhangman@web.de>\n" "\tBenjamin Scherrer <realhangman@web.de>\n"
"\tEdgar Aichinger <edogawa@aon.at>\n" "\tEdgar Aichinger <edogawa@aon.at>\n"
"\tRichard Oax <richard@pagliacciempire.de>\n" "\tRichard Oax <richard@pagliacciempire.de>\n"
"\Robin Gloster <robin@loc-com.de>\n"
#: about.cc:189 #: about.cc:189
msgid "" msgid ""
@ -380,7 +382,7 @@ msgstr "Copyright (C) 1999-2013 Paul Davis\n"
#: about.cc:583 #: about.cc:583
msgid "http://ardour.org/" msgid "http://ardour.org/"
msgstr "http://ardour.org" msgstr "http://ardour.org/"
#: about.cc:584 #: about.cc:584
msgid "" msgid ""
@ -420,7 +422,7 @@ msgstr "Kanaleinstellungen:"
#: add_route_dialog.cc:57 #: add_route_dialog.cc:57
msgid "Track mode:" msgid "Track mode:"
msgstr "SpurModus" msgstr "Spurmodus"
#: add_route_dialog.cc:58 #: add_route_dialog.cc:58
msgid "Instrument:" msgid "Instrument:"
@ -440,7 +442,7 @@ msgstr "Audio+MIDI-Spuren"
#: add_route_dialog.cc:82 #: add_route_dialog.cc:82
msgid "Busses" msgid "Busses"
msgstr "Audio-Busse" msgstr "Audiobusse"
#: add_route_dialog.cc:104 #: add_route_dialog.cc:104
msgid "Add:" msgid "Add:"
@ -495,7 +497,7 @@ msgid ""
"track instead." "track instead."
msgstr "" msgstr ""
"Audio+MIDI Spuren sind <b>NUR</b> für den Gebrauch mit Plugins gedacht, die " "Audio+MIDI Spuren sind <b>NUR</b> für den Gebrauch mit Plugins gedacht, die "
"sowohl Audio als auch MIDI Eingangsdaten tzen\n" "sowohl Audio als auch MIDI Eingangsdaten benutzen\n"
"\n" "\n"
"Falls Sie nicht vorhaben, so ein Plugin zu benutzen, verwenden Sie " "Falls Sie nicht vorhaben, so ein Plugin zu benutzen, verwenden Sie "
"stattdessen eine normale Audio- oder MIDI-Spur" "stattdessen eine normale Audio- oder MIDI-Spur"
@ -563,7 +565,7 @@ msgstr "-keine-"
#: ambiguous_file_dialog.cc:30 #: ambiguous_file_dialog.cc:30
msgid "Ambiguous File" msgid "Ambiguous File"
msgstr "Mehrdeutige Datei" msgstr "Mehrmals gefundene Datei"
#: ambiguous_file_dialog.cc:35 #: ambiguous_file_dialog.cc:35
msgid "" msgid ""
@ -621,7 +623,7 @@ msgstr "Normalisieren"
#: analysis_window.cc:59 #: analysis_window.cc:59
msgid "FFT analysis window" msgid "FFT analysis window"
msgstr "FFT - Analysefenster" msgstr "FFT-Analysefenster"
#: analysis_window.cc:60 editor.cc:1880 #: analysis_window.cc:60 editor.cc:1880
msgid "Spectral Analysis" msgid "Spectral Analysis"
@ -653,11 +655,11 @@ msgstr "Vorhören"
#: ardour_ui.cc:169 #: ardour_ui.cc:169
msgid "solo" msgid "solo"
msgstr "solo" msgstr "Solo"
#: ardour_ui.cc:170 #: ardour_ui.cc:170
msgid "feedback" msgid "feedback"
msgstr "feedback" msgstr "Feedback"
#: ardour_ui.cc:172 #: ardour_ui.cc:172
msgid "Errors" msgid "Errors"
@ -684,15 +686,15 @@ msgid ""
"controlled by %2" "controlled by %2"
msgstr "" msgstr ""
"WARNUNG: Ihr System hat eine Begrenzung für die Reservierung von " "WARNUNG: Ihr System hat eine Begrenzung für die Reservierung von "
"Arbeitsspeicher eingestellt. Dies könnte dazu führen, dass %1 zu schnell der " "Arbeitsspeicher eingestellt. Dies könnte dazu führen, dass %1 der "
"Speicher ausgeht.\n" "Speicher ausgeht bevor die Systembegrenzung erreicht ist.\n"
"\n" "\n"
"Sie können die Speicherbegrenzung mit 'ulimit -l' einsehen und normalerweise " "Sie können die Speicherbegrenzung mit 'ulimit -l' einsehen und normalerweise "
"in %2 verändern." "in %2 verändern."
#: ardour_ui.cc:800 #: ardour_ui.cc:800
msgid "Do not show this window again" msgid "Do not show this window again"
msgstr "Diese Meldung nicht wieder anzeigen" msgstr "Diese Meldung nicht erneut anzeigen"
#: ardour_ui.cc:847 #: ardour_ui.cc:847
msgid "Don't quit" msgid "Don't quit"
@ -700,7 +702,7 @@ msgstr "Abbrechen"
#: ardour_ui.cc:848 #: ardour_ui.cc:848
msgid "Just quit" msgid "Just quit"
msgstr "Nur beenden" msgstr "Beenden ohne zu speichern"
#: ardour_ui.cc:849 #: ardour_ui.cc:849
msgid "Save and quit" msgid "Save and quit"
@ -874,7 +876,7 @@ msgid ""
"You cannot open or close sessions in this condition" "You cannot open or close sessions in this condition"
msgstr "" msgstr ""
"%1 ist derzeit nicht mit JACK verbunden.\n" "%1 ist derzeit nicht mit JACK verbunden.\n"
"Es ist nicht möglich, Projekte zu öffnen oder zu schließen." "Dadurch können keine Projekte geöffnet oder geschlossen werden."
#: ardour_ui.cc:1455 #: ardour_ui.cc:1455
msgid "Open Session" msgid "Open Session"
@ -883,7 +885,7 @@ msgstr "Projekt öffnen"
#: ardour_ui.cc:1473 session_import_dialog.cc:169 #: ardour_ui.cc:1473 session_import_dialog.cc:169
#: session_metadata_dialog.cc:729 startup.cc:1049 #: session_metadata_dialog.cc:729 startup.cc:1049
msgid "%1 sessions" msgid "%1 sessions"
msgstr "%1projekte" msgstr "%1 Projekte"
#: ardour_ui.cc:1510 #: ardour_ui.cc:1510
msgid "You cannot add a track without a session already loaded." msgid "You cannot add a track without a session already loaded."
@ -931,8 +933,8 @@ msgid ""
"Please create one or more tracks before trying to record.\n" "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." "You can do this with the \"Add Track or Bus\" option in the Session menu."
msgstr "" msgstr ""
"Bitte fügen Sie mindestens eine oder mehrere Spur hinzu,\n" "Bitte fügen Sie, bevor Sie aufnehmen, mindestens \n"
"bevor Sie aufnehmen. Die geht über \"Spur/Bus hinzufügen\"\n" "eine oder mehrere Spur hinzu. Die geht über \"Spur/Bus hinzufügen\"\n"
"im Menüpunkt Projekt." "im Menüpunkt Projekt."
#: ardour_ui.cc:2084 #: ardour_ui.cc:2084
@ -984,11 +986,11 @@ msgstr "Bestätige das Überschreiben des Schnappschusses"
#: ardour_ui.cc:2230 #: ardour_ui.cc:2230
msgid "A snapshot already exists with that name. Do you want to overwrite it?" msgid "A snapshot already exists with that name. Do you want to overwrite it?"
msgstr "" msgstr ""
"Ein Schnappschuss mit diesem existiert bereits. Wollen Sie ihn überschreiben?" "Ein Schnappschuss mit diesem Namen existiert bereits. Wollen Sie ihn überschreiben?"
#: ardour_ui.cc:2233 #: ardour_ui.cc:2233
msgid "Overwrite" msgid "Overwrite"
msgstr "Überschreibe" msgstr "Überschreiben"
#: ardour_ui.cc:2267 #: ardour_ui.cc:2267
msgid "Rename Session" msgid "Rename Session"
@ -1011,7 +1013,7 @@ msgid ""
"That name is already in use by another directory/folder. Please try again." "That name is already in use by another directory/folder. Please try again."
msgstr "" msgstr ""
"Dieser Name wird schon von einem anderen Verzeichnis/Ordner benutzt. Bitte " "Dieser Name wird schon von einem anderen Verzeichnis/Ordner benutzt. Bitte "
"nochmal versuchen." "versuchen Sie einen anderen Namen."
#: ardour_ui.cc:2299 #: ardour_ui.cc:2299
msgid "" msgid ""
@ -1031,7 +1033,7 @@ msgstr "Name für Vorlage"
#: ardour_ui.cc:2416 #: ardour_ui.cc:2416
msgid "-template" msgid "-template"
msgstr "Vorlage" msgstr "-Vorlage"
#: ardour_ui.cc:2454 #: ardour_ui.cc:2454
msgid "" msgid ""
@ -1039,7 +1041,7 @@ msgid ""
"%1\n" "%1\n"
"already exists. Do you want to open it?" "already exists. Do you want to open it?"
msgstr "" msgstr ""
"Das Projekt\n" "Dieses Projekt\n"
"%1\n" "%1\n"
"existiert bereits. Wollen Sie sie öffnen?" "existiert bereits. Wollen Sie sie öffnen?"
@ -1049,7 +1051,7 @@ msgstr "Vorhandenes Projekt öffnen"
#: ardour_ui.cc:2702 #: ardour_ui.cc:2702
msgid "There is no existing session at \"%1\"" msgid "There is no existing session at \"%1\""
msgstr "Es gibt kein Projekt an folgender Stelle: \"%1\"" msgstr "Es gibt kein Projekt in: \"%1\""
#: ardour_ui.cc:2792 #: ardour_ui.cc:2792
msgid "Please wait while %1 loads your session" msgid "Please wait while %1 loads your session"
@ -1146,7 +1148,7 @@ msgid_plural ""
"\n" "\n"
"will release an additional %3 %4bytes of disk space.\n" "will release an additional %3 %4bytes of disk space.\n"
msgstr[0] "" msgstr[0] ""
"Die folgende Datei war unbenutzt\n" "Die folgende Datei wurde nicht benutzt\n"
"und wurde verschoben nach: %2\n" "und wurde verschoben nach: %2\n"
"\n" "\n"
"Nach einem Neustart von %5 kann über\n" "Nach einem Neustart von %5 kann über\n"
@ -1195,44 +1197,48 @@ msgstr "gelöschte Datei"
#: ardour_ui.cc:3346 #: ardour_ui.cc:3346
msgid "" msgid ""
"Video-Server was not launched by Ardour. The request to stop it is ignored." "Video-Server was not launched by Ardour. The request to stop it is ignored."
msgstr "" msgstr "Der Video-Server wurde nicht von Ardour gestartet, der Befehl ihn anzuhalten wird ignoriert."
#: ardour_ui.cc:3350 #: ardour_ui.cc:3350
msgid "Stop Video-Server" msgid "Stop Video-Server"
msgstr "" msgstr "Video-Server anhalten"
#: ardour_ui.cc:3351 #: ardour_ui.cc:3351
msgid "Do you really want to stop the Video Server?" msgid "Do you really want to stop the Video Server?"
msgstr "" msgstr "Wollen Sie den Video-Server wirklich anhalten?"
#: ardour_ui.cc:3354 #: ardour_ui.cc:3354
#, fuzzy
msgid "Yes, Stop It" msgid "Yes, Stop It"
msgstr "Ja, entfernen." msgstr "Ja, anhalten."
#: ardour_ui.cc:3380 #: ardour_ui.cc:3380
msgid "The Video Server is already started." msgid "The Video Server is already started."
msgstr "" msgstr "Der Video-Server läuft bereits"
#: ardour_ui.cc:3382 #: ardour_ui.cc:3382
msgid "" msgid ""
"An external Video Server is configured and can be reached. Not starting a " "An external Video Server is configured and can be reached. Not starting a "
"new instance." "new instance."
msgstr "" msgstr ""
"Ein externer Video-Server wurde konfiguriert, ist aber nicht erreichbar. Es wird "
"keine neue Instanz gestartet."
#: ardour_ui.cc:3390 ardour_ui.cc:3461 #: ardour_ui.cc:3390 ardour_ui.cc:3461
msgid "" msgid ""
"Could not connect to the Video Server. Start it or configure its access URL " "Could not connect to the Video Server. Start it or configure its access URL "
"in Edit -> Preferences." "in Edit -> Preferences."
msgstr "" msgstr ""
"Es konnte keine Verbindung zum Video-Server hergestellt werden."
"Sie müssen ihn vorher starten oder die Adresse in "
"Bearbeiten -> Globale Einstellungen anpassen"
#: ardour_ui.cc:3414 #: ardour_ui.cc:3414
msgid "Specified docroot is not an existing directory." msgid "Specified docroot is not an existing directory."
msgstr "" msgstr "Das eingestellte Dokumentenverzeichnis existiert nicht."
#: ardour_ui.cc:3419 #: ardour_ui.cc:3419
msgid "Given Video Server is not an executable file." msgid "Given Video Server is not an executable file."
msgstr "" msgstr "Der eingestellte Video-Server ist keine ausführbare Datei."
#: ardour_ui.cc:3485 editor_audio_import.cc:629 #: ardour_ui.cc:3485 editor_audio_import.cc:629
msgid "could not open %1" msgid "could not open %1"
@ -1240,7 +1246,7 @@ msgstr "Konnte \"%s\" nicht öffnen."
#: ardour_ui.cc:3489 #: ardour_ui.cc:3489
msgid "no video-file selected" msgid "no video-file selected"
msgstr "" msgstr "Es wurde keine Video-Datei ausgewählt."
#: ardour_ui.cc:3650 #: ardour_ui.cc:3650
msgid "Recording was stopped because your system could not keep up." msgid "Recording was stopped because your system could not keep up."
@ -1277,7 +1283,7 @@ msgstr ""
#: ardour_ui.cc:3738 #: ardour_ui.cc:3738
msgid "Crash Recovery" msgid "Crash Recovery"
msgstr "Wiederherstellung" msgstr "Absturz-Wiederherstellung"
#: ardour_ui.cc:3739 #: ardour_ui.cc:3739
msgid "" msgid ""
@ -1338,11 +1344,11 @@ msgstr "Konnte nicht erneut zu JACK verbinden"
#: ardour_ui.cc:3902 #: ardour_ui.cc:3902
msgid "Check the website for more..." msgid "Check the website for more..."
msgstr "" msgstr "Informieren Sie sich auf der Webseite weiter..."
#: ardour_ui.cc:3915 #: ardour_ui.cc:3915
msgid "Click to open the program website in your web browser" msgid "Click to open the program website in your web browser"
msgstr "" msgstr "Klicken Sie, um die Webseite in Ihrem Web-Browse zu öffnen"
#: ardour_ui.cc:4152 #: ardour_ui.cc:4152
msgid "" msgid ""
@ -1453,7 +1459,6 @@ msgid "When active, there is a feedback loop."
msgstr "Wenn aktiv, gibt es eine Rückkopplungsschleife." msgstr "Wenn aktiv, gibt es eine Rückkopplungsschleife."
#: ardour_ui2.cc:142 #: ardour_ui2.cc:142
#, fuzzy
msgid "" msgid ""
"<b>Primary Clock</b> right-click to set display mode. Click to edit, click" "<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" "+drag a digit or mouse-over+scroll wheel to modify.\n"
@ -1470,7 +1475,6 @@ msgstr ""
"Einzelheiten." "Einzelheiten."
#: ardour_ui2.cc:143 #: ardour_ui2.cc:143
#, fuzzy
msgid "" msgid ""
"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click" "<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" "+drag a digit or mouse-over+scroll wheel to modify.\n"
@ -1841,7 +1845,7 @@ msgstr "Start/Stopp"
#: ardour_ui_ed.cc:308 #: ardour_ui_ed.cc:308
msgid "Stop and Forget Capture" msgid "Stop and Forget Capture"
msgstr "Stop + Aufnahme verwerfen" msgstr "Stopp + Aufnahme verwerfen"
#: ardour_ui_ed.cc:318 #: ardour_ui_ed.cc:318
msgid "Transition To Roll" msgid "Transition To Roll"
@ -1857,7 +1861,7 @@ msgstr "Schleife wiedergeben"
#: ardour_ui_ed.cc:329 #: ardour_ui_ed.cc:329
msgid "Play Selected Range" msgid "Play Selected Range"
msgstr "Gewählten Bereich abspielen" msgstr "Gewählten Bereich wiedergeben"
#: ardour_ui_ed.cc:332 #: ardour_ui_ed.cc:332
msgid "Play Selection w/Preroll" msgid "Play Selection w/Preroll"
@ -2610,7 +2614,7 @@ msgstr "Arbeitspunkt"
#: editor.cc:200 #: editor.cc:200
msgid "Mushy" msgid "Mushy"
msgstr "Breiig/Matschig" msgstr "Matschig"
#: editor.cc:201 #: editor.cc:201
msgid "Smooth" msgid "Smooth"
@ -2658,7 +2662,7 @@ msgstr "CD-Marker"
#: editor.cc:250 #: editor.cc:250
msgid "Video Timeline" msgid "Video Timeline"
msgstr "" msgstr "Video Zeitleiste"
#: editor.cc:266 #: editor.cc:266
msgid "mode" msgid "mode"
@ -3105,7 +3109,7 @@ msgstr "Wiedergabeliste löschen"
#: editor.cc:3902 #: editor.cc:3902
msgid "Keep Playlist" msgid "Keep Playlist"
msgstr "Wiedergabeliste beibehalten" msgstr "Wiedergabeliste behalten"
#: editor.cc:3903 editor_audio_import.cc:579 editor_ops.cc:5860 #: editor.cc:3903 editor_audio_import.cc:579 editor_ops.cc:5860
#: processor_box.cc:1953 processor_box.cc:1978 #: processor_box.cc:1953 processor_box.cc:1978

File diff suppressed because it is too large Load diff

View file

@ -2040,7 +2040,7 @@ ProcessorBox::one_processor_can_be_edited ()
} }
Gtk::Window* Gtk::Window*
ProcessorBox::get_editor_window (boost::shared_ptr<Processor> processor) ProcessorBox::get_editor_window (boost::shared_ptr<Processor> processor, bool use_custom)
{ {
boost::shared_ptr<Send> send; boost::shared_ptr<Send> send;
boost::shared_ptr<InternalSend> internal_send; boost::shared_ptr<InternalSend> internal_send;
@ -2119,8 +2119,7 @@ ProcessorBox::get_editor_window (boost::shared_ptr<Processor> processor)
Window* w = get_processor_ui (plugin_insert); Window* w = get_processor_ui (plugin_insert);
if (w == 0) { if (w == 0) {
plugin_ui = new PluginUIWindow (plugin_insert, false, use_custom);
plugin_ui = new PluginUIWindow (plugin_insert, false, Config->get_use_plugin_own_gui());
plugin_ui->set_title (generate_processor_title (plugin_insert)); plugin_ui->set_title (generate_processor_title (plugin_insert));
set_processor_ui (plugin_insert, plugin_ui); set_processor_ui (plugin_insert, plugin_ui);
@ -2438,6 +2437,7 @@ ProcessorBox::edit_processor (boost::shared_ptr<Processor> processor)
ProcessorWindowProxy* proxy = find_window_proxy (processor); ProcessorWindowProxy* proxy = find_window_proxy (processor);
if (proxy) { if (proxy) {
proxy->set_custom_ui_mode (Config->get_use_plugin_own_gui ());
proxy->toggle (); proxy->toggle ();
} }
} }
@ -2452,6 +2452,7 @@ ProcessorBox::generic_edit_processor (boost::shared_ptr<Processor> processor)
ProcessorWindowProxy* proxy = find_window_proxy (processor); ProcessorWindowProxy* proxy = find_window_proxy (processor);
if (proxy) { if (proxy) {
proxy->set_custom_ui_mode (false);
proxy->toggle (); proxy->toggle ();
} }
} }
@ -2629,6 +2630,7 @@ ProcessorWindowProxy::ProcessorWindowProxy (string const & name, ProcessorBox* b
, _processor_box (box) , _processor_box (box)
, _processor (processor) , _processor (processor)
, is_custom (false) , is_custom (false)
, want_custom (false)
{ {
} }
@ -2640,6 +2642,38 @@ ProcessorWindowProxy::session_handle()
return 0; return 0;
} }
XMLNode&
ProcessorWindowProxy::get_state () const
{
XMLNode *node;
node = &ProxyBase::get_state();
node->add_property (X_("custom-ui"), is_custom? X_("yes") : X_("no"));
return *node;
}
void
ProcessorWindowProxy::set_state (const XMLNode& node)
{
XMLNodeList children = node.children ();
XMLNodeList::const_iterator i = children.begin ();
while (i != children.end()) {
XMLProperty* prop = (*i)->property (X_("name"));
if ((*i)->name() == X_("Window") && prop && prop->value() == _name) {
break;
}
++i;
}
if (i != children.end()) {
XMLProperty* prop;
if ((prop = (*i)->property (X_("custom-ui"))) != 0) {
want_custom = PBD::string_is_affirmative (prop->value ());
}
}
ProxyBase::set_state(node);
}
Gtk::Window* Gtk::Window*
ProcessorWindowProxy::get (bool create) ProcessorWindowProxy::get (bool create)
{ {
@ -2648,8 +2682,7 @@ ProcessorWindowProxy::get (bool create)
if (!p) { if (!p) {
return 0; return 0;
} }
if (_window && (is_custom != want_custom)) {
if (_window && (is_custom != Config->get_use_plugin_own_gui ())) {
/* drop existing window - wrong type */ /* drop existing window - wrong type */
drop_window (); drop_window ();
} }
@ -2659,8 +2692,8 @@ ProcessorWindowProxy::get (bool create)
return 0; return 0;
} }
_window = _processor_box->get_editor_window (p); is_custom = want_custom;
is_custom = Config->get_use_plugin_own_gui(); _window = _processor_box->get_editor_window (p, is_custom);
if (_window) { if (_window) {
setup (); setup ();
@ -2673,10 +2706,11 @@ ProcessorWindowProxy::get (bool create)
void void
ProcessorWindowProxy::toggle () ProcessorWindowProxy::toggle ()
{ {
if (_window && (is_custom != Config->get_use_plugin_own_gui ())) { if (_window && (is_custom != want_custom)) {
/* drop existing window - wrong type */ /* drop existing window - wrong type */
drop_window (); drop_window ();
} }
is_custom = want_custom;
WM::ProxyBase::toggle (); WM::ProxyBase::toggle ();
} }

View file

@ -88,13 +88,18 @@ class ProcessorWindowProxy : public WM::ProxyBase
ARDOUR::SessionHandlePtr* session_handle(); ARDOUR::SessionHandlePtr* session_handle();
void toggle(); void toggle();
void set_custom_ui_mode(bool use_custom) { want_custom = use_custom; }
bool marked; bool marked;
void set_state (const XMLNode&);
XMLNode& get_state () const;
private: private:
ProcessorBox* _processor_box; ProcessorBox* _processor_box;
boost::weak_ptr<ARDOUR::Processor> _processor; boost::weak_ptr<ARDOUR::Processor> _processor;
bool is_custom; bool is_custom;
bool want_custom;
}; };
class ProcessorEntry : public Gtkmm2ext::DnDVBoxChild, public sigc::trackable class ProcessorEntry : public Gtkmm2ext::DnDVBoxChild, public sigc::trackable
@ -257,7 +262,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
Gtk::Window* get_processor_ui (boost::shared_ptr<ARDOUR::Processor>) const; Gtk::Window* get_processor_ui (boost::shared_ptr<ARDOUR::Processor>) const;
/* a WindowProxy object can use this */ /* a WindowProxy object can use this */
Gtk::Window* get_editor_window (boost::shared_ptr<ARDOUR::Processor>); Gtk::Window* get_editor_window (boost::shared_ptr<ARDOUR::Processor>, bool);
Gtk::Window* get_generic_editor_window (boost::shared_ptr<ARDOUR::Processor>); Gtk::Window* get_generic_editor_window (boost::shared_ptr<ARDOUR::Processor>);
void edit_processor (boost::shared_ptr<ARDOUR::Processor>); void edit_processor (boost::shared_ptr<ARDOUR::Processor>);

View file

@ -653,7 +653,7 @@ public:
{ {
_store = ListStore::create (_model); _store = ListStore::create (_model);
_view.set_model (_store); _view.set_model (_store);
_view.append_column (_("Name"), _model.name); _view.append_column (_("Control Surface Protocol"), _model.name);
_view.get_column(0)->set_resizable (true); _view.get_column(0)->set_resizable (true);
_view.get_column(0)->set_expand (true); _view.get_column(0)->set_expand (true);
_view.append_column_editable (_("Enabled"), _model.enabled); _view.append_column_editable (_("Enabled"), _model.enabled);
@ -1813,9 +1813,9 @@ RCOptionEditor::RCOptionEditor ()
add_option (_("User interaction"), new KeyboardOptions); add_option (_("User interaction"), new KeyboardOptions);
add_option (_("User interaction"), new OptionEditorHeading (_("Control surfaces"))); /* Control Surfaces */
add_option (_("User interaction"), new ControlSurfacesOptions (*this)); add_option (_("Control Surfaces"), new ControlSurfacesOptions (*this));
ComboOption<RemoteModel>* rm = new ComboOption<RemoteModel> ( ComboOption<RemoteModel>* rm = new ComboOption<RemoteModel> (
"remote-model", "remote-model",
@ -1828,14 +1828,14 @@ RCOptionEditor::RCOptionEditor ()
rm->add (MixerOrdered, _("follows order of mixer")); rm->add (MixerOrdered, _("follows order of mixer"));
rm->add (EditorOrdered, _("follows order of editor")); rm->add (EditorOrdered, _("follows order of editor"));
add_option (_("User interaction"), rm); add_option (_("Control Surfaces"), rm);
/* VIDEO Timeline */ /* VIDEO Timeline */
add_option (_("Video"), new VideoTimelineOptions (_rc_config)); add_option (_("Video"), new VideoTimelineOptions (_rc_config));
/* INTERFACE */ /* INTERFACE */
add_option (S_("GUI"), add_option (S_("Preferences|GUI"),
new BoolOption ( new BoolOption (
"widget-prelight", "widget-prelight",
_("Graphically indicate mouse pointer hovering over various widgets"), _("Graphically indicate mouse pointer hovering over various widgets"),
@ -1843,7 +1843,7 @@ RCOptionEditor::RCOptionEditor ()
sigc::mem_fun (*_rc_config, &RCConfiguration::set_widget_prelight) sigc::mem_fun (*_rc_config, &RCConfiguration::set_widget_prelight)
)); ));
add_option (S_("GUI"), add_option (S_("Preferences|GUI"),
new BoolOption ( new BoolOption (
"use-tooltips", "use-tooltips",
_("Show tooltips if mouse hovers over a control"), _("Show tooltips if mouse hovers over a control"),
@ -1853,9 +1853,9 @@ RCOptionEditor::RCOptionEditor ()
#ifndef GTKOSX #ifndef GTKOSX
/* font scaling does nothing with GDK/Quartz */ /* font scaling does nothing with GDK/Quartz */
add_option (S_("GUI"), new FontScalingOptions (_rc_config)); add_option (S_("Preferences|GUI"), new FontScalingOptions (_rc_config));
#endif #endif
add_option (S_("GUI"), add_option (S_("Preferences|GUI"),
new BoolOption ( new BoolOption (
"use-own-plugin-gui", "use-own-plugin-gui",
string_compose (_("Use plugins' own interfaces instead of %1's"), PROGRAM_NAME), string_compose (_("Use plugins' own interfaces instead of %1's"), PROGRAM_NAME),
@ -1881,7 +1881,7 @@ RCOptionEditor::RCOptionEditor ()
_mixer_strip_visibility.add (0, X_("MeterPoint"), _("Meter Point")); _mixer_strip_visibility.add (0, X_("MeterPoint"), _("Meter Point"));
add_option ( add_option (
S_("GUI"), S_("Preferences|GUI"),
new VisibilityOption ( new VisibilityOption (
_("Mixer Strip"), _("Mixer Strip"),
&_mixer_strip_visibility, &_mixer_strip_visibility,
@ -1890,7 +1890,7 @@ RCOptionEditor::RCOptionEditor ()
) )
); );
add_option (S_("GUI"), add_option (S_("Preferences|GUI"),
new BoolOption ( new BoolOption (
"default-narrow_ms", "default-narrow_ms",
_("Use narrow strips in the mixer by default"), _("Use narrow strips in the mixer by default"),
@ -1898,7 +1898,7 @@ RCOptionEditor::RCOptionEditor ()
sigc::mem_fun (*_rc_config, &RCConfiguration::set_default_narrow_ms) sigc::mem_fun (*_rc_config, &RCConfiguration::set_default_narrow_ms)
)); ));
add_option (S_("GUI"), new OptionEditorHeading (_("Metering"))); add_option (S_("Preferences|GUI"), new OptionEditorHeading (_("Metering")));
ComboOption<float>* mht = new ComboOption<float> ( ComboOption<float>* mht = new ComboOption<float> (
"meter-hold", "meter-hold",
@ -1912,7 +1912,7 @@ RCOptionEditor::RCOptionEditor ()
mht->add (MeterHoldMedium, _("medium")); mht->add (MeterHoldMedium, _("medium"));
mht->add (MeterHoldLong, _("long")); mht->add (MeterHoldLong, _("long"));
add_option (S_("GUI"), mht); add_option (S_("Preferences|GUI"), mht);
ComboOption<float>* mfo = new ComboOption<float> ( ComboOption<float>* mfo = new ComboOption<float> (
"meter-falloff", "meter-falloff",
@ -1929,7 +1929,7 @@ RCOptionEditor::RCOptionEditor ()
mfo->add (METER_FALLOFF_FASTER, _("faster")); mfo->add (METER_FALLOFF_FASTER, _("faster"));
mfo->add (METER_FALLOFF_FASTEST, _("fastest")); mfo->add (METER_FALLOFF_FASTEST, _("fastest"));
add_option (S_("GUI"), mfo); add_option (S_("Preferences|GUI"), mfo);
} }
void void

View file

@ -255,7 +255,9 @@ StepEditor::step_add_note (uint8_t channel, uint8_t pitch, uint8_t velocity, Evo
assert (step_edit_region); assert (step_edit_region);
assert (step_edit_region_view); assert (step_edit_region_view);
if (beat_duration == 0.0) { if (beat_duration == 0.0 && step_editor) {
beat_duration = step_editor->note_length();
} else if (beat_duration == 0.0) {
bool success; bool success;
beat_duration = _editor.get_grid_type_as_beats (success, step_edit_insert_position); beat_duration = _editor.get_grid_type_as_beats (success, step_edit_insert_position);

View file

@ -28,6 +28,7 @@
#include "ardour_dialog.h" #include "ardour_dialog.h"
#include "ardour_window.h" #include "ardour_window.h"
#include "window_manager.h" #include "window_manager.h"
#include "processor_box.h"
#include "i18n.h" #include "i18n.h"
@ -106,7 +107,12 @@ Manager::add_state (XMLNode& root) const
if (dynamic_cast<ProxyTemporary*> (*i)) { if (dynamic_cast<ProxyTemporary*> (*i)) {
continue; continue;
} }
root.add_child_nocopy ((*i)->get_state()); if (dynamic_cast<ProcessorWindowProxy*> (*i)) {
ProcessorWindowProxy *pi = dynamic_cast<ProcessorWindowProxy*> (*i);
root.add_child_nocopy (pi->get_state());
} else {
root.add_child_nocopy ((*i)->get_state());
}
} }
} }

View file

@ -120,8 +120,14 @@ public:
*/ */
LV2_Evbuf* get_lv2_midi(bool input, size_t i, bool old_api); LV2_Evbuf* get_lv2_midi(bool input, size_t i, bool old_api);
/** ensure minimum size of LV2 Atom port buffer */
void ensure_lv2_bufsize(bool input, size_t i, size_t buffer_capacity);
/** Flush modified LV2 event output buffers back to Ardour buffers */ /** Flush modified LV2 event output buffers back to Ardour buffers */
void flush_lv2_midi(bool input, size_t i); void flush_lv2_midi(bool input, size_t i);
/** Forward plugin MIDI output to to Ardour buffers */
void forward_lv2_midi(LV2_Evbuf*, size_t, bool purge_ardour_buffer = true);
#endif #endif
#if defined VST_SUPPORT || defined LXVST_SUPPORT #if defined VST_SUPPORT || defined LXVST_SUPPORT

View file

@ -122,16 +122,13 @@ class ExportProfileManager
TimespanListPtr timespans; TimespanListPtr timespans;
TimeFormat time_format; TimeFormat time_format;
boost::shared_ptr<Location> session_range;
boost::shared_ptr<Location> selection_range; boost::shared_ptr<Location> selection_range;
boost::shared_ptr<LocationList> ranges; boost::shared_ptr<LocationList> ranges;
TimespanState (boost::shared_ptr<Location> session_range, TimespanState (boost::shared_ptr<Location> selection_range,
boost::shared_ptr<Location> selection_range,
boost::shared_ptr<LocationList> ranges) boost::shared_ptr<LocationList> ranges)
: timespans (new TimespanList ()) : timespans (new TimespanList ())
, time_format (Timecode) , time_format (Timecode)
, session_range (session_range)
, selection_range (selection_range) , selection_range (selection_range)
, ranges (ranges) , ranges (ranges)
{} {}
@ -157,7 +154,6 @@ class ExportProfileManager
void update_ranges (); void update_ranges ();
boost::shared_ptr<Location> session_range;
boost::shared_ptr<Location> selection_range; boost::shared_ptr<Location> selection_range;
boost::shared_ptr<LocationList> ranges; boost::shared_ptr<LocationList> ranges;

View file

@ -202,6 +202,7 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
typedef unsigned PortFlags; typedef unsigned PortFlags;
std::vector<PortFlags> _port_flags; std::vector<PortFlags> _port_flags;
std::vector<size_t> _port_minimumSize;
std::map<std::string,uint32_t> _port_indices; std::map<std::string,uint32_t> _port_indices;
/// Message send to/from UI via ports /// Message send to/from UI via ports

View file

@ -252,6 +252,25 @@ BufferSet::get(DataType type, size_t i) const
#ifdef LV2_SUPPORT #ifdef LV2_SUPPORT
void
BufferSet::ensure_lv2_bufsize(bool input, size_t i, size_t buffer_capacity)
{
assert(count().get(DataType::MIDI) > i);
LV2Buffers::value_type b = _lv2_buffers.at(i * 2 + (input ? 0 : 1));
LV2_Evbuf* evbuf = b.second;
if (lv2_evbuf_get_capacity(evbuf) >= buffer_capacity) return;
lv2_evbuf_free(b.second);
_lv2_buffers.at(i * 2 + (input ? 0 : 1)) =
std::make_pair(false, lv2_evbuf_new(
buffer_capacity,
LV2_EVBUF_EVENT,
LV2Plugin::urids.atom_Chunk,
LV2Plugin::urids.atom_Sequence));
}
LV2_Evbuf* LV2_Evbuf*
BufferSet::get_lv2_midi(bool input, size_t i, bool old_api) BufferSet::get_lv2_midi(bool input, size_t i, bool old_api)
{ {
@ -265,6 +284,25 @@ BufferSet::get_lv2_midi(bool input, size_t i, bool old_api)
return evbuf; return evbuf;
} }
void
BufferSet::forward_lv2_midi(LV2_Evbuf* buf, size_t i, bool purge_ardour_buffer)
{
MidiBuffer& mbuf = get_midi(i);
if (purge_ardour_buffer) {
mbuf.silence(0, 0);
}
for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
lv2_evbuf_is_valid(i);
i = lv2_evbuf_next(i)) {
uint32_t frames, subframes, type, size;
uint8_t* data;
lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
if (type == LV2Plugin::urids.midi_MidiEvent) {
mbuf.push_back(frames, size, data);
}
}
}
void void
BufferSet::flush_lv2_midi(bool input, size_t i) BufferSet::flush_lv2_midi(bool input, size_t i)
{ {

View file

@ -61,7 +61,6 @@ ExportProfileManager::ExportProfileManager (Session & s, ExportType type)
, handler (s.get_export_handler()) , handler (s.get_export_handler())
, session (s) , session (s)
, session_range (new Location (s))
, ranges (new LocationList ()) , ranges (new LocationList ())
, single_range_mode (false) , single_range_mode (false)
@ -385,13 +384,16 @@ ExportProfileManager::init_timespans (XMLNodeList nodes)
} }
if (timespans.empty()) { if (timespans.empty()) {
TimespanStatePtr state (new TimespanState (session_range, selection_range, ranges)); TimespanStatePtr state (new TimespanState (selection_range, ranges));
timespans.push_back (state); timespans.push_back (state);
// Add session as default selection // Add session as default selection
Location * session_range = session.locations()->session_range_location();
if (!session_range) { return false; }
ExportTimespanPtr timespan = handler->add_timespan(); ExportTimespanPtr timespan = handler->add_timespan();
timespan->set_name (session_range->name()); timespan->set_name (session_range->name());
timespan->set_range_id ("session"); timespan->set_range_id (session_range->id().to_s());
timespan->set_range (session_range->start(), session_range->end()); timespan->set_range (session_range->start(), session_range->end());
state->timespans->push_back (timespan); state->timespans->push_back (timespan);
return false; return false;
@ -403,7 +405,7 @@ ExportProfileManager::init_timespans (XMLNodeList nodes)
ExportProfileManager::TimespanStatePtr ExportProfileManager::TimespanStatePtr
ExportProfileManager::deserialize_timespan (XMLNode & root) ExportProfileManager::deserialize_timespan (XMLNode & root)
{ {
TimespanStatePtr state (new TimespanState (session_range, selection_range, ranges)); TimespanStatePtr state (new TimespanState (selection_range, ranges));
XMLProperty const * prop; XMLProperty const * prop;
XMLNodeList spans = root.children ("Range"); XMLNodeList spans = root.children ("Range");
@ -413,23 +415,32 @@ ExportProfileManager::deserialize_timespan (XMLNode & root)
if (!prop) { continue; } if (!prop) { continue; }
string id = prop->value(); string id = prop->value();
Location * location = 0;
for (LocationList::iterator it = ranges->begin(); it != ranges->end(); ++it) { for (LocationList::iterator it = ranges->begin(); it != ranges->end(); ++it) {
if ((!id.compare ("session") && *it == session_range.get()) || if ((id == "selection" && *it == selection_range.get()) ||
(!id.compare ("selection") && *it == selection_range.get()) || (id == (*it)->id().to_s())) {
(!id.compare ((*it)->id().to_s()))) { location = *it;
ExportTimespanPtr timespan = handler->add_timespan(); break;
timespan->set_name ((*it)->name());
timespan->set_range_id (id);
timespan->set_range ((*it)->start(), (*it)->end());
state->timespans->push_back (timespan);
} }
} }
if (!location) { continue; }
ExportTimespanPtr timespan = handler->add_timespan();
timespan->set_name (location->name());
timespan->set_range_id (location->id().to_s());
timespan->set_range (location->start(), location->end());
state->timespans->push_back (timespan);
} }
if ((prop = root.property ("format"))) { if ((prop = root.property ("format"))) {
state->time_format = (TimeFormat) string_2_enum (prop->value(), TimeFormat); state->time_format = (TimeFormat) string_2_enum (prop->value(), TimeFormat);
} }
if (state->timespans->empty()) {
return TimespanStatePtr();
}
return state; return state;
} }
@ -440,7 +451,6 @@ ExportProfileManager::serialize_timespan (TimespanStatePtr state)
XMLNode * span; XMLNode * span;
update_ranges (); update_ranges ();
for (TimespanList::iterator it = state->timespans->begin(); it != state->timespans->end(); ++it) { for (TimespanList::iterator it = state->timespans->begin(); it != state->timespans->end(); ++it) {
if ((span = root.add_child ("Range"))) { if ((span = root.add_child ("Range"))) {
span->add_property ("id", (*it)->range_id()); span->add_property ("id", (*it)->range_id());
@ -463,9 +473,10 @@ ExportProfileManager::update_ranges () {
/* Session */ /* Session */
session_range->set_name (_("Session")); Location * session_range = session.locations()->session_range_location();
session_range->set (session.current_start_frame(), session.current_end_frame()); if (session_range) {
ranges->push_back (session_range.get()); ranges->push_back (session_range);
}
/* Selection */ /* Selection */

View file

@ -169,7 +169,7 @@ vstfx_infofile_path (char* dllpath, int personal)
} }
} else { } else {
dir = Glib::path_get_dirname (dllpath); dir = Glib::path_get_dirname (std::string(dllpath));
} }
stringstream s; stringstream s;
@ -214,6 +214,7 @@ vstfx_infofile_for_read (char* dllpath)
{ {
struct stat own_statbuf; struct stat own_statbuf;
struct stat sys_statbuf; struct stat sys_statbuf;
FILE *rv = NULL;
char* own_info = vstfx_infofile_stat (dllpath, &own_statbuf, 1); char* own_info = vstfx_infofile_stat (dllpath, &own_statbuf, 1);
char* sys_info = vstfx_infofile_stat (dllpath, &sys_statbuf, 0); char* sys_info = vstfx_infofile_stat (dllpath, &sys_statbuf, 0);
@ -222,14 +223,16 @@ vstfx_infofile_for_read (char* dllpath)
if (sys_info) { if (sys_info) {
if (own_statbuf.st_mtime <= sys_statbuf.st_mtime) { if (own_statbuf.st_mtime <= sys_statbuf.st_mtime) {
/* system info file is newer, use it */ /* system info file is newer, use it */
return g_fopen (sys_info, "rb"); rv = g_fopen (sys_info, "rb");
} }
} else { } else {
return g_fopen (own_info, "rb"); rv = g_fopen (own_info, "rb");
} }
} }
free(own_info);
free(sys_info);
return 0; return rv;
} }
static FILE * static FILE *
@ -416,6 +419,8 @@ vstfx_free_info (VSTInfo *info)
free (info->name); free (info->name);
free (info->creator); free (info->creator);
free (info->Category); free (info->Category);
free (info->ParamNames);
free (info->ParamLabels);
free (info); free (info);
} }

View file

@ -379,6 +379,7 @@ void vstfx_close (VSTState* vstfx)
dlclose(vstfx->handle->dll); //dlclose keeps its own reference count dlclose(vstfx->handle->dll); //dlclose keeps its own reference count
vstfx->handle->dll = 0; vstfx->handle->dll = 0;
} }
free(vstfx);
} }

View file

@ -115,6 +115,12 @@ lv2_evbuf_get_size(LV2_Evbuf* evbuf)
return 0; return 0;
} }
uint32_t
lv2_evbuf_get_capacity(LV2_Evbuf* evbuf)
{
return evbuf->capacity;
}
void* void*
lv2_evbuf_get_buffer(LV2_Evbuf* evbuf) lv2_evbuf_get_buffer(LV2_Evbuf* evbuf)
{ {

View file

@ -92,6 +92,12 @@ lv2_evbuf_reset(LV2_Evbuf* evbuf, bool input);
uint32_t uint32_t
lv2_evbuf_get_size(LV2_Evbuf* evbuf); lv2_evbuf_get_size(LV2_Evbuf* evbuf);
/**
Return the available capacity of the buffer
*/
uint32_t
lv2_evbuf_get_capacity(LV2_Evbuf* evbuf);
/** /**
Return the actual buffer implementation. Return the actual buffer implementation.
The format of the buffer returned depends on the buffer type. The format of the buffer returned depends on the buffer type.

View file

@ -61,6 +61,7 @@
#include "lv2/lv2plug.in/ns/ext/state/state.h" #include "lv2/lv2plug.in/ns/ext/state/state.h"
#include "lv2/lv2plug.in/ns/ext/time/time.h" #include "lv2/lv2plug.in/ns/ext/time/time.h"
#include "lv2/lv2plug.in/ns/ext/worker/worker.h" #include "lv2/lv2plug.in/ns/ext/worker/worker.h"
#include "lv2/lv2plug.in/ns/ext/resize-port/resize-port.h"
#include "lv2/lv2plug.in/ns/extensions/ui/ui.h" #include "lv2/lv2plug.in/ns/extensions/ui/ui.h"
#ifdef HAVE_NEW_LV2 #ifdef HAVE_NEW_LV2
#include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h" #include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h"
@ -119,6 +120,7 @@ public:
LilvNode* atom_supports; LilvNode* atom_supports;
LilvNode* ev_EventPort; LilvNode* ev_EventPort;
LilvNode* ext_logarithmic; LilvNode* ext_logarithmic;
LilvNode* ext_notOnGUI;
LilvNode* lv2_AudioPort; LilvNode* lv2_AudioPort;
LilvNode* lv2_ControlPort; LilvNode* lv2_ControlPort;
LilvNode* lv2_InputPort; LilvNode* lv2_InputPort;
@ -126,10 +128,12 @@ public:
LilvNode* lv2_enumeration; LilvNode* lv2_enumeration;
LilvNode* lv2_inPlaceBroken; LilvNode* lv2_inPlaceBroken;
LilvNode* lv2_integer; LilvNode* lv2_integer;
LilvNode* lv2_reportsLatency;
LilvNode* lv2_sampleRate; LilvNode* lv2_sampleRate;
LilvNode* lv2_toggled; LilvNode* lv2_toggled;
LilvNode* midi_MidiEvent; LilvNode* midi_MidiEvent;
LilvNode* rdfs_comment; LilvNode* rdfs_comment;
LilvNode* rsz_minimumSize;
LilvNode* time_Position; LilvNode* time_Position;
LilvNode* ui_GtkUI; LilvNode* ui_GtkUI;
LilvNode* ui_external; LilvNode* ui_external;
@ -406,6 +410,7 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
for (uint32_t i = 0; i < num_ports; ++i) { for (uint32_t i = 0; i < num_ports; ++i) {
const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i); const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i);
PortFlags flags = 0; PortFlags flags = 0;
size_t minimumSize = 0;
if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) { if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
flags |= PORT_OUTPUT; flags |= PORT_OUTPUT;
@ -440,6 +445,12 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
flags |= PORT_POSITION; flags |= PORT_POSITION;
} }
} }
LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
if (min_size && lilv_node_is_int(min_size)) {
minimumSize = lilv_node_as_int(min_size);
}
lilv_nodes_free(min_size_v);
lilv_nodes_free(buffer_types); lilv_nodes_free(buffer_types);
lilv_nodes_free(atom_supports); lilv_nodes_free(atom_supports);
} else { } else {
@ -450,6 +461,7 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
} }
_port_flags.push_back(flags); _port_flags.push_back(flags);
_port_minimumSize.push_back(minimumSize);
} }
_control_data = new float[num_ports]; _control_data = new float[num_ports];
@ -1319,6 +1331,16 @@ string
LV2Plugin::describe_parameter(Evoral::Parameter which) LV2Plugin::describe_parameter(Evoral::Parameter which)
{ {
if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) { if (( which.type() == PluginAutomation) && ( which.id() < parameter_count()) ) {
if (lilv_port_has_property(_impl->plugin,
lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
return X_("hidden");
}
if (lilv_port_has_property(_impl->plugin,
lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
return X_("latency");
}
LilvNode* name = lilv_port_get_name(_impl->plugin, LilvNode* name = lilv_port_get_name(_impl->plugin,
lilv_plugin_get_port_by_index(_impl->plugin, which.id())); lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
string ret(lilv_node_as_string(name)); string ret(lilv_node_as_string(name));
@ -1397,6 +1419,7 @@ LV2Plugin::allocate_atom_event_buffers()
*/ */
int count_atom_out = 0; int count_atom_out = 0;
int count_atom_in = 0; int count_atom_in = 0;
int minimumSize = 32768; // TODO use a per-port minimum-size
for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) { for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
const LilvPort* port = lilv_plugin_get_port_by_index(p, i); const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
if (lilv_port_is_a(p, port, _world.atom_AtomPort)) { if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
@ -1413,6 +1436,12 @@ LV2Plugin::allocate_atom_event_buffers()
if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) { if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
count_atom_out++; count_atom_out++;
} }
LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize);
LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL;
if (min_size && lilv_node_is_int(min_size)) {
minimumSize = std::max(minimumSize, lilv_node_as_int(min_size));
}
lilv_nodes_free(min_size_v);
} }
lilv_nodes_free(buffer_types); lilv_nodes_free(buffer_types);
lilv_nodes_free(atom_supports); lilv_nodes_free(atom_supports);
@ -1430,7 +1459,7 @@ LV2Plugin::allocate_atom_event_buffers()
DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers\n", total_atom_buffers)); DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers\n", total_atom_buffers));
_atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*)); _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
for (int i = 0; i < total_atom_buffers; ++i ) { for (int i = 0; i < total_atom_buffers; ++i ) {
_atom_ev_buffers[i] = lv2_evbuf_new(32768, LV2_EVBUF_ATOM, _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
LV2Plugin::urids.atom_Chunk, LV2Plugin::urids.atom_Sequence); LV2Plugin::urids.atom_Chunk, LV2Plugin::urids.atom_Sequence);
} }
_atom_ev_buffers[total_atom_buffers] = 0; _atom_ev_buffers[total_atom_buffers] = 0;
@ -1539,6 +1568,12 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
index = out_map.get(DataType::MIDI, midi_out_index++, &valid); index = out_map.get(DataType::MIDI, midi_out_index++, &valid);
} }
if (valid && bufs.count().n_midi() > index) { if (valid && bufs.count().n_midi() > index) {
/* Note, ensure_lv2_bufsize() is not RT safe!
* However free()/alloc() is only called if a
* plugin requires a rsz:minimumSize buffersize
* and the existing buffer if smaller.
*/
bufs.ensure_lv2_bufsize((flags & PORT_INPUT), index, _port_minimumSize[port_index]);
_ev_buffers[port_index] = bufs.get_lv2_midi( _ev_buffers[port_index] = bufs.get_lv2_midi(
(flags & PORT_INPUT), index, (flags & PORT_EVENT)); (flags & PORT_INPUT), index, (flags & PORT_EVENT));
} }
@ -1640,8 +1675,28 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
PortFlags flags = _port_flags[port_index]; PortFlags flags = _port_flags[port_index];
bool valid = false; bool valid = false;
// Flush MIDI (write back to Ardour MIDI buffers) /* TODO ask drobilla about comment
if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) { * "Make Ardour event buffers generic so plugins can communicate"
* in libs/ardour/buffer_set.cc:310
*
* ideally the user could choose which of the following two modes
* to use (e.g. instrument/effect chains MIDI OUT vs MIDI TRHU).
*
* This implementation follows the discussion on IRC Mar 16 2013 16:47 UTC
* 16:51 < drobilla> rgareus: [..] i.e always replace with MIDI output [of LV2 plugin] if it's there
* 16:52 < drobilla> rgareus: That would probably be good enough [..] to make users not complain
* for quite a while at least ;)
*/
// copy output of LV2 plugin's MIDI port to Ardour MIDI buffers -- MIDI OUT
if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE|PORT_MIDI))) {
const uint32_t buf_index = out_map.get(
DataType::MIDI, midi_out_index++, &valid);
if (valid) {
bufs.forward_lv2_midi(_ev_buffers[port_index], buf_index);
}
}
// Flush MIDI (write back to Ardour MIDI buffers) -- MIDI THRU
else if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
const uint32_t buf_index = out_map.get( const uint32_t buf_index = out_map.get(
DataType::MIDI, midi_out_index++, &valid); DataType::MIDI, midi_out_index++, &valid);
if (valid) { if (valid) {
@ -1836,17 +1891,20 @@ LV2World::LV2World()
atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer); atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT); ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT);
ext_logarithmic = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic); ext_logarithmic = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
ext_notOnGUI = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
lv2_AudioPort = lilv_new_uri(world, LILV_URI_AUDIO_PORT); lv2_AudioPort = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT); lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT); lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT);
lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT); lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken); lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
lv2_integer = lilv_new_uri(world, LV2_CORE__integer); lv2_integer = lilv_new_uri(world, LV2_CORE__integer);
lv2_reportsLatency = lilv_new_uri(world, LV2_CORE__reportsLatency);
lv2_sampleRate = lilv_new_uri(world, LV2_CORE__sampleRate); lv2_sampleRate = lilv_new_uri(world, LV2_CORE__sampleRate);
lv2_toggled = lilv_new_uri(world, LV2_CORE__toggled); lv2_toggled = lilv_new_uri(world, LV2_CORE__toggled);
lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration); lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration);
midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT); midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
rdfs_comment = lilv_new_uri(world, LILV_NS_RDFS "comment"); rdfs_comment = lilv_new_uri(world, LILV_NS_RDFS "comment");
rsz_minimumSize = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
time_Position = lilv_new_uri(world, LV2_TIME__Position); time_Position = lilv_new_uri(world, LV2_TIME__Position);
ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI); ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external"); ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
@ -1856,17 +1914,24 @@ LV2World::~LV2World()
{ {
lilv_node_free(ui_external); lilv_node_free(ui_external);
lilv_node_free(ui_GtkUI); lilv_node_free(ui_GtkUI);
lilv_node_free(time_Position);
lilv_node_free(rsz_minimumSize);
lilv_node_free(rdfs_comment);
lilv_node_free(midi_MidiEvent); lilv_node_free(midi_MidiEvent);
lilv_node_free(lv2_enumeration);
lilv_node_free(lv2_toggled); lilv_node_free(lv2_toggled);
lilv_node_free(lv2_sampleRate); lilv_node_free(lv2_sampleRate);
lilv_node_free(lv2_reportsLatency);
lilv_node_free(lv2_integer); lilv_node_free(lv2_integer);
lilv_node_free(lv2_inPlaceBroken); lilv_node_free(lv2_inPlaceBroken);
lilv_node_free(lv2_OutputPort); lilv_node_free(lv2_OutputPort);
lilv_node_free(lv2_InputPort); lilv_node_free(lv2_InputPort);
lilv_node_free(lv2_ControlPort); lilv_node_free(lv2_ControlPort);
lilv_node_free(lv2_AudioPort); lilv_node_free(lv2_AudioPort);
lilv_node_free(ext_notOnGUI);
lilv_node_free(ext_logarithmic); lilv_node_free(ext_logarithmic);
lilv_node_free(ev_EventPort); lilv_node_free(ev_EventPort);
lilv_node_free(atom_supports);
lilv_node_free(atom_eventTransfer); lilv_node_free(atom_eventTransfer);
lilv_node_free(atom_bufferType); lilv_node_free(atom_bufferType);
lilv_node_free(atom_Sequence); lilv_node_free(atom_Sequence);

View file

@ -140,6 +140,7 @@ Session::Session (AudioEngine &eng,
, _butler (new Butler (*this)) , _butler (new Butler (*this))
, _post_transport_work (0) , _post_transport_work (0)
, _send_timecode_update (false) , _send_timecode_update (false)
, ltc_enc_buf(0)
, _all_route_group (new RouteGroup (*this, "all")) , _all_route_group (new RouteGroup (*this, "all"))
, routes (new RouteList) , routes (new RouteList)
, _total_free_4k_blocks (0) , _total_free_4k_blocks (0)

View file

@ -93,7 +93,8 @@ void
Session::ltc_tx_cleanup() Session::ltc_tx_cleanup()
{ {
DEBUG_TRACE (DEBUG::LTC, "LTC TX cleanup\n"); DEBUG_TRACE (DEBUG::LTC, "LTC TX cleanup\n");
if (ltc_enc_buf) free(ltc_enc_buf); free(ltc_enc_buf);
ltc_enc_buf = NULL;
ltc_encoder_free(ltc_encoder); ltc_encoder_free(ltc_encoder);
ltc_encoder = NULL; ltc_encoder = NULL;
} }

View file

@ -694,7 +694,7 @@ Session::remove_state (string snapshot_name)
void void
Session::jack_session_event (jack_session_event_t * event) Session::jack_session_event (jack_session_event_t * event)
{ {
char timebuf[128]; char timebuf[128], *tmp;
time_t n; time_t n;
struct tm local_time; struct tm local_time;
@ -702,6 +702,8 @@ Session::jack_session_event (jack_session_event_t * event)
localtime_r (&n, &local_time); localtime_r (&n, &local_time);
strftime (timebuf, sizeof(timebuf), "JS_%FT%T", &local_time); strftime (timebuf, sizeof(timebuf), "JS_%FT%T", &local_time);
while ((tmp = strchr(timebuf, ':'))) { *tmp = '.'; }
if (event->type == JackSessionSaveTemplate) if (event->type == JackSessionSaveTemplate)
{ {
if (save_template( timebuf )) { if (save_template( timebuf )) {

View file

@ -28,6 +28,7 @@
#include <gtkmm/spinbutton.h> #include <gtkmm/spinbutton.h>
#include <gtkmm/table.h> #include <gtkmm/table.h>
#include "gtkmm2ext/gtk_ui.h"
#include "gtkmm2ext/utils.h" #include "gtkmm2ext/utils.h"
#include "generic_midi_control_protocol.h" #include "generic_midi_control_protocol.h"
@ -147,7 +148,10 @@ GMCPGUI::GMCPGUI (GenericMidiControlProtocol& p)
threshold_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &GMCPGUI::threshold_changed)); threshold_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &GMCPGUI::threshold_changed));
label = manage (new Label (_("Threshold:"))); Gtkmm2ext::UI::instance()->set_tip (threshold_spinner,
string_compose (_("Controls how %1 behaves if the MIDI controller sends discontinuous values"), PROGRAM_NAME));
label = manage (new Label (_("Smoothing:")));
label->set_alignment (0, 0.5); label->set_alignment (0, 0.5);
table->attach (*label, 0, 1, n, n + 1); table->attach (*label, 0, 1, n, n + 1);
table->attach (threshold_spinner, 1, 2, n, n + 1); table->attach (threshold_spinner, 1, 2, n, n + 1);

View file

@ -38,6 +38,9 @@ def build(bld):
obj.use = 'libardour libardour_cp libgtkmm2ext libpbd' obj.use = 'libardour libardour_cp libgtkmm2ext libpbd'
obj.vnum = LIBARDOUR_GENERIC_MIDI_LIB_VERSION obj.vnum = LIBARDOUR_GENERIC_MIDI_LIB_VERSION
obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3', 'surfaces') obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3', 'surfaces')
obj.defines = [
'PROGRAM_NAME="' + bld.env['PROGRAM_NAME'] + '"'
]
def shutdown(): def shutdown():
autowaf.shutdown() autowaf.shutdown()

View file

@ -595,13 +595,13 @@ then
else else
echo "" echo ""
echo "!!! WARNING !!! - The version of Jack on this system is too old!" echo "!!! WARNING !!! - The version of Jack on this system is too old!"
echo "Using an old version of Jack is not recommened. Please update" echo "Using an old version of Jack is not recommended. Please update"
echo "Jack for best results." echo "Jack for best results."
echo "" echo ""
echo "System Jack version:" echo "System Jack version:"
echo " ${JACK_VER_STRING}" echo " ${JACK_VER_STRING}"
echo "" echo ""
echo "Recommened minimum versions:" echo "Recommended minimum versions:"
echo " Jack1 - 0.121.3" echo " Jack1 - 0.121.3"
echo " Jack2 - 1.9.8" echo " Jack2 - 1.9.8"
echo "" echo ""