13
0

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\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>\

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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

View File

@ -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;
}
}

View File

@ -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 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

File diff suppressed because it is too large Load Diff

View File

@ -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 ();
}

View File

@ -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>);

View File

@ -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

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_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);

View File

@ -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());
}
}
}

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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)
{

View File

@ -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 */

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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)
{

View File

@ -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.

View File

@ -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);

View File

@ -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)

View File

@ -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;
}

View File

@ -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 )) {

View File

@ -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);

View File

@ -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()

View File

@ -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 ""