Merge branch 'master' of git@git.ardour.org:ardour/ardour

This commit is contained in:
Paul Davis
2013-06-09 13:13:53 -04:00
43 changed files with 3300 additions and 4728 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>\
@@ -590,6 +591,11 @@ About::About ()
get_action_area()->add (*config_button);
get_action_area()->reorder_child (*config_button, 0);
config_button->signal_clicked().connect (mem_fun (*this, &About::show_config_info));
Gtk::Button *btn = static_cast<Gtk::Button*>(get_widget_for_response(Gtk::RESPONSE_CANCEL));
if (btn) {
btn->signal_clicked().connect(sigc::mem_fun(static_cast<Gtk::Window*>(this), &Gtk::Window::hide));
}
}
About::~About ()

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);
@@ -3425,9 +3423,23 @@ ARDOUR_UI::start_video_server (Gtk::Window* float_window, bool popup_msg)
Config->set_video_advanced_setup(true);
}
if (video_server_process) {
delete video_server_process;
}
video_server_process = new SystemExec(icsd_exec, argp);
video_server_process->start();
sleep(1);
if (video_server_process->start()) {
warning << _("Cannot launch the video-server") << endmsg;
continue;
}
int timeout = 120; // 6 sec
while (!ARDOUR_UI::instance()->video_timeline->check_server()) {
usleep (50000);
if (--timeout <= 0 || !video_server_process->is_running()) break;
}
if (timeout <= 0) {
warning << _("Video-server was started but does not respond to requests...") << endmsg;
}
}
return true;
}

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

@@ -25,6 +25,7 @@
#include "ardour/dB.h"
#include "ardour/utils.h"
#include <pangomm.h>
#include <gtkmm/style.h>
#include <gdkmm/color.h>
#include <gtkmm2ext/utils.h>
@@ -236,7 +237,7 @@ GainMeterBase::setup_gain_adjustment ()
ignore_toggle = true;
if (_amp->output_streams().n_midi() == 0) {
if (_amp->output_streams().n_midi() <= _amp->output_streams().n_audio()) {
_data_type = DataType::AUDIO;
gain_adjustment.set_lower (0.0);
gain_adjustment.set_upper (1.0);
@@ -860,7 +861,7 @@ GainMeter::GainMeter (Session* s, int fader_length)
gain_display_box.pack_start (gain_display, true, true);
meter_metric_area.set_name ("AudioTrackMetrics");
set_size_request_to_display_given_text (meter_metric_area, "-127", 0, 0);
set_size_request_to_display_given_text (meter_metric_area, "-127", 1, 0);
gain_automation_style_button.set_name ("mixer strip button");
gain_automation_state_button.set_name ("mixer strip button");
@@ -952,7 +953,32 @@ GainMeter::render_metrics (Gtk::Widget& w, vector<DataType> types)
cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
cairo_t* cr = cairo_create (surface);
PangoLayout* layout = gtk_widget_create_pango_layout (w.gobj(), "");
Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create(w.get_pango_context());
Pango::AttrList audio_font_attributes;
Pango::AttrList midi_font_attributes;
Pango::AttrFontDesc* font_attr;
Pango::FontDescription font;
font = Pango::FontDescription (""); // use defaults
//font = get_font_for_style("gain-fader");
//font = w.get_style()->get_font();
font.set_weight (Pango::WEIGHT_NORMAL);
font.set_size (10.0 * PANGO_SCALE);
font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font));
audio_font_attributes.change (*font_attr);
delete font_attr;
font.set_weight (Pango::WEIGHT_ULTRALIGHT);
font.set_stretch (Pango::STRETCH_ULTRA_CONDENSED);
font.set_size (7.5 * PANGO_SCALE);
font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font));
midi_font_attributes.change (*font_attr);
delete font_attr;
cairo_move_to (cr, 0, 0);
cairo_rectangle (cr, 0, 0, width, height);
@@ -988,6 +1014,7 @@ GainMeter::render_metrics (Gtk::Widget& w, vector<DataType> types)
switch (*i) {
case DataType::AUDIO:
layout->set_attributes (audio_font_attributes);
points.push_back (-50);
points.push_back (-40);
points.push_back (-30);
@@ -999,6 +1026,7 @@ GainMeter::render_metrics (Gtk::Widget& w, vector<DataType> types)
break;
case DataType::MIDI:
layout->set_attributes (midi_font_attributes);
points.push_back (0);
if (types.size() == 1) {
points.push_back (32);
@@ -1030,23 +1058,23 @@ GainMeter::render_metrics (Gtk::Widget& w, vector<DataType> types)
cairo_set_line_width (cr, 1.0);
cairo_move_to (cr, 0, pos);
cairo_line_to (cr, 4, pos);
cairo_line_to (cr, 3.5, pos);
cairo_stroke (cr);
snprintf (buf, sizeof (buf), "%d", abs (*j));
pango_layout_set_text (layout, buf, strlen (buf));
snprintf (buf, sizeof (buf), "%2d", abs (*j));
layout->set_text(buf);
/* we want logical extents, not ink extents here */
int tw, th;
pango_layout_get_pixel_size (layout, &tw, &th);
layout->get_pixel_size(tw, th);
int p = pos - (th / 2);
p = min (p, height - th);
p = max (p, 0);
cairo_move_to (cr, 6, p);
pango_cairo_show_layout (cr, layout);
cairo_move_to (cr, 5, p);
pango_cairo_show_layout (cr, layout->gobj());
}
}
@@ -1061,7 +1089,6 @@ GainMeter::render_metrics (Gtk::Widget& w, vector<DataType> types)
cairo_destroy (cr);
cairo_surface_destroy (surface);
g_object_unref (layout);
return pattern;
}

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

File diff suppressed because it is too large Load Diff

View File

@@ -1485,13 +1485,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;
}
}
@@ -1501,13 +1501,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"
"\tRobin 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"
"\tRobin 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

@@ -113,7 +113,7 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processo
_button.set_active (_processor->active());
_button.show ();
_processor->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&ProcessorEntry::processor_active_changed, this), gui_context());
_processor->PropertyChanged.connect (name_connection, invalidator (*this), boost::bind (&ProcessorEntry::processor_property_changed, this, _1), gui_context());
@@ -247,7 +247,20 @@ ProcessorEntry::processor_property_changed (const PropertyChange& what_changed)
void
ProcessorEntry::setup_tooltip ()
{
ARDOUR_UI::instance()->set_tip (_button, name (Wide));
if (_processor) {
boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (_processor);
if (pi) {
if (pi->plugin()->has_editor()) {
ARDOUR_UI::instance()->set_tip (_button,
string_compose (_("<b>%1</b>\nDouble-click to show GUI.\nAlt+double-click to show generic GUI."), name (Wide)));
} else {
ARDOUR_UI::instance()->set_tip (_button,
string_compose (_("<b>%1</b>\nDouble-click to show generic GUI."), name (Wide)));
}
return;
}
}
ARDOUR_UI::instance()->set_tip (_button, string_compose ("<b>%1</b>", name (Wide)));
}
string
@@ -918,6 +931,7 @@ ProcessorBox::show_processor_menu (int arg)
const bool sensitive = !processor_display.selection().empty();
ActionManager::set_sensitive (ActionManager::plugin_selection_sensitive_actions, sensitive);
edit_action->set_sensitive (one_processor_can_be_edited ());
edit_generic_action->set_sensitive (one_processor_can_be_edited ());
boost::shared_ptr<PluginInsert> pi;
if (single_selection) {
@@ -925,7 +939,7 @@ ProcessorBox::show_processor_menu (int arg)
}
/* allow editing with an Ardour-generated UI for plugin inserts with editors */
edit_generic_action->set_sensitive (pi && pi->plugin()->has_editor ());
edit_action->set_sensitive (pi && pi->plugin()->has_editor ());
/* disallow rename for multiple selections, for plugin inserts and for the fader */
rename_action->set_sensitive (single_selection && !pi && !boost::dynamic_pointer_cast<Amp> (single_selection->processor ()));
@@ -1050,13 +1064,14 @@ ProcessorBox::processor_button_press_event (GdkEventButton *ev, ProcessorEntry*
if (processor && (Keyboard::is_edit_event (ev) || (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS))) {
if (_session->engine().connected()) {
/* XXX giving an error message here is hard, because we may be in the midst of a button press */
if (Config->get_use_plugin_own_gui ()) {
edit_processor (processor);
} else {
if (!one_processor_can_be_edited ()) return true;
if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
generic_edit_processor (processor);
} else {
edit_processor (processor);
}
}
@@ -2040,7 +2055,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;
@@ -2069,10 +2084,12 @@ ProcessorBox::get_editor_window (boost::shared_ptr<Processor> processor)
}
if (boost::dynamic_pointer_cast<InternalSend> (processor) == 0) {
SendUIWindow* w = new SendUIWindow (send, _session);
w->show ();
gidget = new SendUIWindow (send, _session);
} else {
/* assign internal send to main fader */
if (_parent_strip) {
if (_parent_strip->current_delivery() == send) {
_parent_strip->revert_to_default_display ();
@@ -2119,8 +2136,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);
@@ -2236,7 +2252,7 @@ ProcessorBox::register_actions ()
sigc::ptr_fun (ProcessorBox::rb_edit));
edit_generic_action = ActionManager::register_action (
popup_act_grp, X_("edit-generic"), _("Edit with basic controls..."),
popup_act_grp, X_("edit-generic"), _("Edit with generic controls..."),
sigc::ptr_fun (ProcessorBox::rb_edit_generic));
ActionManager::add_action_group (popup_act_grp);
@@ -2438,6 +2454,7 @@ ProcessorBox::edit_processor (boost::shared_ptr<Processor> processor)
ProcessorWindowProxy* proxy = find_window_proxy (processor);
if (proxy) {
proxy->set_custom_ui_mode (true);
proxy->toggle ();
}
}
@@ -2452,6 +2469,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 +2647,7 @@ ProcessorWindowProxy::ProcessorWindowProxy (string const & name, ProcessorBox* b
, _processor_box (box)
, _processor (processor)
, is_custom (false)
, want_custom (false)
{
}
@@ -2640,6 +2659,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 +2699,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 +2709,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 +2723,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,15 +1853,8 @@ 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"),
new BoolOption (
"use-own-plugin-gui",
string_compose (_("Use plugins' own interfaces instead of %1's"), PROGRAM_NAME),
sigc::mem_fun (*_rc_config, &RCConfiguration::get_use_plugin_own_gui),
sigc::mem_fun (*_rc_config, &RCConfiguration::set_use_plugin_own_gui)
));
add_option (S_("GUI"),
new BoolOption (
@@ -1881,7 +1874,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 +1883,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 +1891,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 +1905,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 +1922,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

@@ -999,7 +999,7 @@ RouteTimeAxisView::resolve_new_group_playlist_name(std::string &basename, vector
tmp = tmp.substr(idx + group_string.length());
// and find the largest current number
int x = atoi(tmp.c_str());
int x = atoi(tmp);
if (x > maxnumber) {
maxnumber = x;
}

View File

@@ -949,7 +949,7 @@ SoundFileBrowser::freesound_search()
XMLNode *res = root->child("num_pages");
if (res) {
string result = res->child("text")->content();
freesound_n_pages = atoi(result.c_str());
freesound_n_pages = atoi(result);
}
int more_pages = freesound_n_pages - freesound_page;
@@ -1010,7 +1010,7 @@ SoundFileBrowser::freesound_search()
std::string r;
// cerr << "id=" << id << ",uri=" << uri << ",ofn=" << ofn << ",dur=" << dur << endl;
double duration_seconds = atof(dur.c_str());
double duration_seconds = atof(dur);
double h, m, s;
char duration_hhmmss[16];
if (duration_seconds >= 99 * 60 * 60) {
@@ -1023,7 +1023,7 @@ SoundFileBrowser::freesound_search()
);
}
double size_bytes = atof(siz.c_str());
double size_bytes = atof(siz);
char bsize[32];
if (size_bytes < 1000) {
sprintf(bsize, "%.0f %s", size_bytes, _("B"));

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

@@ -1,5 +1,6 @@
/*
Copyright (C) 2010 Paul Davis
Copyright 2005-2008 Lennart Poettering
Author: Robin Gareus <robin@gareus.org>
This program is free software; you can redistribute it and/or modify
@@ -23,6 +24,9 @@
#include <errno.h>
#include <unistd.h>
#include <assert.h>
#include <dirent.h>
#ifdef __WIN32__
#include <windows.h>
#else
@@ -31,14 +35,115 @@
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/resource.h>
#endif
#include "system_exec.h"
using namespace std;
void * interposer_thread (void *arg);
static void close_fd (int* fd) { if (!fd) return; if (*fd >= 0) ::close (*fd); *fd = -1; }
static void close_fd (int& fd) { if (fd >= 0) ::close (fd); fd = -1; }
#ifndef __WIN32__
/*
* This function was part of libasyncns.
* LGPL v2.1
* Copyright 2005-2008 Lennart Poettering
*/
static int close_allv(const int except_fds[]) {
struct rlimit rl;
int fd;
#ifdef __linux__
DIR *d;
assert(except_fds);
if ((d = opendir("/proc/self/fd"))) {
struct dirent *de;
while ((de = readdir(d))) {
int found;
long l;
char *e = NULL;
int i;
if (de->d_name[0] == '.')
continue;
errno = 0;
l = strtol(de->d_name, &e, 10);
if (errno != 0 || !e || *e) {
closedir(d);
errno = EINVAL;
return -1;
}
fd = (int) l;
if ((long) fd != l) {
closedir(d);
errno = EINVAL;
return -1;
}
if (fd < 3)
continue;
if (fd == dirfd(d))
continue;
found = 0;
for (i = 0; except_fds[i] >= 0; i++)
if (except_fds[i] == fd) {
found = 1;
break;
}
if (found) continue;
if (close(fd) < 0) {
int saved_errno;
saved_errno = errno;
closedir(d);
errno = saved_errno;
return -1;
}
}
closedir(d);
return 0;
}
#endif
if (getrlimit(RLIMIT_NOFILE, &rl) < 0)
return -1;
for (fd = 0; fd < (int) rl.rlim_max; fd++) {
int i;
if (fd <= 3)
continue;
for (i = 0; except_fds[i] >= 0; i++)
if (except_fds[i] == fd)
continue;
if (close(fd) < 0 && errno != EBADF)
return -1;
}
return 0;
}
#endif /* not on windows */
SystemExec::SystemExec (std::string c, std::string a)
: cmd(c)
@@ -414,19 +519,33 @@ void
SystemExec::terminate ()
{
::pthread_mutex_lock(&write_lock);
/* close stdin in an attempt to get the child to exit cleanly.
*/
close_stdin();
if (pid) {
::usleep(50000);
sched_yield();
wait(WNOHANG);
}
/* if pid is non-zero, the child task is still executing (i.e. it did
* not exit in response to stdin being closed). try to kill it.
*/
if (pid) {
::kill(pid, SIGTERM);
::usleep(50000);
sched_yield();
wait(WNOHANG);
}
/* if pid is non-zero, the child task is STILL executing after being
* sent SIGTERM. Act tough ... send SIGKILL
*/
if (pid) {
::fprintf(stderr, "Process is still running! trying SIGKILL\n");
::kill(pid, SIGKILL);
@@ -442,12 +561,23 @@ int
SystemExec::wait (int options)
{
int status=0;
int ret;
if (pid==0) return -1;
if (pid==::waitpid(pid, &status, options)) {
pid=0;
}
if (errno == ECHILD) {
pid=0;
ret = waitpid (pid, &status, options);
if (ret == pid) {
if (WEXITSTATUS(status) || WIFSIGNALED(status)) {
pid=0;
}
} else {
if (ret != 0) {
if (errno == ECHILD) {
/* no currently running children, reset pid */
pid=0;
}
} /* else the process is still running */
}
return status;
}
@@ -485,18 +615,18 @@ SystemExec::start (int stderr_mode)
pid=r;
/* check if execve was successful. */
close_fd(&pok[1]);
close_fd(pok[1]);
char buf;
for ( ;; ) {
ssize_t n = ::read(pok[0], &buf, 1 );
if ( n==1 ) {
/* child process returned from execve */
pid=0;
close_fd(&pok[0]);
close_fd(&pin[1]);
close_fd(&pin[0]);
close_fd(&pout[1]);
close_fd(&pout[0]);
close_fd(pok[0]);
close_fd(pin[1]);
close_fd(pin[0]);
close_fd(pout[1]);
close_fd(pout[0]);
pin[1] = -1;
return -3;
} else if ( n==-1 ) {
@@ -505,7 +635,7 @@ SystemExec::start (int stderr_mode)
}
break;
}
close_fd(&pok[0]);
close_fd(pok[0]);
/* child started successfully */
#if 0
@@ -521,17 +651,17 @@ SystemExec::start (int stderr_mode)
}
if (r == 0) {
/* 2nd child process - catch stdout */
close_fd(&pin[1]);
close_fd(&pout[1]);
close_fd(pin[1]);
close_fd(pout[1]);
output_interposer();
exit(0);
}
close_fd(&pout[1]);
close_fd(&pin[0]);
close_fd(&pout[0]);
close_fd(pout[1]);
close_fd(pin[0]);
close_fd(pout[0]);
#else /* use pthread */
close_fd(&pout[1]);
close_fd(&pin[0]);
close_fd(pout[1]);
close_fd(pin[0]);
int rv = pthread_create(&thread_id_tt, NULL, interposer_thread, this);
thread_active=true;
@@ -545,15 +675,15 @@ SystemExec::start (int stderr_mode)
}
/* child process - exec external process */
close_fd(&pok[0]);
close_fd(pok[0]);
::fcntl(pok[1], F_SETFD, FD_CLOEXEC);
close_fd(&pin[1]);
close_fd(pin[1]);
if (pin[0] != STDIN_FILENO) {
::dup2(pin[0], STDIN_FILENO);
}
close_fd(&pin[0]);
close_fd(&pout[0]);
close_fd(pin[0]);
close_fd(pout[0]);
if (pout[1] != STDOUT_FILENO) {
::dup2(pout[1], STDOUT_FILENO);
}
@@ -571,7 +701,7 @@ SystemExec::start (int stderr_mode)
}
if (pout[1] != STDOUT_FILENO && pout[1] != STDERR_FILENO) {
close_fd(&pout[1]);
close_fd(pout[1]);
}
if (nicelevel !=0) {
@@ -594,11 +724,16 @@ SystemExec::start (int stderr_mode)
signal(SIGPIPE, SIG_DFL);
#endif
#ifndef __WIN32__
int good_fds[1] = { 0 };
close_allv(good_fds);
#endif
::execve(argp[0], argp, envp);
/* if we reach here something went wrong.. */
char buf = 0;
(void) ::write(pok[1], &buf, 1 );
close_fd(&pok[1]);
close_fd(pok[1]);
exit(-1);
return -1;
}
@@ -611,7 +746,7 @@ SystemExec::output_interposer()
ssize_t r;
unsigned long l = 1;
ioctl(rfd, FIONBIO, &l); // set non-blocking I/O
ioctl(rfd, FIONBIO, &l); // set non-blocking I/O
for (;fcntl(rfd, F_GETFL)!=-1;) {
r = read(rfd, buf, sizeof(buf));
@@ -633,17 +768,18 @@ void
SystemExec::close_stdin()
{
if (pin[1]<0) return;
close_fd(&pin[0]);
close_fd(&pin[1]);
close_fd(&pout[0]);
close_fd(&pout[1]);
close_fd(pin[0]);
close_fd(pin[1]);
close_fd(pout[0]);
close_fd(pout[1]);
}
int
SystemExec::write_to_stdin(std::string d, size_t len)
{
const char *data;
size_t r,c;
ssize_t r;
size_t c;
::pthread_mutex_lock(&write_lock);
data=d.c_str();
@@ -658,7 +794,7 @@ SystemExec::write_to_stdin(std::string d, size_t len)
sleep(1);
continue;
}
if (r != (len-c)) {
if ((size_t) r != (len-c)) {
::pthread_mutex_unlock(&write_lock);
return c;
}

View File

@@ -23,7 +23,7 @@
#include <sys/types.h>
#include "pbd/error.h"
#include "pbd/file_utils.h"
#include "pbd/convert.h"
#include "pbd/file_utils.h"
#include "gui_thread.h"
@@ -32,6 +32,8 @@
#include "i18n.h"
using namespace PBD;
TranscodeFfmpeg::TranscodeFfmpeg (std::string f)
: infile(f)
{
@@ -48,7 +50,7 @@ TranscodeFfmpeg::TranscodeFfmpeg (std::string f)
#endif
std::string ff_file_path;
if (find_file_in_search_path (PBD::SearchPath(Glib::getenv("PATH")), X_("ffmpeg_harvid"), ff_file_path)) { ffmpeg_exe = ff_file_path; }
if (find_file_in_search_path (SearchPath(Glib::getenv("PATH")), X_("ffmpeg_harvid"), ff_file_path)) { ffmpeg_exe = ff_file_path; }
else if (Glib::file_test(X_("C:\\Program Files\\harvid\\ffmpeg.exe"), Glib::FILE_TEST_EXISTS)) {
ffmpeg_exe = X_("C:\\Program Files\\ffmpeg\\ffmpeg.exe");
}
@@ -56,7 +58,7 @@ TranscodeFfmpeg::TranscodeFfmpeg (std::string f)
ffmpeg_exe = X_("C:\\Program Files\\ffmpeg\\ffmpeg.exe");
}
if (find_file_in_search_path (PBD::SearchPath(Glib::getenv("PATH")), X_("ffprobe_harvid"), ff_file_path)) { ffprobe_exe = ff_file_path; }
if (find_file_in_search_path (SearchPath(Glib::getenv("PATH")), X_("ffprobe_harvid"), ff_file_path)) { ffprobe_exe = ff_file_path; }
else if (Glib::file_test(X_("C:\\Program Files\\harvid\\ffprobe.exe"), Glib::FILE_TEST_EXISTS)) {
ffprobe_exe = X_("C:\\Program Files\\ffmpeg\\ffprobe.exe");
}
@@ -65,7 +67,7 @@ TranscodeFfmpeg::TranscodeFfmpeg (std::string f)
}
if (ffmpeg_exe.empty() || ffprobe_exe.empty()) {
PBD::warning << _(
warning << _(
"No ffprobe or ffmpeg executables could be found on this system.\n"
"Video import and export is not possible until you install those tools.\n"
"Ardour requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
@@ -128,10 +130,10 @@ TranscodeFfmpeg::probe ()
#define PARSE_FRACTIONAL_FPS(VAR) \
{ \
std::string::size_type pos; \
VAR = atof(value.c_str()); \
VAR = atof(value); \
pos = value.find_first_of('/'); \
if (pos != std::string::npos) { \
VAR = atof(value.substr(0, pos).c_str()) / atof(value.substr(pos+1).c_str()); \
VAR = atof(value.substr(0, pos)) / atof(value.substr(pos+1)); \
} \
}
@@ -149,11 +151,11 @@ TranscodeFfmpeg::probe ()
std::string value = kv->substr(kvsep + 1);
if (key == X_("index")) {
m_videoidx = atoi(value.c_str());
m_videoidx = atoi(value);
} else if (key == X_("width")) {
m_width = atoi(value.c_str());
m_width = atoi(value);
} else if (key == X_("height")) {
m_height = atoi(value.c_str());
m_height = atoi(value);
} else if (key == X_("codec_name")) {
if (!m_codec.empty()) m_codec += " ";
m_codec += value;
@@ -180,14 +182,14 @@ TranscodeFfmpeg::probe ()
));
}
} else if (key == X_("duration_ts") && m_fps == 0 && timebase !=0 ) {
m_duration = atof(value.c_str()) * m_fps * timebase;
m_duration = atof(value) * m_fps * timebase;
} else if (key == X_("duration") && m_fps != 0 && m_duration == 0) {
m_duration = atof(value.c_str()) * m_fps;
m_duration = atof(value) * m_fps;
} else if (key == X_("display_aspect_ratio")) {
std::string::size_type pos;
pos = value.find_first_of(':');
if (pos != std::string::npos && atof(value.substr(pos+1).c_str()) != 0) {
m_aspect = atof(value.substr(0, pos).c_str()) / atof(value.substr(pos+1).c_str());
if (pos != std::string::npos && atof(value.substr(pos+1)) != 0) {
m_aspect = atof(value.substr(0, pos)) / atof(value.substr(pos+1));
}
}
}
@@ -205,7 +207,7 @@ TranscodeFfmpeg::probe ()
std::string value = kv->substr(kvsep + 1);
if (key == X_("channels")) {
as.channels = atoi(value.c_str());
as.channels = atoi(value);
} else if (key == X_("index")) {
as.stream_id = value;
} else if (key == X_("codec_long_name")) {
@@ -542,7 +544,7 @@ void
TranscodeFfmpeg::ffmpegparse_v (std::string d, size_t /* s */)
{
if (strstr(d.c_str(), "ERROR") || strstr(d.c_str(), "Error") || strstr(d.c_str(), "error")) {
PBD::warning << "ffmpeg-error: " << d << endmsg;
warning << "ffmpeg-error: " << d << endmsg;
}
if (strncmp(d.c_str(), "frame=",6)) {
#if 1 /* DEBUG */
@@ -554,7 +556,7 @@ TranscodeFfmpeg::ffmpegparse_v (std::string d, size_t /* s */)
Progress(0, 0); /* EMIT SIGNAL */
return;
}
ARDOUR::framecnt_t f = atol(d.substr(6).c_str());
ARDOUR::framecnt_t f = atol(d.substr(6));
if (f == 0) {
Progress(0, 0); /* EMIT SIGNAL */
} else {

View File

@@ -388,7 +388,7 @@ TranscodeVideoDialog::launch_transcode ()
if (scale_combo.get_active_row_number() == 0 ) {
scale_width =0;
} else {
scale_width = atoi(scale_combo.get_active_text().c_str());
scale_width = atoi(scale_combo.get_active_text());
}
if (!aspect_checkbox.get_active()) {
scale_height = 0;
@@ -443,7 +443,7 @@ TranscodeVideoDialog::scale_combo_changed ()
if (scale_combo.get_active_row_number() == 0 ) {
h = transcoder->get_height();
} else {
h = floor(atof(scale_combo.get_active_text().c_str()) / m_aspect);
h = floor(atof(scale_combo.get_active_text()) / m_aspect);
}
height_spinner.set_value(h);
}
@@ -477,7 +477,7 @@ TranscodeVideoDialog::update_bitrate ()
if (scale_combo.get_active_row_number() == 0 ) {
br *= transcoder->get_width();
} else {
br *= atof(scale_combo.get_active_text().c_str());
br *= atof(scale_combo.get_active_text());
}
if (br != 0) {
bitrate_spinner.set_value(floor(br/10000.0)*10);

View File

@@ -18,6 +18,7 @@
*/
#include "pbd/file_utils.h"
#include "pbd/convert.h"
#include "gui_thread.h"
#include "ardour_ui.h"
@@ -28,6 +29,7 @@
#include "i18n.h"
using namespace std;
using namespace PBD;
VideoMonitor::VideoMonitor (PublicEditor *ed, std::string xjadeo_bin_path)
: editor (ed)
@@ -248,7 +250,7 @@ VideoMonitor::parse_output (std::string d, size_t /*s*/)
printf("xjadeo: '%s'\n", line.c_str());
}
#endif
int status = atoi(line.substr(1,3).c_str());
int status = atoi(line.substr(1,3));
switch(status / 100) {
case 4: /* errors */
if (status == 403) {
@@ -295,7 +297,7 @@ VideoMonitor::parse_output (std::string d, size_t /*s*/)
knownstate |= 2;
if (starting || xjadeo_settings["window ontop"] != value) {
if (!starting && _session) _session->set_dirty ();
if (atoi(value.c_str())) { UiState("xjadeo-window-ontop-on"); }
if (atoi(value)) { UiState("xjadeo-window-ontop-on"); }
else { UiState("xjadeo-window-ontop-off"); }
starting &= ~2;
}
@@ -304,7 +306,7 @@ VideoMonitor::parse_output (std::string d, size_t /*s*/)
knownstate |= 4;
if (starting || xjadeo_settings["window zoom"] != value) {
if (!starting && _session) _session->set_dirty ();
if (atoi(value.c_str())) { UiState("xjadeo-window-fullscreen-on"); }
if (atoi(value)) { UiState("xjadeo-window-fullscreen-on"); }
else { UiState("xjadeo-window-fullscreen-off"); }
starting &= ~4;
}
@@ -313,15 +315,15 @@ VideoMonitor::parse_output (std::string d, size_t /*s*/)
knownstate |= 8;
if (starting || xjadeo_settings["window letterbox"] != value) {
if (!starting && _session) _session->set_dirty ();
if (atoi(value.c_str())) { UiState("xjadeo-window-letterbox-on"); }
if (atoi(value)) { UiState("xjadeo-window-letterbox-on"); }
else { UiState("xjadeo-window-letterbox-off"); }
starting &= ~8;
}
xjadeo_settings["window letterbox"] = value;
} else if(key == "osdmode") {
knownstate |= 1;
osdmode = atoi(value.c_str());
if (starting || atoi(xjadeo_settings["osd mode"].c_str()) != osdmode) {
osdmode = atoi(value);
if (starting || atoi(xjadeo_settings["osd mode"]) != osdmode) {
if (!starting && _session) _session->set_dirty ();
if ((osdmode & 1) == 1) { UiState("xjadeo-window-osd-frame-on"); }
if ((osdmode & 1) == 0) { UiState("xjadeo-window-osd-frame-off"); }

View File

@@ -22,6 +22,7 @@
#include "ardour/tempo.h"
#include "pbd/file_utils.h"
#include "pbd/convert.h"
#include "ardour/session_directory.h"
#include "ardour_ui.h"
@@ -150,44 +151,41 @@ VideoTimeLine::set_session (ARDOUR::Session *s)
return;
}
if (node) {
ARDOUR_UI::instance()->start_video_server((Gtk::Window*)0, false);
ARDOUR_UI::instance()->start_video_server((Gtk::Window*)0, false);
set_id(*node);
set_id(*node);
const XMLProperty* proph = node->property (X_("Height"));
if (proph) {
editor->set_video_timeline_height(atoi(proph->value().c_str()));
}
const XMLProperty* proph = node->property (X_("Height"));
if (proph) {
editor->set_video_timeline_height(atoi(proph->value()));
}
#if 0 /* TODO THINK: set FPS first time only ?! */
const XMLProperty* propasfps = node->property (X_("AutoFPS"));
if (propasfps) {
auto_set_session_fps = atoi(propasfps->value().c_str())?true:false;
}
const XMLProperty* propasfps = node->property (X_("AutoFPS"));
if (propasfps) {
auto_set_session_fps = atoi(propasfps->value())?true:false;
}
#endif
const XMLProperty* propoffset = node->property (X_("VideoOffset"));
if (propoffset) {
video_offset = atoll(propoffset->value().c_str());
video_offset_p = video_offset;
}
const XMLProperty* proplock = node->property (X_("VideoOffsetLock"));
if (proplock) {
video_offset_lock = atoi(proplock->value().c_str())?true:false;
}
const XMLProperty* localfile = node->property (X_("LocalFile"));
if (localfile) {
local_file = atoi(localfile->value().c_str())?true:false;
}
const XMLProperty* propf = node->property (X_("Filename"));
video_file_info(propf->value(), local_file);
const XMLProperty* propoffset = node->property (X_("VideoOffset"));
if (propoffset) {
video_offset = atoll(propoffset->value());
video_offset_p = video_offset;
}
node = _session->extra_xml (X_("Videomonitor"));
if (node) {
const XMLProperty* proplock = node->property (X_("VideoOffsetLock"));
if (proplock) {
video_offset_lock = atoi(proplock->value())?true:false;
}
const XMLProperty* localfile = node->property (X_("LocalFile"));
if (localfile) {
local_file = atoi(localfile->value())?true:false;
}
const XMLProperty* propf = node->property (X_("Filename"));
video_file_info(propf->value(), local_file);
if ((node = _session->extra_xml (X_("Videomonitor")))) {
const XMLProperty* prop = node->property (X_("active"));
if (prop && prop->value() == "yes" && found_xjadeo() && !video_filename.empty() && local_file) {
open_video_monitor();
@@ -229,7 +227,7 @@ VideoTimeLine::set_state (const XMLNode& node, int /*version*/)
LocaleGuard lg (X_("POSIX"));
const XMLProperty* propoffset = node.property (X_("VideoOffset"));
if (propoffset) {
video_offset = atoll(propoffset->value().c_str());
video_offset = atoll(propoffset->value());
}
ARDOUR_UI::instance()->flush_videotimeline_cache(true);
return 0;
@@ -507,7 +505,7 @@ VideoTimeLine::video_file_info (std::string filename, bool local)
}
_session->config.set_video_pullup(0); /* TODO only set if set_timecode_format() was successful ?!*/
}
if (video_file_fps != _session->timecode_frames_per_second()) {
if (floor(video_file_fps*100) != floor(_session->timecode_frames_per_second()*100)) {
warning << _("Video file's framerate is not equal to Ardour session timecode's framerate: ")
<< video_file_fps << _(" vs ") << _session->timecode_frames_per_second() << endmsg;
}
@@ -717,7 +715,7 @@ VideoTimeLine::open_video_monitor() {
if (node) {
const XMLProperty* prop = node->property (X_("mask"));
if (prop) {
xj_settings_mask = atoi(prop->value().c_str());
xj_settings_mask = atoi(prop->value());
}
}
}

View File

@@ -28,11 +28,13 @@
#include "ardour_dialog.h"
#include "ardour_window.h"
#include "window_manager.h"
#include "processor_box.h"
#include "i18n.h"
using std::string;
using namespace WM;
using namespace PBD;
Manager* Manager::_instance = 0;
@@ -106,7 +108,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());
}
}
}
@@ -124,12 +131,19 @@ Manager::set_session (ARDOUR::Session* s)
void
Manager::set_transient_for (Gtk::Window* parent)
{
/* OS X has a richer concept of window layering than X does (or
* certainly, than any accepted conventions on X), and so the use of
* Manager::set_transient_for() is not necessary on that platform.
*
* On OS X this is mostly taken care of by using the window type rather
* than explicit 1:1 transient-for relationships.
*/
#ifndef __APPLE__
if (parent) {
for (Windows::const_iterator i = _windows.begin(); i != _windows.end(); ++i) {
Gtk::Window* win = (*i)->get();
if (win) {
std::cerr << "marked " << win->get_title() << " as transient of " << parent->get_title() << std::endl;
win->set_transient_for (*parent);
}
}
@@ -205,16 +219,16 @@ ProxyBase::set_state (const XMLNode& node)
}
if ((prop = (*i)->property (X_("x-off"))) != 0) {
_x_off = atoi (prop->value().c_str());
_x_off = atoi (prop->value());
}
if ((prop = (*i)->property (X_("y-off"))) != 0) {
_y_off = atoi (prop->value().c_str());
_y_off = atoi (prop->value());
}
if ((prop = (*i)->property (X_("x-size"))) != 0) {
_width = atoi (prop->value().c_str());
_width = atoi (prop->value());
}
if ((prop = (*i)->property (X_("y-size"))) != 0) {
_height = atoi (prop->value().c_str());
_height = atoi (prop->value());
}
}

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

@@ -104,10 +104,11 @@ ControllableDescriptor::set (const std::string& str)
}
} else if (path[1] == "send") {
if (path.size() == 3 && rest.size() == 2) {
if (path.size() == 3 && rest.size() == 3) {
if (path[2] == "gain") {
_subtype = SendGain;
_target.push_back (atoi (rest[1]));
_target.push_back (atoi (rest[2]));
} else {
return -1;
}

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

@@ -34,6 +34,7 @@
#include <pbd/file_utils.h>
#include <pbd/failed_constructor.h>
#include "ardour/amp.h"
#include "ardour/session.h"
#include "ardour/route.h"
#include "ardour/audio_track.h"
@@ -42,6 +43,7 @@
#include "ardour/filesystem_paths.h"
#include "ardour/panner.h"
#include "ardour/plugin.h"
#include "ardour/send.h"
#include "osc.h"
#include "osc_controllable.h"
@@ -164,6 +166,10 @@ OSC::start ()
_port++;
continue;
}
if (!_osc_server) {
return 1;
}
#ifdef ARDOUR_OSC_UNIX_SERVER
@@ -356,8 +362,8 @@ OSC::register_callbacks()
REGISTER_CALLBACK (serv, "/ardour/routes/pan_stereo_width", "if", route_set_pan_stereo_width);
REGISTER_CALLBACK (serv, "/ardour/routes/plugin/parameter", "iiif", route_plugin_parameter);
REGISTER_CALLBACK (serv, "/ardour/routes/plugin/parameter/print", "iii", route_plugin_parameter_print);
REGISTER_CALLBACK (serv, "/ardour/routes/send/gainabs", "iif", route_set_send_gain_abs);
REGISTER_CALLBACK (serv, "/ardour/routes/send/gaindB", "iif", route_set_send_gain_dB);
/* still not-really-standardized query interface */
//REGISTER_CALLBACK (serv, "/ardour/*/#current_value", "", current_value);
@@ -891,6 +897,70 @@ OSC::route_set_pan_stereo_width (int rid, float pos)
}
int
OSC::route_set_send_gain_abs (int rid, int sid, float val)
{
if (!session) {
return -1;
}
boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
if (!r) {
return -1;
}
/* revert to zero-based counting */
if (sid > 0) {
--sid;
}
boost::shared_ptr<Processor> p = r->nth_send (sid);
if (p) {
boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(p);
boost::shared_ptr<Amp> a = s->amp();
if (a) {
a->set_gain (val, this);
}
}
return 0;
}
int
OSC::route_set_send_gain_dB (int rid, int sid, float val)
{
if (!session) {
return -1;
}
boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
if (!r) {
return -1;
}
/* revert to zero-based counting */
if (sid > 0) {
--sid;
}
boost::shared_ptr<Processor> p = r->nth_send (sid);
if (p) {
boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(p);
boost::shared_ptr<Amp> a = s->amp();
if (a) {
a->set_gain (dB_to_coefficient (val), this);
}
}
return 0;
}
int
OSC::route_plugin_parameter (int rid, int piid, int par, float val)
{

View File

@@ -214,6 +214,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
PATH_CALLBACK2(route_set_gain_dB,i,f);
PATH_CALLBACK2(route_set_pan_stereo_position,i,f);
PATH_CALLBACK2(route_set_pan_stereo_width,i,f);
PATH_CALLBACK3(route_set_send_gain_abs,i,i,f);
PATH_CALLBACK3(route_set_send_gain_dB,i,i,f);
PATH_CALLBACK4(route_plugin_parameter,i,i,i,f);
PATH_CALLBACK3(route_plugin_parameter_print,i,i,i);
@@ -224,6 +226,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
int route_set_gain_dB (int rid, float dB);
int route_set_pan_stereo_position (int rid, float left_right_fraction);
int route_set_pan_stereo_width (int rid, float percent);
int route_set_send_gain_abs (int rid, int sid, float val);
int route_set_send_gain_dB (int rid, int sid, float val);
int route_plugin_parameter (int rid, int piid,int par, float val);
int route_plugin_parameter_print (int rid, int piid,int par);

View File

@@ -11,7 +11,7 @@ fi
cd $BASE || exit 1
git pull || exit 1
./waf configure $* --strict --noconfirm --also-libdir=$HOME/a3/inst/lib --also-include=$HOME/gtk/inst/include || exit 1
./waf configure $* --strict --backtrace --noconfirm --also-libdir=$HOME/a3/inst/lib --also-include=$HOME/gtk/inst/include || exit 1
./waf || exit 1
cd tools/linux_packaging || exit 1
./build --public --strip some || exit 1

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

View File

@@ -8,6 +8,7 @@ BUILD_ROOT=../../build
SAE=
MIXBUS=
WITH_HARVID=
WITH_LADSPA=1
STRIP=1
PRINT_SYSDEPS=
@@ -55,6 +56,7 @@ while [ $# -gt 0 ] ; do
# specific build flags
#
--harvid) WITH_HARVID=1 ; shift ;;
--noladspa) WITH_LADSPA= ; shift ;;
--nostrip) STRIP= ; shift ;;
--sysdeps) PRINT_SYSDEPS=1; shift ;;
@@ -472,6 +474,8 @@ done
rm -rf $PRODUCT_PKG_DIR
mkdir $PRODUCT_PKG_DIR
DMGWINBOTTOM=440
if [ x$SAE != x ] ; then
# SAE packaging
@@ -489,7 +493,8 @@ elif [ x$MIXBUS != x ] ; then
echo "Creating Mixbus packaging directory"
mv $APPDIR $PRODUCT_PKG_DIR/
cp MixBus_Install_QuickStart.pdf "$PRODUCT_PKG_DIR/Mixbus Install & Quick Start Guide.pdf"
DMGWINBOTTOM=$[ $DMGWINBOTTOM + 100 ]
MIXBUSPOS="set position of item \"MixBus_Install_QuickStart.pdf\" of container window to {90, 180}"
else
echo "Creating $APPNAME packaging directory"
@@ -497,6 +502,20 @@ else
fi
if test x$WITH_HARVID != x ; then
echo "installing video tools.."
# TODO move files to http://ardour.org/files/ - symlink 'latest'
HARVID_VERSION=$(curl http://ardour.org/files/video-tools/harvid_version.txt)
XJADEO_VERSION=$(curl http://ardour.org/files/video-tools/xjadeo_version.txt)
echo "copying harvid and xjadeo ..."
curl -L -o "$PRODUCT_PKG_DIR/harvid-${HARVID_VERSION}.pkg" "http://x42.github.io/harvid/releases/harvid-${HARVID_VERSION}.pkg"
curl -L -o "$PRODUCT_PKG_DIR/xjadeo-${XJADEO_VERSION:1}.dmg" "http://sourceforge.net/projects/xjadeo/files/xjadeo/${XJADEO_VERSION}/jadeo-${XJADEO_VERSION:1}.dmg/download"
DMGWINBOTTOM=$[ $DMGWINBOTTOM + 140 ]
YPOS=$[ $DMGWINBOTTOM - 300 ]
HARVIDPOS="set position of item \"harvid-${HARVID_VERSION}.pkg\" of container window to {90, ${YPOS}}"
XJADEOPOS="set position of item \"xjadeo-${XJADEO_VERSION:1}.dmg\" of container window to {310, ${YPOS}}"
fi
echo "Building DMG ..."
# UC_DMG=$APPNAME-${release_version}-${revision}-UC.dmg
@@ -525,7 +544,7 @@ DiskDevice=$(hdid -nomount "$TMPDMG" | grep Apple_HFS | cut -f 1 -d ' ')
newfs_hfs -v "${VOLNAME}" "${DiskDevice}"
mount -t hfs "${DiskDevice}" "${MNTPATH}"
cp -r ${PRODUCT_PKG_DIR}/${APPDIR} "${MNTPATH}" || exit
cp -r ${PRODUCT_PKG_DIR}/* "${MNTPATH}" || exit
mkdir "${MNTPATH}/.background"
cp -vi dmgbg.png "${MNTPATH}/.background/dmgbg.png"
@@ -538,7 +557,7 @@ echo '
set current view of container window to icon view
set toolbar visible of container window to false
set statusbar visible of container window to false
set the bounds of container window to {400, 200, 800, 440}
set the bounds of container window to {400, 200, 800, '${DMGWINBOTTOM}'}
set theViewOptions to the icon view options of container window
set arrangement of theViewOptions to not arranged
set icon size of theViewOptions to 64
@@ -546,6 +565,9 @@ echo '
make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
set position of item "'${APPDIR}'" of container window to {90, 100}
set position of item "Applications" of container window to {310, 100}
'${MIXBUSPOS}'
'${HARVIDPOS}'
'${XJADEOPOS}'
close
open
update without registering applications

View File

@@ -106,12 +106,14 @@ def set_compiler_flags (conf,opt):
platform = u[0].lower()
version = u[2]
# waf adds -O0 -g itself. thanks waf!
is_clang = conf.env['CXX'][0].endswith('clang++')
if opt.gprofile:
debug_flags = [ '-pg' ]
else:
if opt.backtrace:
if platform != 'darwin' and not is_clang:
debug_flags = [ '-rdynamic' ] # waf adds -O0 -g itself. thanks waf!
debug_flags = [ '-rdynamic' ]
# Autodetect
if opt.dist_target == 'auto':
@@ -377,6 +379,8 @@ def options(opt):
help='The user-visible name of the program being built')
opt.add_option('--arch', type='string', action='store', dest='arch',
help='Architecture-specific compiler flags')
opt.add_option('--backtrace', action='store_true', default=False, dest='backtrace',
help='Compile with -rdynamic -- allow obtaining backtraces from within Ardour')
opt.add_option('--no-carbon', action='store_true', default=False, dest='nocarbon',
help='Compile without support for AU Plugins with only CARBON UI (needed for 64bit)')
opt.add_option('--boost-sp-debug', action='store_true', default=False, dest='boost_sp_debug',
@@ -668,6 +672,7 @@ const char* const ardour_config_info = "\\n\\
write_config_text('Build documentation', conf.env['DOCS'])
write_config_text('Debuggable build', conf.env['DEBUG'])
write_config_text('Export all symbols (backtrace)', opts.backtrace)
write_config_text('Install prefix', conf.env['PREFIX'])
write_config_text('Strict compiler flags', conf.env['STRICT'])
write_config_text('Internal Shared Libraries', conf.is_defined('INTERNAL_SHARED_LIBS'))