Merge branch 'master' into cairocanvas
This commit is contained in:
commit
ce8731b32d
@ -185,7 +185,8 @@ static const char* translators[] = {
|
||||
\n\tRobert Schwede <schwede@ironshark.com>\
|
||||
\n\tBenjamin Scherrer <realhangman@web.de>\
|
||||
\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_("Portuguese:\n\tRui Nuno Capela <rncbc@rncbc.org>\n"),
|
||||
N_("Brazilian Portuguese:\n\tAlexander da Franca Fernandes <alexander@nautae.eti.br>\
|
||||
|
@ -27,8 +27,6 @@
|
||||
#include <cerrno>
|
||||
#include <fstream>
|
||||
|
||||
#include <boost/locale.hpp>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
@ -815,13 +813,13 @@ ARDOUR_UI::check_memory_locking ()
|
||||
"runs out of memory. \n\n"
|
||||
"You can view the memory limit with 'ulimit -l', "
|
||||
"and it is normally controlled by %2"),
|
||||
PROGRAM_NAME).c_str(),
|
||||
PROGRAM_NAME,
|
||||
#ifdef __FreeBSD__
|
||||
X_("/etc/login.conf")
|
||||
X_("/etc/login.conf")
|
||||
#else
|
||||
X_(" /etc/security/limits.conf")
|
||||
X_(" /etc/security/limits.conf")
|
||||
#endif
|
||||
);
|
||||
).c_str());
|
||||
|
||||
msg.set_default_response (RESPONSE_OK);
|
||||
|
||||
|
@ -120,9 +120,7 @@ ExportTimespanSelector::add_range_to_selection (ARDOUR::Location const * loc)
|
||||
ExportTimespanPtr span = _session->get_export_handler()->add_timespan();
|
||||
|
||||
std::string id;
|
||||
if (loc == state->session_range.get()) {
|
||||
id = "session";
|
||||
} else if (loc == state->selection_range.get()) {
|
||||
if (loc == state->selection_range.get()) {
|
||||
id = "selection";
|
||||
} else {
|
||||
id = loc->id().to_s();
|
||||
@ -367,9 +365,7 @@ ExportTimespanSelectorSingle::fill_range_list ()
|
||||
if (!state) { return; }
|
||||
|
||||
std::string id;
|
||||
if (!range_id.compare (X_("session"))) {
|
||||
id = state->session_range->id().to_s();
|
||||
} else if (!range_id.compare (X_("selection"))) {
|
||||
if (!range_id.compare (X_("selection"))) {
|
||||
id = state->selection_range->id().to_s();
|
||||
} else {
|
||||
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) {
|
||||
Location * loc = tree_it->get_value (range_cols.location);
|
||||
|
||||
if ((!id.compare ("session") && loc == state->session_range.get()) ||
|
||||
(!id.compare ("selection") && loc == state->selection_range.get()) ||
|
||||
(!id.compare (loc->id().to_s()))) {
|
||||
if ((id == "selection" && loc == state->selection_range.get()) ||
|
||||
(id == loc->id().to_s())) {
|
||||
tree_it->set_value (range_cols.selected, true);
|
||||
}
|
||||
}
|
||||
|
@ -256,6 +256,10 @@ GenericPluginUI::build ()
|
||||
continue;
|
||||
}
|
||||
|
||||
if (plugin->describe_parameter (Evoral::Parameter(PluginAutomation, 0, i)) == X_("hidden")) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ControlUI* cui;
|
||||
|
||||
boost::shared_ptr<ARDOUR::AutomationControl> c
|
||||
|
@ -1483,13 +1483,13 @@ MidiTimeAxisView::playback_channel_mode_changed ()
|
||||
{
|
||||
switch (midi_track()->get_playback_channel_mode()) {
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -1499,13 +1499,13 @@ MidiTimeAxisView::capture_channel_mode_changed ()
|
||||
{
|
||||
switch (midi_track()->get_capture_channel_mode()) {
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -148,7 +148,7 @@ msgstr "Armand Klenk"
|
||||
|
||||
#: about.cc:153
|
||||
msgid "Julien de Kozak"
|
||||
msgstr ""
|
||||
msgstr "Julien de Kozak"
|
||||
|
||||
#: about.cc:154
|
||||
msgid "Matt Krai"
|
||||
@ -269,6 +269,7 @@ msgid ""
|
||||
"\tBenjamin Scherrer <realhangman@web.de>\n"
|
||||
"\tEdgar Aichinger <edogawa@aon.at>\n"
|
||||
"\tRichard Oax <richard@pagliacciempire.de>\n"
|
||||
"\Robin Gloster <robin@loc-com.de>\n"
|
||||
msgstr ""
|
||||
"Deutsch:\n"
|
||||
"\tKarsten Petersen <kapet@kapet.de>\n"
|
||||
@ -277,6 +278,7 @@ msgstr ""
|
||||
"\tBenjamin Scherrer <realhangman@web.de>\n"
|
||||
"\tEdgar Aichinger <edogawa@aon.at>\n"
|
||||
"\tRichard Oax <richard@pagliacciempire.de>\n"
|
||||
"\Robin Gloster <robin@loc-com.de>\n"
|
||||
|
||||
#: about.cc:189
|
||||
msgid ""
|
||||
@ -380,7 +382,7 @@ msgstr "Copyright (C) 1999-2013 Paul Davis\n"
|
||||
|
||||
#: about.cc:583
|
||||
msgid "http://ardour.org/"
|
||||
msgstr "http://ardour.org"
|
||||
msgstr "http://ardour.org/"
|
||||
|
||||
#: about.cc:584
|
||||
msgid ""
|
||||
@ -420,7 +422,7 @@ msgstr "Kanaleinstellungen:"
|
||||
|
||||
#: add_route_dialog.cc:57
|
||||
msgid "Track mode:"
|
||||
msgstr "SpurModus"
|
||||
msgstr "Spurmodus"
|
||||
|
||||
#: add_route_dialog.cc:58
|
||||
msgid "Instrument:"
|
||||
@ -440,7 +442,7 @@ msgstr "Audio+MIDI-Spuren"
|
||||
|
||||
#: add_route_dialog.cc:82
|
||||
msgid "Busses"
|
||||
msgstr "Audio-Busse"
|
||||
msgstr "Audiobusse"
|
||||
|
||||
#: add_route_dialog.cc:104
|
||||
msgid "Add:"
|
||||
@ -495,7 +497,7 @@ msgid ""
|
||||
"track instead."
|
||||
msgstr ""
|
||||
"Audio+MIDI Spuren sind <b>NUR</b> für den Gebrauch mit Plugins gedacht, die "
|
||||
"sowohl Audio als auch MIDI Eingangsdaten nützen\n"
|
||||
"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"
|
||||
@ -563,7 +565,7 @@ msgstr "-keine-"
|
||||
|
||||
#: ambiguous_file_dialog.cc:30
|
||||
msgid "Ambiguous File"
|
||||
msgstr "Mehrdeutige Datei"
|
||||
msgstr "Mehrmals gefundene Datei"
|
||||
|
||||
#: ambiguous_file_dialog.cc:35
|
||||
msgid ""
|
||||
@ -621,7 +623,7 @@ msgstr "Normalisieren"
|
||||
|
||||
#: analysis_window.cc:59
|
||||
msgid "FFT analysis window"
|
||||
msgstr "FFT - Analysefenster"
|
||||
msgstr "FFT-Analysefenster"
|
||||
|
||||
#: analysis_window.cc:60 editor.cc:1880
|
||||
msgid "Spectral Analysis"
|
||||
@ -653,11 +655,11 @@ msgstr "Vorhören"
|
||||
|
||||
#: ardour_ui.cc:169
|
||||
msgid "solo"
|
||||
msgstr "solo"
|
||||
msgstr "Solo"
|
||||
|
||||
#: ardour_ui.cc:170
|
||||
msgid "feedback"
|
||||
msgstr "feedback"
|
||||
msgstr "Feedback"
|
||||
|
||||
#: ardour_ui.cc:172
|
||||
msgid "Errors"
|
||||
@ -684,15 +686,15 @@ msgid ""
|
||||
"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 zu schnell der "
|
||||
"Speicher ausgeht.\n"
|
||||
"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:800
|
||||
msgid "Do not show this window again"
|
||||
msgstr "Diese Meldung nicht wieder anzeigen"
|
||||
msgstr "Diese Meldung nicht erneut anzeigen"
|
||||
|
||||
#: ardour_ui.cc:847
|
||||
msgid "Don't quit"
|
||||
@ -700,7 +702,7 @@ msgstr "Abbrechen"
|
||||
|
||||
#: ardour_ui.cc:848
|
||||
msgid "Just quit"
|
||||
msgstr "Nur beenden"
|
||||
msgstr "Beenden ohne zu speichern"
|
||||
|
||||
#: ardour_ui.cc:849
|
||||
msgid "Save and quit"
|
||||
@ -874,7 +876,7 @@ msgid ""
|
||||
"You cannot open or close sessions in this condition"
|
||||
msgstr ""
|
||||
"%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
|
||||
msgid "Open Session"
|
||||
@ -883,7 +885,7 @@ msgstr "Projekt öffnen"
|
||||
#: ardour_ui.cc:1473 session_import_dialog.cc:169
|
||||
#: session_metadata_dialog.cc:729 startup.cc:1049
|
||||
msgid "%1 sessions"
|
||||
msgstr "%1projekte"
|
||||
msgstr "%1 Projekte"
|
||||
|
||||
#: ardour_ui.cc:1510
|
||||
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"
|
||||
"You can do this with the \"Add Track or Bus\" option in the Session menu."
|
||||
msgstr ""
|
||||
"Bitte fügen Sie mindestens eine oder mehrere Spur hinzu,\n"
|
||||
"bevor Sie aufnehmen. Die geht über \"Spur/Bus hinzufügen\"\n"
|
||||
"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:2084
|
||||
@ -984,11 +986,11 @@ msgstr "Bestätige das Überschreiben des Schnappschusses"
|
||||
#: ardour_ui.cc:2230
|
||||
msgid "A snapshot already exists with that name. Do you want to overwrite it?"
|
||||
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
|
||||
msgid "Overwrite"
|
||||
msgstr "Überschreibe"
|
||||
msgstr "Überschreiben"
|
||||
|
||||
#: ardour_ui.cc:2267
|
||||
msgid "Rename Session"
|
||||
@ -1011,7 +1013,7 @@ 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 "
|
||||
"nochmal versuchen."
|
||||
"versuchen Sie einen anderen Namen."
|
||||
|
||||
#: ardour_ui.cc:2299
|
||||
msgid ""
|
||||
@ -1031,7 +1033,7 @@ msgstr "Name für Vorlage"
|
||||
|
||||
#: ardour_ui.cc:2416
|
||||
msgid "-template"
|
||||
msgstr "Vorlage"
|
||||
msgstr "-Vorlage"
|
||||
|
||||
#: ardour_ui.cc:2454
|
||||
msgid ""
|
||||
@ -1039,7 +1041,7 @@ msgid ""
|
||||
"%1\n"
|
||||
"already exists. Do you want to open it?"
|
||||
msgstr ""
|
||||
"Das Projekt\n"
|
||||
"Dieses Projekt\n"
|
||||
"%1\n"
|
||||
"existiert bereits. Wollen Sie sie öffnen?"
|
||||
|
||||
@ -1049,7 +1051,7 @@ msgstr "Vorhandenes Projekt öffnen"
|
||||
|
||||
#: ardour_ui.cc:2702
|
||||
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
|
||||
msgid "Please wait while %1 loads your session"
|
||||
@ -1146,7 +1148,7 @@ msgid_plural ""
|
||||
"\n"
|
||||
"will release an additional %3 %4bytes of disk space.\n"
|
||||
msgstr[0] ""
|
||||
"Die folgende Datei war unbenutzt\n"
|
||||
"Die folgende Datei wurde nicht benutzt\n"
|
||||
"und wurde verschoben nach: %2\n"
|
||||
"\n"
|
||||
"Nach einem Neustart von %5 kann über\n"
|
||||
@ -1195,44 +1197,48 @@ msgstr "gelöschte Datei"
|
||||
#: ardour_ui.cc:3346
|
||||
msgid ""
|
||||
"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
|
||||
msgid "Stop Video-Server"
|
||||
msgstr ""
|
||||
msgstr "Video-Server anhalten"
|
||||
|
||||
#: ardour_ui.cc:3351
|
||||
msgid "Do you really want to stop the Video Server?"
|
||||
msgstr ""
|
||||
msgstr "Wollen Sie den Video-Server wirklich anhalten?"
|
||||
|
||||
#: ardour_ui.cc:3354
|
||||
#, fuzzy
|
||||
msgid "Yes, Stop It"
|
||||
msgstr "Ja, entfernen."
|
||||
msgstr "Ja, anhalten."
|
||||
|
||||
#: ardour_ui.cc:3380
|
||||
msgid "The Video Server is already started."
|
||||
msgstr ""
|
||||
msgstr "Der Video-Server läuft bereits"
|
||||
|
||||
#: ardour_ui.cc:3382
|
||||
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:3390 ardour_ui.cc:3461
|
||||
msgid ""
|
||||
"Could not connect to the Video Server. Start it or configure its access URL "
|
||||
"in Edit -> Preferences."
|
||||
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
|
||||
msgid "Specified docroot is not an existing directory."
|
||||
msgstr ""
|
||||
msgstr "Das eingestellte Dokumentenverzeichnis existiert nicht."
|
||||
|
||||
#: ardour_ui.cc:3419
|
||||
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
|
||||
msgid "could not open %1"
|
||||
@ -1240,7 +1246,7 @@ msgstr "Konnte \"%s\" nicht öffnen."
|
||||
|
||||
#: ardour_ui.cc:3489
|
||||
msgid "no video-file selected"
|
||||
msgstr ""
|
||||
msgstr "Es wurde keine Video-Datei ausgewählt."
|
||||
|
||||
#: ardour_ui.cc:3650
|
||||
msgid "Recording was stopped because your system could not keep up."
|
||||
@ -1277,7 +1283,7 @@ msgstr ""
|
||||
|
||||
#: ardour_ui.cc:3738
|
||||
msgid "Crash Recovery"
|
||||
msgstr "Wiederherstellung"
|
||||
msgstr "Absturz-Wiederherstellung"
|
||||
|
||||
#: ardour_ui.cc:3739
|
||||
msgid ""
|
||||
@ -1338,11 +1344,11 @@ msgstr "Konnte nicht erneut zu JACK verbinden"
|
||||
|
||||
#: ardour_ui.cc:3902
|
||||
msgid "Check the website for more..."
|
||||
msgstr ""
|
||||
msgstr "Informieren Sie sich auf der Webseite weiter..."
|
||||
|
||||
#: ardour_ui.cc:3915
|
||||
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
|
||||
msgid ""
|
||||
@ -1453,7 +1459,6 @@ msgid "When active, there is a feedback loop."
|
||||
msgstr "Wenn aktiv, gibt es eine Rückkopplungsschleife."
|
||||
|
||||
#: ardour_ui2.cc:142
|
||||
#, fuzzy
|
||||
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"
|
||||
@ -1470,7 +1475,6 @@ msgstr ""
|
||||
"Einzelheiten."
|
||||
|
||||
#: ardour_ui2.cc:143
|
||||
#, fuzzy
|
||||
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"
|
||||
@ -1841,7 +1845,7 @@ msgstr "Start/Stopp"
|
||||
|
||||
#: ardour_ui_ed.cc:308
|
||||
msgid "Stop and Forget Capture"
|
||||
msgstr "Stop + Aufnahme verwerfen"
|
||||
msgstr "Stopp + Aufnahme verwerfen"
|
||||
|
||||
#: ardour_ui_ed.cc:318
|
||||
msgid "Transition To Roll"
|
||||
@ -1857,7 +1861,7 @@ msgstr "Schleife wiedergeben"
|
||||
|
||||
#: ardour_ui_ed.cc:329
|
||||
msgid "Play Selected Range"
|
||||
msgstr "Gewählten Bereich abspielen"
|
||||
msgstr "Gewählten Bereich wiedergeben"
|
||||
|
||||
#: ardour_ui_ed.cc:332
|
||||
msgid "Play Selection w/Preroll"
|
||||
@ -2610,7 +2614,7 @@ msgstr "Arbeitspunkt"
|
||||
|
||||
#: editor.cc:200
|
||||
msgid "Mushy"
|
||||
msgstr "Breiig/Matschig"
|
||||
msgstr "Matschig"
|
||||
|
||||
#: editor.cc:201
|
||||
msgid "Smooth"
|
||||
@ -2658,7 +2662,7 @@ msgstr "CD-Marker"
|
||||
|
||||
#: editor.cc:250
|
||||
msgid "Video Timeline"
|
||||
msgstr ""
|
||||
msgstr "Video Zeitleiste"
|
||||
|
||||
#: editor.cc:266
|
||||
msgid "mode"
|
||||
@ -3105,7 +3109,7 @@ msgstr "Wiedergabeliste löschen"
|
||||
|
||||
#: editor.cc:3902
|
||||
msgid "Keep Playlist"
|
||||
msgstr "Wiedergabeliste beibehalten"
|
||||
msgstr "Wiedergabeliste behalten"
|
||||
|
||||
#: editor.cc:3903 editor_audio_import.cc:579 editor_ops.cc:5860
|
||||
#: processor_box.cc:1953 processor_box.cc:1978
|
||||
|
4657
gtk2_ardour/po/fr.po
4657
gtk2_ardour/po/fr.po
File diff suppressed because it is too large
Load Diff
@ -2040,7 +2040,7 @@ ProcessorBox::one_processor_can_be_edited ()
|
||||
}
|
||||
|
||||
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<InternalSend> internal_send;
|
||||
@ -2119,8 +2119,7 @@ ProcessorBox::get_editor_window (boost::shared_ptr<Processor> processor)
|
||||
Window* w = get_processor_ui (plugin_insert);
|
||||
|
||||
if (w == 0) {
|
||||
|
||||
plugin_ui = new PluginUIWindow (plugin_insert, false, Config->get_use_plugin_own_gui());
|
||||
plugin_ui = new PluginUIWindow (plugin_insert, false, use_custom);
|
||||
plugin_ui->set_title (generate_processor_title (plugin_insert));
|
||||
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);
|
||||
|
||||
if (proxy) {
|
||||
proxy->set_custom_ui_mode (Config->get_use_plugin_own_gui ());
|
||||
proxy->toggle ();
|
||||
}
|
||||
}
|
||||
@ -2452,6 +2452,7 @@ ProcessorBox::generic_edit_processor (boost::shared_ptr<Processor> processor)
|
||||
ProcessorWindowProxy* proxy = find_window_proxy (processor);
|
||||
|
||||
if (proxy) {
|
||||
proxy->set_custom_ui_mode (false);
|
||||
proxy->toggle ();
|
||||
}
|
||||
}
|
||||
@ -2629,6 +2630,7 @@ ProcessorWindowProxy::ProcessorWindowProxy (string const & name, ProcessorBox* b
|
||||
, _processor_box (box)
|
||||
, _processor (processor)
|
||||
, is_custom (false)
|
||||
, want_custom (false)
|
||||
{
|
||||
|
||||
}
|
||||
@ -2640,6 +2642,38 @@ ProcessorWindowProxy::session_handle()
|
||||
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*
|
||||
ProcessorWindowProxy::get (bool create)
|
||||
{
|
||||
@ -2648,8 +2682,7 @@ ProcessorWindowProxy::get (bool create)
|
||||
if (!p) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (_window && (is_custom != Config->get_use_plugin_own_gui ())) {
|
||||
if (_window && (is_custom != want_custom)) {
|
||||
/* drop existing window - wrong type */
|
||||
drop_window ();
|
||||
}
|
||||
@ -2659,8 +2692,8 @@ ProcessorWindowProxy::get (bool create)
|
||||
return 0;
|
||||
}
|
||||
|
||||
_window = _processor_box->get_editor_window (p);
|
||||
is_custom = Config->get_use_plugin_own_gui();
|
||||
is_custom = want_custom;
|
||||
_window = _processor_box->get_editor_window (p, is_custom);
|
||||
|
||||
if (_window) {
|
||||
setup ();
|
||||
@ -2673,10 +2706,11 @@ ProcessorWindowProxy::get (bool create)
|
||||
void
|
||||
ProcessorWindowProxy::toggle ()
|
||||
{
|
||||
if (_window && (is_custom != Config->get_use_plugin_own_gui ())) {
|
||||
if (_window && (is_custom != want_custom)) {
|
||||
/* drop existing window - wrong type */
|
||||
drop_window ();
|
||||
}
|
||||
is_custom = want_custom;
|
||||
|
||||
WM::ProxyBase::toggle ();
|
||||
}
|
||||
|
@ -88,13 +88,18 @@ class ProcessorWindowProxy : public WM::ProxyBase
|
||||
|
||||
ARDOUR::SessionHandlePtr* session_handle();
|
||||
void toggle();
|
||||
void set_custom_ui_mode(bool use_custom) { want_custom = use_custom; }
|
||||
|
||||
bool marked;
|
||||
|
||||
void set_state (const XMLNode&);
|
||||
XMLNode& get_state () const;
|
||||
|
||||
private:
|
||||
ProcessorBox* _processor_box;
|
||||
boost::weak_ptr<ARDOUR::Processor> _processor;
|
||||
bool is_custom;
|
||||
bool want_custom;
|
||||
};
|
||||
|
||||
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;
|
||||
|
||||
/* 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>);
|
||||
|
||||
void edit_processor (boost::shared_ptr<ARDOUR::Processor>);
|
||||
|
@ -653,7 +653,7 @@ public:
|
||||
{
|
||||
_store = ListStore::create (_model);
|
||||
_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_expand (true);
|
||||
_view.append_column_editable (_("Enabled"), _model.enabled);
|
||||
@ -1813,9 +1813,9 @@ RCOptionEditor::RCOptionEditor ()
|
||||
|
||||
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> (
|
||||
"remote-model",
|
||||
@ -1828,14 +1828,14 @@ RCOptionEditor::RCOptionEditor ()
|
||||
rm->add (MixerOrdered, _("follows order of mixer"));
|
||||
rm->add (EditorOrdered, _("follows order of editor"));
|
||||
|
||||
add_option (_("User interaction"), rm);
|
||||
add_option (_("Control Surfaces"), rm);
|
||||
|
||||
/* VIDEO Timeline */
|
||||
add_option (_("Video"), new VideoTimelineOptions (_rc_config));
|
||||
|
||||
/* INTERFACE */
|
||||
|
||||
add_option (S_("GUI"),
|
||||
add_option (S_("Preferences|GUI"),
|
||||
new BoolOption (
|
||||
"widget-prelight",
|
||||
_("Graphically indicate mouse pointer hovering over various widgets"),
|
||||
@ -1843,7 +1843,7 @@ RCOptionEditor::RCOptionEditor ()
|
||||
sigc::mem_fun (*_rc_config, &RCConfiguration::set_widget_prelight)
|
||||
));
|
||||
|
||||
add_option (S_("GUI"),
|
||||
add_option (S_("Preferences|GUI"),
|
||||
new BoolOption (
|
||||
"use-tooltips",
|
||||
_("Show tooltips if mouse hovers over a control"),
|
||||
@ -1853,9 +1853,9 @@ RCOptionEditor::RCOptionEditor ()
|
||||
|
||||
#ifndef GTKOSX
|
||||
/* 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
|
||||
add_option (S_("GUI"),
|
||||
add_option (S_("Preferences|GUI"),
|
||||
new BoolOption (
|
||||
"use-own-plugin-gui",
|
||||
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"));
|
||||
|
||||
add_option (
|
||||
S_("GUI"),
|
||||
S_("Preferences|GUI"),
|
||||
new VisibilityOption (
|
||||
_("Mixer Strip"),
|
||||
&_mixer_strip_visibility,
|
||||
@ -1890,7 +1890,7 @@ RCOptionEditor::RCOptionEditor ()
|
||||
)
|
||||
);
|
||||
|
||||
add_option (S_("GUI"),
|
||||
add_option (S_("Preferences|GUI"),
|
||||
new BoolOption (
|
||||
"default-narrow_ms",
|
||||
_("Use narrow strips in the mixer by default"),
|
||||
@ -1898,7 +1898,7 @@ RCOptionEditor::RCOptionEditor ()
|
||||
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> (
|
||||
"meter-hold",
|
||||
@ -1912,7 +1912,7 @@ RCOptionEditor::RCOptionEditor ()
|
||||
mht->add (MeterHoldMedium, _("medium"));
|
||||
mht->add (MeterHoldLong, _("long"));
|
||||
|
||||
add_option (S_("GUI"), mht);
|
||||
add_option (S_("Preferences|GUI"), mht);
|
||||
|
||||
ComboOption<float>* mfo = new ComboOption<float> (
|
||||
"meter-falloff",
|
||||
@ -1929,7 +1929,7 @@ RCOptionEditor::RCOptionEditor ()
|
||||
mfo->add (METER_FALLOFF_FASTER, _("faster"));
|
||||
mfo->add (METER_FALLOFF_FASTEST, _("fastest"));
|
||||
|
||||
add_option (S_("GUI"), mfo);
|
||||
add_option (S_("Preferences|GUI"), mfo);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -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_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;
|
||||
beat_duration = _editor.get_grid_type_as_beats (success, step_edit_insert_position);
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "ardour_dialog.h"
|
||||
#include "ardour_window.h"
|
||||
#include "window_manager.h"
|
||||
#include "processor_box.h"
|
||||
|
||||
#include "i18n.h"
|
||||
|
||||
@ -106,7 +107,12 @@ Manager::add_state (XMLNode& root) const
|
||||
if (dynamic_cast<ProxyTemporary*> (*i)) {
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -120,8 +120,14 @@ public:
|
||||
*/
|
||||
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 */
|
||||
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
|
||||
|
||||
#if defined VST_SUPPORT || defined LXVST_SUPPORT
|
||||
|
@ -122,16 +122,13 @@ class ExportProfileManager
|
||||
TimespanListPtr timespans;
|
||||
TimeFormat time_format;
|
||||
|
||||
boost::shared_ptr<Location> session_range;
|
||||
boost::shared_ptr<Location> selection_range;
|
||||
boost::shared_ptr<LocationList> ranges;
|
||||
|
||||
TimespanState (boost::shared_ptr<Location> session_range,
|
||||
boost::shared_ptr<Location> selection_range,
|
||||
TimespanState (boost::shared_ptr<Location> selection_range,
|
||||
boost::shared_ptr<LocationList> ranges)
|
||||
: timespans (new TimespanList ())
|
||||
, time_format (Timecode)
|
||||
, session_range (session_range)
|
||||
, selection_range (selection_range)
|
||||
, ranges (ranges)
|
||||
{}
|
||||
@ -157,7 +154,6 @@ class ExportProfileManager
|
||||
|
||||
void update_ranges ();
|
||||
|
||||
boost::shared_ptr<Location> session_range;
|
||||
boost::shared_ptr<Location> selection_range;
|
||||
boost::shared_ptr<LocationList> ranges;
|
||||
|
||||
|
@ -202,6 +202,7 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
|
||||
typedef unsigned PortFlags;
|
||||
|
||||
std::vector<PortFlags> _port_flags;
|
||||
std::vector<size_t> _port_minimumSize;
|
||||
std::map<std::string,uint32_t> _port_indices;
|
||||
|
||||
/// Message send to/from UI via ports
|
||||
|
@ -252,6 +252,25 @@ BufferSet::get(DataType type, size_t i) const
|
||||
|
||||
#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*
|
||||
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;
|
||||
}
|
||||
|
||||
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
|
||||
BufferSet::flush_lv2_midi(bool input, size_t i)
|
||||
{
|
||||
|
@ -61,7 +61,6 @@ ExportProfileManager::ExportProfileManager (Session & s, ExportType type)
|
||||
, handler (s.get_export_handler())
|
||||
, session (s)
|
||||
|
||||
, session_range (new Location (s))
|
||||
, ranges (new LocationList ())
|
||||
, single_range_mode (false)
|
||||
|
||||
@ -385,13 +384,16 @@ ExportProfileManager::init_timespans (XMLNodeList nodes)
|
||||
}
|
||||
|
||||
if (timespans.empty()) {
|
||||
TimespanStatePtr state (new TimespanState (session_range, selection_range, ranges));
|
||||
TimespanStatePtr state (new TimespanState (selection_range, ranges));
|
||||
timespans.push_back (state);
|
||||
|
||||
// Add session as default selection
|
||||
Location * session_range = session.locations()->session_range_location();
|
||||
if (!session_range) { return false; }
|
||||
|
||||
ExportTimespanPtr timespan = handler->add_timespan();
|
||||
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());
|
||||
state->timespans->push_back (timespan);
|
||||
return false;
|
||||
@ -403,7 +405,7 @@ ExportProfileManager::init_timespans (XMLNodeList nodes)
|
||||
ExportProfileManager::TimespanStatePtr
|
||||
ExportProfileManager::deserialize_timespan (XMLNode & root)
|
||||
{
|
||||
TimespanStatePtr state (new TimespanState (session_range, selection_range, ranges));
|
||||
TimespanStatePtr state (new TimespanState (selection_range, ranges));
|
||||
XMLProperty const * prop;
|
||||
|
||||
XMLNodeList spans = root.children ("Range");
|
||||
@ -413,23 +415,32 @@ ExportProfileManager::deserialize_timespan (XMLNode & root)
|
||||
if (!prop) { continue; }
|
||||
string id = prop->value();
|
||||
|
||||
Location * location = 0;
|
||||
for (LocationList::iterator it = ranges->begin(); it != ranges->end(); ++it) {
|
||||
if ((!id.compare ("session") && *it == session_range.get()) ||
|
||||
(!id.compare ("selection") && *it == selection_range.get()) ||
|
||||
(!id.compare ((*it)->id().to_s()))) {
|
||||
ExportTimespanPtr timespan = handler->add_timespan();
|
||||
timespan->set_name ((*it)->name());
|
||||
timespan->set_range_id (id);
|
||||
timespan->set_range ((*it)->start(), (*it)->end());
|
||||
state->timespans->push_back (timespan);
|
||||
if ((id == "selection" && *it == selection_range.get()) ||
|
||||
(id == (*it)->id().to_s())) {
|
||||
location = *it;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
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"))) {
|
||||
state->time_format = (TimeFormat) string_2_enum (prop->value(), TimeFormat);
|
||||
}
|
||||
|
||||
if (state->timespans->empty()) {
|
||||
return TimespanStatePtr();
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
@ -440,7 +451,6 @@ ExportProfileManager::serialize_timespan (TimespanStatePtr state)
|
||||
XMLNode * span;
|
||||
|
||||
update_ranges ();
|
||||
|
||||
for (TimespanList::iterator it = state->timespans->begin(); it != state->timespans->end(); ++it) {
|
||||
if ((span = root.add_child ("Range"))) {
|
||||
span->add_property ("id", (*it)->range_id());
|
||||
@ -463,9 +473,10 @@ ExportProfileManager::update_ranges () {
|
||||
|
||||
/* Session */
|
||||
|
||||
session_range->set_name (_("Session"));
|
||||
session_range->set (session.current_start_frame(), session.current_end_frame());
|
||||
ranges->push_back (session_range.get());
|
||||
Location * session_range = session.locations()->session_range_location();
|
||||
if (session_range) {
|
||||
ranges->push_back (session_range);
|
||||
}
|
||||
|
||||
/* Selection */
|
||||
|
||||
|
@ -169,7 +169,7 @@ vstfx_infofile_path (char* dllpath, int personal)
|
||||
}
|
||||
|
||||
} else {
|
||||
dir = Glib::path_get_dirname (dllpath);
|
||||
dir = Glib::path_get_dirname (std::string(dllpath));
|
||||
}
|
||||
|
||||
stringstream s;
|
||||
@ -214,6 +214,7 @@ vstfx_infofile_for_read (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);
|
||||
@ -222,14 +223,16 @@ vstfx_infofile_for_read (char* dllpath)
|
||||
if (sys_info) {
|
||||
if (own_statbuf.st_mtime <= sys_statbuf.st_mtime) {
|
||||
/* system info file is newer, use it */
|
||||
return g_fopen (sys_info, "rb");
|
||||
rv = g_fopen (sys_info, "rb");
|
||||
}
|
||||
} 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 *
|
||||
@ -416,6 +419,8 @@ vstfx_free_info (VSTInfo *info)
|
||||
free (info->name);
|
||||
free (info->creator);
|
||||
free (info->Category);
|
||||
free (info->ParamNames);
|
||||
free (info->ParamLabels);
|
||||
free (info);
|
||||
}
|
||||
|
||||
|
@ -379,6 +379,7 @@ void vstfx_close (VSTState* vstfx)
|
||||
dlclose(vstfx->handle->dll); //dlclose keeps its own reference count
|
||||
vstfx->handle->dll = 0;
|
||||
}
|
||||
free(vstfx);
|
||||
}
|
||||
|
||||
|
||||
|
@ -115,6 +115,12 @@ lv2_evbuf_get_size(LV2_Evbuf* evbuf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
lv2_evbuf_get_capacity(LV2_Evbuf* evbuf)
|
||||
{
|
||||
return evbuf->capacity;
|
||||
}
|
||||
|
||||
void*
|
||||
lv2_evbuf_get_buffer(LV2_Evbuf* evbuf)
|
||||
{
|
||||
|
@ -92,6 +92,12 @@ lv2_evbuf_reset(LV2_Evbuf* evbuf, bool input);
|
||||
uint32_t
|
||||
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.
|
||||
The format of the buffer returned depends on the buffer type.
|
||||
|
@ -61,6 +61,7 @@
|
||||
#include "lv2/lv2plug.in/ns/ext/state/state.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/resize-port/resize-port.h"
|
||||
#include "lv2/lv2plug.in/ns/extensions/ui/ui.h"
|
||||
#ifdef HAVE_NEW_LV2
|
||||
#include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h"
|
||||
@ -119,6 +120,7 @@ public:
|
||||
LilvNode* atom_supports;
|
||||
LilvNode* ev_EventPort;
|
||||
LilvNode* ext_logarithmic;
|
||||
LilvNode* ext_notOnGUI;
|
||||
LilvNode* lv2_AudioPort;
|
||||
LilvNode* lv2_ControlPort;
|
||||
LilvNode* lv2_InputPort;
|
||||
@ -126,10 +128,12 @@ public:
|
||||
LilvNode* lv2_enumeration;
|
||||
LilvNode* lv2_inPlaceBroken;
|
||||
LilvNode* lv2_integer;
|
||||
LilvNode* lv2_reportsLatency;
|
||||
LilvNode* lv2_sampleRate;
|
||||
LilvNode* lv2_toggled;
|
||||
LilvNode* midi_MidiEvent;
|
||||
LilvNode* rdfs_comment;
|
||||
LilvNode* rsz_minimumSize;
|
||||
LilvNode* time_Position;
|
||||
LilvNode* ui_GtkUI;
|
||||
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) {
|
||||
const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i);
|
||||
PortFlags flags = 0;
|
||||
size_t minimumSize = 0;
|
||||
|
||||
if (lilv_port_is_a(_impl->plugin, port, _world.lv2_OutputPort)) {
|
||||
flags |= PORT_OUTPUT;
|
||||
@ -440,6 +445,12 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
|
||||
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(atom_supports);
|
||||
} else {
|
||||
@ -450,6 +461,7 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
|
||||
}
|
||||
|
||||
_port_flags.push_back(flags);
|
||||
_port_minimumSize.push_back(minimumSize);
|
||||
}
|
||||
|
||||
_control_data = new float[num_ports];
|
||||
@ -1319,6 +1331,16 @@ string
|
||||
LV2Plugin::describe_parameter(Evoral::Parameter which)
|
||||
{
|
||||
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,
|
||||
lilv_plugin_get_port_by_index(_impl->plugin, which.id()));
|
||||
string ret(lilv_node_as_string(name));
|
||||
@ -1397,6 +1419,7 @@ LV2Plugin::allocate_atom_event_buffers()
|
||||
*/
|
||||
int count_atom_out = 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) {
|
||||
const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
|
||||
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)) {
|
||||
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(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));
|
||||
_atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
|
||||
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);
|
||||
}
|
||||
_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);
|
||||
}
|
||||
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(
|
||||
(flags & PORT_INPUT), index, (flags & PORT_EVENT));
|
||||
}
|
||||
@ -1640,8 +1675,28 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
|
||||
PortFlags flags = _port_flags[port_index];
|
||||
bool valid = false;
|
||||
|
||||
// Flush MIDI (write back to Ardour MIDI buffers)
|
||||
if ((flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
|
||||
/* TODO ask drobilla about comment
|
||||
* "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(
|
||||
DataType::MIDI, midi_out_index++, &valid);
|
||||
if (valid) {
|
||||
@ -1836,17 +1891,20 @@ LV2World::LV2World()
|
||||
atom_eventTransfer = lilv_new_uri(world, LV2_ATOM__eventTransfer);
|
||||
ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT);
|
||||
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_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
|
||||
lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT);
|
||||
lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
|
||||
lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
|
||||
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_toggled = lilv_new_uri(world, LV2_CORE__toggled);
|
||||
lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration);
|
||||
midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
|
||||
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);
|
||||
ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
|
||||
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_GtkUI);
|
||||
lilv_node_free(time_Position);
|
||||
lilv_node_free(rsz_minimumSize);
|
||||
lilv_node_free(rdfs_comment);
|
||||
lilv_node_free(midi_MidiEvent);
|
||||
lilv_node_free(lv2_enumeration);
|
||||
lilv_node_free(lv2_toggled);
|
||||
lilv_node_free(lv2_sampleRate);
|
||||
lilv_node_free(lv2_reportsLatency);
|
||||
lilv_node_free(lv2_integer);
|
||||
lilv_node_free(lv2_inPlaceBroken);
|
||||
lilv_node_free(lv2_OutputPort);
|
||||
lilv_node_free(lv2_InputPort);
|
||||
lilv_node_free(lv2_ControlPort);
|
||||
lilv_node_free(lv2_AudioPort);
|
||||
lilv_node_free(ext_notOnGUI);
|
||||
lilv_node_free(ext_logarithmic);
|
||||
lilv_node_free(ev_EventPort);
|
||||
lilv_node_free(atom_supports);
|
||||
lilv_node_free(atom_eventTransfer);
|
||||
lilv_node_free(atom_bufferType);
|
||||
lilv_node_free(atom_Sequence);
|
||||
|
@ -140,6 +140,7 @@ Session::Session (AudioEngine &eng,
|
||||
, _butler (new Butler (*this))
|
||||
, _post_transport_work (0)
|
||||
, _send_timecode_update (false)
|
||||
, ltc_enc_buf(0)
|
||||
, _all_route_group (new RouteGroup (*this, "all"))
|
||||
, routes (new RouteList)
|
||||
, _total_free_4k_blocks (0)
|
||||
|
@ -93,7 +93,8 @@ void
|
||||
Session::ltc_tx_cleanup()
|
||||
{
|
||||
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 = NULL;
|
||||
}
|
||||
|
@ -694,7 +694,7 @@ Session::remove_state (string snapshot_name)
|
||||
void
|
||||
Session::jack_session_event (jack_session_event_t * event)
|
||||
{
|
||||
char timebuf[128];
|
||||
char timebuf[128], *tmp;
|
||||
time_t n;
|
||||
struct tm local_time;
|
||||
|
||||
@ -702,6 +702,8 @@ Session::jack_session_event (jack_session_event_t * event)
|
||||
localtime_r (&n, &local_time);
|
||||
strftime (timebuf, sizeof(timebuf), "JS_%FT%T", &local_time);
|
||||
|
||||
while ((tmp = strchr(timebuf, ':'))) { *tmp = '.'; }
|
||||
|
||||
if (event->type == JackSessionSaveTemplate)
|
||||
{
|
||||
if (save_template( timebuf )) {
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <gtkmm/spinbutton.h>
|
||||
#include <gtkmm/table.h>
|
||||
|
||||
#include "gtkmm2ext/gtk_ui.h"
|
||||
#include "gtkmm2ext/utils.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));
|
||||
|
||||
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);
|
||||
table->attach (*label, 0, 1, n, n + 1);
|
||||
table->attach (threshold_spinner, 1, 2, n, n + 1);
|
||||
|
@ -38,6 +38,9 @@ def build(bld):
|
||||
obj.use = 'libardour libardour_cp libgtkmm2ext libpbd'
|
||||
obj.vnum = LIBARDOUR_GENERIC_MIDI_LIB_VERSION
|
||||
obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3', 'surfaces')
|
||||
obj.defines = [
|
||||
'PROGRAM_NAME="' + bld.env['PROGRAM_NAME'] + '"'
|
||||
]
|
||||
|
||||
def shutdown():
|
||||
autowaf.shutdown()
|
||||
|
@ -595,13 +595,13 @@ then
|
||||
else
|
||||
echo ""
|
||||
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 ""
|
||||
echo "System Jack version:"
|
||||
echo " ${JACK_VER_STRING}"
|
||||
echo ""
|
||||
echo "Recommened minimum versions:"
|
||||
echo "Recommended minimum versions:"
|
||||
echo " Jack1 - 0.121.3"
|
||||
echo " Jack2 - 1.9.8"
|
||||
echo ""
|
||||
|
Loading…
Reference in New Issue
Block a user