diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2013-08-05 14:22:32 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2013-08-05 14:22:32 -0400 |
commit | 616f2a0370a10dcc7372a95f6bca9f5a45698980 (patch) | |
tree | b07badccad237cc66d0668482ad65cedefdee23f | |
parent | 499b7fcfa9f3e8535a4500143a9d7af7b67c6984 (diff) | |
parent | 38e4f7bd1ba2ec9ae37dbb384da449f894cd8564 (diff) |
fix conflicts after merge with master
116 files changed, 3607 insertions, 1728 deletions
diff --git a/gtk2_ardour/add_video_dialog.cc b/gtk2_ardour/add_video_dialog.cc index a005b74467..57938ac3f1 100644 --- a/gtk2_ardour/add_video_dialog.cc +++ b/gtk2_ardour/add_video_dialog.cc @@ -42,6 +42,7 @@ using namespace Gtk; using namespace std; using namespace PBD; using namespace ARDOUR; +using namespace VideoUtils; #define PREVIEW_WIDTH (240) #define PREVIEW_HEIGHT (180) @@ -482,7 +483,7 @@ AddVideoDialog::harvid_request(std::string u) harvid_list->clear(); - char *res = curl_http_get(url, &status); + char *res = a3_curl_http_get(url, &status); if (status != 200) { printf("request failed\n"); // XXX harvid_path.set_text(" - request failed -"); @@ -662,7 +663,7 @@ AddVideoDialog::request_preview(std::string u) , (long long) (video_duration * seek_slider.get_value() / 1000.0) , clip_width, clip_height, u.c_str()); - char *data = curl_http_get(url, NULL); + char *data = a3_curl_http_get(url, NULL); if (!data) { printf("image preview request failed %s\n", url); imgbuf->fill(RGBA_TO_UINT(0,0,0,255)); diff --git a/gtk2_ardour/ardour3_styles.rc.in b/gtk2_ardour/ardour3_styles.rc.in index 45b8458370..e3978d063a 100644 --- a/gtk2_ardour/ardour3_styles.rc.in +++ b/gtk2_ardour/ardour3_styles.rc.in @@ -989,3 +989,25 @@ style "default_toggle_button" bg[ACTIVE] = @@COLPREFIX@_contrasting_indicator fg[ACTIVE] = @@COLPREFIX@_darkest } + + +style "meter_strip_dpm" = "default" +{ +} + +style "meter_strip_ppm" = "default" +{ + bg[NORMAL] = { 0.1, 0.1, 0.1 } + fg[NORMAL] = { 1.0, 1.0, 1.0 } +} + +style "meter_strip_vu" = "default" +{ + bg[NORMAL] = { .84, .77, .58 } + fg[NORMAL] = { 0.0, 0.0, 0.0 } +} + +style "meter_strip_sep" = "default" +{ + bg[NORMAL] = { 0.0, 0.0, 0.0 } +} diff --git a/gtk2_ardour/ardour3_ui_default.conf b/gtk2_ardour/ardour3_ui_default.conf index 372cab8a16..7c33944dbe 100644 --- a/gtk2_ardour/ardour3_ui_default.conf +++ b/gtk2_ardour/ardour3_ui_default.conf @@ -221,7 +221,8 @@ <Option name="solo safe: led active" value="ff0000ff"/> <Option name="solo safe: text" value="c7c7d8ff"/> <Option name="solo safe: text active" value="c8c8d9ff"/> - <Option name="meterbridge peaklabel" value="cc4422ff"/> + <Option name="meterbridge peaklabel" value="ff1111ff"/> + <Option name="meter color BBC" value="ffa500ff"/> <Option name="meterbridge peakindicator: fill start" value="444444ff"/> <Option name="meterbridge peakindicator: fill end" value="333333ff"/> <Option name="meterbridge peakindicator on: fill start" value="ff0000ff"/> diff --git a/gtk2_ardour/ardour3_widget_list.rc b/gtk2_ardour/ardour3_widget_list.rc index 05ebde9421..0e7075cef4 100644 --- a/gtk2_ardour/ardour3_widget_list.rc +++ b/gtk2_ardour/ardour3_widget_list.rc @@ -290,6 +290,11 @@ widget "*PluginLoadButton" style:highest "small_button" widget "*PluginLoadButton*" style:highest "small_button" widget "*PluginEditorButton" style:highest "default_toggle_button" +widget "*meterstripPPM" style:highest "meter_strip_ppm" +widget "*meterstripDPM" style:highest "meter_strip_dpm" +widget "*meterstripVU" style:highest "meter_strip_vu" +widget "*BlackSeparator" style:highest "meter_strip_sep" + widget "*MetricDialogFrame" style:highest "base_frame" widget "*MetricEntry" style:highest "medium_bold_entry" widget "*MetricButton" style:highest "default_button" diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index c4e037a5bf..a3ea2b1612 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -182,6 +182,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) , solo_alert_button (_("solo")) , feedback_alert_button (_("feedback")) + , editor_meter(0) + , editor_meter_peak_display() + , speaker_config_window (X_("speaker-config"), _("Speaker Configuration")) , theme_manager (X_("theme-manager"), _("Theme Manager")) , key_editor (X_("key-editor"), _("Key Bindings")) @@ -1020,6 +1023,15 @@ ARDOUR_UI::every_point_zero_something_seconds () // august 2007: actual update frequency: 25Hz (40ms), not 100Hz SuperRapidScreenUpdate(); /* EMIT_SIGNAL */ + if (editor_meter && Config->get_show_editor_meter()) { + float mpeak = editor_meter->update_meters(); + if (mpeak > editor_meter_max_peak) { + if (mpeak >= Config->get_meter_peak()) { + editor_meter_peak_display.set_name ("meterbridge peakindicator on"); + editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body)); + } + } + } return TRUE; } @@ -3479,7 +3491,10 @@ ARDOUR_UI::add_video (Gtk::Window* float_window) return; } if (!transcode_video_dialog->get_audiofile().empty()) { - editor->embed_audio_from_video(transcode_video_dialog->get_audiofile()); + editor->embed_audio_from_video( + transcode_video_dialog->get_audiofile(), + video_timeline->get_offset() + ); } switch (transcode_video_dialog->import_option()) { case VTL_IMPORT_TRANSCODED: @@ -3543,6 +3558,10 @@ ARDOUR_UI::remove_video () video_timeline->close_session(); editor->toggle_ruler_video(false); + /* reset state */ + video_timeline->set_offset_locked(false); + video_timeline->set_offset(0); + /* delete session state */ XMLNode* node = new XMLNode(X_("Videotimeline")); _session->add_extra_xml(*node); @@ -4080,3 +4099,32 @@ ARDOUR_UI::session_format_mismatch (std::string xml_path, std::string backup_pat msg.run (); } + + +void +ARDOUR_UI::reset_peak_display () +{ + if (!_session || !_session->master_out() || !editor_meter) return; + editor_meter->clear_meters(); + editor_meter_max_peak = -INFINITY; + editor_meter_peak_display.set_name ("meterbridge peakindicator"); + editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body)); +} + +void +ARDOUR_UI::reset_group_peak_display (RouteGroup* group) +{ + if (!_session || !_session->master_out()) return; + if (group == _session->master_out()->route_group()) { + reset_peak_display (); + } +} + +void +ARDOUR_UI::reset_route_peak_display (Route* route) +{ + if (!_session || !_session->master_out()) return; + if (_session->master_out().get() == route) { + reset_peak_display (); + } +} diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index c4ac0e67d7..1dcaeb0e9e 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -104,6 +104,7 @@ class SpeakerDialog; class ThemeManager; class TimeInfoBox; class MidiTracer; +class LevelMeterHBox; class GlobalPortMatrixWindow; class GUIObjectState; @@ -281,6 +282,10 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr void get_process_buffers (); void drop_process_buffers (); + void reset_peak_display (); + void reset_route_peak_display (ARDOUR::Route*); + void reset_group_peak_display (ARDOUR::RouteGroup*); + const std::string& announce_string() const { return _announce_string; } protected: @@ -444,6 +449,11 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr ArdourButton feedback_alert_button; Gtk::VBox alert_box; + Gtk::VBox meter_box; + LevelMeterHBox * editor_meter; + float editor_meter_max_peak; + ArdourButton editor_meter_peak_display; + bool editor_meter_peak_button_release (GdkEventButton*); void solo_blink (bool); void sync_blink (bool); diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 50affa6c96..e9ad631032 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -144,6 +144,7 @@ ARDOUR_UI::setup_tooltips () set_tip (feedback_alert_button, _("When active, there is a feedback loop.")); set_tip (primary_clock, _("<b>Primary Clock</b> right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify.\nText edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; postfix the edit with '+' or '-' to enter delta times.\n")); set_tip (secondary_clock, _("<b>Secondary Clock</b> right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify.\nText edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; postfix the edit with '+' or '-' to enter delta times.\n")); + set_tip (editor_meter_peak_display, _("Reset Level Meter")); synchronize_sync_source_and_video_pullup (); @@ -417,6 +418,8 @@ ARDOUR_UI::setup_transport () transport_tearoff_hbox.pack_start (_editor_transport_box, false, false); } transport_tearoff_hbox.pack_start (alert_box, false, false); + transport_tearoff_hbox.pack_start (meter_box, false, false); + transport_tearoff_hbox.pack_start (editor_meter_peak_display, false, false); if (Profile->get_sae()) { Image* img = manage (new Image ((::get_icon (X_("sae"))))); diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index 8c78d6494d..24f6511b4c 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -39,6 +39,7 @@ #include "keyeditor.h" #include "location_ui.h" #include "main_clock.h" +#include "meter_patterns.h" #include "midi_tracer.h" #include "mixer_ui.h" #include "public_editor.h" @@ -52,6 +53,8 @@ #include "theme_manager.h" #include "time_info_box.h" +#include <gtkmm2ext/keyboard.h> + #include "i18n.h" using namespace ARDOUR; @@ -186,6 +189,45 @@ ARDOUR_UI::set_session (Session *s) point_zero_something_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_something_seconds), 40); update_format (); + + if (editor_meter) { + meter_box.remove(*editor_meter); + delete editor_meter; + editor_meter = 0; + editor_meter_peak_display.hide(); + } + + if (_session && _session->master_out()) { + editor_meter = new LevelMeterHBox(_session); + editor_meter->set_meter (_session->master_out()->shared_peak_meter().get()); + editor_meter->clear_meters(); + editor_meter->set_type (_session->master_out()->meter_type()); + editor_meter->setup_meters (30, 12, 6); + editor_meter->show(); + meter_box.pack_start(*editor_meter); + + ArdourMeter::ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_peak_display)); + ArdourMeter::ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_route_peak_display)); + ArdourMeter::ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_group_peak_display)); + + editor_meter_peak_display.set_name ("meterbridge peakindicator"); + editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body)); + editor_meter_peak_display.unset_flags (Gtk::CAN_FOCUS); + editor_meter_peak_display.set_size_request(6, -1); + editor_meter_peak_display.set_corner_radius(2); + + editor_meter_max_peak = -INFINITY; + editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false); + + if (Config->get_show_editor_meter()) { + meter_box.show(); + editor_meter_peak_display.show(); + } else { + meter_box.hide(); + editor_meter_peak_display.hide(); + } + } + } int @@ -225,6 +267,13 @@ ARDOUR_UI::unload_session (bool hide_stuff) point_one_second_connection.disconnect (); point_zero_something_second_connection.disconnect(); + if (editor_meter) { + meter_box.remove(*editor_meter); + delete editor_meter; + editor_meter = 0; + editor_meter_peak_display.hide(); + } + ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false); rec_button.set_sensitive (false); @@ -497,3 +546,18 @@ ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window return false; } + +bool +ARDOUR_UI::editor_meter_peak_button_release (GdkEventButton* ev) +{ + if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier|Gtkmm2ext::Keyboard::TertiaryModifier)) { + ArdourMeter::ResetAllPeakDisplays (); + } else if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier)) { + if (_session->master_out()) { + ArdourMeter::ResetGroupPeakDisplays (_session->master_out()->route_group()); + } + } else if (_session->master_out()) { + ArdourMeter::ResetRoutePeakDisplays (_session->master_out().get()); + } + return true; +} diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index 8cb1376522..6b2c9da6fa 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -413,6 +413,15 @@ ARDOUR_UI::parameter_changed (std::string p) } else if (p == "super-rapid-clock-update") { stop_clocking (); start_clocking (); + } else if (p == "show-editor-meter") { + bool show = Config->get_show_editor_meter(); + if (editor_meter && show) { + meter_box.show(); + editor_meter_peak_display.show(); + } else if (editor_meter && !show) { + meter_box.hide(); + editor_meter_peak_display.hide(); + } } } diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index 12d3a1642f..c658160e14 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -2013,7 +2013,7 @@ framepos_t AudioClock::frame_duration_from_bbt_string (framepos_t pos, const string& str) const { if (_session == 0) { - error << "AudioClock::current_time() called with BBT mode but without session!" << endmsg; + error << "AudioClock::frame_duration_from_bbt_string() called with BBT mode but without session!" << endmsg; return 0; } diff --git a/gtk2_ardour/canvas_vars.h b/gtk2_ardour/canvas_vars.h index e2f1f42766..34116c8736 100644 --- a/gtk2_ardour/canvas_vars.h +++ b/gtk2_ardour/canvas_vars.h @@ -65,6 +65,7 @@ CANVAS_VARIABLE(canvasvar_MeasureLineBar, "measure line bar") CANVAS_VARIABLE(canvasvar_MeasureLineBeat, "measure line beat") CANVAS_VARIABLE(canvasvar_MeterBar, "meter bar") CANVAS_VARIABLE(canvasvar_MeterBridgePeakLabel, "meterbridge peaklabel") +CANVAS_VARIABLE(canvasvar_MeterColorBBC, "meter color BBC") CANVAS_VARIABLE(canvasvar_MeterColor0, "meter fill: 0") CANVAS_VARIABLE(canvasvar_MeterColor1, "meter fill: 1") CANVAS_VARIABLE(canvasvar_MeterColor2, "meter fill: 2") diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 8f992266e7..b083e851c5 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -1665,7 +1665,7 @@ VideoTimeLineDrag::motion (GdkEvent* event, bool first_move) } framecnt_t dt = adjusted_current_frame (event) - raw_grab_frame() + _pointer_frame_offset; - dt = ARDOUR_UI::instance()->video_timeline->quantify_frames_to_apv(dt); + dt = ARDOUR_UI::instance()->video_timeline->quantify_frames_to_apv(_startdrag_video_offset+dt) - _startdrag_video_offset; if (_max_backwards_drag >= 0 && dt <= - _max_backwards_drag) { dt = - _max_backwards_drag; @@ -2373,6 +2373,7 @@ CursorDrag::fake_locate (framepos_t t) framepos_t const f = _editor->playhead_cursor->current_frame; s->send_mmc_locate (f); s->send_full_time_code (f); + s->send_song_position_pointer (f); } show_verbose_cursor_time (t); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index b70d0f0664..93a53dd1d3 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -6950,7 +6950,7 @@ Editor::uncombine_regions () void Editor::toggle_midi_input_active (bool flip_others) { - bool onoff; + bool onoff = false; boost::shared_ptr<RouteList> rl (new RouteList); for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 8c67d23d36..58d7bd5fec 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -111,8 +111,12 @@ EngineControl::EngineControl () strings.clear (); strings.push_back (_("None")); +#ifdef __APPLE__ + strings.push_back (_("coremidi")); +#else strings.push_back (_("seq")); strings.push_back (_("raw")); +#endif set_popdown_strings (midi_driver_combo, strings); midi_driver_combo.set_active_text (strings.front ()); diff --git a/gtk2_ardour/export_video_dialog.cc b/gtk2_ardour/export_video_dialog.cc index 5ccfa172ea..b8f94ac55c 100644 --- a/gtk2_ardour/export_video_dialog.cc +++ b/gtk2_ardour/export_video_dialog.cc @@ -60,6 +60,7 @@ using namespace Gtk; using namespace std; using namespace PBD; using namespace ARDOUR; +using namespace VideoUtils; ExportVideoDialog::ExportVideoDialog (PublicEditor& ed, Session* s) : ArdourDialog (_("Export Video File ")) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 489564ec63..10512b24d0 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -84,7 +84,7 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int gain_slider = manage (new VSliderController (&gain_adjustment, fader_length, fader_girth, false)); } - level_meter = new LevelMeter(_session); + level_meter = new LevelMeterHBox(_session); level_meter->ButtonPress.connect_same_thread (_level_meter_connection, boost::bind (&GainMeterBase::level_meter_button_press, this, _1)); meter_metric_area.signal_button_press_event().connect (sigc::mem_fun (*this, &GainMeterBase::level_meter_button_press)); @@ -526,9 +526,12 @@ GainMeterBase::gain_changed () void GainMeterBase::set_meter_strip_name (const char * name) { + char tmp[256]; meter_metric_area.set_name (name); - meter_ticks1_area.set_name (name); - meter_ticks2_area.set_name (name); + sprintf(tmp, "Mark%sLeft", name); + meter_ticks1_area.set_name (tmp); + sprintf(tmp, "Mark%sRight", name); + meter_ticks2_area.set_name (tmp); } void @@ -1019,21 +1022,30 @@ GainMeter::get_gm_width () gint GainMeter::meter_metrics_expose (GdkEventExpose *ev) { - assert(_route); + if (!_route) { + if (_types.empty()) { _types.push_back(DataType::AUDIO); } + return meter_expose_metrics(ev, MeterPeak, _types, &meter_metric_area); + } return meter_expose_metrics(ev, _route->meter_type(), _types, &meter_metric_area); } gint GainMeter::meter_ticks1_expose (GdkEventExpose *ev) { - assert(_route); + if (!_route) { + if (_types.empty()) { _types.push_back(DataType::AUDIO); } + return meter_expose_ticks(ev, MeterPeak, _types, &meter_ticks1_area); + } return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks1_area); } gint GainMeter::meter_ticks2_expose (GdkEventExpose *ev) { - assert(_route); + if (!_route) { + if (_types.empty()) { _types.push_back(DataType::AUDIO); } + return meter_expose_ticks(ev, MeterPeak, _types, &meter_ticks2_area); + } return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks2_area); } diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h index 0c698d54ee..8286cbeb95 100644 --- a/gtk2_ardour/gain_meter.h +++ b/gtk2_ardour/gain_meter.h @@ -89,7 +89,7 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr boost::shared_ptr<PBD::Controllable> get_controllable(); - LevelMeter& get_level_meter() const { return *level_meter; } + LevelMeterHBox& get_level_meter() const { return *level_meter; } Gtkmm2ext::SliderController& get_gain_slider() const { return *gain_slider; } /** Emitted in the GUI thread when a button is pressed over the level meter; @@ -117,7 +117,7 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr Gtk::DrawingArea meter_metric_area; Gtk::DrawingArea meter_ticks1_area; Gtk::DrawingArea meter_ticks2_area; - LevelMeter *level_meter; + LevelMeterHBox *level_meter; sigc::connection gain_watching; diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index d3bb4ad5ab..6f48864992 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -22,7 +22,6 @@ #include "ardour/meter.h" #include <gtkmm2ext/utils.h> -#include <gtkmm2ext/fastmeter.h> #include <gtkmm2ext/barcontroller.h> #include "midi++/manager.h" #include "pbd/fastlog.h" @@ -44,27 +43,29 @@ using namespace Gtkmm2ext; using namespace Gtk; using namespace std; -LevelMeter::LevelMeter (Session* s) - : _meter (0) +LevelMeterBase::LevelMeterBase (Session* s, PBD::EventLoop::InvalidationRecord* ir, FastMeter::Orientation o) + : parent_invalidator(ir) + , _meter (0) + , _meter_orientation(o) + , regular_meter_width (6) , meter_length (0) , thin_meter_width(2) { set_session (s); - set_spacing (1); - Config->ParameterChanged.connect (_parameter_connection, invalidator (*this), boost::bind (&LevelMeter::parameter_changed, this, _1), gui_context()); - UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &LevelMeter::on_theme_changed)); - ColorsChanged.connect (sigc::mem_fun (*this, &LevelMeter::color_handler)); + Config->ParameterChanged.connect (_parameter_connection, parent_invalidator, boost::bind (&LevelMeterBase::parameter_changed, this, _1), gui_context()); + UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &LevelMeterBase::on_theme_changed)); + ColorsChanged.connect (sigc::mem_fun (*this, &LevelMeterBase::color_handler)); max_peak = minus_infinity(); meter_type = MeterPeak; } void -LevelMeter::on_theme_changed() +LevelMeterBase::on_theme_changed() { style_changed = true; } -LevelMeter::~LevelMeter () +LevelMeterBase::~LevelMeterBase () { for (vector<MeterInfo>::iterator i = meters.begin(); i != meters.end(); i++) { delete (*i).meter; @@ -72,7 +73,7 @@ LevelMeter::~LevelMeter () } void -LevelMeter::set_meter (PeakMeter* meter) +LevelMeterBase::set_meter (PeakMeter* meter) { _configuration_connection.disconnect(); _meter_type_connection.disconnect(); @@ -80,13 +81,13 @@ LevelMeter::set_meter (PeakMeter* meter) _meter = meter; if (_meter) { - _meter->ConfigurationChanged.connect (_configuration_connection, invalidator (*this), boost::bind (&LevelMeter::configuration_changed, this, _1, _2), gui_context()); - _meter->TypeChanged.connect (_meter_type_connection, invalidator (*this), boost::bind (&LevelMeter::meter_type_changed, this, _1), gui_context()); + _meter->ConfigurationChanged.connect (_configuration_connection, parent_invalidator, boost::bind (&LevelMeterBase::configuration_changed, this, _1, _2), gui_context()); + _meter->TypeChanged.connect (_meter_type_connection, parent_invalidator, boost::bind (&LevelMeterBase::meter_type_changed, this, _1), gui_context()); } } -static float meter_lineup(float offset) { - switch (Config->get_meter_line_up_level()) { +static float meter_lineup_cfg(MeterLineUp lul, float offset) { + switch (lul) { case MeteringLineUp24: return offset + 6.0; case MeteringLineUp20: @@ -101,20 +102,27 @@ static float meter_lineup(float offset) { return offset; } +static float meter_lineup(float offset) { + return meter_lineup_cfg(Config->get_meter_line_up_level(), offset); +} + static float vu_standard() { // note - default meter config is +2dB (france) switch (Config->get_meter_vu_standard()) { - case MeteringVUfrench: // +2dB + default: + case MeteringVUfrench: // 0VU = -2dBu return 0; - case MeteringVUamerican: // 0dB + case MeteringVUamerican: // 0VU = 0dBu return -2; - case MeteringVUstandard: // -4dB + case MeteringVUstandard: // 0VU = +4dBu return -6; + case MeteringVUeight: // 0VU = +8dBu + return -10; } } float -LevelMeter::update_meters () +LevelMeterBase::update_meters () { vector<MeterInfo>::iterator i; uint32_t n; @@ -130,7 +138,7 @@ LevelMeter::update_meters () const float mpeak = _meter->meter_level(n, MeterMaxPeak); if (mpeak > (*i).max_peak) { (*i).max_peak = mpeak; - (*i).meter->set_highlight(mpeak > Config->get_meter_peak()); + (*i).meter->set_highlight(mpeak >= Config->get_meter_peak()); } if (mpeak > max_peak) { max_peak = mpeak; @@ -145,7 +153,7 @@ LevelMeter::update_meters () } else if (meter_type == MeterIEC1NOR) { (*i).meter->set (meter_deflect_nordic (peak + meter_lineup(0))); } else if (meter_type == MeterIEC1DIN) { - (*i).meter->set (meter_deflect_din (peak + meter_lineup(3.0))); + (*i).meter->set (meter_deflect_din (peak + meter_lineup_cfg(Config->get_meter_line_up_din(), 3.0))); } else if (meter_type == MeterIEC2BBC || meter_type == MeterIEC2EBU) { (*i).meter->set (meter_deflect_ppm (peak + meter_lineup(0))); } else if (meter_type == MeterVU) { @@ -164,9 +172,9 @@ LevelMeter::update_meters () } void -LevelMeter::parameter_changed (string p) +LevelMeterBase::parameter_changed (string p) { - ENSURE_GUI_THREAD (*this, &LevelMeter::parameter_changed, p) + ENSURE_GUI_THREAD (*this, &LevelMeterBase::parameter_changed, p) if (p == "meter-hold") { vector<MeterInfo>::iterator i; @@ -180,6 +188,10 @@ LevelMeter::parameter_changed (string p) color_changed = true; setup_meters (meter_length, regular_meter_width, thin_meter_width); } + else if (p == "meter-style-led") { + color_changed = true; + setup_meters (meter_length, regular_meter_width, thin_meter_width); + } else if (p == "meter-peak") { vector<MeterInfo>::iterator i; uint32_t n; @@ -191,14 +203,14 @@ LevelMeter::parameter_changed (string p) } void -LevelMeter::configuration_changed (ChanCount /*in*/, ChanCount /*out*/) +LevelMeterBase::configuration_changed (ChanCount /*in*/, ChanCount /*out*/) { color_changed = true; setup_meters (meter_length, regular_meter_width, thin_meter_width); } void -LevelMeter::meter_type_changed (MeterType t) +LevelMeterBase::meter_type_changed (MeterType t) { meter_type = t; color_changed = true; @@ -207,18 +219,18 @@ LevelMeter::meter_type_changed (MeterType t) } void -LevelMeter::hide_all_meters () +LevelMeterBase::hide_all_meters () { for (vector<MeterInfo>::iterator i = meters.begin(); i != meters.end(); ++i) { if ((*i).packed) { - remove (*((*i).meter)); + mtr_remove (*((*i).meter)); (*i).packed = false; } } } void -LevelMeter::setup_meters (int len, int initial_width, int thin_width) +LevelMeterBase::setup_meters (int len, int initial_width, int thin_width) { hide_all_meters (); @@ -248,11 +260,17 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) meters.push_back (MeterInfo()); } - //cerr << "LevelMeter::setup_meters() called color_changed = " << color_changed << " colors: " << endl;//DEBUG + //cerr << "LevelMeterBase::setup_meters() called color_changed = " << color_changed << " colors: " << endl;//DEBUG for (int32_t n = nmeters-1; nmeters && n >= 0 ; --n) { uint32_t c[10]; + uint32_t b[4]; float stp[4]; + int styleflags = Config->get_meter_style_led() ? 3 : 1; + b[0] = ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get(); + b[1] = ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get(); + b[2] = 0x991122ff; // red highlight gradient Bot + b[3] = 0x551111ff; // red highlight gradient Top if (n < nmidi) { c[0] = ARDOUR_UI::config()->canvasvar_MidiMeterColor0.get(); c[1] = ARDOUR_UI::config()->canvasvar_MidiMeterColor1.get(); @@ -303,30 +321,44 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) c[6] = c[7] = 0xffff00ff; c[8] = c[9] = 0xff0000ff; break; - case MeterIEC2EBU: case MeterIEC2BBC: - stp[0] = 115.0 * meter_deflect_ppm(-18); - stp[1] = 115.0 * meter_deflect_ppm(-14); - stp[2] = 115.0 * meter_deflect_ppm(-10); - stp[3] = 115.0 * meter_deflect_ppm( -8); + c[0] = c[1] = c[2] = c[3] = c[4] = c[5] = c[6] = c[7] = c[8] = c[9] = + ARDOUR_UI::config()->color_by_name ("meter color BBC"); + stp[0] = stp[1] = stp[2] = stp[3] = 115.0; + break; + case MeterIEC2EBU: + stp[0] = 115.0 * meter_deflect_ppm(-24); // ignored + stp[1] = 115.0 * meter_deflect_ppm(-18); + stp[2] = 115.0 * meter_deflect_ppm( -9); + stp[3] = 115.0 * meter_deflect_ppm( 0); // ignored + c[3] = c[2] = c[1]; + c[6] = c[7] = c[8] = c[9]; break; case MeterIEC1NOR: - stp[0] = 115.0 * meter_deflect_nordic(-18); - stp[1] = 115.0 * meter_deflect_nordic(-15); + stp[0] = 115.0 * meter_deflect_nordic(-30); // ignored + stp[1] = 115.0 * meter_deflect_nordic(-18); stp[2] = 115.0 * meter_deflect_nordic(-12); - stp[3] = 115.0 * meter_deflect_nordic( -9); + stp[3] = 115.0 * meter_deflect_nordic( -9); // ignored + //c[2] = c[3] = c[1]; // dark-green + c[0] = c[1] = c[2]; // bright-green + c[6] = c[7] = c[8] = c[9]; break; case MeterIEC1DIN: - stp[0] = 115.0 * meter_deflect_din(-29); + stp[0] = 115.0 * meter_deflect_din(-29); // ignored stp[1] = 115.0 * meter_deflect_din(-18); - stp[2] = 115.0 * meter_deflect_din(-15); + stp[2] = 115.0 * meter_deflect_din(-15); // ignored stp[3] = 115.0 * meter_deflect_din( -9); + c[0] = c[1] = c[2] = c[3] = 0x00aa00ff; + c[4] = c[6]; + c[5] = c[7]; break; case MeterVU: stp[0] = 115.0 * meter_deflect_vu(-26); // -6 stp[1] = 115.0 * meter_deflect_vu(-23); // -3 stp[2] = 115.0 * meter_deflect_vu(-20); // 0 stp[3] = 115.0 * meter_deflect_vu(-18); // +2 + c[0] = c[1] = c[2] = c[3] = c[4] = c[5] = 0x00aa00ff; + c[6] = c[7] = c[8] = c[9] = 0xff8800ff; break; default: // PEAK, RMS stp[1] = 77.5; // 115 * log_meter(-10) @@ -349,56 +381,61 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) } } } - if (meters[n].width != width || meters[n].length != len || color_changed) { + if (meters[n].width != width || meters[n].length != len || color_changed || meter_type != visible_meter_type) { + bool hl = meters[n].meter ? meters[n].meter->get_highlight() : false; + meters[n].packed = false; delete meters[n].meter; - meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical, len, + meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, _meter_orientation, len, c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], - ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get(), - ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get(), - 0x991122ff, 0x551111ff, - stp[0], stp[1], stp[2], stp[3] + b[0], b[1], b[2], b[3], + stp[0], stp[1], stp[2], stp[3], + styleflags ); + meters[n].meter->set_highlight(hl); meters[n].width = width; meters[n].length = len; meters[n].meter->add_events (Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK); - meters[n].meter->signal_button_press_event().connect (sigc::mem_fun (*this, &LevelMeter::meter_button_press)); - meters[n].meter->signal_button_release_event().connect (sigc::mem_fun (*this, &LevelMeter::meter_button_release)); + meters[n].meter->signal_button_press_event().connect (sigc::mem_fun (*this, &LevelMeterBase::meter_button_press)); + meters[n].meter->signal_button_release_event().connect (sigc::mem_fun (*this, &LevelMeterBase::meter_button_release)); } - pack_end (*meters[n].meter, false, false); + //pack_end (*meters[n].meter, false, false); + mtr_pack (*meters[n].meter); meters[n].meter->show_all (); meters[n].packed = true; } - show(); + //show(); color_changed = false; + visible_meter_type = meter_type; } void -LevelMeter::set_type(MeterType t) +LevelMeterBase::set_type(MeterType t) { meter_type = t; _meter->set_type(t); } bool -LevelMeter::meter_button_press (GdkEventButton* ev) +LevelMeterBase::meter_button_press (GdkEventButton* ev) { return ButtonPress (ev); /* EMIT SIGNAL */ } bool -LevelMeter::meter_button_release (GdkEventButton* ev) +LevelMeterBase::meter_button_release (GdkEventButton* ev) { if (ev->button == 1) { clear_meters (false); } + ButtonRelease(ev); return true; } -void LevelMeter::clear_meters (bool reset_highlight) +void LevelMeterBase::clear_meters (bool reset_highlight) { for (vector<MeterInfo>::iterator i = meters.begin(); i < meters.end(); i++) { (*i).meter->clear(); @@ -409,14 +446,53 @@ void LevelMeter::clear_meters (bool reset_highlight) max_peak = minus_infinity(); } -void LevelMeter::hide_meters () +void LevelMeterBase::hide_meters () { hide_all_meters(); } void -LevelMeter::color_handler () +LevelMeterBase::color_handler () { color_changed = true; + setup_meters (meter_length, regular_meter_width, thin_meter_width); } +LevelMeterHBox::LevelMeterHBox(Session* s) + : LevelMeterBase(s, invalidator(*this)) +{ + set_spacing(1); + show(); +} + + +LevelMeterHBox::~LevelMeterHBox() {} + +void +LevelMeterHBox::mtr_pack(Gtk::Widget &w) { + pack_end (w, false, false); +} + +void +LevelMeterHBox::mtr_remove(Gtk::Widget &w) { + remove (w); +} + + +LevelMeterVBox::LevelMeterVBox(Session* s) + : LevelMeterBase(s, invalidator(*this), FastMeter::Horizontal) +{ + set_spacing(1); + show(); +} +LevelMeterVBox::~LevelMeterVBox() {} + +void +LevelMeterVBox::mtr_pack(Gtk::Widget &w) { + pack_end (w, false, false); +} + +void +LevelMeterVBox::mtr_remove(Gtk::Widget &w) { + remove (w); +} diff --git a/gtk2_ardour/level_meter.h b/gtk2_ardour/level_meter.h index ead63aa50b..a355d7d285 100644 --- a/gtk2_ardour/level_meter.h +++ b/gtk2_ardour/level_meter.h @@ -37,6 +37,7 @@ #include <gtkmm2ext/click_box.h> #include <gtkmm2ext/focus_entry.h> #include <gtkmm2ext/slider_controller.h> +#include <gtkmm2ext/fastmeter.h> #include "enums.h" @@ -44,18 +45,16 @@ namespace ARDOUR { class Session; class PeakMeter; } -namespace Gtkmm2ext { - class FastMeter; -} namespace Gtk { class Menu; } -class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr +class LevelMeterBase : public ARDOUR::SessionHandlePtr { public: - LevelMeter (ARDOUR::Session*); - ~LevelMeter (); + LevelMeterBase (ARDOUR::Session*, PBD::EventLoop::InvalidationRecord* ir, + Gtkmm2ext::FastMeter::Orientation o = Gtkmm2ext::FastMeter::Vertical); + virtual ~LevelMeterBase (); virtual void set_meter (ARDOUR::PeakMeter* meter); @@ -72,10 +71,17 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr /** Emitted in the GUI thread when a button is pressed over the meter */ PBD::Signal1<bool, GdkEventButton *> ButtonPress; + PBD::Signal1<bool, GdkEventButton *> ButtonRelease; PBD::Signal1<void, ARDOUR::MeterType> MeterTypeChanged; + protected: + virtual void mtr_pack(Gtk::Widget &w) = 0; + virtual void mtr_remove(Gtk::Widget &w) = 0; + private: + PBD::EventLoop::InvalidationRecord* parent_invalidator; ARDOUR::PeakMeter* _meter; + Gtkmm2ext::FastMeter::Orientation _meter_orientation; Width _width; @@ -101,6 +107,7 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr std::vector<MeterInfo> meters; float max_peak; ARDOUR::MeterType meter_type; + ARDOUR::MeterType visible_meter_type; PBD::ScopedConnection _configuration_connection; PBD::ScopedConnection _meter_type_connection; @@ -120,5 +127,27 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr void color_handler (); }; +class LevelMeterHBox : public LevelMeterBase, public Gtk::HBox +{ + public: + LevelMeterHBox (ARDOUR::Session*); + ~LevelMeterHBox(); + + protected: + void mtr_pack(Gtk::Widget &w); + void mtr_remove(Gtk::Widget &w); +}; + +class LevelMeterVBox : public LevelMeterBase, public Gtk::VBox +{ + public: + LevelMeterVBox (ARDOUR::Session*); + ~LevelMeterVBox(); + + protected: + void mtr_pack(Gtk::Widget &w); + void mtr_remove(Gtk::Widget &w); +}; + #endif /* __ardour_gtk_track_meter_h__ */ diff --git a/gtk2_ardour/logmeter.h b/gtk2_ardour/logmeter.h index c7b18ea6b9..a244fb4bbe 100644 --- a/gtk2_ardour/logmeter.h +++ b/gtk2_ardour/logmeter.h @@ -35,16 +35,16 @@ alt_log_meter (float power) #endif /* prototypes - avoid compiler warning */ -inline float log_meter (float db); -inline float meter_deflect_ppm (float); -inline float meter_deflect_din (float); -inline float meter_deflect_nordic (float); -inline float meter_deflect_vu (float); -inline float meter_deflect_k (float, float); +static inline float log_meter (float db); +static inline float meter_deflect_ppm (float); +static inline float meter_deflect_din (float); +static inline float meter_deflect_nordic (float); +static inline float meter_deflect_vu (float); +static inline float meter_deflect_k (float, float); -inline float +static inline float log_meter (float db) { gfloat def = 0.0f; /* Meter deflection %age */ @@ -75,7 +75,7 @@ log_meter (float db) return def/115.0f; } -inline float +static inline float meter_deflect_ppm (float db) { if (db < -30) { @@ -91,7 +91,7 @@ meter_deflect_ppm (float db) } } -inline float +static inline float meter_deflect_din (float db) { float rv = dB_to_coefficient(db); @@ -103,7 +103,7 @@ meter_deflect_din (float db) } } -inline float +static inline float meter_deflect_nordic (float db) { if (db < -60) { @@ -118,7 +118,7 @@ meter_deflect_nordic (float db) } } -inline float +static inline float meter_deflect_vu (float db) { const float rv = 6.77165f * dB_to_coefficient(db); @@ -126,7 +126,7 @@ meter_deflect_vu (float db) return rv; } -inline float +static inline float meter_deflect_k (float db, float krange) { db+=krange; diff --git a/gtk2_ardour/lv2_plugin_ui.cc b/gtk2_ardour/lv2_plugin_ui.cc index 2fe817a6a0..f9b15714f6 100644 --- a/gtk2_ardour/lv2_plugin_ui.cc +++ b/gtk2_ardour/lv2_plugin_ui.cc @@ -184,11 +184,19 @@ LV2PluginUI::LV2PluginUI(boost::shared_ptr<PluginInsert> pi, , _pi(pi) , _lv2(lv2p) , _gui_widget(NULL) - , _ardour_buttons_box(NULL) , _values(NULL) , _external_ui_ptr(NULL) , _inst(NULL) { + _ardour_buttons_box.set_spacing (6); + _ardour_buttons_box.set_border_width (6); + _ardour_buttons_box.pack_end (focus_button, false, false); + _ardour_buttons_box.pack_end (bypass_button, false, false, 10); + _ardour_buttons_box.pack_end (delete_button, false, false); + _ardour_buttons_box.pack_end (save_button, false, false); + _ardour_buttons_box.pack_end (add_button, false, false); + _ardour_buttons_box.pack_end (_preset_combo, false, false); + _ardour_buttons_box.pack_end (_preset_modified, false, false); } void @@ -219,18 +227,11 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title) features[features_count - 1] = &_external_ui_feature; features[features_count] = NULL; } else { - _ardour_buttons_box = manage (new Gtk::HBox); - _ardour_buttons_box->set_spacing (6); - _ardour_buttons_box->set_border_width (6); - _ardour_buttons_box->pack_end (focus_button, false, false); - _ardour_buttons_box->pack_end (bypass_button, false, false, 10); - _ardour_buttons_box->pack_end (delete_button, false, false); - _ardour_buttons_box->pack_end (save_button, false, false); - _ardour_buttons_box->pack_end (add_button, false, false); - _ardour_buttons_box->pack_end (_preset_combo, false, false); - _ardour_buttons_box->pack_end (_preset_modified, false, false); - _ardour_buttons_box->show_all(); - pack_start(*_ardour_buttons_box, false, false); + if (_ardour_buttons_box.get_parent()) { + _ardour_buttons_box.get_parent()->remove(_ardour_buttons_box); + } + pack_start(_ardour_buttons_box, false, false); + _ardour_buttons_box.show_all(); _gui_widget = Gtk::manage((container = new Gtk::Alignment())); pack_start(*_gui_widget, true, true); diff --git a/gtk2_ardour/lv2_plugin_ui.h b/gtk2_ardour/lv2_plugin_ui.h index 9bf8c3d92b..edb90cb154 100644 --- a/gtk2_ardour/lv2_plugin_ui.h +++ b/gtk2_ardour/lv2_plugin_ui.h @@ -73,7 +73,7 @@ class LV2PluginUI : public PlugUIBase, public Gtk::VBox sigc::connection _screen_update_connection; Gtk::Widget* _gui_widget; /** a box containing the focus, bypass, delete, save / add preset buttons etc. */ - Gtk::HBox* _ardour_buttons_box; + Gtk::HBox _ardour_buttons_box; float* _values; std::vector<ControllableRef> _controllables; struct lv2_external_ui_host _external_ui_host; diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 193039b3eb..f392dc0872 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -52,15 +52,17 @@ sigc::signal<void, int, ARDOUR::RouteGroup*, ARDOUR::MeterType> ArdourMeter::Set /* pattern cache */ struct MeterMatricsMapKey { - MeterMatricsMapKey (std::string n, MeterType t) + MeterMatricsMapKey (std::string n, MeterType t, int dt) : _n(n) , _t(t) + , _dt(dt) {} inline bool operator<(const MeterMatricsMapKey& rhs) const { - return (_n < rhs._n) || (_n == rhs._n && _t < rhs._t); + return (_n < rhs._n) || (_n == rhs._n && _t < rhs._t) || (_n == rhs._n && _t == rhs._t && _dt < rhs._dt); } std::string _n; MeterType _t; + int _dt; }; namespace ArdourMeter { @@ -108,6 +110,14 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) } } +static inline int types_to_bit (vector<ARDOUR::DataType> types) { + int rv = 0; + for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) { + rv |= 1 << (*i); + } + return rv; +} + static inline float mtr_col_and_fract( cairo_t* cr, Gdk::Color const * const c, const uint32_t peakcolor, const MeterType mt, const float val) { @@ -130,18 +140,12 @@ static inline float mtr_col_and_fract( case MeterIEC2BBC: case MeterIEC2EBU: fraction = meter_deflect_ppm(val); - if (val >= -10.0) { - cairo_set_source_rgb (cr, - UINT_RGBA_R_FLT(peakcolor), - UINT_RGBA_G_FLT(peakcolor), - UINT_RGBA_B_FLT(peakcolor)); - } else { - cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); - } + cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); break; case MeterIEC1NOR: fraction = meter_deflect_nordic(val); - if (val >= -12.0) { +#if 0 + if (val == -18.0) { cairo_set_source_rgb (cr, UINT_RGBA_R_FLT(peakcolor), UINT_RGBA_G_FLT(peakcolor), @@ -149,10 +153,13 @@ static inline float mtr_col_and_fract( } else { cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); } +#else + cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); +#endif break; case MeterIEC1DIN: fraction = meter_deflect_din(val); - if (val >= -9.0) { + if (val == -9.0 || val == -15 || val == -18) { cairo_set_source_rgb (cr, UINT_RGBA_R_FLT(peakcolor), UINT_RGBA_G_FLT(peakcolor), @@ -196,6 +203,65 @@ static inline float mtr_col_and_fract( return fraction; } +static void mtr_red_stripe(cairo_t* cr, float l, float w, int h, float top, float bot) { + if (w <= 0) return; + int t = h - floorf (h * (top)); + int b = h - floorf (h * (bot)); + cairo_set_source_rgba (cr, .75, 0, 0, 0.75); + cairo_rectangle (cr, l, t + .5, w, b - t); + cairo_fill (cr); +} + +static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { + float r,g,b; + switch(type) { + case MeterVU: + if (rgba_p_from_style("meterstripVU", &r, &g, &b, "bg")) { + cairo_set_source_rgb (cr, r, g, b); + } else { + cairo_set_source_rgb (cr, 1.0, 1.0, 0.85); + } + break; + case MeterIEC1DIN: + case MeterIEC1NOR: + case MeterIEC2BBC: + case MeterIEC2EBU: + case MeterK14: + case MeterK20: + if (rgba_p_from_style("meterstripPPM", &r, &g, &b, "bg")) { + cairo_set_source_rgb (cr, r, g, b); + } else { + cairo_set_source_rgb (cr, 0.1, 0.1, 0.1); + } + break; + default: + { + Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_ACTIVE); + cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); + } + break; + } +} + +static void set_fg_color(Gtk::Widget&, MeterType type, Gdk::Color * c) { + float r,g,b; + switch(type) { + case MeterVU: + if (rgba_p_from_style("meterstripVU", &r, &g, &b)) { + c->set_rgb_p(r, g, b); + } else { + c->set_rgb_p(0.0, 0.0, 0.0); + } + break; + default: + if (rgba_p_from_style("meterstripPPM", &r, &g, &b)) { + c->set_rgb_p(r, g, b); + } else { + c->set_rgb_p(1.0, 1.0, 1.0); + } + break; + } +} static cairo_pattern_t* meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> types) @@ -203,19 +269,45 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ Glib::RefPtr<Gdk::Window> win (w.get_window()); bool background; + bool tickleft, tickright; gint width, height; win->get_size (width, height); - background = types.size() == 0 - || w.get_name().substr(w.get_name().length() - 4) == "Left" - || w.get_name().substr(w.get_name().length() - 5) == "Right"; + tickleft = w.get_name().substr(w.get_name().length() - 4) == "Left"; + tickright = w.get_name().substr(w.get_name().length() - 5) == "Right"; + background = types.size() == 0 || tickleft || tickright; + + float box_l=0; + float box_w=0; + if (tickleft) { + if (w.get_name().substr(0, 3) == "Bar") { + box_l = width-2; box_w = 2; + } else if (w.get_name().substr(0, 4) == "Mark") { + box_l = width-2; box_w = 2; + background = false; + } + } else if (tickright) { + if (w.get_name().substr(0, 3) == "Bar") { + box_l = 0; box_w = 2; + } else if (w.get_name().substr(0, 4) == "Mark") { + box_l = 0; box_w = 2; + background = false; + } + } else { + box_l = 0; box_w = 3; + } cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); cairo_t* cr = cairo_create (surface); cairo_move_to (cr, 0, 0); cairo_rectangle (cr, 0, 0, width, height); - { - Gdk::Color c = w.get_style()->get_bg (background ? Gtk::STATE_ACTIVE : Gtk::STATE_NORMAL); + + if (background) { + /* meterbridge */ + set_bg_color(w, cr, type); + } else { + /* mixer */ + Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_NORMAL); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } cairo_fill (cr); @@ -226,23 +318,13 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) { Gdk::Color c; - c = w.get_style()->get_fg (Gtk::STATE_NORMAL); - - if (types.size() > 1) { + if (types.size() > 1 && (*i) == DataType::MIDI) { /* we're overlaying more than 1 set of marks, so use different colours */ - switch (*i) { - case DataType::AUDIO: - c = w.get_style()->get_fg (Gtk::STATE_NORMAL); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - break; - case DataType::MIDI: - c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - break; - } + c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); + } else if (background) { + set_fg_color(w, type, &c); } else { c = w.get_style()->get_fg (Gtk::STATE_NORMAL); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } // tick-maker position in dBFS, line-thickness @@ -259,10 +341,11 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ points.insert (std::pair<float,float>(-24.0f, 1.0)); points.insert (std::pair<float,float>(-20.0f, 1.0)); points.insert (std::pair<float,float>(-17.0f, 1.0)); - points.insert (std::pair<float,float>(-14.0f, 1.0)); - points.insert (std::pair<float,float>(-11.0f, 1.0)); - points.insert (std::pair<float,float>( -8.0f, 1.0)); - points.insert (std::pair<float,float>( -4.0f, 1.0)); + points.insert (std::pair<float,float>(-14.0f, 1.0)); // 0 + points.insert (std::pair<float,float>(-11.0f, 1.0)); // +3 + points.insert (std::pair<float,float>(-10.0f, 0.8)); // +4 + points.insert (std::pair<float,float>( -8.0f, 1.0)); // +6 + points.insert (std::pair<float,float>( -4.0f, 1.0)); // +10 points.insert (std::pair<float,float>( 0.0f, 1.0)); break; case MeterK20: @@ -272,12 +355,13 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ points.insert (std::pair<float,float>(-30.0f, 1.0)); points.insert (std::pair<float,float>(-26.0f, 1.0)); points.insert (std::pair<float,float>(-23.0f, 1.0)); - points.insert (std::pair<float,float>(-20.0f, 1.0)); + points.insert (std::pair<float,float>(-20.0f, 1.0)); // 0 points.insert (std::pair<float,float>(-17.0f, 1.0)); - points.insert (std::pair<float,float>(-14.0f, 1.0)); + points.insert (std::pair<float,float>(-16.0f, 0.8)); + points.insert (std::pair<float,float>(-14.0f, 1.0)); // +6 points.insert (std::pair<float,float>(-10.0f, 1.0)); points.insert (std::pair<float,float>( -5.0f, 1.0)); - points.insert (std::pair<float,float>( 0.0f, 1.0)); + points.insert (std::pair<float,float>( 0.0f, 1.0)); //+20 break; case MeterIEC2EBU: points.insert (std::pair<float,float>(-30.0f, 1.0)); @@ -291,7 +375,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ points.insert (std::pair<float,float>(-14.0f, 1.0)); points.insert (std::pair<float,float>(-12.0f, 0.5)); points.insert (std::pair<float,float>(-10.0f, 1.0)); - points.insert (std::pair<float,float>( -9.0f, 0.5)); + points.insert (std::pair<float,float>( -9.0f, 0.8)); points.insert (std::pair<float,float>( -8.0f, 0.5)); points.insert (std::pair<float,float>( -6.0f, 1.0)); break; @@ -315,44 +399,66 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ points.insert (std::pair<float,float>(-39.0f, 0.5)); points.insert (std::pair<float,float>(-36.0f, 1.0)); - points.insert (std::pair<float,float>(-33.0f, 1.0)); + points.insert (std::pair<float,float>(-33.0f, 0.5)); points.insert (std::pair<float,float>(-30.0f, 1.0)); - points.insert (std::pair<float,float>(-27.0f, 1.0)); + points.insert (std::pair<float,float>(-27.0f, 0.5)); points.insert (std::pair<float,float>(-24.0f, 1.0)); - points.insert (std::pair<float,float>(-21.0f, 1.0)); + points.insert (std::pair<float,float>(-21.0f, 0.5)); points.insert (std::pair<float,float>(-18.0f, 1.0)); - points.insert (std::pair<float,float>(-15.0f, 1.0)); + points.insert (std::pair<float,float>(-15.0f, 0.5)); points.insert (std::pair<float,float>(-12.0f, 1.0)); points.insert (std::pair<float,float>( -9.0f, 1.0)); - points.insert (std::pair<float,float>( -6.0f, 1.0)); + points.insert (std::pair<float,float>( -6.0f, 0.5)); + mtr_red_stripe(cr, box_l, box_w, height, + meter_deflect_nordic(-6.0f), meter_deflect_nordic(-12.0f)); break; case MeterIEC1DIN: points.insert (std::pair<float,float>( -3.0f, 0.5)); // "200%" - points.insert (std::pair<float,float>( -4.0f, 1.0)); // "100%" - points.insert (std::pair<float,float>( -9.0f, 1.0)); + points.insert (std::pair<float,float>( -4.0f, 1.0)); + points.insert (std::pair<float,float>( -5.0f, 0.5)); + points.insert (std::pair<float,float>( -6.0f, 0.5)); + points.insert (std::pair<float,float>( -7.0f, 0.5)); + points.insert (std::pair<float,float>( -8.0f, 0.5)); + points.insert (std::pair<float,float>( -9.0f, 1.0)); // "100%" + points.insert (std::pair<float,float>(-10.0f, 0.5)); + points.insert (std::pair<float,float>(-11.0f, 0.5)); + points.insert (std::pair<float,float>(-12.0f, 0.5)); + points.insert (std::pair<float,float>(-13.0f, 0.5)); points.insert (std::pair<float,float>(-14.0f, 1.0)); - points.insert (std::pair<float,float>(-15.0f, 0.5)); // "50%" - points.insert (std::pair<float,float>(-18.0f, 0.5)); // "-9" - points.insert (std::pair<float,float>(-19.0f, 1.0)); // "30%" - points.insert (std::pair<float,float>(-29.0f, 1.0)); // "10%" - points.insert (std::pair<float,float>(-35.0f, 0.5)); // "5%" " -20" - points.insert (std::pair<float,float>(-39.0f, 1.0)); // "3%" - points.insert (std::pair<float,float>(-49.0f, 0.5)); // "1%" + points.insert (std::pair<float,float>(-15.0f, 0.8)); // "50%" + points.insert (std::pair<float,float>(-18.0f, 0.8)); // "-9" + points.insert (std::pair<float,float>(-19.0f, 1.0)); + points.insert (std::pair<float,float>(-24.0f, 0.5)); + points.insert (std::pair<float,float>(-29.0f, 1.0)); // "-20", "10%" + points.insert (std::pair<float,float>(-34.0f, 0.5)); // -25 + //points.insert (std::pair<float,float>(-35.0f, 0.5)); // "5%" " -20" + points.insert (std::pair<float,float>(-39.0f, 1.0)); + points.insert (std::pair<float,float>(-49.0f, 1.0)); + points.insert (std::pair<float,float>(-54.0f, 0.5)); points.insert (std::pair<float,float>(-59.0f, 1.0)); + mtr_red_stripe(cr, box_l, box_w, height, + meter_deflect_din(0.0f), meter_deflect_din(-9.0f)); break; case MeterVU: - points.insert (std::pair<float,float>(-17.0f, 1.0)); + points.insert (std::pair<float,float>(-17.0f, 1.0)); //+3 VU points.insert (std::pair<float,float>(-18.0f, 1.0)); points.insert (std::pair<float,float>(-19.0f, 1.0)); - points.insert (std::pair<float,float>(-20.0f, 1.0)); + points.insert (std::pair<float,float>(-19.5f, 0.5)); + points.insert (std::pair<float,float>(-20.0f, 1.0)); // 0 VU + points.insert (std::pair<float,float>(-20.5f, 0.5)); points.insert (std::pair<float,float>(-21.0f, 1.0)); points.insert (std::pair<float,float>(-22.0f, 1.0)); - points.insert (std::pair<float,float>(-23.0f, 1.0)); + points.insert (std::pair<float,float>(-23.0f, 1.0)); //-3 VU + points.insert (std::pair<float,float>(-24.0f, 0.5)); points.insert (std::pair<float,float>(-25.0f, 1.0)); - points.insert (std::pair<float,float>(-27.0f, 1.0)); + points.insert (std::pair<float,float>(-26.0f, 0.5)); + points.insert (std::pair<float,float>(-27.0f, 1.0)); //-7 VU points.insert (std::pair<float,float>(-30.0f, 1.0)); + points.insert (std::pair<float,float>(-35.0f, 0.5)); points.insert (std::pair<float,float>(-40.0f, 1.0)); + mtr_red_stripe(cr, box_l, box_w, height, + meter_deflect_vu(-17.0f), meter_deflect_vu(-20.0f)); break; default: @@ -433,6 +539,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ fraction = (j->first) / 127.0; pos = 1 + height - (gint) floor (height * fraction); pos = min (pos, height); + cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); cairo_arc(cr, 1.5, pos + .5, 1.0, 0, 2 * M_PI); cairo_fill(cr); break; @@ -455,6 +562,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) bool tickleft, tickright; bool background; + int overlay_midi = 1; gint width, height; win->get_size (width, height); @@ -500,8 +608,12 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) cairo_move_to (cr, 0, 0); cairo_rectangle (cr, 0, 0, width, height); - { - Gdk::Color c = w.get_style()->get_bg (background ? Gtk::STATE_ACTIVE : Gtk::STATE_NORMAL); + if (background) { + /* meterbridge */ + set_bg_color(w, cr, type); + } else { + /* mixer */ + Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_NORMAL); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } cairo_fill (cr); @@ -510,56 +622,52 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) height = min(max_pattern_metric_size, height); uint32_t peakcolor = ARDOUR_UI::config()->color_by_name ("meterbridge peaklabel"); + Gdk::Color c; // default text color for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) { - Gdk::Color c; - if (types.size() > 1) { + if (types.size() > 1 && (*i) == DataType::MIDI && overlay_midi == 0) { + continue; + } + + if (types.size() > 1 && (*i) == DataType::MIDI) { /* we're overlaying more than 1 set of marks, so use different colours */ - switch (*i) { - case DataType::AUDIO: - c = w.get_style()->get_fg (Gtk::STATE_NORMAL); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - break; - case DataType::MIDI: - c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - break; - } + c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); + } else if (background) { + set_fg_color(w, type, &c); } else { c = w.get_style()->get_fg (Gtk::STATE_NORMAL); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } - - // label-pos in dBFS, label-text - std::map<float,string> points; + std::map<float,string> points; // map: label-pos in dBFS, label-text switch (*i) { case DataType::AUDIO: layout->set_attributes (audio_font_attributes); switch (type) { case MeterK14: + overlay_midi = 0; points.insert (std::pair<float,string>(-54.0f, "-40")); points.insert (std::pair<float,string>(-44.0f, "-30")); points.insert (std::pair<float,string>(-34.0f, "-20")); points.insert (std::pair<float,string>(-24.0f, "-10")); points.insert (std::pair<float,string>(-20.0f, "-6")); points.insert (std::pair<float,string>(-17.0f, "-3")); - points.insert (std::pair<float,string>(-14.0f, "0")); + points.insert (std::pair<float,string>(-14.0f, " 0")); points.insert (std::pair<float,string>(-11.0f, "+3")); points.insert (std::pair<float,string>( -8.0f, "+6")); points.insert (std::pair<float,string>( -4.0f, "+10")); points.insert (std::pair<float,string>( 0.0f, "+14")); break; case MeterK20: + overlay_midi = 0; points.insert (std::pair<float,string>(-60.0f, "-40")); points.insert (std::pair<float,string>(-50.0f, "-30")); points.insert (std::pair<float,string>(-40.0f, "-20")); points.insert (std::pair<float,string>(-30.0f, "-10")); points.insert (std::pair<float,string>(-26.0f, "-6")); points.insert (std::pair<float,string>(-23.0f, "-3")); - points.insert (std::pair<float,string>(-20.0f, "0")); + points.insert (std::pair<float,string>(-20.0f, " 0")); points.insert (std::pair<float,string>(-17.0f, "+3")); points.insert (std::pair<float,string>(-14.0f, "+6")); points.insert (std::pair<float,string>(-10.0f, "+10")); @@ -590,6 +698,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) break; case MeterIEC2EBU: + overlay_midi = 3; points.insert (std::pair<float,string>(-30.0f, "-12")); points.insert (std::pair<float,string>(-26.0f, "-8")); points.insert (std::pair<float,string>(-22.0f, "-4")); @@ -600,6 +709,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) break; case MeterIEC2BBC: + overlay_midi = 3; points.insert (std::pair<float,string>(-30.0f, " 1 ")); points.insert (std::pair<float,string>(-26.0f, " 2 ")); points.insert (std::pair<float,string>(-22.0f, " 3 ")); @@ -610,45 +720,48 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) break; case MeterIEC1NOR: + overlay_midi = 0; //points.insert (std::pair<float,string>(-60.0f, "-42")); points.insert (std::pair<float,string>(-54.0f, "-36")); points.insert (std::pair<float,string>(-48.0f, "-30")); points.insert (std::pair<float,string>(-42.0f, "-24")); points.insert (std::pair<float,string>(-36.0f, "-18")); - points.insert (std::pair<float,string>(-33.0f, "-15")); + //points.insert (std::pair<float,string>(-33.0f, "-15")); points.insert (std::pair<float,string>(-30.0f, "-12")); - points.insert (std::pair<float,string>(-27.0f, "-9")); + //points.insert (std::pair<float,string>(-27.0f, "-9")); points.insert (std::pair<float,string>(-24.0f, "-6")); - points.insert (std::pair<float,string>(-21.0f, "-3")); + //points.insert (std::pair<float,string>(-21.0f, "-3")); points.insert (std::pair<float,string>(-18.0f, "TST")); - points.insert (std::pair<float,string>(-15.0f, "+3")); + //points.insert (std::pair<float,string>(-15.0f, "+3")); points.insert (std::pair<float,string>(-12.0f, "+6")); points.insert (std::pair<float,string>( -9.0f, "+9")); - points.insert (std::pair<float,string>( -6.0f, "+12")); + //points.insert (std::pair<float,string>( -6.0f, "+12")); break; case MeterIEC1DIN: + overlay_midi = 2; //points.insert (std::pair<float,string>( -3.0f, "200%")); - points.insert (std::pair<float,string>( -4.0f, "+5")); // "100%" - points.insert (std::pair<float,string>( -9.0f, "0")); + points.insert (std::pair<float,string>( -4.0f, "+5")); + points.insert (std::pair<float,string>( -9.0f, "0")); // "100%"; points.insert (std::pair<float,string>(-14.0f, "-5")); //points.insert (std::pair<float,string>(-15.0f, "50%")); //points.insert (std::pair<float,string>(-18.0f, "-9")); points.insert (std::pair<float,string>(-19.0f, "-10")); // "30%" points.insert (std::pair<float,string>(-29.0f, "-20")); // "10%" - //points.insert (std::pair<float,string>(-35.0f, "-20")); // "5%" - points.insert (std::pair<float,string>(-39.0f, "-30")); // "3%" + //points.insert (std::pair<float,string>(-35.0f, "5%")); // "5%" + points.insert (std::pair<float,string>(-39.0f, "-30")); //points.insert (std::pair<float,string>(-49.0f, "1%")); points.insert (std::pair<float,string>(-59.0f, "-50")); break; case MeterVU: + overlay_midi = 0; points.insert (std::pair<float,string>(-17.0f, "+3")); points.insert (std::pair<float,string>(-18.0f, "+2")); points.insert (std::pair<float,string>(-19.0f, "+1")); - points.insert (std::pair<float,string>(-20.0f, "0")); + points.insert (std::pair<float,string>(-20.0f, " 0")); points.insert (std::pair<float,string>(-21.0f, "-1")); points.insert (std::pair<float,string>(-22.0f, "-2")); points.insert (std::pair<float,string>(-23.0f, "-3")); @@ -661,8 +774,8 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) break; case DataType::MIDI: layout->set_attributes (midi_font_attributes); - points.insert (std::pair<float,string>( 0, "0")); if (types.size() == 1) { + points.insert (std::pair<float,string>( 0, "0")); points.insert (std::pair<float,string>( 16, "16")); points.insert (std::pair<float,string>( 32, "32")); points.insert (std::pair<float,string>( 48, "48")); @@ -672,16 +785,40 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) points.insert (std::pair<float,string>(100, "100")); points.insert (std::pair<float,string>(112, "112")); } else { - /* labels that don't overlay with dB */ - points.insert (std::pair<float,string>( 24, "24")); - points.insert (std::pair<float,string>( 48, "48")); - points.insert (std::pair<float,string>( 72, "74")); + switch (overlay_midi) { + case 1: + /* labels that don't overlay with dBFS */ + points.insert (std::pair<float,string>( 0, "0")); + points.insert (std::pair<float,string>( 24, "24")); + points.insert (std::pair<float,string>( 48, "48")); + points.insert (std::pair<float,string>( 72, "72")); + points.insert (std::pair<float,string>(127, "127")); + break; + case 2: + /* labels that don't overlay with DIN */ + points.insert (std::pair<float,string>( 0, "0")); + points.insert (std::pair<float,string>( 16, "16")); + points.insert (std::pair<float,string>( 40, "40")); + points.insert (std::pair<float,string>( 64, "64")); + points.insert (std::pair<float,string>(112, "112")); + points.insert (std::pair<float,string>(127, "127")); + break; + case 3: + /* labels that don't overlay with BBC nor EBU*/ + points.insert (std::pair<float,string>( 0, "0")); + points.insert (std::pair<float,string>( 16, "16")); + points.insert (std::pair<float,string>( 56, "56")); + points.insert (std::pair<float,string>( 72, "72")); + points.insert (std::pair<float,string>(112, "112")); + points.insert (std::pair<float,string>(127, "127")); + default: + break; + } } - points.insert (std::pair<float,string>(127, "127")); break; } - gint pos; + gint pos = -1; for (std::map<float,string>::const_iterator j = points.begin(); j != points.end(); ++j) { float fraction = 0; @@ -708,6 +845,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) fraction = (j->first) / 127.0; pos = 1 + height - (gint) rintf (height * fraction); pos = min (pos, height); + cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); if (tickleft) { cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI); cairo_fill(cr); @@ -718,6 +856,8 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) break; } + if (pos < 0) continue; + layout->set_text(j->second.c_str()); int tw, th; @@ -732,12 +872,26 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) } else { cairo_move_to (cr, width-3-tw, p); } + + cairo_set_line_width(cr, 0.12); + cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0); + pango_cairo_layout_path(cr, layout->gobj()); + cairo_stroke_preserve (cr); + cairo_set_line_width(cr, 1.0); + + if ((*i) == DataType::AUDIO) { + mtr_col_and_fract(cr, &c, peakcolor, type, j->first); + } else { + cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); + } + pango_cairo_show_layout (cr, layout->gobj()); + cairo_new_path(cr); } } // add legend - if (types.size() == 1) { + if (types.size() == 1 || overlay_midi == 0) { int tw, th; layout->set_attributes (unit_font_attributes); switch (types.at(0)) { @@ -777,7 +931,9 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) layout->get_pixel_size(tw, th); break; } - Gdk::Color c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); + if (!background) { + c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); + } cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); if (tickleft) { cairo_move_to (cr, width - 2 - tw, height - th - 0.5); @@ -809,7 +965,7 @@ ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, MeterType type, std::vector cairo_clip (cr); cairo_pattern_t* pattern; - const MeterMatricsMapKey key (mta->get_name(), type); + const MeterMatricsMapKey key (mta->get_name(), type, types_to_bit(types)); MetricPatternMap::iterator i = ticks_patterns.find (key); if (i == ticks_patterns.end()) { @@ -847,7 +1003,7 @@ ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, MeterType type, std::vect cairo_clip (cr); cairo_pattern_t* pattern; - const MeterMatricsMapKey key (mma->get_name(), type); + const MeterMatricsMapKey key (mma->get_name(), type, types_to_bit(types)); MetricPatternMap::iterator i = metric_patterns.find (key); if (i == metric_patterns.end()) { diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 4e4ffe11cf..703870ecef 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -56,6 +56,7 @@ using namespace ArdourMeter; PBD::Signal1<void,MeterStrip*> MeterStrip::CatchDeletion; PBD::Signal0<void> MeterStrip::MetricChanged; +PBD::Signal0<void> MeterStrip::ConfigurationChanged; MeterStrip::MeterStrip (int metricmode, MeterType mt) : AxisView(0) @@ -63,9 +64,14 @@ MeterStrip::MeterStrip (int metricmode, MeterType mt) { level_meter = 0; _strip_type = 0; - set_spacing(2); + _tick_bar = 0; + _metricmode = -1; + metric_type = MeterPeak; + mtr_vbox.set_spacing(2); + nfo_vbox.set_spacing(2); peakbx.set_size_request(-1, 14); namebx.set_size_request(18, 52); + spacer.set_size_request(-1,0); set_metric_mode(metricmode, mt); @@ -76,15 +82,30 @@ MeterStrip::MeterStrip (int metricmode, MeterType mt) meterbox.pack_start(meter_metric_area, true, false); - pack_start (peakbx, false, false); - pack_start (meterbox, true, true); - pack_start (btnbox, false, false); - pack_start (namebx, false, false); + mtr_vbox.pack_start (peakbx, false, false); + mtr_vbox.pack_start (meterbox, true, true); + mtr_vbox.pack_start (spacer, false, false); + mtr_container.add(mtr_vbox); + + mtr_hsep.set_size_request(-1,1); + mtr_hsep.set_name("BlackSeparator"); + + nfo_vbox.pack_start (mtr_hsep, false, false); + nfo_vbox.pack_start (btnbox, false, false); + nfo_vbox.pack_start (namebx, false, false); + + pack_start (mtr_container, true, true); + pack_start (nfo_vbox, false, false); peakbx.show(); btnbox.show(); meter_metric_area.show(); meterbox.show(); + spacer.show(); + mtr_vbox.show(); + mtr_container.show(); + mtr_hsep.show(); + nfo_vbox.show(); UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &MeterStrip::on_theme_changed)); ColorsChanged.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed)); @@ -97,11 +118,15 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt) , _route(rt) , peak_display() { - set_spacing(2); + mtr_vbox.set_spacing(2); + nfo_vbox.set_spacing(2); RouteUI::set_route (rt); SessionHandlePtr::set_session (sess); _has_midi = false; + _tick_bar = 0; + _metricmode = -1; + metric_type = MeterPeak; int meter_width = 6; if (_route->shared_peak_meter()->input_streams().n_total() == 1) { @@ -109,12 +134,12 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt) } // level meter + ticks - level_meter = new LevelMeter(sess); + level_meter = new LevelMeterHBox(sess); level_meter->set_meter (_route->shared_peak_meter().get()); level_meter->clear_meters(); level_meter->set_type (_route->meter_type()); level_meter->setup_meters (220, meter_width, 6); - level_meter->ButtonPress.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::level_meter_button_press, this, _1)); + level_meter->ButtonRelease.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::level_meter_button_release, this, _1)); level_meter->MeterTypeChanged.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::meter_type_changed, this, _1)); meter_align.set(0.5, 0.5, 0.0, 1.0); @@ -147,6 +172,7 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt) name_label.set_size_request(18, 50); name_label.set_alignment(-1.0, .5); ARDOUR_UI::instance()->set_tip (name_label, _route->name()); + ARDOUR_UI::instance()->set_tip (*level_meter, _route->name()); namebx.set_size_request(18, 52); namebx.pack_start(name_label, true, false, 3); @@ -170,24 +196,42 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt) mutebox.set_size_request(16, 16); solobox.set_size_request(16, 16); recbox.set_size_request(16, 16); + spacer.set_size_request(-1,0); update_button_box(); update_name_box(); + update_background (_route->meter_type()); + + mtr_vbox.pack_start (peakbx, false, false); + mtr_vbox.pack_start (meterbox, true, true); + mtr_vbox.pack_start (spacer, false, false); + mtr_container.add(mtr_vbox); + + mtr_hsep.set_size_request(-1,1); + mtr_hsep.set_name("BlackSeparator"); + + nfo_vbox.pack_start (mtr_hsep, false, false); + nfo_vbox.pack_start (btnbox, false, false); + nfo_vbox.pack_start (namebx, false, false); + + pack_start (mtr_container, true, true); + pack_start (nfo_vbox, false, false); - pack_start (peakbx, false, false); - pack_start (meterbox, true, true); - pack_start (btnbox, false, false); - pack_start (namebx, false, false); name_label.show(); peak_display.show(); peakbx.show(); meter_ticks1_area.show(); meter_ticks2_area.show(); meterbox.show(); + spacer.show(); level_meter->show(); meter_align.show(); peak_align.show(); btnbox.show(); + mtr_vbox.show(); + mtr_container.show(); + mtr_hsep.show(); + nfo_vbox.show(); _route->shared_peak_meter()->ConfigurationChanged.connect ( route_connections, invalidator (*this), boost::bind (&MeterStrip::meter_configuration_changed, this, _1), gui_context() @@ -210,6 +254,7 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt) _route->PropertyChanged.connect (route_connections, invalidator (*this), boost::bind (&MeterStrip::strip_property_changed, this, _1), gui_context()); peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &MeterStrip::peak_button_release), false); + name_label.signal_button_release_event().connect (sigc::mem_fun(*this, &MeterStrip::name_label_button_release), false); UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &MeterStrip::on_theme_changed)); ColorsChanged.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed)); @@ -235,8 +280,10 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt) MeterStrip::~MeterStrip () { - delete level_meter; - CatchDeletion (this); + if (level_meter) { + delete level_meter; + CatchDeletion (this); + } } void @@ -303,6 +350,9 @@ MeterStrip::strip_property_changed (const PropertyChange& what_changed) ENSURE_GUI_THREAD (*this, &MeterStrip::strip_name_changed, what_changed) name_label.set_text(_route->name()); ARDOUR_UI::instance()->set_tip (name_label, _route->name()); + if (level_meter) { + ARDOUR_UI::instance()->set_tip (*level_meter, _route->name()); + } } void @@ -347,13 +397,13 @@ MeterStrip::meter_configuration_changed (ChanCount c) if (boost::dynamic_pointer_cast<AudioTrack>(_route) == 0 && boost::dynamic_pointer_cast<MidiTrack>(_route) == 0 ) { - meter_ticks1_area.set_name ("AudioBusMetricsLeft"); - meter_ticks2_area.set_name ("AudioBusMetricsRight"); + meter_ticks1_area.set_name ("MyAudioBusMetricsLeft"); + meter_ticks2_area.set_name ("MyAudioBusMetricsRight"); _has_midi = false; } else if (type == (1 << DataType::AUDIO)) { - meter_ticks1_area.set_name ("AudioTrackMetricsLeft"); - meter_ticks2_area.set_name ("AudioTrackMetricsRight"); + meter_ticks1_area.set_name ("MyAudioTrackMetricsLeft"); + meter_ticks2_area.set_name ("MyAudioTrackMetricsRight"); _has_midi = false; } else if (type == (1 << DataType::MIDI)) { @@ -365,9 +415,40 @@ MeterStrip::meter_configuration_changed (ChanCount c) meter_ticks2_area.set_name ("AudioMidiTrackMetricsRight"); _has_midi = true; } + set_tick_bar(_tick_bar); - if (old_has_midi != _has_midi) MetricChanged(); on_theme_changed(); + if (old_has_midi != _has_midi) MetricChanged(); + else ConfigurationChanged(); +} + +void +MeterStrip::set_tick_bar (int m) +{ + std::string n; + _tick_bar = m; + if (_tick_bar & 1) { + n = meter_ticks1_area.get_name(); + if (n.substr(0,3) != "Bar") { + meter_ticks1_area.set_name("Bar" + n); + } + } else { + n = meter_ticks1_area.get_name(); + if (n.substr(0,3) == "Bar") { + meter_ticks1_area.set_name(n.substr(3,-1)); + } + } + if (_tick_bar & 2) { + n = meter_ticks2_area.get_name(); + if (n.substr(0,3) != "Bar") { + meter_ticks2_area.set_name("Bar" + n); + } + } else { + n = meter_ticks2_area.get_name(); + if (n.substr(0,3) == "Bar") { + meter_ticks2_area.set_name(n.substr(3,-1)); + } + } } void @@ -380,9 +461,31 @@ void MeterStrip::on_size_allocate (Gtk::Allocation& a) { const int wh = a.get_height(); - int nh = ceilf(wh * .11f); - if (nh < 52) nh = 52; - if (nh > 148) nh = 148; + int nh; + int mh = 0; + if (_session) { + mh = _session->config.get_meterbridge_label_height(); + } + switch (mh) { + default: + case 0: + nh = ceilf(wh * .12f); + if (nh < 52) nh = 52; + if (nh > 148) nh = 148; + break; + case 1: + nh = 52; + break; + case 2: + nh = 88; + break; + case 3: + nh = 106; + break; + case 4: + nh = 148; + break; + } namebx.set_size_request(18, nh); if (_route) { name_label.set_size_request(18, nh-2); @@ -404,7 +507,12 @@ MeterStrip::meter_metrics_expose (GdkEventExpose *ev) void MeterStrip::set_metric_mode (int metricmode, ARDOUR::MeterType mt) { + if (metric_type == mt && _metricmode == metricmode) { + return; + } metric_type = mt; + _metricmode = metricmode; + _types.clear (); switch(metricmode) { case 0: @@ -425,10 +533,30 @@ MeterStrip::set_metric_mode (int metricmode, ARDOUR::MeterType mt) _types.push_back (DataType::AUDIO); break; } - + update_background (mt); meter_metric_area.queue_draw (); } +void +MeterStrip::update_background(MeterType type) +{ + switch(type) { + case MeterIEC1DIN: + case MeterIEC1NOR: + case MeterIEC2BBC: + case MeterIEC2EBU: + case MeterK14: + case MeterK20: + mtr_container.set_name ("meterstripPPM"); + break; + case MeterVU: + mtr_container.set_name ("meterstripVU"); + break; + default: + mtr_container.set_name ("meterstripDPM"); + } +} + MeterType MeterStrip::meter_type() { @@ -556,11 +684,13 @@ MeterStrip::parameter_changed (std::string const & p) else if (p == "show-name-on-meterbridge") { update_name_box(); } + else if (p == "meterbridge-label-height") { + queue_resize(); + } } - bool -MeterStrip::level_meter_button_press (GdkEventButton* ev) +MeterStrip::level_meter_button_release (GdkEventButton* ev) { if (ev->button == 3) { popup_level_meter_menu (ev); @@ -581,15 +711,15 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev) RadioMenuItem::Group group; _suspend_menu_callbacks = true; - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterK20), MeterK20); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterK14), MeterK14); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU); + add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); + add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); + add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN); + add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR); + add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC); + add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU); + add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK20), MeterK20); + add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK14), MeterK14); + add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU); MeterType cmt = _route->meter_type(); const std::string cmn = ArdourMeter::meter_type_string(cmt); @@ -606,8 +736,53 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev) _suspend_menu_callbacks = false; } +bool +MeterStrip::name_label_button_release (GdkEventButton* ev) +{ + if (!_session) return true; + if (!_session->config.get_show_name_on_meterbridge()) return true; + + if (ev->button == 3) { + popup_name_label_menu (ev); + return true; + } + + return false; +} + +void +MeterStrip::popup_name_label_menu (GdkEventButton* ev) +{ + using namespace Gtk::Menu_Helpers; + + Gtk::Menu* m = manage (new Menu); + MenuList& items = m->items (); + + RadioMenuItem::Group group; + + _suspend_menu_callbacks = true; + add_label_height_item (items, group, _("Variable height"), 0); + add_label_height_item (items, group, _("Short"), 1); + add_label_height_item (items, group, _("Tall"), 2); + add_label_height_item (items, group, _("Grande"), 3); + add_label_height_item (items, group, _("Venti"), 4); + + m->popup (ev->button, ev->time); + _suspend_menu_callbacks = false; +} + void -MeterStrip::add_level_meter_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, MeterType type) +MeterStrip::add_label_height_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, uint32_t h) +{ + using namespace Menu_Helpers; + + items.push_back (RadioMenuElem (group, name, sigc::bind (sigc::mem_fun (*this, &MeterStrip::set_label_height), h))); + RadioMenuItem* i = dynamic_cast<RadioMenuItem *> (&items.back ()); + i->set_active (_session && _session->config.get_meterbridge_label_height() == h); +} + +void +MeterStrip::add_level_meter_type_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, MeterType type) { using namespace Menu_Helpers; @@ -620,15 +795,25 @@ void MeterStrip::set_meter_type (MeterType type) { if (_suspend_menu_callbacks) return; + if (_route->meter_type() == type) return; + level_meter->set_type (type); } void +MeterStrip::set_label_height (uint32_t h) +{ + if (_suspend_menu_callbacks) return; + _session->config.set_meterbridge_label_height(h); +} + +void MeterStrip::meter_type_changed (MeterType type) { if (_route->meter_type() != type) { _route->set_meter_type(type); } + update_background (type); MetricChanged(); } diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h index 4c532df5c7..e817f7d5c6 100644 --- a/gtk2_ardour/meter_strip.h +++ b/gtk2_ardour/meter_strip.h @@ -56,6 +56,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI static PBD::Signal1<void,MeterStrip*> CatchDeletion; static PBD::Signal0<void> MetricChanged; + static PBD::Signal0<void> ConfigurationChanged; void reset_peak_display (); void reset_route_peak_display (ARDOUR::Route*); @@ -64,6 +65,9 @@ class MeterStrip : public Gtk::VBox, public RouteUI void set_meter_type_multi (int, ARDOUR::RouteGroup*, ARDOUR::MeterType); void set_metric_mode (int, ARDOUR::MeterType); + int get_metric_mode() { return _metricmode; } + void set_tick_bar (int); + int get_tick_bar() { return _tick_bar; } bool has_midi() { return _has_midi; } bool is_metric_display() { return _strip_type == 0; } ARDOUR::MeterType meter_type(); @@ -89,7 +93,12 @@ class MeterStrip : public Gtk::VBox, public RouteUI void set_button_names (); private: + Gtk::VBox mtr_vbox; + Gtk::VBox nfo_vbox; + Gtk::EventBox mtr_container; + Gtk::HSeparator mtr_hsep; Gtk::HBox meterbox; + Gtk::HBox spacer; Gtk::HBox namebx; ArdourButton name_label; Gtk::DrawingArea meter_metric_area; @@ -111,16 +120,17 @@ class MeterStrip : public Gtk::VBox, public RouteUI float max_peak; bool _has_midi; + int _tick_bar; int _strip_type; + int _metricmode; - LevelMeter *level_meter; + LevelMeterHBox *level_meter; PBD::ScopedConnection _config_connection; void strip_property_changed (const PBD::PropertyChange&); void meter_configuration_changed (ARDOUR::ChanCount); void meter_type_changed (ARDOUR::MeterType); - - static int max_pattern_metric_size; // == FastMeter::max_pattern_metric_size + void update_background (ARDOUR::MeterType); bool peak_button_release (GdkEventButton*); @@ -130,10 +140,16 @@ class MeterStrip : public Gtk::VBox, public RouteUI void update_name_box (); bool _suspend_menu_callbacks; - bool level_meter_button_press (GdkEventButton* ev); + bool level_meter_button_release (GdkEventButton* ev); void popup_level_meter_menu (GdkEventButton* ev); - void add_level_meter_item (Gtk::Menu_Helpers::MenuList& items, Gtk::RadioMenuItem::Group& group, std::string const & name, ARDOUR::MeterType mode); + void add_level_meter_type_item (Gtk::Menu_Helpers::MenuList&, Gtk::RadioMenuItem::Group&, std::string const &, ARDOUR::MeterType); + + bool name_label_button_release (GdkEventButton* ev); + void popup_name_label_menu (GdkEventButton* ev); + void add_label_height_item (Gtk::Menu_Helpers::MenuList&, Gtk::RadioMenuItem::Group&, std::string const &, uint32_t); + void set_meter_type (ARDOUR::MeterType mode); + void set_label_height (uint32_t); }; #endif /* __ardour_mixer_strip__ */ diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index 2b51e9a85f..4a4f1dd8dd 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -141,6 +141,7 @@ Meterbridge::Meterbridge () Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Meterbridge::sync_order_keys, this, _1), gui_context()); MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context()); MeterStrip::MetricChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::resync_order, this), gui_context()); + MeterStrip::ConfigurationChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::queue_resize, this), gui_context()); /* work around ScrolledWindowViewport alignment mess Part one */ Gtk::HBox * yspc = manage (new Gtk::HBox()); @@ -336,9 +337,31 @@ Meterbridge::on_size_request (Gtk::Requisition* r) Gtk::Window::on_size_request(r); Gdk::Geometry geom; - geom.max_width = meterarea.get_width() + metrics_left.get_width() + metrics_right.get_width(); + Gtk::Requisition mr = meterarea.size_request(); + + geom.max_width = mr.width + metrics_left.get_width() + metrics_right.get_width(); geom.max_height = max_height; +#ifndef GTKOSX + /* on OSX this leads to a constant live-loop: show/hide scrollbar + * on Linux, the window is resized IFF the scrollbar was not visible + */ + const Gtk::Scrollbar * hsc = scroller.get_hscrollbar(); + Glib::RefPtr<Gdk::Screen> screen = get_screen (); + Gdk::Rectangle monitor_rect; + screen->get_monitor_geometry (0, monitor_rect); + const int scr_w = monitor_rect.get_width() - 44; + + if (cur_max_width < geom.max_width + && cur_max_width < scr_w + && !(scroller.get_hscrollbar_visible() && hsc)) { + int h = r->height; + *r = Gtk::Requisition(); + r->width = geom.max_width; + r->height = h; + } +#endif + if (cur_max_width != geom.max_width) { cur_max_width = geom.max_width; geom.height_inc = 16; @@ -353,6 +376,10 @@ Meterbridge::on_size_allocate (Gtk::Allocation& a) const Gtk::Scrollbar * hsc = scroller.get_hscrollbar(); if (scroller.get_hscrollbar_visible() && hsc) { + if (!scroll_connection.connected()) { + scroll_connection = scroller.get_hscrollbar()->get_adjustment()->signal_value_changed().connect(sigc::mem_fun (*this, &Meterbridge::on_scroll)); + scroller.get_hscrollbar()->get_adjustment()->signal_changed().connect(sigc::mem_fun (*this, &Meterbridge::on_scroll)); + } gint scrollbar_spacing; gtk_widget_style_get (GTK_WIDGET (scroller.gobj()), "scrollbar-spacing", &scrollbar_spacing, NULL); @@ -367,6 +394,41 @@ Meterbridge::on_size_allocate (Gtk::Allocation& a) } void +Meterbridge::on_scroll() +{ + if (!scroller.get_hscrollbar()) return; + + Adjustment* adj = scroller.get_hscrollbar()->get_adjustment(); + int leftend = adj->get_value(); + int rightend = scroller.get_width() + leftend; + + int mm_left = _mm_left; + int mm_right = _mm_right; + ARDOUR::MeterType mt_left = _mt_left; + ARDOUR::MeterType mt_right = _mt_right; + + for (unsigned int i = 0; i < _metrics.size(); ++i) { + int sx, dx, dy; + int mm = _metrics[i]->get_metric_mode(); + sx = (mm & 2) ? _metrics[i]->get_width() : 0; + + _metrics[i]->translate_coordinates(meterarea, sx, 0, dx, dy); + + if (dx < leftend && !(mm&2)) { + mm_left = mm; + mt_left = _metrics[i]->meter_type(); + } + if (dx > rightend && (mm&2)) { + mm_right = mm; + mt_right = _metrics[i]->meter_type(); + break; + } + } + metrics_left.set_metric_mode(mm_left, mt_left); + metrics_right.set_metric_mode(mm_right, mt_right); +} + +void Meterbridge::set_session (Session* s) { SessionHandlePtr::set_session (s); @@ -570,10 +632,12 @@ Meterbridge::remove_strip (MeterStrip* strip) break; } } + + resync_order(); } void -Meterbridge::sync_order_keys (RouteSortOrderKey src) +Meterbridge::sync_order_keys (RouteSortOrderKey) { Glib::Threads::Mutex::Lock lm (_resync_mutex); @@ -582,6 +646,7 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) int pos = 0; int vis = 0; + MeterStrip * last = 0; unsigned int metrics = 0; MeterType lmt = MeterPeak; @@ -633,14 +698,24 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) vis++; } + (*i).s->set_tick_bar(0); + MeterType nmt = (*i).s->meter_type(); if (nmt == MeterKrms) nmt = MeterPeak; // identical metrics + if (pos == 0) { + (*i).s->set_tick_bar(1); + } if ((*i).visible && nmt != lmt && pos == 0) { lmt = nmt; metrics_left.set_metric_mode(1, lmt); } else if ((*i).visible && nmt != lmt) { + if (last) { + last->set_tick_bar(last->get_tick_bar() | 2); + } + (*i).s->set_tick_bar((*i).s->get_tick_bar() | 1); + if (_metrics.size() <= metrics) { _metrics.push_back(new MeterStrip(have_midi ? 2 : 3, lmt)); meterarea.pack_start (*_metrics[metrics], false, false); @@ -672,6 +747,13 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) } meterarea.reorder_child(*((*i).s), pos++); + if ((*i).visible) { + last = (*i).s; + } + } + + if (last) { + last->set_tick_bar(last->get_tick_bar() | 2); } metrics_right.set_metric_mode(have_midi ? 2 : 3, lmt); @@ -681,6 +763,14 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) delete (_metrics.back()); _metrics.pop_back(); } + + _mm_left = metrics_left.get_metric_mode(); + _mt_left = metrics_left.meter_type(); + _mm_right = metrics_right.get_metric_mode(); + _mt_right = metrics_right.meter_type(); + + on_scroll(); + queue_resize(); } void @@ -719,6 +809,9 @@ Meterbridge::parameter_changed (std::string const & p) else if (p == "show-name-on-meterbridge") { scroller.queue_resize(); } + else if (p == "meterbridge-label-height") { + scroller.queue_resize(); + } } void diff --git a/gtk2_ardour/meterbridge.h b/gtk2_ardour/meterbridge.h index cca31d370c..2fac91cd0a 100644 --- a/gtk2_ardour/meterbridge.h +++ b/gtk2_ardour/meterbridge.h @@ -147,6 +147,12 @@ class Meterbridge : void parameter_changed (std::string const & p); void on_theme_changed (); + + void on_scroll (); + sigc::connection scroll_connection; + + int _mm_left, _mm_right; + ARDOUR::MeterType _mt_left, _mt_right; }; #endif diff --git a/gtk2_ardour/midi_tracer.cc b/gtk2_ardour/midi_tracer.cc index 70d7c24da6..073fd9cc15 100644 --- a/gtk2_ardour/midi_tracer.cc +++ b/gtk2_ardour/midi_tracer.cc @@ -300,7 +300,11 @@ MidiTracer::tracer (Parser&, byte* msg, size_t len) s += snprintf ( &buf[s], bufsize, " MTC full frame to %02d:%02d:%02d:%02d\n", msg[5] & 0x1f, msg[6], msg[7], msg[8] ); + } else if (len == 3 && msg[0] == MIDI::position) { + /* MIDI Song Position */ + int midi_beats = (msg[2] << 7) | msg[1]; + s += snprintf (&buf[s], bufsize, "%16s %d\n", "Position", (int) midi_beats); } else { /* other sys-ex */ diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index be43a3d6a0..7e8188cac9 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -1926,7 +1926,7 @@ void Mixer_UI::toggle_midi_input_active (bool flip_others) { boost::shared_ptr<RouteList> rl (new RouteList); - bool onoff; + bool onoff = false; set_route_targets_for_operation (); diff --git a/gtk2_ardour/po/de.po b/gtk2_ardour/po/de.po index 632efabbd9..c9efd566d1 100644 --- a/gtk2_ardour/po/de.po +++ b/gtk2_ardour/po/de.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: gtk-ardour 0.347.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-06-11 08:49-0400\n" -"PO-Revision-Date: 2013-03-05 12:38+0100\n" +"POT-Creation-Date: 2013-07-28 12:10+0200\n" +"PO-Revision-Date: 2013-07-28 15:37+0200\n" "Last-Translator: Edgar Aichinger <edogawa@aon.at>\n" "Language-Team: German <ardour-dev@lists.ardour.org>\n" "Language: de\n" @@ -412,7 +412,7 @@ msgstr "Konnte die %1 Menü-Definitionsdatei nicht finden" msgid "%1 will not work without a valid ardour.menus file" msgstr "%1 benötigt eine gültige ardour.menus Datei" -#: add_route_dialog.cc:53 route_params_ui.cc:503 +#: add_route_dialog.cc:53 route_params_ui.cc:500 msgid "Add Track or Bus" msgstr "Spur/Bus hinzufügen" @@ -448,8 +448,8 @@ msgstr "Audiobusse" msgid "Add:" msgstr "Erstelle:" -#: add_route_dialog.cc:114 startup.cc:833 time_fx_dialog.cc:91 -#: add_video_dialog.cc:149 video_server_dialog.cc:109 +#: add_route_dialog.cc:114 startup.cc:841 time_fx_dialog.cc:91 +#: add_video_dialog.cc:149 video_server_dialog.cc:111 msgid "<b>Options</b>" msgstr "<b>Optionen</b>" @@ -504,7 +504,7 @@ msgstr "" "stattdessen eine normale Audio- oder MIDI-Spur" #: add_route_dialog.cc:319 add_route_dialog.cc:338 editor_actions.cc:385 -#: editor_rulers.cc:377 time_axis_view.cc:1301 +#: editor_rulers.cc:377 time_axis_view.cc:1305 msgid "Normal" msgstr "Normal" @@ -548,7 +548,7 @@ msgstr "8 Kanäle" msgid "12 Channel" msgstr "12 Kanäle" -#: add_route_dialog.cc:475 mixer_strip.cc:2136 +#: add_route_dialog.cc:475 mixer_strip.cc:2131 msgid "Custom" msgstr "Benutzerdefiniert" @@ -636,7 +636,7 @@ msgid "Track" msgstr "Spur" #: analysis_window.cc:68 editor_actions.cc:616 mixer_ui.cc:125 -#: mixer_ui.cc:1793 +#: mixer_ui.cc:1795 msgid "Show" msgstr "Anzeigen" @@ -644,96 +644,93 @@ msgstr "Anzeigen" msgid "Re-analyze data" msgstr "Daten erneut analysieren" -#: ardour_button.cc:658 +#: ardour_button.cc:704 msgid "button cannot watch state of non-existing Controllable\n" msgstr "" "Schaltfläche kann den Status des nichtexistenten Kontrollzieles nicht " "verfolgen\n" -#: ardour_ui.cc:179 +#: ardour_ui.cc:180 msgid "audition" msgstr "Vorhören" -#: ardour_ui.cc:180 +#: ardour_ui.cc:181 msgid "solo" msgstr "Solo" -#: ardour_ui.cc:181 +#: ardour_ui.cc:182 msgid "feedback" msgstr "Feedback" -#: ardour_ui.cc:183 speaker_dialog.cc:36 +#: ardour_ui.cc:186 speaker_dialog.cc:36 msgid "Speaker Configuration" msgstr "Lautsprechereinstellung" -#: ardour_ui.cc:184 theme_manager.cc:56 theme_manager.cc:64 +#: ardour_ui.cc:187 theme_manager.cc:56 theme_manager.cc:64 msgid "Theme Manager" msgstr "Thema" -#: ardour_ui.cc:185 keyeditor.cc:53 +#: ardour_ui.cc:188 keyeditor.cc:53 msgid "Key Bindings" msgstr "Tastenkombinationen" -#: ardour_ui.cc:186 +#: ardour_ui.cc:189 msgid "Preferences" msgstr "Globale Einstellungen" -#: ardour_ui.cc:187 ardour_ui.cc:192 -#, fuzzy +#: ardour_ui.cc:190 ardour_ui.cc:195 msgid "Add Tracks/Busses" -msgstr "Spuren/Busse" +msgstr "Spuren/Busse hinzufügen" -#: ardour_ui.cc:188 +#: ardour_ui.cc:191 msgid "About" msgstr "Über..." -#: ardour_ui.cc:189 location_ui.cc:1134 +#: ardour_ui.cc:192 location_ui.cc:1146 msgid "Locations" msgstr "Positionen" -#: ardour_ui.cc:190 route_params_ui.cc:57 route_params_ui.cc:604 +#: ardour_ui.cc:193 route_params_ui.cc:58 route_params_ui.cc:606 msgid "Tracks and Busses" msgstr "Spuren/Busse" -#: ardour_ui.cc:191 +#: ardour_ui.cc:194 msgid "Properties" msgstr "Projekteinstellungen" -#: ardour_ui.cc:193 bundle_manager.cc:263 +#: ardour_ui.cc:196 bundle_manager.cc:263 msgid "Bundle Manager" msgstr "Bundle Manager" -#: ardour_ui.cc:194 big_clock_window.cc:35 +#: ardour_ui.cc:197 big_clock_window.cc:35 msgid "Big Clock" msgstr "Große Zeitanzeige" -#: ardour_ui.cc:195 -#, fuzzy +#: ardour_ui.cc:198 msgid "Audio Connections" -msgstr "Audio Verbindungsmanager" +msgstr "Audio-Verbindungen" -#: ardour_ui.cc:196 -#, fuzzy +#: ardour_ui.cc:199 msgid "MIDI Connections" -msgstr "Midi Verbindungsmanager" +msgstr "MIDI-Verbindungen" -#: ardour_ui.cc:198 +#: ardour_ui.cc:201 msgid "Errors" msgstr "Fehlermeldungen" -#: ardour_ui.cc:299 +#: ardour_ui.cc:303 msgid "could not initialize %1." msgstr "Konnte %1 nicht initialisieren." -#: ardour_ui.cc:394 +#: ardour_ui.cc:398 msgid "Starting audio engine" msgstr "Starte Audio-Engine" -#: ardour_ui.cc:763 startup.cc:638 +#: ardour_ui.cc:768 startup.cc:638 msgid "%1 is ready for use" msgstr "%1 ist bereit" -#: ardour_ui.cc:811 +#: ardour_ui.cc:816 msgid "" "WARNING: Your system has a limit for maximum amount of locked memory. This " "might cause %1 to run out of memory before your system runs out of memory. \n" @@ -748,23 +745,23 @@ msgstr "" "Sie können die Speicherbegrenzung mit 'ulimit -l' einsehen und normalerweise " "in %2 verändern." -#: ardour_ui.cc:828 +#: ardour_ui.cc:833 msgid "Do not show this window again" msgstr "Diese Meldung nicht erneut anzeigen" -#: ardour_ui.cc:870 +#: ardour_ui.cc:875 msgid "Don't quit" msgstr "Abbrechen" -#: ardour_ui.cc:871 +#: ardour_ui.cc:876 msgid "Just quit" msgstr "Beenden ohne zu speichern" -#: ardour_ui.cc:872 +#: ardour_ui.cc:877 msgid "Save and quit" msgstr "Speichern und beenden" -#: ardour_ui.cc:882 +#: ardour_ui.cc:887 msgid "" "%1 was unable to save your session.\n" "\n" @@ -778,15 +775,15 @@ msgstr "" "\n" "\"Trotzdem beenden\"." -#: ardour_ui.cc:913 +#: ardour_ui.cc:918 msgid "Please wait while %1 cleans up..." msgstr "Bitte warten Sie, während %1 aufräumt." -#: ardour_ui.cc:930 +#: ardour_ui.cc:935 msgid "Unsaved Session" msgstr "Nicht gespeichertes Projekt" -#: ardour_ui.cc:951 +#: ardour_ui.cc:956 msgid "" "The session \"%1\"\n" "has not been saved.\n" @@ -804,7 +801,7 @@ msgstr "" "\n" "Wie wollen Sie vorgehen?" -#: ardour_ui.cc:954 +#: ardour_ui.cc:959 msgid "" "The snapshot \"%1\"\n" "has not been saved.\n" @@ -822,74 +819,74 @@ msgstr "" "\n" "Wie wollen Sie vorgehen?" -#: ardour_ui.cc:968 +#: ardour_ui.cc:973 msgid "Prompter" msgstr "Frage" -#: ardour_ui.cc:1045 +#: ardour_ui.cc:1053 msgid "disconnected" msgstr "getrennt" -#: ardour_ui.cc:1052 +#: ardour_ui.cc:1060 #, c-format msgid "JACK: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>" msgstr "JACK: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>" -#: ardour_ui.cc:1056 +#: ardour_ui.cc:1064 #, c-format msgid "JACK: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>" msgstr "JACK: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>" -#: ardour_ui.cc:1074 export_video_dialog.cc:67 +#: ardour_ui.cc:1082 export_video_dialog.cc:67 msgid "File:" msgstr "Datei:" -#: ardour_ui.cc:1078 +#: ardour_ui.cc:1086 msgid "BWF" msgstr "BWF" -#: ardour_ui.cc:1081 +#: ardour_ui.cc:1089 msgid "WAV" msgstr "WAV" -#: ardour_ui.cc:1084 +#: ardour_ui.cc:1092 msgid "WAV64" msgstr "WAV64" -#: ardour_ui.cc:1087 session_option_editor.cc:197 +#: ardour_ui.cc:1095 session_option_editor.cc:197 msgid "CAF" msgstr "CAF" -#: ardour_ui.cc:1090 +#: ardour_ui.cc:1098 msgid "AIFF" msgstr "AIFF" -#: ardour_ui.cc:1093 +#: ardour_ui.cc:1101 msgid "iXML" msgstr "iXML" -#: ardour_ui.cc:1096 +#: ardour_ui.cc:1104 msgid "RF64" msgstr "RF64" -#: ardour_ui.cc:1104 +#: ardour_ui.cc:1112 msgid "32-float" msgstr "32-float" -#: ardour_ui.cc:1107 +#: ardour_ui.cc:1115 msgid "24-int" msgstr "24-int" -#: ardour_ui.cc:1110 +#: ardour_ui.cc:1118 msgid "16-int" msgstr "16-int" -#: ardour_ui.cc:1129 +#: ardour_ui.cc:1137 #, c-format msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>" msgstr "DSP: <span foreground=\"%s\">%5.1f%%</span>" -#: ardour_ui.cc:1148 +#: ardour_ui.cc:1156 #, c-format msgid "" "Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">" @@ -900,33 +897,33 @@ msgstr "" "%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s\">" "%<PRIu32>%%</span>" -#: ardour_ui.cc:1184 +#: ardour_ui.cc:1192 msgid "Disk: <span foreground=\"green\">Unknown</span>" msgstr "Disk: <span foreground=\"green\">Unbekannt</span>" -#: ardour_ui.cc:1186 +#: ardour_ui.cc:1194 msgid "Disk: <span foreground=\"green\">24hrs+</span>" msgstr "Disk: <span foreground=\"green\">24h+</span>" -#: ardour_ui.cc:1204 +#: ardour_ui.cc:1212 msgid "Disk: <span foreground=\"green\">>24 hrs</span>" msgstr "Disk: <span foreground=\"green\">>24 h</span>" -#: ardour_ui.cc:1215 +#: ardour_ui.cc:1223 #, c-format msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>" msgstr "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>" -#: ardour_ui.cc:1241 +#: ardour_ui.cc:1249 #, c-format msgid "Timecode|TC: <span foreground=\"%s\">%s</span>" msgstr "Timecode|TC: <span foreground=\"%s\">%s</span>" -#: ardour_ui.cc:1358 ardour_ui.cc:1367 startup.cc:1045 +#: ardour_ui.cc:1366 ardour_ui.cc:1375 startup.cc:1054 msgid "Recent Sessions" msgstr "Zuletzt verwendete Projekte" -#: ardour_ui.cc:1447 +#: ardour_ui.cc:1455 msgid "" "%1 is not connected to JACK\n" "You cannot open or close sessions in this condition" @@ -934,27 +931,27 @@ msgstr "" "%1 ist derzeit nicht mit JACK verbunden.\n" "Dadurch können keine Projekte geöffnet oder geschlossen werden." -#: ardour_ui.cc:1474 +#: ardour_ui.cc:1482 msgid "Open Session" msgstr "Projekt öffnen" -#: ardour_ui.cc:1492 session_import_dialog.cc:169 -#: session_metadata_dialog.cc:729 startup.cc:1074 +#: ardour_ui.cc:1507 session_import_dialog.cc:169 +#: session_metadata_dialog.cc:729 startup.cc:1083 msgid "%1 sessions" msgstr "%1 Projekte" -#: ardour_ui.cc:1529 +#: ardour_ui.cc:1544 msgid "You cannot add a track without a session already loaded." msgstr "" "Sie können erst Spuren oder Busse hinzufügen, wenn ein Projekt geladen wurde." -#: ardour_ui.cc:1537 +#: ardour_ui.cc:1552 msgid "could not create %1 new mixed track" msgid_plural "could not create %1 new mixed tracks" msgstr[0] "konnte %1 neue Audio+MIDI-Spur nicht erstellen" msgstr[1] "konnte %1 neue Audio+MIDI-Spuren nicht erstellen" -#: ardour_ui.cc:1543 ardour_ui.cc:1604 +#: ardour_ui.cc:1558 ardour_ui.cc:1619 msgid "" "There are insufficient JACK ports available\n" "to create a new track or bus.\n" @@ -967,24 +964,24 @@ msgstr "" "%1 und starten Sie JACK mit einer größeren\n" "Anzahl Ports neu." -#: ardour_ui.cc:1578 +#: ardour_ui.cc:1593 msgid "You cannot add a track or bus without a session already loaded." msgstr "" "Sie können erst Spuren oder Busse hinzufügen, wenn ein Projekt geladen wurde." -#: ardour_ui.cc:1587 +#: ardour_ui.cc:1602 msgid "could not create %1 new audio track" msgid_plural "could not create %1 new audio tracks" msgstr[0] "konnte %1 neue Audiospur nicht erstellen." msgstr[1] "konnte %1 neue Audiospuren nicht erstellen." -#: ardour_ui.cc:1596 +#: ardour_ui.cc:1611 msgid "could not create %1 new audio bus" msgid_plural "could not create %1 new audio busses" msgstr[0] "konnte %1 neuen Audiobus nicht erstellen" msgstr[1] "konnte %1 neue Audiobusse nicht erstellen" -#: ardour_ui.cc:1713 +#: ardour_ui.cc:1728 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." @@ -993,7 +990,7 @@ msgstr "" "eine oder mehrere Spur hinzu. Die geht über \"Spur/Bus hinzufügen\"\n" "im Menüpunkt Projekt." -#: ardour_ui.cc:2103 +#: ardour_ui.cc:2118 msgid "" "The audio backend (JACK) was shutdown because:\n" "\n" @@ -1003,7 +1000,7 @@ msgstr "" "\n" "%1" -#: ardour_ui.cc:2105 +#: ardour_ui.cc:2120 msgid "" "JACK has either been shutdown or it\n" "disconnected %1 because %1\n" @@ -1015,19 +1012,19 @@ msgstr "" "war. Sie sollten versuchen, JACK neu zu starten,\n" "neu zu verbinden, und das Projekt zu speichern." -#: ardour_ui.cc:2131 +#: ardour_ui.cc:2146 msgid "Unable to start the session running" msgstr "Konnte das aktuelle Projekt nicht starten" -#: ardour_ui.cc:2211 +#: ardour_ui.cc:2226 msgid "Take Snapshot" msgstr "Schnappschuss machen" -#: ardour_ui.cc:2212 +#: ardour_ui.cc:2227 msgid "Name of new snapshot" msgstr "Name für neuen Schnappschuss" -#: ardour_ui.cc:2236 +#: ardour_ui.cc:2251 msgid "" "To ensure compatibility with various systems\n" "snapshot names may not contain a '%1' character" @@ -1035,29 +1032,29 @@ msgstr "" "Um die Kompatibilität mit verschiedenen Systemen sicher zu stellen,\n" "dürfen Namen von Schnappschüssen kein '%1'-Zeichen enthalten" -#: ardour_ui.cc:2248 +#: ardour_ui.cc:2263 msgid "Confirm Snapshot Overwrite" msgstr "Bestätige das Überschreiben des Schnappschusses" -#: ardour_ui.cc:2249 +#: ardour_ui.cc:2264 msgid "A snapshot already exists with that name. Do you want to overwrite it?" msgstr "" "Ein Schnappschuss mit diesem Namen existiert bereits. Wollen Sie ihn " "überschreiben?" -#: ardour_ui.cc:2252 utils_videotl.cc:66 +#: ardour_ui.cc:2267 utils_videotl.cc:66 msgid "Overwrite" msgstr "Überschreiben" -#: ardour_ui.cc:2286 +#: ardour_ui.cc:2301 msgid "Rename Session" msgstr "Projekt umbenennen" -#: ardour_ui.cc:2287 +#: ardour_ui.cc:2302 msgid "New session name" msgstr "Neuer Projektname" -#: ardour_ui.cc:2301 ardour_ui.cc:2681 ardour_ui.cc:2726 +#: ardour_ui.cc:2316 ardour_ui.cc:2696 ardour_ui.cc:2741 msgid "" "To ensure compatibility with various systems\n" "session names may not contain a '%1' character" @@ -1065,14 +1062,14 @@ msgstr "" "Um die Kompatibilität mit verschiedenen Systemen sicher zu stellen,\n" "dürfen Projektnamen kein '%1'-Zeichen enthalten" -#: ardour_ui.cc:2309 +#: ardour_ui.cc:2324 msgid "" "That name is already in use by another directory/folder. Please try again." msgstr "" "Dieser Name wird schon von einem anderen Verzeichnis/Ordner benutzt. Bitte " "versuchen Sie einen anderen Namen." -#: ardour_ui.cc:2318 +#: ardour_ui.cc:2333 msgid "" "Renaming this session failed.\n" "Things could be seriously messed up at this point" @@ -1080,19 +1077,19 @@ msgstr "" "Das Umbenennen des Projekts ist fehlgeschlagen.\n" "Dies könnte auf schwerwiegende Probleme hinweisen." -#: ardour_ui.cc:2429 +#: ardour_ui.cc:2444 msgid "Save Template" msgstr "Als Vorlage Speichern" -#: ardour_ui.cc:2430 +#: ardour_ui.cc:2445 msgid "Name for template:" msgstr "Name für Vorlage" -#: ardour_ui.cc:2431 +#: ardour_ui.cc:2446 msgid "-template" msgstr "-Vorlage" -#: ardour_ui.cc:2469 +#: ardour_ui.cc:2484 msgid "" "This session\n" "%1\n" @@ -1102,52 +1099,52 @@ msgstr "" "%1\n" "existiert bereits. Wollen Sie sie öffnen?" -#: ardour_ui.cc:2479 +#: ardour_ui.cc:2494 msgid "Open Existing Session" msgstr "Vorhandenes Projekt öffnen" -#: ardour_ui.cc:2717 +#: ardour_ui.cc:2732 msgid "There is no existing session at \"%1\"" msgstr "Es gibt kein Projekt in: \"%1\"" -#: ardour_ui.cc:2804 +#: ardour_ui.cc:2819 msgid "Please wait while %1 loads your session" msgstr "Bitte warten Sie, während %1 das Projekt lädt" -#: ardour_ui.cc:2819 +#: ardour_ui.cc:2834 msgid "Port Registration Error" msgstr "Fehler bei der Registrierung von Ports" -#: ardour_ui.cc:2820 +#: ardour_ui.cc:2835 msgid "Click the Close button to try again." msgstr "Klicken Sie auf Schließen, um es erneut zu versuchen." -#: ardour_ui.cc:2841 +#: ardour_ui.cc:2856 msgid "Session \"%1 (snapshot %2)\" did not load successfully" msgstr "Projekt \"%1 (Schnappschuss %2)\" konnte nicht geladen werden." -#: ardour_ui.cc:2847 +#: ardour_ui.cc:2862 msgid "Loading Error" msgstr "Fehler beim Laden" -#: ardour_ui.cc:2848 +#: ardour_ui.cc:2863 msgid "Click the Refresh button to try again." msgstr "Klicken Sie auf Aktualisieren, um es erneut zu versuchen." -#: ardour_ui.cc:2930 +#: ardour_ui.cc:2945 msgid "Could not create session in \"%1\"" msgstr "Konnte kein Projekt in \"%1\" anlegen" -#: ardour_ui.cc:3030 +#: ardour_ui.cc:3045 msgid "No files were ready for clean-up" msgstr "Keine Audiodateien zum Aufräumen vorhanden" -#: ardour_ui.cc:3034 ardour_ui.cc:3044 ardour_ui.cc:3177 ardour_ui.cc:3184 +#: ardour_ui.cc:3049 ardour_ui.cc:3059 ardour_ui.cc:3192 ardour_ui.cc:3199 #: ardour_ui_ed.cc:104 msgid "Clean-up" msgstr "Aufräumen" -#: ardour_ui.cc:3035 +#: ardour_ui.cc:3050 msgid "" "If this seems suprising, \n" "check for any existing snapshots.\n" @@ -1159,19 +1156,19 @@ msgstr "" "sind sie wahrscheinlich noch in einem\n" "älteren Schnappschuss als Region eingebunden." -#: ardour_ui.cc:3094 +#: ardour_ui.cc:3109 msgid "kilo" msgstr "kilo" -#: ardour_ui.cc:3097 +#: ardour_ui.cc:3112 msgid "mega" msgstr "mega" -#: ardour_ui.cc:3100 +#: ardour_ui.cc:3115 msgid "giga" msgstr "giga" -#: ardour_ui.cc:3105 +#: ardour_ui.cc:3120 msgid "" "The following file was deleted from %2,\n" "releasing %3 %4bytes of disk space" @@ -1185,7 +1182,7 @@ msgstr[1] "" "Die folgenden %1 Dateien wurden von %2\n" "gelöscht und gaben %3 %4bytes Speicherplatz frei" -#: ardour_ui.cc:3112 +#: ardour_ui.cc:3127 msgid "" "The following file was not in use and \n" "has been moved to: %2\n" @@ -1206,7 +1203,7 @@ msgid_plural "" "will release an additional %3 %4bytes of disk space.\n" msgstr[0] "" "Die folgende Datei wurde nicht benutzt\n" -"und wurde verschoben nach: %2\n" +"und wurde nach %2 verschoben.\n" "\n" "Nach einem Neustart von %5 kann über\n" "\n" @@ -1215,7 +1212,7 @@ msgstr[0] "" "%3 %4bytes Speicherplatz freigegeben werden.\n" msgstr[1] "" "Die folgenden %1 Dateien waren unbenutzt\n" -"und wurden verschoben nach: %2\n" +"und wurden nach %2 verschoben.\n" "\n" "Nach einem Neustart von %5 kann über\n" "\n" @@ -1223,11 +1220,11 @@ msgstr[1] "" "\n" "%3 %4bytes Speicherplatz freigegeben werden.\n" -#: ardour_ui.cc:3172 +#: ardour_ui.cc:3187 msgid "Are you sure you want to clean-up?" msgstr "Wollen Sie wirklich aufräumen?" -#: ardour_ui.cc:3179 +#: ardour_ui.cc:3194 msgid "" "Clean-up is a destructive operation.\n" "ALL undo/redo information will be lost if you clean-up.\n" @@ -1239,42 +1236,42 @@ msgstr "" "Nach dem Aufräumen werden alle nicht benötigten Audiodateien in den \"dead " "sounds\" Ordner verschoben." -#: ardour_ui.cc:3187 +#: ardour_ui.cc:3202 msgid "CleanupDialog" msgstr "Aufräumdialog" -#: ardour_ui.cc:3217 +#: ardour_ui.cc:3232 msgid "Cleaned Files" msgstr "Aufgeräumte Dateien" -#: ardour_ui.cc:3234 +#: ardour_ui.cc:3249 msgid "deleted file" msgstr "gelöschte Datei" -#: ardour_ui.cc:3326 +#: ardour_ui.cc:3341 msgid "" "Video-Server was not launched by Ardour. The request to stop it is ignored." msgstr "" "Der Video-Server wurde nicht von Ardour gestartet, der Befehl ihn anzuhalten " "wird ignoriert." -#: ardour_ui.cc:3330 +#: ardour_ui.cc:3345 msgid "Stop Video-Server" msgstr "Video-Server anhalten" -#: ardour_ui.cc:3331 +#: ardour_ui.cc:3346 msgid "Do you really want to stop the Video Server?" msgstr "Wollen Sie den Video-Server wirklich anhalten?" -#: ardour_ui.cc:3334 +#: ardour_ui.cc:3349 msgid "Yes, Stop It" msgstr "Ja, anhalten." -#: ardour_ui.cc:3360 +#: ardour_ui.cc:3375 msgid "The Video Server is already started." msgstr "Der Video-Server läuft bereits" -#: ardour_ui.cc:3362 +#: ardour_ui.cc:3377 msgid "" "An external Video Server is configured and can be reached. Not starting a " "new instance." @@ -1282,7 +1279,7 @@ msgstr "" "Ein externer Video-Server wurde konfiguriert, ist aber nicht erreichbar. Es " "wird keine neue Instanz gestartet." -#: ardour_ui.cc:3370 ardour_ui.cc:3455 +#: ardour_ui.cc:3385 ardour_ui.cc:3475 msgid "" "Could not connect to the Video Server. Start it or configure its access URL " "in Edit -> Preferences." @@ -1291,36 +1288,36 @@ msgstr "" "ihn vorher starten oder die Adresse in Bearbeiten -> Globale Einstellungen " "anpassen" -#: ardour_ui.cc:3394 +#: ardour_ui.cc:3409 msgid "Specified docroot is not an existing directory." msgstr "Das eingestellte Dokumentenverzeichnis existiert nicht." -#: ardour_ui.cc:3399 +#: ardour_ui.cc:3414 msgid "Given Video Server is not an executable file." msgstr "Der eingestellte Video-Server ist keine ausführbare Datei." -#: ardour_ui.cc:3432 +#: ardour_ui.cc:3447 msgid "Cannot launch the video-server" -msgstr "" +msgstr "Kann den Videoserver nicht starten " -#: ardour_ui.cc:3441 +#: ardour_ui.cc:3456 msgid "Video-server was started but does not respond to requests..." -msgstr "" +msgstr "Viideoserver wurde gestartet, reagiert aber nicht auf Anfragen..." -#: ardour_ui.cc:3477 editor_audio_import.cc:629 +#: ardour_ui.cc:3501 editor_audio_import.cc:632 msgid "could not open %1" msgstr "Konnte \"%s\" nicht öffnen." -#: ardour_ui.cc:3481 +#: ardour_ui.cc:3505 msgid "no video-file selected" msgstr "Es wurde keine Video-Datei ausgewählt." -#: ardour_ui.cc:3641 +#: ardour_ui.cc:3670 msgid "Recording was stopped because your system could not keep up." msgstr "" "Die Aufnahme wurde gestoppt, da Ihr System nicht schnell genug folgen konnte." -#: ardour_ui.cc:3670 +#: ardour_ui.cc:3699 msgid "" "The disk system on your computer\n" "was not able to keep up with %1.\n" @@ -1334,7 +1331,7 @@ msgstr "" "Die Daten konnten nicht schnell genug geschrieben\n" "werden, um die Aufnahme fortzuführen.\n" -#: ardour_ui.cc:3689 +#: ardour_ui.cc:3718 msgid "" "The disk system on your computer\n" "was not able to keep up with %1.\n" @@ -1348,11 +1345,11 @@ msgstr "" "Die Daten konnten nicht schnell genug gelesen\n" "werden, um die Wiedergabe aufrechtzuerhalten.\n" -#: ardour_ui.cc:3729 +#: ardour_ui.cc:3758 msgid "Crash Recovery" msgstr "Absturz-Wiederherstellung" -#: ardour_ui.cc:3730 +#: ardour_ui.cc:3759 msgid "" "This session appears to have been in the\n" "middle of recording when %1 or\n" @@ -1370,19 +1367,19 @@ msgstr "" "für Sie wiederherstellen oder sie verwerfen.\n" "Bitte entscheiden Sie, wie Sie vorgehen möchten.\n" -#: ardour_ui.cc:3742 +#: ardour_ui.cc:3771 msgid "Ignore crash data" msgstr "Daten verwerfen" -#: ardour_ui.cc:3743 +#: ardour_ui.cc:3772 msgid "Recover from crash" msgstr "Daten wiederherstellen" -#: ardour_ui.cc:3763 +#: ardour_ui.cc:3792 msgid "Sample Rate Mismatch" msgstr "Samplerate passt nicht" -#: ardour_ui.cc:3764 +#: ardour_ui.cc:3793 msgid "" "This session was created with a sample rate of %1 Hz, but\n" "%2 is currently running at %3 Hz. If you load this session,\n" @@ -1393,23 +1390,23 @@ msgstr "" "%2 läuft derzeit mit %3 Hz. Wenn Sie dieses Projekt laden, \n" "wird Ihr Audiomaterial mit der falschen Samplerate abgespielt.\n" -#: ardour_ui.cc:3773 +#: ardour_ui.cc:3802 msgid "Do not load session" msgstr "Projekt nicht laden" -#: ardour_ui.cc:3774 +#: ardour_ui.cc:3803 msgid "Load session anyway" msgstr "Projekt trotzdem laden" -#: ardour_ui.cc:3797 +#: ardour_ui.cc:3826 msgid "Could not disconnect from JACK" msgstr "Konnte Verbindung mit JACK nicht trennen" -#: ardour_ui.cc:3810 +#: ardour_ui.cc:3839 msgid "Could not reconnect to JACK" msgstr "Konnte nicht erneut zu JACK verbinden" -#: ardour_ui.cc:4084 +#: ardour_ui.cc:4113 msgid "" "%4This is a session from an older version of %3%5\n" "\n" @@ -1444,35 +1441,39 @@ msgstr "Der Editor konnte nicht initialisiert werden." msgid "UI: cannot setup mixer" msgstr "Der Mixer konnte nicht initialisiert werden." -#: ardour_ui2.cc:125 +#: ardour_ui2.cc:82 +msgid "UI: cannot setup meterbridge" +msgstr "UI: konnte Meterbridge nicht einrichten." + +#: ardour_ui2.cc:130 msgid "Play from playhead" msgstr "Wiedergabe ab Positionszeiger" -#: ardour_ui2.cc:126 +#: ardour_ui2.cc:131 msgid "Stop playback" msgstr "Wiedergabe anhalten" -#: ardour_ui2.cc:127 +#: ardour_ui2.cc:132 msgid "Toggle record" msgstr "Aufnahme aktivieren" -#: ardour_ui2.cc:128 +#: ardour_ui2.cc:133 msgid "Play range/selection" msgstr "Bereich/Auswahl wiedergeben" -#: ardour_ui2.cc:129 +#: ardour_ui2.cc:134 msgid "Go to start of session" msgstr "Zum Anfang des Projekts springen" -#: ardour_ui2.cc:130 +#: ardour_ui2.cc:135 msgid "Go to end of session" msgstr "Zum Ende des Projekts springen" -#: ardour_ui2.cc:131 +#: ardour_ui2.cc:136 msgid "Play loop range" msgstr "Schleife wiedergeben" -#: ardour_ui2.cc:132 +#: ardour_ui2.cc:137 msgid "" "MIDI Panic\n" "Send note off and reset controller messages on all MIDI channels" @@ -1481,23 +1482,23 @@ msgstr "" "Schalte auf allen Midikanälen die Notensignale aus und setzte alle MIDI-" "Controller zurück" -#: ardour_ui2.cc:133 +#: ardour_ui2.cc:138 msgid "Return to last playback start when stopped" msgstr "Bei Stopp zum letzten Wiedergabepunkt springen" -#: ardour_ui2.cc:134 +#: ardour_ui2.cc:139 msgid "Playhead follows Range Selections and Edits" msgstr "Positionszeiger folgt Auswahl und Editierungen" -#: ardour_ui2.cc:135 +#: ardour_ui2.cc:140 msgid "Be sensible about input monitoring" msgstr "Automatisches Input Monitoring aktivieren" -#: ardour_ui2.cc:136 +#: ardour_ui2.cc:141 msgid "Enable/Disable audio click" msgstr "Aktiviert/Deaktiviert Klick" -#: ardour_ui2.cc:137 monitor_section.cc:101 +#: ardour_ui2.cc:142 monitor_section.cc:101 msgid "" "When active, something is soloed.\n" "Click to de-solo everything" @@ -1505,7 +1506,7 @@ msgstr "" "Wenn aktiv, ist etwas auf Solo geschalten.\n" "Klick schaltet Solo überall aus." -#: ardour_ui2.cc:138 +#: ardour_ui2.cc:143 msgid "" "When active, auditioning is taking place\n" "Click to stop the audition" @@ -1513,11 +1514,11 @@ msgstr "" "Wird beim Vorhören aktiv.\n" "Klicken stoppt das Vorhören." -#: ardour_ui2.cc:139 +#: ardour_ui2.cc:144 msgid "When active, there is a feedback loop." msgstr "Wenn aktiv, gibt es eine Rückkopplungsschleife." -#: ardour_ui2.cc:140 +#: ardour_ui2.cc:145 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" @@ -1533,7 +1534,7 @@ msgstr "" "Siehe <span color=\"blue\">http://ardour.org/a3_features_clocks</span> für " "Einzelheiten." -#: ardour_ui2.cc:141 +#: ardour_ui2.cc:146 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" @@ -1549,27 +1550,27 @@ msgstr "" "Siehe <span color=\"blue\">http://ardour.org/a3_features_clocks</span> für " "Einzelheiten." -#: ardour_ui2.cc:173 +#: ardour_ui2.cc:178 msgid "[ERROR]: " msgstr "[FEHLER]:" -#: ardour_ui2.cc:175 +#: ardour_ui2.cc:180 msgid "[WARNING]: " msgstr "[WARNUNG]:" -#: ardour_ui2.cc:177 +#: ardour_ui2.cc:182 msgid "[INFO]: " msgstr "[INFO]: " -#: ardour_ui2.cc:241 ardour_ui_ed.cc:376 +#: ardour_ui2.cc:246 ardour_ui_ed.cc:377 msgid "Auto Return" msgstr "Auto Return" -#: ardour_ui2.cc:243 ardour_ui_ed.cc:379 +#: ardour_ui2.cc:248 ardour_ui_ed.cc:380 msgid "Follow Edits" msgstr "Folge Bearbeitungen" -#: ardour_ui2.cc:621 rc_option_editor.cc:1004 rc_option_editor.cc:1022 +#: ardour_ui2.cc:626 rc_option_editor.cc:1004 rc_option_editor.cc:1022 #: rc_option_editor.cc:1025 rc_option_editor.cc:1027 rc_option_editor.cc:1029 #: rc_option_editor.cc:1037 rc_option_editor.cc:1045 rc_option_editor.cc:1047 #: rc_option_editor.cc:1055 rc_option_editor.cc:1062 rc_option_editor.cc:1071 @@ -1589,23 +1590,23 @@ msgstr "Editor laden" msgid "Setup Mixer" msgstr "Mixer laden" -#: ardour_ui_dependents.cc:84 +#: ardour_ui_dependents.cc:85 msgid "Reload Session History" msgstr "Projekt-Aktionsverlauf laden" -#: ardour_ui_dialogs.cc:206 +#: ardour_ui_dialogs.cc:221 msgid "Don't close" msgstr "Abbrechen" -#: ardour_ui_dialogs.cc:207 +#: ardour_ui_dialogs.cc:222 msgid "Just close" msgstr "Ohne speichern schließen" -#: ardour_ui_dialogs.cc:208 +#: ardour_ui_dialogs.cc:223 msgid "Save and close" msgstr "Speichern und schließen" -#: ardour_ui_dialogs.cc:293 +#: ardour_ui_dialogs.cc:318 msgid "This screen is not tall enough to display the mixer window" msgstr "" "Dieser Bildschirm ist nicht hoch genug, um das Mixerfenster darzustellen" @@ -1671,7 +1672,7 @@ msgstr "Pegelanzeige halten" msgid "Denormal Handling" msgstr "Umgang mit Denormals" -#: ardour_ui_ed.cc:123 route_time_axis.cc:1475 +#: ardour_ui_ed.cc:123 route_time_axis.cc:1489 msgid "New..." msgstr "Neu..." @@ -1692,19 +1693,16 @@ msgid "Add Track or Bus..." msgstr "Spur/Bus hinzufügen..." #: ardour_ui_ed.cc:135 -#, fuzzy msgid "Open Video" -msgstr "Projekt öffnen" +msgstr "Video öffnen" #: ardour_ui_ed.cc:138 -#, fuzzy msgid "Remove Video" -msgstr "Bereich entfernen" +msgstr "Video entfernen" #: ardour_ui_ed.cc:141 -#, fuzzy msgid "Export To Video File" -msgstr "Exportiere Audio-Datei(en)..." +msgstr "Exportiere Video-Datei" #: ardour_ui_ed.cc:145 msgid "Snapshot..." @@ -1714,8 +1712,8 @@ msgstr "Schnappschuss..." msgid "Save As..." msgstr "Speichern unter..." -#: ardour_ui_ed.cc:153 editor_actions.cc:1710 editor_markers.cc:858 -#: editor_snapshots.cc:123 mixer_strip.cc:1464 route_time_axis.cc:1471 +#: ardour_ui_ed.cc:153 editor_actions.cc:1719 editor_markers.cc:858 +#: editor_snapshots.cc:123 mixer_strip.cc:1471 route_time_axis.cc:1485 msgid "Rename..." msgstr "Umbenennen..." @@ -1760,7 +1758,7 @@ msgstr "Müll leeren" msgid "JACK" msgstr "JACK" -#: ardour_ui_ed.cc:190 route_params_ui.cc:104 +#: ardour_ui_ed.cc:190 route_params_ui.cc:105 msgid "Latency" msgstr "Latenz" @@ -1768,8 +1766,8 @@ msgstr "Latenz" msgid "Reconnect" msgstr "Verbinde neu" -#: ardour_ui_ed.cc:195 global_port_matrix.cc:198 io_selector.cc:210 -#: mixer_strip.cc:712 mixer_strip.cc:838 +#: ardour_ui_ed.cc:195 global_port_matrix.cc:207 io_selector.cc:210 +#: mixer_strip.cc:719 mixer_strip.cc:845 msgid "Disconnect" msgstr "Trenne" @@ -1785,36 +1783,39 @@ msgstr "Editor maximieren" msgid "Show Toolbars" msgstr "Zeige Werkzeugleisten" -#: ardour_ui_ed.cc:230 mixer_ui.cc:1863 mixer_ui.cc:1869 +#: ardour_ui_ed.cc:230 mixer_ui.cc:1865 mixer_ui.cc:1871 msgid "Window|Mixer" msgstr "Mixer" #: ardour_ui_ed.cc:231 -#, fuzzy msgid "Toggle Editor+Mixer" -msgstr "Bearbeitungsmodus ändern" +msgstr "Editor+Mixer umschalten" + +#: ardour_ui_ed.cc:232 meterbridge.cc:230 meterbridge.cc:236 +msgid "Window|Meterbridge" +msgstr "Meterbridge" -#: ardour_ui_ed.cc:233 midi_tracer.cc:39 +#: ardour_ui_ed.cc:234 midi_tracer.cc:39 msgid "MIDI Tracer" msgstr "Midisignale verfolgen" -#: ardour_ui_ed.cc:235 +#: ardour_ui_ed.cc:236 msgid "Chat" msgstr "Chat" -#: ardour_ui_ed.cc:237 +#: ardour_ui_ed.cc:238 msgid "Help|Manual" msgstr "Handbuch" -#: ardour_ui_ed.cc:238 +#: ardour_ui_ed.cc:239 msgid "Reference" msgstr "Referenz" -#: ardour_ui_ed.cc:240 plugin_ui.cc:419 +#: ardour_ui_ed.cc:241 plugin_ui.cc:418 msgid "Save" msgstr "Speichern" -#: ardour_ui_ed.cc:248 rc_option_editor.cc:1114 rc_option_editor.cc:1125 +#: ardour_ui_ed.cc:249 rc_option_editor.cc:1114 rc_option_editor.cc:1125 #: rc_option_editor.cc:1134 rc_option_editor.cc:1147 rc_option_editor.cc:1160 #: rc_option_editor.cc:1169 rc_option_editor.cc:1179 rc_option_editor.cc:1181 #: rc_option_editor.cc:1191 rc_option_editor.cc:1207 rc_option_editor.cc:1220 @@ -1824,99 +1825,99 @@ msgstr "Speichern" msgid "Transport" msgstr "Transport" -#: ardour_ui_ed.cc:254 engine_dialog.cc:85 sfdb_ui.cc:559 +#: ardour_ui_ed.cc:255 engine_dialog.cc:85 msgid "Stop" msgstr "Stopp" -#: ardour_ui_ed.cc:257 +#: ardour_ui_ed.cc:258 msgid "Roll" msgstr "Wiedergabe" -#: ardour_ui_ed.cc:261 +#: ardour_ui_ed.cc:262 msgid "Start/Stop" msgstr "Start/Stopp" -#: ardour_ui_ed.cc:264 +#: ardour_ui_ed.cc:265 msgid "Start/Continue/Stop" msgstr "Start/Stopp" -#: ardour_ui_ed.cc:267 +#: ardour_ui_ed.cc:268 msgid "Stop and Forget Capture" msgstr "Stopp + Aufnahme verwerfen" -#: ardour_ui_ed.cc:277 +#: ardour_ui_ed.cc:278 msgid "Transition To Roll" msgstr "Vorwärts (normal)" -#: ardour_ui_ed.cc:281 +#: ardour_ui_ed.cc:282 msgid "Transition To Reverse" msgstr "Rückwärts (normal)" -#: ardour_ui_ed.cc:285 +#: ardour_ui_ed.cc:286 msgid "Play Loop Range" msgstr "Schleife wiedergeben" -#: ardour_ui_ed.cc:288 +#: ardour_ui_ed.cc:289 msgid "Play Selected Range" msgstr "Gewählten Bereich wiedergeben" -#: ardour_ui_ed.cc:291 +#: ardour_ui_ed.cc:292 msgid "Play Selection w/Preroll" msgstr "Ausgewählten Bereich mit Vorlauf wiedergeben" -#: ardour_ui_ed.cc:295 +#: ardour_ui_ed.cc:296 msgid "Enable Record" msgstr "Aufnahme aktivieren" -#: ardour_ui_ed.cc:298 +#: ardour_ui_ed.cc:299 msgid "Start Recording" msgstr "Aufnahme starten" -#: ardour_ui_ed.cc:302 +#: ardour_ui_ed.cc:303 msgid "Rewind" msgstr "Rückwärts (beschleunigen)" -#: ardour_ui_ed.cc:305 +#: ardour_ui_ed.cc:306 msgid "Rewind (Slow)" msgstr "Rückwärts (langsam)" -#: ardour_ui_ed.cc:308 +#: ardour_ui_ed.cc:309 msgid "Rewind (Fast)" msgstr "Rückwärts (schnell)" -#: ardour_ui_ed.cc:311 startup.cc:727 +#: ardour_ui_ed.cc:312 startup.cc:727 msgid "Forward" msgstr "Vorwärts (beschleunigen)" -#: ardour_ui_ed.cc:314 +#: ardour_ui_ed.cc:315 msgid "Forward (Slow)" msgstr "Vorwärts (langsam)" -#: ardour_ui_ed.cc:317 +#: ardour_ui_ed.cc:318 msgid "Forward (Fast)" msgstr "Vorwärts (schnell)" -#: ardour_ui_ed.cc:320 +#: ardour_ui_ed.cc:321 msgid "Goto Zero" msgstr "Zum Nullpunkt springen" -#: ardour_ui_ed.cc:323 +#: ardour_ui_ed.cc:324 msgid "Goto Start" msgstr "Zum Anfang springen" -#: ardour_ui_ed.cc:326 +#: ardour_ui_ed.cc:327 msgid "Goto End" msgstr "Zum Ende springen" -#: ardour_ui_ed.cc:329 +#: ardour_ui_ed.cc:330 msgid "Goto Wall Clock" msgstr "Zur lokalen Uhrzeit springen" -#: ardour_ui_ed.cc:333 +#: ardour_ui_ed.cc:334 msgid "Focus On Clock" msgstr "Fokus auf Zeitanzeige setzen" -#: ardour_ui_ed.cc:337 ardour_ui_ed.cc:346 audio_clock.cc:2046 editor.cc:237 +#: ardour_ui_ed.cc:338 ardour_ui_ed.cc:347 audio_clock.cc:2046 editor.cc:237 #: editor_actions.cc:544 editor_actions.cc:553 export_timespan_selector.cc:88 #: session_option_editor.cc:41 session_option_editor.cc:61 #: session_option_editor.cc:80 session_option_editor.cc:96 @@ -1925,125 +1926,125 @@ msgstr "Fokus auf Zeitanzeige setzen" msgid "Timecode" msgstr "Timecode" -#: ardour_ui_ed.cc:339 ardour_ui_ed.cc:348 editor_actions.cc:542 +#: ardour_ui_ed.cc:340 ardour_ui_ed.cc:349 editor_actions.cc:542 msgid "Bars & Beats" msgstr "Takte & Schläge" -#: ardour_ui_ed.cc:341 ardour_ui_ed.cc:350 +#: ardour_ui_ed.cc:342 ardour_ui_ed.cc:351 msgid "Minutes & Seconds" msgstr "Minuten & Sekunden" -#: ardour_ui_ed.cc:343 ardour_ui_ed.cc:352 audio_clock.cc:2050 editor.cc:238 +#: ardour_ui_ed.cc:344 ardour_ui_ed.cc:353 audio_clock.cc:2050 editor.cc:238 #: editor_actions.cc:543 msgid "Samples" msgstr "Samples" -#: ardour_ui_ed.cc:355 +#: ardour_ui_ed.cc:356 msgid "Punch In" msgstr "Punch In" -#: ardour_ui_ed.cc:356 mixer_strip.cc:1904 route_ui.cc:132 +#: ardour_ui_ed.cc:357 mixer_strip.cc:1905 route_ui.cc:137 #: time_info_box.cc:113 msgid "In" msgstr "In" -#: ardour_ui_ed.cc:359 +#: ardour_ui_ed.cc:360 msgid "Punch Out" msgstr "Punch Out" -#: ardour_ui_ed.cc:360 time_info_box.cc:114 +#: ardour_ui_ed.cc:361 time_info_box.cc:114 msgid "Out" msgstr "Out" -#: ardour_ui_ed.cc:363 +#: ardour_ui_ed.cc:364 msgid "Punch In/Out" msgstr "Punch In/Out" -#: ardour_ui_ed.cc:364 +#: ardour_ui_ed.cc:365 msgid "In/Out" msgstr "In/Out" -#: ardour_ui_ed.cc:367 rc_option_editor.cc:1071 +#: ardour_ui_ed.cc:368 rc_option_editor.cc:1071 msgid "Click" msgstr "Klick" -#: ardour_ui_ed.cc:370 +#: ardour_ui_ed.cc:371 msgid "Auto Input" msgstr "Auto Input" -#: ardour_ui_ed.cc:373 +#: ardour_ui_ed.cc:374 msgid "Auto Play" msgstr "Auto Play" -#: ardour_ui_ed.cc:384 +#: ardour_ui_ed.cc:385 msgid "Sync Startup to Video" msgstr "Start mit Video synchronisieren" -#: ardour_ui_ed.cc:386 +#: ardour_ui_ed.cc:387 msgid "Time Master" msgstr "Time Master" -#: ardour_ui_ed.cc:393 +#: ardour_ui_ed.cc:394 msgid "Toggle Record Enable Track %1" msgstr "Aufnahme auf Spur %1 aktivieren" -#: ardour_ui_ed.cc:400 +#: ardour_ui_ed.cc:401 msgid "Percentage" msgstr "Prozent" -#: ardour_ui_ed.cc:401 shuttle_control.cc:169 +#: ardour_ui_ed.cc:402 shuttle_control.cc:169 msgid "Semitones" msgstr "Halbtöne" -#: ardour_ui_ed.cc:405 +#: ardour_ui_ed.cc:406 msgid "Send MTC" msgstr "MTC senden" -#: ardour_ui_ed.cc:407 +#: ardour_ui_ed.cc:408 msgid "Send MMC" msgstr "MMC senden" -#: ardour_ui_ed.cc:409 +#: ardour_ui_ed.cc:410 msgid "Use MMC" msgstr "Benutze MMC" -#: ardour_ui_ed.cc:411 rc_option_editor.cc:1702 +#: ardour_ui_ed.cc:412 rc_option_editor.cc:1702 msgid "Send MIDI Clock" msgstr "MIDI Clock senden" -#: ardour_ui_ed.cc:413 +#: ardour_ui_ed.cc:414 msgid "Send MIDI Feedback" msgstr "MIDI Feedback senden" -#: ardour_ui_ed.cc:419 +#: ardour_ui_ed.cc:420 msgid "Panic" msgstr "Panic" -#: ardour_ui_ed.cc:559 +#: ardour_ui_ed.cc:560 msgid "Wall Clock" msgstr "Uhrzeit" -#: ardour_ui_ed.cc:560 +#: ardour_ui_ed.cc:561 msgid "Disk Space" msgstr "Speicherplatz" -#: ardour_ui_ed.cc:561 +#: ardour_ui_ed.cc:562 msgid "DSP" msgstr "DSP" -#: ardour_ui_ed.cc:562 +#: ardour_ui_ed.cc:563 msgid "Buffers" msgstr "Puffer" -#: ardour_ui_ed.cc:563 +#: ardour_ui_ed.cc:564 msgid "JACK Sampling Rate and Latency" msgstr "JACK Samplerate und Latenz" -#: ardour_ui_ed.cc:564 +#: ardour_ui_ed.cc:565 msgid "Timecode Format" msgstr "Timecode-Format" -#: ardour_ui_ed.cc:565 +#: ardour_ui_ed.cc:566 msgid "File Format" msgstr "Dateiformat" @@ -2093,7 +2094,7 @@ msgstr "Tempo" msgid "Meter" msgstr "Taktart" -#: audio_clock.cc:1819 audio_streamview.cc:116 editor_actions.cc:1030 +#: audio_clock.cc:1819 audio_streamview.cc:116 editor_actions.cc:1039 #: midi_region_view.cc:2991 session_metadata_dialog.cc:331 #: session_metadata_dialog.cc:379 session_metadata_dialog.cc:435 #: session_metadata_dialog.cc:716 @@ -2182,32 +2183,32 @@ msgid "hide track" msgstr "Diese Spur verbergen" #: automation_time_axis.cc:255 automation_time_axis.cc:307 -#: automation_time_axis.cc:496 gain_meter.cc:196 generic_pluginui.cc:456 -#: generic_pluginui.cc:733 panner_ui.cc:150 +#: automation_time_axis.cc:496 gain_meter.cc:195 generic_pluginui.cc:456 +#: generic_pluginui.cc:746 panner_ui.cc:150 msgid "Automation|Manual" msgstr "Manuell" #: automation_time_axis.cc:257 automation_time_axis.cc:318 #: automation_time_axis.cc:501 editor.cc:1933 editor.cc:2010 -#: editor_actions.cc:118 editor_actions.cc:1856 gain_meter.cc:199 -#: generic_pluginui.cc:459 generic_pluginui.cc:735 midi_time_axis.cc:1488 +#: editor_actions.cc:118 editor_actions.cc:1865 gain_meter.cc:198 +#: generic_pluginui.cc:459 generic_pluginui.cc:748 midi_time_axis.cc:1488 #: midi_time_axis.cc:1491 midi_time_axis.cc:1494 panner_ui.cc:153 msgid "Play" msgstr "Wiedergabe" #: automation_time_axis.cc:259 automation_time_axis.cc:329 -#: automation_time_axis.cc:506 gain_meter.cc:202 generic_pluginui.cc:462 -#: generic_pluginui.cc:737 panner_ui.cc:156 +#: automation_time_axis.cc:506 gain_meter.cc:201 generic_pluginui.cc:462 +#: generic_pluginui.cc:750 panner_ui.cc:156 msgid "Write" msgstr "Schreiben" #: automation_time_axis.cc:261 automation_time_axis.cc:340 -#: automation_time_axis.cc:511 gain_meter.cc:205 generic_pluginui.cc:465 -#: generic_pluginui.cc:739 panner_ui.cc:159 +#: automation_time_axis.cc:511 gain_meter.cc:204 generic_pluginui.cc:465 +#: generic_pluginui.cc:752 panner_ui.cc:159 msgid "Touch" msgstr "Ändern" -#: automation_time_axis.cc:351 generic_pluginui.cc:468 +#: automation_time_axis.cc:351 generic_pluginui.cc:468 meter_patterns.cc:108 msgid "???" msgstr "???" @@ -2216,7 +2217,7 @@ msgid "clear automation" msgstr "Automation zurücksetzen" #: automation_time_axis.cc:485 editor_actions.cc:613 editor_markers.cc:857 -#: location_ui.cc:55 plugin_selector.cc:85 route_time_axis.cc:699 +#: location_ui.cc:55 plugin_selector.cc:85 route_time_axis.cc:708 msgid "Hide" msgstr "Verbergen" @@ -2237,7 +2238,7 @@ msgstr "Diskret" msgid "Linear" msgstr "Linear" -#: automation_time_axis.cc:543 rhythm_ferret.cc:110 route_time_axis.cc:638 +#: automation_time_axis.cc:543 rhythm_ferret.cc:110 route_time_axis.cc:647 #: shuttle_control.cc:188 msgid "Mode" msgstr "Modus" @@ -2254,13 +2255,13 @@ msgstr "Bundle editieren" msgid "Direction:" msgstr "Richtung:" -#: bundle_manager.cc:205 bundle_manager.cc:209 mixer_strip.cc:156 -#: mixer_strip.cc:2132 +#: bundle_manager.cc:205 bundle_manager.cc:209 mixer_strip.cc:158 +#: mixer_strip.cc:2127 msgid "Input" msgstr "Eingang" #: bundle_manager.cc:206 bundle_manager.cc:211 bundle_manager.cc:245 -#: mixer_strip.cc:161 mixer_strip.cc:2135 +#: mixer_strip.cc:163 mixer_strip.cc:2130 msgid "Output" msgstr "Ausgang" @@ -2270,8 +2271,8 @@ msgid "Edit" msgstr "Bearbeiten" #: bundle_manager.cc:265 editor.cc:5493 editor_actions.cc:310 -#: editor_actions.cc:368 plugin_ui.cc:420 processor_box.cc:2227 -#: route_time_axis.cc:704 +#: editor_actions.cc:368 plugin_ui.cc:419 processor_box.cc:2229 +#: route_time_axis.cc:713 msgid "Delete" msgstr "Löschen" @@ -2439,7 +2440,7 @@ msgstr "Zeitpunkt" #: edit_note_dialog.cc:98 editor_regions.cc:114 #: export_timespan_selector.cc:359 export_timespan_selector.cc:421 -#: location_ui.cc:313 midi_list_editor.cc:114 time_info_box.cc:105 +#: location_ui.cc:317 midi_list_editor.cc:114 time_info_box.cc:105 msgid "Length" msgstr "Länge" @@ -2695,7 +2696,7 @@ msgid "Editor" msgstr "Editor" #: editor.cc:1215 editor.cc:1225 editor.cc:4440 editor_actions.cc:130 -#: editor_actions.cc:1804 +#: editor_actions.cc:1813 msgid "Loop" msgstr "Schleife" @@ -2720,8 +2721,8 @@ msgstr "Symmetrisch" msgid "Slow" msgstr "Langsam" -#: editor.cc:1390 editor.cc:1483 editor.cc:1545 sfdb_ui.cc:1606 -#: sfdb_ui.cc:1715 +#: editor.cc:1390 editor.cc:1483 editor.cc:1545 sfdb_ui.cc:1634 +#: sfdb_ui.cc:1743 msgid "Fast" msgstr "Schnell" @@ -2741,7 +2742,7 @@ msgstr "Aktivieren" msgid "Slowest" msgstr "Sehr langsam" -#: editor.cc:1572 route_time_axis.cc:1863 selection.cc:1009 selection.cc:1064 +#: editor.cc:1572 route_time_axis.cc:1877 selection.cc:1009 selection.cc:1064 msgid "programming error: " msgstr "Programmierfehler:" @@ -2858,7 +2859,7 @@ msgid "Select All in Track" msgstr "Alles in der Spur auswählen" #: editor.cc:1942 editor.cc:2019 editor_actions.cc:185 -#: export_timespan_selector.cc:53 processor_box.cc:2235 +#: export_timespan_selector.cc:53 processor_box.cc:2237 msgid "Select All" msgstr "Alles auswählen" @@ -2910,15 +2911,15 @@ msgstr "Wähle Bereich zwischen Positionszeiger und Arbeitspunkt aus" msgid "Select" msgstr "Auswahl" -#: editor.cc:1965 editor.cc:2036 editor_actions.cc:309 processor_box.cc:2220 +#: editor.cc:1965 editor.cc:2036 editor_actions.cc:309 processor_box.cc:2222 msgid "Cut" msgstr "Ausschneiden" -#: editor.cc:1966 editor.cc:2037 editor_actions.cc:312 processor_box.cc:2223 +#: editor.cc:1966 editor.cc:2037 editor_actions.cc:312 processor_box.cc:2225 msgid "Copy" msgstr "Kopieren" -#: editor.cc:1967 editor.cc:2038 editor_actions.cc:313 processor_box.cc:2231 +#: editor.cc:1967 editor.cc:2038 editor_actions.cc:313 processor_box.cc:2233 msgid "Paste" msgstr "Einfügen" @@ -3075,7 +3076,7 @@ msgstr "Wiederherstellen" msgid "Redo (%1)" msgstr "Wiederherstellen (%1)" -#: editor.cc:3286 editor.cc:3310 editor_actions.cc:106 editor_actions.cc:1785 +#: editor.cc:3286 editor.cc:3310 editor_actions.cc:106 editor_actions.cc:1794 msgid "Duplicate" msgstr "Duplizieren" @@ -3107,8 +3108,8 @@ msgstr "Wiedergabeliste löschen" msgid "Keep Playlist" msgstr "Wiedergabeliste behalten" -#: editor.cc:3877 editor_audio_import.cc:579 editor_ops.cc:5856 -#: processor_box.cc:1990 processor_box.cc:2015 +#: editor.cc:3877 editor_audio_import.cc:581 editor_ops.cc:5856 +#: processor_box.cc:2003 processor_box.cc:2028 msgid "Cancel" msgstr "Abbrechen" @@ -3128,7 +3129,7 @@ msgstr "Wiedergabelisten zurücksetzen" msgid "Please wait while %1 loads visual data." msgstr "Bitte warten Sie, während %1 die Daten zur Anzeige des Projekts lädt." -#: editor.cc:5492 editor_markers.cc:940 panner_ui.cc:393 processor_box.cc:2251 +#: editor.cc:5492 editor_markers.cc:940 panner_ui.cc:393 processor_box.cc:2253 msgid "Edit..." msgstr "Bearbeiten..." @@ -3177,7 +3178,7 @@ msgstr "Layering" msgid "Position" msgstr "Position" -#: editor_actions.cc:101 gain_meter.cc:124 gain_meter.cc:755 panner_ui.cc:177 +#: editor_actions.cc:101 gain_meter.cc:121 gain_meter.cc:788 panner_ui.cc:177 #: panner_ui.cc:586 msgid "Trim" msgstr "Anpassen" @@ -3190,7 +3191,7 @@ msgstr "Lautstärke" msgid "Ranges" msgstr "Bereiche" -#: editor_actions.cc:104 editor_actions.cc:1781 session_option_editor.cc:145 +#: editor_actions.cc:104 editor_actions.cc:1790 session_option_editor.cc:145 #: session_option_editor.cc:147 session_option_editor.cc:156 #: session_option_editor.cc:163 msgid "Fades" @@ -3269,8 +3270,8 @@ msgstr "Zweite Zeitanzeige" msgid "Separate" msgstr "Teilen" -#: editor_actions.cc:132 mixer_strip.cc:1916 route_time_axis.cc:199 -#: route_time_axis.cc:2397 +#: editor_actions.cc:132 mixer_strip.cc:1914 route_time_axis.cc:208 +#: route_time_axis.cc:2417 msgid "Solo" msgstr "Solo" @@ -3282,7 +3283,7 @@ msgstr "Subframes" msgid "Timecode fps" msgstr "Timecode FPS" -#: editor_actions.cc:137 route_time_axis.cc:421 +#: editor_actions.cc:137 route_time_axis.cc:430 msgid "Height" msgstr "Höhe" @@ -3406,7 +3407,7 @@ msgstr "Positionszeiger zum Anfang des Auswahlbereichs" msgid "Playhead to Range End" msgstr "Positionszeiger zum Ende des Auswahlbereichs" -#: editor_actions.cc:186 export_timespan_selector.cc:61 processor_box.cc:2237 +#: editor_actions.cc:186 export_timespan_selector.cc:61 processor_box.cc:2239 msgid "Deselect All" msgstr "Nichts auswählen" @@ -3674,9 +3675,9 @@ msgstr "Stille Einfügen" msgid "Toggle Active" msgstr "Spur Aktivieren / Deaktivieren" -#: editor_actions.cc:370 editor_actions.cc:1707 editor_markers.cc:876 -#: editor_markers.cc:941 editor_snapshots.cc:121 mixer_strip.cc:1488 -#: route_time_axis.cc:701 +#: editor_actions.cc:370 editor_actions.cc:1716 editor_markers.cc:876 +#: editor_markers.cc:941 editor_snapshots.cc:121 mixer_strip.cc:1495 +#: route_time_axis.cc:710 msgid "Remove" msgstr "Löschen" @@ -3684,19 +3685,19 @@ msgstr "Löschen" msgid "Fit Selected Tracks" msgstr "An ausgewählte Spuren anpassen" -#: editor_actions.cc:376 time_axis_view.cc:1298 +#: editor_actions.cc:376 time_axis_view.cc:1302 msgid "Largest" msgstr "Am größten" -#: editor_actions.cc:379 time_axis_view.cc:1299 +#: editor_actions.cc:379 time_axis_view.cc:1303 msgid "Larger" msgstr "Größer" -#: editor_actions.cc:382 editor_rulers.cc:375 time_axis_view.cc:1300 +#: editor_actions.cc:382 editor_rulers.cc:375 time_axis_view.cc:1304 msgid "Large" msgstr "Groß" -#: editor_actions.cc:388 editor_rulers.cc:379 time_axis_view.cc:1302 +#: editor_actions.cc:388 editor_rulers.cc:379 time_axis_view.cc:1306 msgid "Small" msgstr "Klein" @@ -3792,7 +3793,7 @@ msgstr "Splice" msgid "Slide" msgstr "Slide" -#: editor_actions.cc:478 editor_actions.cc:1728 editor_markers.cc:860 +#: editor_actions.cc:478 editor_actions.cc:1737 editor_markers.cc:860 #: editor_rulers.cc:386 location_ui.cc:56 msgid "Lock" msgstr "Sperren" @@ -3962,40 +3963,36 @@ msgid "Min:Sec" msgstr "Min:Sek" #: editor_actions.cc:547 editor_actions.cc:550 -#, fuzzy msgid "Video Monitor" -msgstr "Monitor" +msgstr "Videomonitor" #: editor_actions.cc:549 rc_option_editor.cc:1834 msgid "Video" -msgstr "" +msgstr "Video" #: editor_actions.cc:552 -#, fuzzy msgid "Always on Top" -msgstr "Ganz nach oben" +msgstr "Immer oben" #: editor_actions.cc:554 -#, fuzzy -msgid "Framenumber" -msgstr "Liednummer" +msgid "Frame number" +msgstr "Framenummer" #: editor_actions.cc:555 -#, fuzzy msgid "Timecode Background" -msgstr "Timecode-Sekunden" +msgstr "Timecode-Hintergrund" #: editor_actions.cc:556 msgid "Fullscreen" -msgstr "" +msgstr "Vollbild" #: editor_actions.cc:557 msgid "Letterbox" -msgstr "" +msgstr "Letterbox" #: editor_actions.cc:558 msgid "Original Size" -msgstr "" +msgstr "Originalgröße" #: editor_actions.cc:608 msgid "Sort" @@ -4067,7 +4064,7 @@ msgstr "Ungenutzte entfernen" #: editor_actions.cc:652 editor_audio_import.cc:279 #: session_import_dialog.cc:74 session_import_dialog.cc:94 -#: session_metadata_dialog.cc:297 editor_videotimeline.cc:107 +#: session_metadata_dialog.cc:297 editor_videotimeline.cc:108 msgid "Import" msgstr "Importieren" @@ -4107,289 +4104,289 @@ msgstr "Editor-Tastenkürzel aus %1 geladen" msgid "Could not find editor.bindings in search path %1" msgstr "Konnte editor.bindings im Suchpfad %1 nicht finden" -#: editor_actions.cc:1019 editor_actions.cc:1415 editor_actions.cc:1426 -#: editor_actions.cc:1479 editor_actions.cc:1490 editor_actions.cc:1537 -#: editor_actions.cc:1547 editor_regions.cc:1561 +#: editor_actions.cc:1028 editor_actions.cc:1424 editor_actions.cc:1435 +#: editor_actions.cc:1488 editor_actions.cc:1499 editor_actions.cc:1546 +#: editor_actions.cc:1556 editor_regions.cc:1561 msgid "programming error: %1: %2" msgstr "Programmierfehler: %1: %2" -#: editor_actions.cc:1713 +#: editor_actions.cc:1722 msgid "Raise" msgstr "Nach oben" -#: editor_actions.cc:1716 +#: editor_actions.cc:1725 msgid "Raise to Top" msgstr "Ganz nach oben" -#: editor_actions.cc:1719 gtk-custom-ruler.c:132 +#: editor_actions.cc:1728 gtk-custom-ruler.c:132 msgid "Lower" msgstr "Nach unten" -#: editor_actions.cc:1722 +#: editor_actions.cc:1731 msgid "Lower to Bottom" msgstr "Ganz nach unten" -#: editor_actions.cc:1725 +#: editor_actions.cc:1734 msgid "Move to Original Position" msgstr "Zur Ursprungsposition verschieben" -#: editor_actions.cc:1730 +#: editor_actions.cc:1739 msgid "Lock to Video" -msgstr "" +msgstr "an Video koppeln" -#: editor_actions.cc:1735 editor_markers.cc:867 +#: editor_actions.cc:1744 editor_markers.cc:867 msgid "Glue to Bars and Beats" msgstr "An Takte und Schläge binden" -#: editor_actions.cc:1740 +#: editor_actions.cc:1749 msgid "Remove Sync" msgstr "Synchronisationspunkt entfernen" -#: editor_actions.cc:1743 mixer_strip.cc:1903 route_time_axis.cc:200 +#: editor_actions.cc:1752 mixer_strip.cc:1904 route_time_axis.cc:209 msgid "Mute" msgstr "Mute" -#: editor_actions.cc:1746 +#: editor_actions.cc:1755 msgid "Normalize..." msgstr "Normalisieren..." -#: editor_actions.cc:1749 +#: editor_actions.cc:1758 msgid "Reverse" msgstr "Umkehren" -#: editor_actions.cc:1752 +#: editor_actions.cc:1761 msgid "Make Mono Regions" msgstr "In Mono-Regionen umwandeln" -#: editor_actions.cc:1755 +#: editor_actions.cc:1764 msgid "Boost Gain" msgstr "Lautstärke erhöhen" -#: editor_actions.cc:1758 +#: editor_actions.cc:1767 msgid "Cut Gain" msgstr "Lautstärke reduzieren" -#: editor_actions.cc:1761 +#: editor_actions.cc:1770 msgid "Pitch Shift..." msgstr "Tonhöhe ändern..." -#: editor_actions.cc:1764 +#: editor_actions.cc:1773 msgid "Transpose..." msgstr "Transponieren..." -#: editor_actions.cc:1767 +#: editor_actions.cc:1776 msgid "Opaque" msgstr "Deckend" -#: editor_actions.cc:1771 editor_regions.cc:116 +#: editor_actions.cc:1780 editor_regions.cc:116 msgid "Fade In" msgstr "Fade In" -#: editor_actions.cc:1776 editor_regions.cc:117 +#: editor_actions.cc:1785 editor_regions.cc:117 msgid "Fade Out" msgstr "Fade Out" -#: editor_actions.cc:1791 +#: editor_actions.cc:1800 msgid "Multi-Duplicate..." msgstr "Mehrfach duplizieren..." -#: editor_actions.cc:1796 +#: editor_actions.cc:1805 msgid "Fill Track" msgstr "Spur auffüllen" -#: editor_actions.cc:1800 editor_markers.cc:955 +#: editor_actions.cc:1809 editor_markers.cc:955 msgid "Set Loop Range" msgstr "Schleife erstellen" -#: editor_actions.cc:1807 +#: editor_actions.cc:1816 msgid "Set Punch" msgstr "Punchbereich erstellen" -#: editor_actions.cc:1811 +#: editor_actions.cc:1820 msgid "Add Single Range Marker" msgstr "Einzelnen Bereichsmarker einfügen" -#: editor_actions.cc:1816 +#: editor_actions.cc:1825 msgid "Add Range Marker Per Region" msgstr "Einen Bereichsmarker pro Region einfügen" -#: editor_actions.cc:1820 +#: editor_actions.cc:1829 msgid "Snap Position To Grid" msgstr "Positionszeiger einrasten" -#: editor_actions.cc:1823 +#: editor_actions.cc:1832 msgid "Close Gaps" msgstr "Lücken schließen" -#: editor_actions.cc:1826 +#: editor_actions.cc:1835 msgid "Rhythm Ferret..." msgstr "Rhythm Ferret..." -#: editor_actions.cc:1829 +#: editor_actions.cc:1838 msgid "Export..." msgstr "Exportieren..." -#: editor_actions.cc:1835 +#: editor_actions.cc:1844 msgid "Separate Under" msgstr "Bereich unter aktueller Region entfernen" -#: editor_actions.cc:1839 +#: editor_actions.cc:1848 msgid "Set Fade In Length" msgstr "Fade-In bis Positionszeiger" -#: editor_actions.cc:1840 +#: editor_actions.cc:1849 msgid "Set Fade Out Length" msgstr "Fade-Out ab Positionszeiger" -#: editor_actions.cc:1841 +#: editor_actions.cc:1850 msgid "Set Tempo from Region = Bar" msgstr "Regionlänge = Taktlänge setzen" -#: editor_actions.cc:1846 +#: editor_actions.cc:1855 msgid "Split at Percussion Onsets" msgstr "Regionen an perkussiven Schlägen teilen" -#: editor_actions.cc:1851 +#: editor_actions.cc:1860 msgid "List Editor..." msgstr "Eventlisteneditor..." -#: editor_actions.cc:1854 +#: editor_actions.cc:1863 msgid "Properties..." msgstr "Eigenschaften..." -#: editor_actions.cc:1858 +#: editor_actions.cc:1867 msgid "Bounce (with processing)" msgstr "Bounce (Post-Mixer)" -#: editor_actions.cc:1859 +#: editor_actions.cc:1868 msgid "Bounce (without processing)" msgstr "Bounce (Pre-Mixer)" -#: editor_actions.cc:1860 +#: editor_actions.cc:1869 msgid "Combine" msgstr "Verbinden (combine)" -#: editor_actions.cc:1861 +#: editor_actions.cc:1870 msgid "Uncombine" msgstr "Trennen (uncombine)" -#: editor_actions.cc:1863 +#: editor_actions.cc:1872 msgid "Spectral Analysis..." msgstr "FFT-Analyse" -#: editor_actions.cc:1865 +#: editor_actions.cc:1874 msgid "Reset Envelope" msgstr "Lautstärkekurve zurücksetzen" -#: editor_actions.cc:1867 +#: editor_actions.cc:1876 msgid "Reset Gain" msgstr "Lautstärke zurücksetzen" -#: editor_actions.cc:1872 +#: editor_actions.cc:1881 msgid "Envelope Active" msgstr "Lautstärkekurve ist aktiv" -#: editor_actions.cc:1876 +#: editor_actions.cc:1885 msgid "Quantize..." msgstr "Quantisieren.." -#: editor_actions.cc:1877 editor_actions.cc:1878 +#: editor_actions.cc:1886 editor_actions.cc:1887 msgid "Insert Patch Change..." msgstr "Patch Change einfügen..." -#: editor_actions.cc:1879 +#: editor_actions.cc:1888 msgid "Unlink from other copies" msgstr "Von anderen Kopien entkoppeln" -#: editor_actions.cc:1880 +#: editor_actions.cc:1889 msgid "Strip Silence..." msgstr "Stille entfernen..." -#: editor_actions.cc:1881 +#: editor_actions.cc:1890 msgid "Set Range Selection" msgstr "Bereich auswählen" -#: editor_actions.cc:1883 +#: editor_actions.cc:1892 msgid "Nudge Later" msgstr "Schritt nach hinten" -#: editor_actions.cc:1884 +#: editor_actions.cc:1893 msgid "Nudge Earlier" msgstr "Schritt nach vorne" -#: editor_actions.cc:1889 +#: editor_actions.cc:1898 msgid "Nudge Later by Capture Offset" msgstr "Schritt nach hinten um Aufnahme-Offset" -#: editor_actions.cc:1896 +#: editor_actions.cc:1905 msgid "Nudge Earlier by Capture Offset" msgstr "Schritt nach vorne um Aufnahme-Offset" -#: editor_actions.cc:1900 +#: editor_actions.cc:1909 msgid "Trim to Loop" msgstr "Auf Schleife kürzen" -#: editor_actions.cc:1901 +#: editor_actions.cc:1910 msgid "Trim to Punch" msgstr "Auf Punchbereich kürzen" -#: editor_actions.cc:1903 +#: editor_actions.cc:1912 msgid "Trim to Previous" msgstr "Zur vorherigen Region aufschließen" -#: editor_actions.cc:1904 +#: editor_actions.cc:1913 msgid "Trim to Next" msgstr "Zur nächsten Region aufschließen" -#: editor_actions.cc:1911 +#: editor_actions.cc:1920 msgid "Insert Region From Region List" msgstr "Region von Regionenliste hinzufügen" -#: editor_actions.cc:1917 +#: editor_actions.cc:1926 msgid "Set Sync Position" msgstr "Synchronisationspunkt setzen" -#: editor_actions.cc:1918 +#: editor_actions.cc:1927 msgid "Place Transient" msgstr "Transienten setzen" -#: editor_actions.cc:1919 +#: editor_actions.cc:1928 msgid "Split" msgstr "Region teilen" -#: editor_actions.cc:1920 +#: editor_actions.cc:1929 msgid "Trim Start at Edit Point" msgstr "Anfang der Region am Arbeitspunkt abschneiden" -#: editor_actions.cc:1921 +#: editor_actions.cc:1930 msgid "Trim End at Edit Point" msgstr "Ende der Region am Arbeitspunkt abschneiden" -#: editor_actions.cc:1926 +#: editor_actions.cc:1935 msgid "Align Start" msgstr "Anfang ausrichten" -#: editor_actions.cc:1933 +#: editor_actions.cc:1942 msgid "Align Start Relative" msgstr "Anfang relativ ausrichten" -#: editor_actions.cc:1937 +#: editor_actions.cc:1946 msgid "Align End" msgstr "Ende ausrichten" -#: editor_actions.cc:1942 +#: editor_actions.cc:1951 msgid "Align End Relative" msgstr "Ende relativ ausrichten" -#: editor_actions.cc:1949 +#: editor_actions.cc:1958 msgid "Align Sync" msgstr "Synchronisationspunkt ausrichten" -#: editor_actions.cc:1956 +#: editor_actions.cc:1965 msgid "Align Sync Relative" msgstr "Synchronisationspunkt relativ ausrichten" -#: editor_actions.cc:1960 editor_actions.cc:1963 +#: editor_actions.cc:1969 editor_actions.cc:1972 msgid "Choose Top..." msgstr "Oberste Region auswählen..." @@ -4418,32 +4415,32 @@ msgstr "" "Das Projekt enthält bereits eine Datei namens %1. Wollen Sie %2 als neue " "Quelle importieren, oder überspringen?" -#: editor_audio_import.cc:279 editor_videotimeline.cc:107 +#: editor_audio_import.cc:279 editor_videotimeline.cc:108 msgid "Cancel Import" msgstr "Importieren Abbrechen" -#: editor_audio_import.cc:541 +#: editor_audio_import.cc:543 msgid "Editor: cannot open file \"%1\", (%2)" msgstr "Editor: kann die Datei \"%1\" nicht öffnen (%2)" -#: editor_audio_import.cc:549 +#: editor_audio_import.cc:551 msgid "Cancel entire import" msgstr "Importieren Abbrechen" -#: editor_audio_import.cc:550 +#: editor_audio_import.cc:552 msgid "Don't embed it" msgstr "Nicht einbetten" -#: editor_audio_import.cc:551 +#: editor_audio_import.cc:553 msgid "Embed all without questions" msgstr "Alle Importieren ohne nachzufragen" -#: editor_audio_import.cc:554 editor_audio_import.cc:583 +#: editor_audio_import.cc:556 editor_audio_import.cc:585 #: export_format_dialog.cc:58 msgid "Sample rate" msgstr "Samplerate" -#: editor_audio_import.cc:555 editor_audio_import.cc:584 +#: editor_audio_import.cc:557 editor_audio_import.cc:586 msgid "" "%1\n" "This audiofile's sample rate doesn't match the session sample rate!" @@ -4452,7 +4449,7 @@ msgstr "" "Die Samplerate dieser Audiodatei unterscheidet sich von der Samplerate " "dieses Projekts." -#: editor_audio_import.cc:580 +#: editor_audio_import.cc:582 msgid "Embed it anyway" msgstr "Trotzdem importieren" @@ -4461,17 +4458,16 @@ msgid "fixed time region drag" msgstr "Region zeitgleich verschieben" #: editor_drag.cc:1700 -#, fuzzy msgid "Video Start:" -msgstr "Mike Start" +msgstr "Videostart" #: editor_drag.cc:1702 msgid "Diff:" -msgstr "" +msgstr "Diff:" #: editor_drag.cc:1722 msgid "Move Video" -msgstr "" +msgstr "Bewege Video" #: editor_drag.cc:2200 msgid "copy meter mark" @@ -4582,7 +4578,7 @@ msgid "Sharing Solo?" msgstr "Solo teilen?" #: editor_route_groups.cc:103 midi_time_axis.cc:1504 midi_time_axis.cc:1507 -#: midi_time_axis.cc:1510 mixer_strip.cc:1902 +#: midi_time_axis.cc:1510 mixer_strip.cc:1903 msgid "Rec" msgstr "Rec" @@ -4654,7 +4650,7 @@ msgid "end" msgstr "Ende" #: editor_markers.cc:646 editor_ops.cc:1744 editor_ops.cc:1764 -#: editor_ops.cc:1788 editor_ops.cc:1815 location_ui.cc:1005 +#: editor_ops.cc:1788 editor_ops.cc:1815 location_ui.cc:1017 msgid "add marker" msgstr "Marker hinzufügen" @@ -4662,7 +4658,7 @@ msgstr "Marker hinzufügen" msgid "range" msgstr "Bereich" -#: editor_markers.cc:713 location_ui.cc:840 +#: editor_markers.cc:713 location_ui.cc:852 msgid "remove marker" msgstr "Marker entfernen" @@ -4738,8 +4734,8 @@ msgstr "Marker umbenennen" msgid "Rename Range" msgstr "Bereich umbenennen" -#: editor_markers.cc:1363 editor_mouse.cc:2510 processor_box.cc:1768 -#: processor_box.cc:2233 route_time_axis.cc:968 route_ui.cc:1535 +#: editor_markers.cc:1363 editor_mouse.cc:2510 processor_box.cc:1781 +#: processor_box.cc:2235 route_time_axis.cc:982 route_ui.cc:1540 msgid "Rename" msgstr "Umbenennen" @@ -4876,7 +4872,7 @@ msgstr "Regionen ganz nach unten" msgid "Rename Region" msgstr "Region umbenennen" -#: editor_ops.cc:2372 processor_box.cc:1766 route_ui.cc:1533 +#: editor_ops.cc:2372 processor_box.cc:1779 route_ui.cc:1538 msgid "New name:" msgstr "Neuer Name: " @@ -5053,7 +5049,7 @@ msgstr "" "(Dies kann nicht rückgängig gemacht werden!)" #: editor_ops.cc:4509 editor_ops.cc:6512 editor_regions.cc:460 -#: editor_snapshots.cc:158 route_ui.cc:1477 +#: editor_snapshots.cc:158 route_ui.cc:1482 msgid "No, do nothing." msgstr "Nein, nichts machen." @@ -5094,9 +5090,8 @@ msgid "toggle region lock" msgstr "Regionensperre umschalten" #: editor_ops.cc:5067 -#, fuzzy msgid "Toggle Video Lock" -msgstr "Regionensperre umschalten" +msgstr "Videosperre umschalten" #: editor_ops.cc:5091 msgid "region lock style" @@ -5242,11 +5237,11 @@ msgstr "Ok" msgid "close region gaps" msgstr "Schließe Lücken zwischen Regionen" -#: editor_ops.cc:6461 route_ui.cc:1451 +#: editor_ops.cc:6461 route_ui.cc:1456 msgid "That would be bad news ...." msgstr "Lieber nicht!" -#: editor_ops.cc:6466 route_ui.cc:1456 +#: editor_ops.cc:6466 route_ui.cc:1461 msgid "" "Removing the master or monitor bus is such a bad idea\n" "that %1 is not going to allow it.\n" @@ -5266,7 +5261,7 @@ msgstr "" msgid "tracks" msgstr "Spuren" -#: editor_ops.cc:6485 route_ui.cc:1817 +#: editor_ops.cc:6485 route_ui.cc:1822 msgid "track" msgstr "Spur" @@ -5274,7 +5269,7 @@ msgstr "Spur" msgid "busses" msgstr "Audio-Busse" -#: editor_ops.cc:6491 route_ui.cc:1817 +#: editor_ops.cc:6491 route_ui.cc:1822 msgid "bus" msgstr "Bus" @@ -5319,7 +5314,7 @@ msgstr "" msgid "Yes, remove them." msgstr "Ja, entfernen." -#: editor_ops.cc:6516 editor_snapshots.cc:159 route_ui.cc:1478 +#: editor_ops.cc:6516 editor_snapshots.cc:159 route_ui.cc:1483 msgid "Yes, remove it." msgstr "Ja, entfernen." @@ -5389,7 +5384,7 @@ msgstr "Länge des Einblendens (Einheiten: sekundäre Uhr), () falls inaktiv" msgid "Length of region fade-out (units: secondary clock), () if dsisabled" msgstr "Länge des Ausblendens (Einheiten: sekundäre Uhr), () falls inaktiv" -#: editor_regions.cc:118 mixer_strip.cc:1960 mono_panner.cc:179 +#: editor_regions.cc:118 mixer_strip.cc:1954 mono_panner.cc:179 #: stereo_panner.cc:217 stereo_panner.cc:240 msgid "L" msgstr "L" @@ -5406,8 +5401,9 @@ msgstr "G" msgid "Region position glued to Bars|Beats time?" msgstr "Regionenposition an Takt und Schäge gebunden?" -#: editor_regions.cc:120 editor_routes.cc:207 gain_meter.cc:723 -#: mixer_strip.cc:1934 panner_ui.cc:554 stereo_panner.cc:237 +#: editor_regions.cc:120 editor_routes.cc:207 gain_meter.cc:756 +#: mixer_strip.cc:1931 meter_strip.cc:312 panner_ui.cc:554 +#: stereo_panner.cc:237 msgid "M" msgstr "M" @@ -5476,7 +5472,8 @@ msgstr "Spur/Busname" msgid "Track/Bus visible ?" msgstr "Spuren/Busse sichtbar?" -#: editor_routes.cc:204 mixer_strip.cc:1951 route_time_axis.cc:2387 +#: editor_routes.cc:204 mixer_strip.cc:1945 meter_strip.cc:326 +#: route_time_axis.cc:2407 msgid "A" msgstr "A" @@ -5484,7 +5481,7 @@ msgstr "A" msgid "Track/Bus active ?" msgstr "Spur/Bus aktiv?" -#: editor_routes.cc:205 mixer_strip.cc:1935 +#: editor_routes.cc:205 mixer_strip.cc:1932 msgid "I" msgstr "I" @@ -5492,7 +5489,7 @@ msgstr "I" msgid "MIDI input enabled" msgstr "MIDI Eingänge aktiv" -#: editor_routes.cc:206 mixer_strip.cc:1933 mono_panner.cc:198 +#: editor_routes.cc:206 mixer_strip.cc:1930 mono_panner.cc:198 #: stereo_panner.cc:215 stereo_panner.cc:242 msgid "R" msgstr "R" @@ -5505,7 +5502,7 @@ msgstr "Aufnahme bereit" msgid "Muted" msgstr "Stumm" -#: editor_routes.cc:208 mixer_strip.cc:1947 +#: editor_routes.cc:208 mixer_strip.cc:1941 meter_strip.cc:322 msgid "S" msgstr "S" @@ -5517,7 +5514,7 @@ msgstr "Solo ein" msgid "SI" msgstr "SI" -#: editor_routes.cc:209 mixer_strip.cc:351 rc_option_editor.cc:1872 +#: editor_routes.cc:209 mixer_strip.cc:353 rc_option_editor.cc:1872 msgid "Solo Isolated" msgstr "Isoliertes Solo" @@ -5595,12 +5592,11 @@ msgstr "Taktwechsel einfügen..." #: editor_rulers.cc:373 msgid "Timeline height" -msgstr "" +msgstr "Höhe der Zeitleiste" #: editor_rulers.cc:383 -#, fuzzy msgid "Align Video Track" -msgstr "Audiospur hinzufügen" +msgstr "Videospur ausrichten" #: editor_selection.cc:889 editor_selection.cc:932 msgid "set selected regions" @@ -5853,7 +5849,7 @@ msgstr "Treiber:" msgid "Audio Interface:" msgstr "Audio-Schnittstelle:" -#: engine_dialog.cc:187 sfdb_ui.cc:148 sfdb_ui.cc:261 sfdb_ui.cc:266 +#: engine_dialog.cc:187 sfdb_ui.cc:149 sfdb_ui.cc:262 sfdb_ui.cc:267 msgid "Sample rate:" msgstr "Samplerate:" @@ -5992,7 +5988,7 @@ msgid "configuration files contain a JACK server path that doesn't exist (%1)" msgstr "" "die Konfiguration enthält einen JACK-Serverpfad, der nicht existiert (%1)" -#: export_channel_selector.cc:45 sfdb_ui.cc:146 +#: export_channel_selector.cc:45 sfdb_ui.cc:147 msgid "Channels:" msgstr "Kanäle:" @@ -6017,14 +6013,12 @@ msgid "Track output (channels: %1)" msgstr "Spurausgang (%1 Kanäle)" #: export_channel_selector.cc:536 -#, fuzzy msgid "Export region contents" -msgstr "Region exportieren" +msgstr "Regioneninhalte exportieren" #: export_channel_selector.cc:537 -#, fuzzy msgid "Export track output" -msgstr "Verbinde Spur- und Busausgänge" +msgstr "Exportiere Spurausgänge" #: export_dialog.cc:46 msgid "" @@ -6279,6 +6273,10 @@ msgstr "FLAC Optionen" msgid "Broadcast Wave options" msgstr "Broadcast Wave Optionen" +#: export_format_selector.cc:136 +msgid "Do you really want to remove the format?" +msgstr "Wollen Sie das Format wirklich entfernen?" + #: export_preset_selector.cc:28 msgid "Preset" msgstr "Preset" @@ -6291,6 +6289,10 @@ msgstr "" "Das ausgewählte Preset konnte nicht geladen werden!\n" "Möglicherweise verwendet es ein Format, das entfernt wurde." +#: export_preset_selector.cc:156 +msgid "Do you really want to remove this preset?" +msgstr "Wollen Sie dieses Preset wirklich entfernen?" + #: export_timespan_selector.cc:46 msgid "Show Times as:" msgstr "Zeitanzeige:" @@ -6303,36 +6305,32 @@ msgstr " bis" msgid "Range" msgstr "Bereiche" -#: gain_meter.cc:109 gain_meter.cc:431 gain_meter.cc:820 +#: gain_meter.cc:106 gain_meter.cc:357 gain_meter.cc:462 gain_meter.cc:853 msgid "-inf" msgstr "-inf" -#: gain_meter.cc:115 gain_meter.cc:869 +#: gain_meter.cc:112 gain_meter.cc:910 msgid "Fader automation mode" msgstr "Fader Automationsmodus" -#: gain_meter.cc:116 gain_meter.cc:870 +#: gain_meter.cc:113 gain_meter.cc:911 msgid "Fader automation type" msgstr "Fader-Automationstyp" -#: gain_meter.cc:125 gain_meter.cc:759 panner_ui.cc:178 panner_ui.cc:590 +#: gain_meter.cc:122 gain_meter.cc:792 panner_ui.cc:178 panner_ui.cc:590 msgid "Abs" msgstr "Abs" -#: gain_meter.cc:334 -msgid "-Inf" -msgstr "-Inf" - -#: gain_meter.cc:726 mixer_strip.cc:1954 panner_ui.cc:557 -#: route_time_axis.cc:2391 +#: gain_meter.cc:759 mixer_strip.cc:1948 meter_strip.cc:329 panner_ui.cc:557 +#: route_time_axis.cc:2411 msgid "P" msgstr "P" -#: gain_meter.cc:729 panner_ui.cc:560 +#: gain_meter.cc:762 panner_ui.cc:560 msgid "T" msgstr "T" -#: gain_meter.cc:732 panner_ui.cc:563 +#: gain_meter.cc:765 panner_ui.cc:563 msgid "W" msgstr "W" @@ -6344,7 +6342,7 @@ msgstr "<span size=\"large\">Voreinstellungen</span>" msgid "Switches" msgstr "Schalter" -#: generic_pluginui.cc:242 generic_pluginui.cc:376 processor_box.cc:2210 +#: generic_pluginui.cc:242 generic_pluginui.cc:376 processor_box.cc:2212 msgid "Controls" msgstr "Steuerelemente" @@ -6372,63 +6370,63 @@ msgstr "Audio Verbindungsmanager" msgid "MIDI Connection Manager" msgstr "Midi Verbindungsmanager" -#: global_port_matrix.cc:204 io_selector.cc:216 +#: global_port_matrix.cc:213 io_selector.cc:216 msgid "port" msgstr "Port" -#: group_tabs.cc:306 +#: group_tabs.cc:308 msgid "Selection..." msgstr "Ausgewählten Spuren" -#: group_tabs.cc:307 +#: group_tabs.cc:309 msgid "Record Enabled..." msgstr "Spuren, deren Aufnahme aktiviert ist" -#: group_tabs.cc:308 +#: group_tabs.cc:310 msgid "Soloed..." msgstr "Solo-Spuren/Busse" -#: group_tabs.cc:314 +#: group_tabs.cc:316 msgid "Create New Group ..." msgstr "Neue Gruppe erzeugen ..." -#: group_tabs.cc:315 +#: group_tabs.cc:317 msgid "Create New Group From" msgstr "Neue Gruppe erzeugen aus" -#: group_tabs.cc:318 +#: group_tabs.cc:320 msgid "Edit Group..." msgstr "Gruppe bearbeiten..." -#: group_tabs.cc:319 +#: group_tabs.cc:321 msgid "Collect Group" msgstr "Gruppe sammeln" -#: group_tabs.cc:320 +#: group_tabs.cc:322 msgid "Remove Group" msgstr "Gruppe entfernen" -#: group_tabs.cc:323 +#: group_tabs.cc:325 msgid "Remove Subgroup Bus" msgstr "Subgruppen-Bus entfernen" -#: group_tabs.cc:325 +#: group_tabs.cc:327 msgid "Add New Subgroup Bus" msgstr "Subgruppen-Bus hinzufügen" -#: group_tabs.cc:327 +#: group_tabs.cc:329 msgid "Add New Aux Bus (pre-fader)" msgstr "Aux-Send zur Subgruppe hinzufügen (Pre-Fader)" -#: group_tabs.cc:328 +#: group_tabs.cc:330 msgid "Add New Aux Bus (post-fader)" msgstr "Aux-Send zur Subgruppe hinzufügen (Post-Fader)" -#: group_tabs.cc:334 +#: group_tabs.cc:336 msgid "Enable All Groups" msgstr "Alle Gruppen aktivieren" -#: group_tabs.cc:335 +#: group_tabs.cc:337 msgid "Disable All Groups" msgstr "Alle Gruppen deaktivieren" @@ -6524,11 +6522,11 @@ msgstr "Importiere Datei: %1 von %2" msgid "I/O selector" msgstr "E/A Auswahl" -#: io_selector.cc:266 +#: io_selector.cc:265 msgid "%1 input" msgstr "%1 Eingang" -#: io_selector.cc:268 +#: io_selector.cc:267 msgid "%1 output" msgstr "%1 Ausgang" @@ -6608,7 +6606,7 @@ msgstr[1] "%1 Samples" msgid "Reset" msgstr "Zurücksetzen" -#: latency_gui.cc:151 rhythm_ferret.cc:274 sfdb_ui.cc:1734 +#: latency_gui.cc:151 rhythm_ferret.cc:274 sfdb_ui.cc:1762 msgid "programming error: %1 (%2)" msgstr "Programmierfehler: %1 (%2)" @@ -6636,63 +6634,63 @@ msgstr "Komponist:" msgid "Pre-Emphasis" msgstr "Präemphase" -#: location_ui.cc:310 +#: location_ui.cc:314 msgid "Remove this range" msgstr "Diesen Bereich entfernen" -#: location_ui.cc:311 +#: location_ui.cc:315 msgid "Start time - middle click to locate here" msgstr "Startzeit - Mittelklick, um hierher zu positionieren" -#: location_ui.cc:312 +#: location_ui.cc:316 msgid "End time - middle click to locate here" msgstr "Endzeit - Mittelklick, um hierher zu positionieren" -#: location_ui.cc:315 +#: location_ui.cc:319 msgid "Set range start from playhead location" msgstr "Bereichsbeginn auf Positionszeiger setzen" -#: location_ui.cc:316 +#: location_ui.cc:320 msgid "Set range end from playhead location" msgstr "Bereichsende auf Positionszeiger setzen" -#: location_ui.cc:320 +#: location_ui.cc:324 msgid "Remove this marker" msgstr "Diesen Marker entfernen" -#: location_ui.cc:321 +#: location_ui.cc:325 msgid "Position - middle click to locate here" msgstr "Position - Mittelklick, um hierher zu positionieren" -#: location_ui.cc:323 +#: location_ui.cc:327 msgid "Set marker time from playhead location" msgstr "Markerposition auf Positionszeiger setzen" -#: location_ui.cc:462 +#: location_ui.cc:494 msgid "You cannot put a CD marker at the start of the session" msgstr "Sie können keinen CD-Marker am Anfang des Projekts erstellen" -#: location_ui.cc:708 +#: location_ui.cc:720 msgid "New Marker" msgstr "Neuer Marker" -#: location_ui.cc:709 +#: location_ui.cc:721 msgid "New Range" msgstr "Neuer Bereich" -#: location_ui.cc:722 +#: location_ui.cc:734 msgid "<b>Loop/Punch Ranges</b>" msgstr "<b>Schleifen/Punchbereiche</b>" -#: location_ui.cc:747 +#: location_ui.cc:759 msgid "<b>Markers (Including CD Index)</b>" msgstr "<b>Marker (Inclusive CD Index)</b>" -#: location_ui.cc:782 +#: location_ui.cc:794 msgid "<b>Ranges (Including CD Track Ranges)</b>" msgstr "<b>Bereiche (Inclusive CD Track-Bereichen)</b>" -#: location_ui.cc:1024 +#: location_ui.cc:1036 msgid "add range marker" msgstr "Bereich hinzufügen" @@ -6850,89 +6848,82 @@ msgid "Force" msgstr "Force" #: midi_channel_selector.cc:330 midi_channel_selector.cc:372 -#, fuzzy msgid "MIDI Channel Control" -msgstr "Kanalfarben" +msgstr "MIDI-Kanaleinstellungen" #: midi_channel_selector.cc:332 -#, fuzzy msgid "Playback all channels" -msgstr "Alle Kanäle verbergen" +msgstr "Alle Kanäle wiedergeben" #: midi_channel_selector.cc:333 -#, fuzzy msgid "Play only selected channels" -msgstr "Gewählten Bereich abspielen" +msgstr "Nur ausgewählte Kanäle abspielen" #: midi_channel_selector.cc:334 msgid "Use a single fixed channel for all playback" -msgstr "" +msgstr "Benutze einen einzelnen festen Kanal für gesamte Wiedergabe" #: midi_channel_selector.cc:335 -#, fuzzy msgid "Record all channels" -msgstr "Alle Kanäle verbergen" +msgstr "Alle Kanäle aufnehmen" #: midi_channel_selector.cc:336 -#, fuzzy msgid "Record only selected channels" -msgstr "Kanal bearbeiten" +msgstr "Nur ausgewählte Kanäle aufnehmen" #: midi_channel_selector.cc:337 -#, fuzzy msgid "Force all channels to 1 channel" -msgstr "Kanal ändern" +msgstr "Alle Kanäle auf einem Kanal wiedergeben" #: midi_channel_selector.cc:378 -#, fuzzy msgid "Inbound" -msgstr "Regionengrenzen" +msgstr "Eingehend" #: midi_channel_selector.cc:398 -#, fuzzy msgid "Click to enable recording all channels" -msgstr "Klicke, um dieses Plugin zu ein/auszuschalten" +msgstr "Klicke, um Aufnahme aller Kanäle zuzulassen" #: midi_channel_selector.cc:403 msgid "Click to disable recording all channels" -msgstr "" +msgstr "Klicke, um Aufnahme für alle Kanäle abzuschalten" #: midi_channel_selector.cc:408 msgid "Click to invert currently selected recording channels" msgstr "" +"Klicke, um die gegenwärtige Auswahl der aufnehmenden Kanäle zu invertieren" #: midi_channel_selector.cc:415 -#, fuzzy msgid "Playback" -msgstr "Nur Wiedergabe" +msgstr "Wiedergabe" #: midi_channel_selector.cc:434 msgid "Click to enable playback of all channels" -msgstr "" +msgstr "Klicke, um Wiedergabe aller Kanäle zuzulassen" #: midi_channel_selector.cc:439 msgid "Click to disable playback of all channels" -msgstr "" +msgstr "Klicke, um Wiedergabe aller Kanäle abzuschalten" #: midi_channel_selector.cc:444 msgid "Click to invert current selected playback channels" msgstr "" +"Klicke, um die gegenwärtige Auswahl der wiedergebenden Kanäle zu invertieren" #: midi_channel_selector.cc:622 msgid "Click to toggle playback of channel %1" -msgstr "" +msgstr "Klicke, um die Wiedergabe von Kanal %1 umzuschalten" #: midi_channel_selector.cc:630 msgid "Click to force all MIDI channel messages to channel %1" -msgstr "" +msgstr "Klicke, um alle MIDI Channel Messages auf Kanal %1 auszugeben" #: midi_channel_selector.cc:720 msgid "Click to toggle recording of channel %1" -msgstr "" +msgstr "Klicke, um die Aufnahme von Kanal %1 umzuschalten" #: midi_channel_selector.cc:728 msgid "Click to force all recorded channels to %1" -msgstr "" +msgstr "Klicke, um alle aufgenommenen Kanäle an %1 zu zwingen" #: midi_export_dialog.cc:35 msgid "Export MIDI: %1" @@ -7140,12 +7131,11 @@ msgstr "Modus Externes Gerät" #: midi_time_axis.cc:271 msgid "Chns" -msgstr "" +msgstr "Chns" #: midi_time_axis.cc:272 -#, fuzzy msgid "Click to edit channel settings" -msgstr "Hier klicken, um einen Pfad hinzuzufügen" +msgstr "Klicke, um Kanaleinstellungen zu bearbeiten" #: midi_time_axis.cc:486 msgid "Show Full Range" @@ -7164,9 +7154,8 @@ msgid "Note Mode" msgstr "Noten-Modus" #: midi_time_axis.cc:497 -#, fuzzy msgid "Channel Selector" -msgstr "Kanalfarben" +msgstr "Kanalauswahl" #: midi_time_axis.cc:502 msgid "Color Mode" @@ -7230,13 +7219,12 @@ msgstr "Spurfarbe" #: midi_time_axis.cc:1488 midi_time_axis.cc:1494 midi_time_axis.cc:1504 #: midi_time_axis.cc:1510 -#, fuzzy msgid "all" -msgstr "Klein" +msgstr "alle" #: midi_time_axis.cc:1491 midi_time_axis.cc:1507 msgid "some" -msgstr "" +msgstr "einige" #: midi_tracer.cc:43 msgid "Line history: " @@ -7394,20 +7382,20 @@ msgstr "Mixer-Tastenkürzel aus %1 geladen" msgid "Could not find mixer.bindings in search path %1" msgstr "Konnte mixer.bindings im Suchpfad %1 nicht finden" -#: mixer_strip.cc:91 mixer_strip.cc:119 mixer_strip.cc:1720 +#: mixer_strip.cc:93 mixer_strip.cc:121 mixer_strip.cc:1721 msgid "pre" msgstr "Pre" -#: mixer_strip.cc:93 mixer_strip.cc:121 mixer_strip.cc:352 mixer_strip.cc:1293 +#: mixer_strip.cc:95 mixer_strip.cc:123 mixer_strip.cc:354 mixer_strip.cc:1300 #: rc_option_editor.cc:1873 msgid "Comments" msgstr "Kommentare" -#: mixer_strip.cc:145 +#: mixer_strip.cc:147 msgid "Click to toggle the width of this mixer strip." msgstr "Klicken Sie, um die Breite des Mixerkanals umzuschalten" -#: mixer_strip.cc:147 +#: mixer_strip.cc:149 msgid "" "\n" "%1-%2-click to toggle the width of all strips." @@ -7415,59 +7403,59 @@ msgstr "" "\n" "%1-%2-Klicken Sie, um die Breite aller Mixerkanäle umzuschalten." -#: mixer_strip.cc:154 +#: mixer_strip.cc:156 msgid "Hide this mixer strip" msgstr "Diesen Mixerkanal verbergen" -#: mixer_strip.cc:165 +#: mixer_strip.cc:167 msgid "Click to select metering point" msgstr "Abgreifpunkt der Pegelanzeige auswählen" -#: mixer_strip.cc:171 +#: mixer_strip.cc:173 msgid "tupni" msgstr "tupni" -#: mixer_strip.cc:190 +#: mixer_strip.cc:192 msgid "Isolate Solo" msgstr "Solo isolieren" -#: mixer_strip.cc:199 +#: mixer_strip.cc:201 msgid "Lock Solo Status" msgstr "Solostatus sperren" -#: mixer_strip.cc:201 mixer_strip.cc:1929 +#: mixer_strip.cc:203 mixer_strip.cc:1926 msgid "lock" msgstr "lock" -#: mixer_strip.cc:202 mixer_strip.cc:1928 +#: mixer_strip.cc:204 mixer_strip.cc:1925 msgid "iso" msgstr "iso" -#: mixer_strip.cc:256 +#: mixer_strip.cc:258 msgid "Mix group" msgstr "Bearbeitungsgruppe" -#: mixer_strip.cc:349 rc_option_editor.cc:1870 +#: mixer_strip.cc:351 rc_option_editor.cc:1870 msgid "Phase Invert" msgstr "Phaseninvertierung" -#: mixer_strip.cc:350 rc_option_editor.cc:1871 route_ui.cc:1213 +#: mixer_strip.cc:352 rc_option_editor.cc:1871 route_ui.cc:1218 msgid "Solo Safe" msgstr "Solo sperren" -#: mixer_strip.cc:353 mixer_ui.cc:124 route_time_axis.cc:664 +#: mixer_strip.cc:355 mixer_ui.cc:124 route_time_axis.cc:673 msgid "Group" msgstr "Gruppe" -#: mixer_strip.cc:354 rc_option_editor.cc:1874 +#: mixer_strip.cc:356 rc_option_editor.cc:1874 msgid "Meter Point" msgstr "Abgreifpunkt der Pegelanzeige" -#: mixer_strip.cc:466 +#: mixer_strip.cc:470 msgid "Enable/Disable MIDI input" msgstr "Aktiviert/Deaktiviert MIDI Input" -#: mixer_strip.cc:616 +#: mixer_strip.cc:622 msgid "" "Aux\n" "Sends" @@ -7475,139 +7463,151 @@ msgstr "" "Aux\n" "Sends" -#: mixer_strip.cc:640 +#: mixer_strip.cc:646 msgid "Snd" msgstr "Snd" -#: mixer_strip.cc:694 mixer_strip.cc:822 processor_box.cc:2152 +#: mixer_strip.cc:701 mixer_strip.cc:829 processor_box.cc:2154 msgid "Not connected to JACK - no I/O changes are possible" msgstr "" "Nicht mit Jack verbunden - es sind keine Änderungen an Ein-/Ausgängen möglich" -#: mixer_strip.cc:1089 +#: mixer_strip.cc:1096 msgid "<b>INPUT</b> to %1" msgstr "<b>EINGANG</b> zu %1" -#: mixer_strip.cc:1092 +#: mixer_strip.cc:1099 msgid "<b>OUTPUT</b> from %1" msgstr "<b>AUSGANG</b> von %1" -#: mixer_strip.cc:1167 +#: mixer_strip.cc:1174 msgid "Disconnected" msgstr "Getrennt" -#: mixer_strip.cc:1296 +#: mixer_strip.cc:1303 msgid "*Comments*" msgstr "*Kommentare*" -#: mixer_strip.cc:1303 +#: mixer_strip.cc:1310 msgid "Cmt" msgstr "Kmt" -#: mixer_strip.cc:1306 +#: mixer_strip.cc:1313 msgid "*Cmt*" msgstr "*Kmt*" -#: mixer_strip.cc:1312 +#: mixer_strip.cc:1319 msgid "Click to Add/Edit Comments" msgstr "Kommentare hinzufügen/ändern" -#: mixer_strip.cc:1351 +#: mixer_strip.cc:1358 msgid ": comment editor" msgstr ": Kommentare bearbeiten" -#: mixer_strip.cc:1428 +#: mixer_strip.cc:1435 msgid "Grp" msgstr "Grp" -#: mixer_strip.cc:1431 +#: mixer_strip.cc:1438 msgid "~G" msgstr "~G" -#: mixer_strip.cc:1460 +#: mixer_strip.cc:1467 msgid "Comments..." msgstr "Kommentare" -#: mixer_strip.cc:1462 +#: mixer_strip.cc:1469 msgid "Save As Template..." msgstr "Als Vorlage Speichern..." -#: mixer_strip.cc:1468 route_group_dialog.cc:39 route_time_axis.cc:687 +#: mixer_strip.cc:1475 route_group_dialog.cc:39 route_time_axis.cc:696 msgid "Active" msgstr "Aktiv" -#: mixer_strip.cc:1475 +#: mixer_strip.cc:1482 msgid "Adjust Latency..." msgstr "Latenz einstellen..." -#: mixer_strip.cc:1478 +#: mixer_strip.cc:1485 msgid "Protect Against Denormals" msgstr "Schütze vor Denormals" -#: mixer_strip.cc:1484 route_time_axis.cc:426 +#: mixer_strip.cc:1491 route_time_axis.cc:435 msgid "Remote Control ID..." msgstr "ID für Fernsteuerung..." -#: mixer_strip.cc:1716 mixer_strip.cc:1740 +#: mixer_strip.cc:1717 mixer_strip.cc:1741 msgid "in" msgstr "in" -#: mixer_strip.cc:1724 +#: mixer_strip.cc:1725 msgid "post" msgstr "Post" -#: mixer_strip.cc:1728 +#: mixer_strip.cc:1729 msgid "out" msgstr "out" -#: mixer_strip.cc:1733 +#: mixer_strip.cc:1734 msgid "custom" msgstr "Benutzerdefiniert" -#: mixer_strip.cc:1744 +#: mixer_strip.cc:1745 msgid "pr" msgstr "Pre" -#: mixer_strip.cc:1748 +#: mixer_strip.cc:1749 msgid "po" msgstr "Po" -#: mixer_strip.cc:1752 +#: mixer_strip.cc:1753 msgid "o" msgstr "an" -#: mixer_strip.cc:1757 +#: mixer_strip.cc:1758 msgid "c" msgstr "c" -#: mixer_strip.cc:1905 route_ui.cc:138 +#: mixer_strip.cc:1906 route_ui.cc:143 msgid "Disk" msgstr "Disk" -#: mixer_strip.cc:1920 monitor_section.cc:63 +#: mixer_strip.cc:1918 monitor_section.cc:63 msgid "AFL" msgstr "AFL" -#: mixer_strip.cc:1923 monitor_section.cc:64 +#: mixer_strip.cc:1921 monitor_section.cc:64 msgid "PFL" msgstr "PFL" -#: mixer_strip.cc:1936 +#: mixer_strip.cc:1933 msgid "D" msgstr "D" -#: mixer_strip.cc:1959 +#: mixer_strip.cc:1953 msgid "i" msgstr "i" -#: mixer_strip.cc:2133 +#: mixer_strip.cc:2128 msgid "Pre-fader" msgstr "Pre-Fader" -#: mixer_strip.cc:2134 +#: mixer_strip.cc:2129 msgid "Post-fader" msgstr "Post-Fader" +#: mixer_strip.cc:2166 meter_strip.cc:688 +msgid "Change all in Group to %1" +msgstr "Alle in Gruppe zu %1 ändern" + +#: mixer_strip.cc:2168 meter_strip.cc:690 +msgid "Change all to %1" +msgstr "Alle zu %1 ändern" + +#: mixer_strip.cc:2170 meter_strip.cc:692 +msgid "Change same track-type to %1" +msgstr "Gleichen Spurtyp zu %1 ändern" + #: mixer_ui.cc:1189 msgid "track display list item for renamed strip not found!" msgstr "" @@ -7617,10 +7617,46 @@ msgstr "" msgid "-all-" msgstr "-alle-" -#: mixer_ui.cc:1792 +#: mixer_ui.cc:1794 msgid "Strips" msgstr "Spur" +#: meter_patterns.cc:81 +msgid "Peak" +msgstr "Spitzenwert" + +#: meter_patterns.cc:84 +msgid "RMS + Peak" +msgstr "RMS + Spitzenwert" + +#: meter_patterns.cc:87 +msgid "IEC1/DIN" +msgstr "IEC1/DIN" + +#: meter_patterns.cc:90 +msgid "IEC1/Nordic" +msgstr "IEC1/Nordisch" + +#: meter_patterns.cc:93 +msgid "IEC2/BBC" +msgstr "IEC2/BBC" + +#: meter_patterns.cc:96 +msgid "IEC2/EBU" +msgstr "IEC2/EBU" + +#: meter_patterns.cc:99 +msgid "K20" +msgstr "K20" + +#: meter_patterns.cc:102 +msgid "K14" +msgstr "K14" + +#: meter_patterns.cc:105 +msgid "VU" +msgstr "VU" + #: monitor_section.cc:62 msgid "SiP" msgstr "SiP" @@ -7922,6 +7958,8 @@ msgstr " -h, --help Diese Hinweise ausgeben\n" msgid "" " -a, --no-announcements Do not contact website for announcements\n" msgstr "" +" -a, --no-announcements Webseite nicht wegen Verlautbarungen " +"kontaktieren" #: opts.cc:62 msgid "" @@ -7976,7 +8014,7 @@ msgstr "" #: opts.cc:70 msgid " -P, --no-connect-ports Do not connect any ports at startup\n" -msgstr "" +msgstr " -P, --no-connect-ports beim Programmstart Ports nicht verbinden" #: opts.cc:71 msgid " -S, --sync Draw the gui synchronously \n" @@ -8010,7 +8048,7 @@ msgstr "" msgid "Panner (2D)" msgstr "Panner (2D)" -#: panner2d.cc:783 panner_ui.cc:384 plugin_ui.cc:452 +#: panner2d.cc:783 panner_ui.cc:384 plugin_ui.cc:451 msgid "Bypass" msgstr "Bypass" @@ -8186,7 +8224,7 @@ msgstr "Nach Kategorie" msgid "Eh? LADSPA plugins don't have editors!" msgstr "Merkwürdig... LADSPA-Plugins sollten kein GUI haben!" -#: plugin_ui.cc:125 plugin_ui.cc:228 +#: plugin_ui.cc:125 plugin_ui.cc:227 msgid "" "unknown type of editor-supplying plugin (note: no VST support in this " "version of %1)" @@ -8198,7 +8236,7 @@ msgstr "" msgid "unknown type of editor-supplying plugin" msgstr "Unbekannter Plugintyp" -#: plugin_ui.cc:258 +#: plugin_ui.cc:257 msgid "" "unknown type of editor-supplying plugin (note: no linuxVST support in this " "version of %1)" @@ -8206,23 +8244,23 @@ msgstr "" "Unbekannter Plugintyp mit eigenem Editor (Hinweis: diese %1-Version " "unterstützt keine linuxVST-Plugins)" -#: plugin_ui.cc:330 +#: plugin_ui.cc:329 msgid "create_lv2_editor called on non-LV2 plugin" msgstr "create_lv2_editor auf nicht-LV2-Plugin angewandt" -#: plugin_ui.cc:418 +#: plugin_ui.cc:417 msgid "Add" msgstr "Hinzufügen" -#: plugin_ui.cc:422 +#: plugin_ui.cc:421 msgid "Description" msgstr "Beschreibung:" -#: plugin_ui.cc:423 +#: plugin_ui.cc:422 msgid "Plugin analysis" msgstr "Pluginanalyse" -#: plugin_ui.cc:430 +#: plugin_ui.cc:429 msgid "" "Presets (if any) for this plugin\n" "(Both factory and user-created)" @@ -8230,23 +8268,23 @@ msgstr "" "Presets (falls existent) für dieses Plugin\n" "(Hersteller- und Benutzerpresets)" -#: plugin_ui.cc:431 +#: plugin_ui.cc:430 msgid "Save a new preset" msgstr "Neues Preset speichern" -#: plugin_ui.cc:432 +#: plugin_ui.cc:431 msgid "Save the current preset" msgstr "Momentanes Preset speichern" -#: plugin_ui.cc:433 +#: plugin_ui.cc:432 msgid "Delete the current preset" msgstr "Lösche das aktuelle Preset" -#: plugin_ui.cc:434 +#: plugin_ui.cc:433 msgid "Disable signal processing by the plugin" msgstr "Deaktiviere die Signalverarbeitung des Plugins" -#: plugin_ui.cc:467 plugin_ui.cc:632 +#: plugin_ui.cc:466 plugin_ui.cc:662 msgid "" "Click to allow the plugin to receive keyboard events that %1 would normally " "use as a shortcut" @@ -8254,29 +8292,45 @@ msgstr "" "Klicke, damit das Plugin Tastaturbefehle erhält, die %1 sonst als " "Tastenkürzel verwenden würde" -#: plugin_ui.cc:468 +#: plugin_ui.cc:467 msgid "Click to enable/disable this plugin" msgstr "Klicke, um dieses Plugin zu ein/auszuschalten" -#: plugin_ui.cc:507 +#: plugin_ui.cc:506 msgid "latency (%1 sample)" msgid_plural "latency (%1 samples)" msgstr[0] "Latenz (%1 Sample)" msgstr[1] "Latenz (%1 Samples)" -#: plugin_ui.cc:509 +#: plugin_ui.cc:508 msgid "latency (%1 ms)" msgstr "Latenz (%1 ms)" -#: plugin_ui.cc:520 +#: plugin_ui.cc:519 msgid "Edit Latency" msgstr "Latenz bearbeiten" -#: plugin_ui.cc:559 +#: plugin_ui.cc:558 msgid "Plugin preset %1 not found" msgstr "Plugin Preset %1 nicht gefunden" -#: plugin_ui.cc:639 +#: plugin_ui.cc:595 +msgid "" +"Plugin presets are not supported in this build of %1. Consider paying for a " +"full version" +msgstr "" +"Pluginpresets werden in diesem Version von %1 nicht unterstützt. Erwägen " +"Sie, für eine Vollversion zu zahlen" + +#: plugin_ui.cc:615 plugin_ui.cc:630 +msgid "" +"Plugin presets are not supported in this build of %1. Consider paying for a " +"newer version" +msgstr "" +"Pluginpresets werden in diesem Version von %1 nicht unterstützt. Erwägen " +"Sie, für eine neuere Version zu zahlen" + +#: plugin_ui.cc:669 msgid "Click to allow normal use of %1 keyboard shortcuts" msgstr "Klicke, um die normale Verwendung von %1 Tastenkürzeln zu aktivieren" @@ -8380,62 +8434,62 @@ msgstr "Messe..." msgid "Port Insert " msgstr "Port Insert " -#: port_matrix.cc:323 port_matrix.cc:342 +#: port_matrix.cc:325 port_matrix.cc:344 msgid "<b>Sources</b>" msgstr "<b>Quellen</b>" -#: port_matrix.cc:324 port_matrix.cc:343 +#: port_matrix.cc:326 port_matrix.cc:345 msgid "<b>Destinations</b>" msgstr "<b>Ziele</b>" -#: port_matrix.cc:419 port_matrix.cc:427 +#: port_matrix.cc:421 port_matrix.cc:429 #, c-format msgid "Add %s %s" msgstr "Füge %s %s hinzu" -#: port_matrix.cc:435 +#: port_matrix.cc:437 #, c-format msgid "Rename '%s'..." msgstr "Benenne '%s' um..." -#: port_matrix.cc:451 +#: port_matrix.cc:453 msgid "Remove all" msgstr "Alle löschen" -#: port_matrix.cc:471 port_matrix.cc:483 +#: port_matrix.cc:473 port_matrix.cc:485 #, c-format msgid "%s all" msgstr "%s alle" -#: port_matrix.cc:506 +#: port_matrix.cc:508 msgid "Rescan" msgstr "Aktualisieren" -#: port_matrix.cc:508 +#: port_matrix.cc:510 msgid "Show individual ports" msgstr "Individuelle Ports anzeigen" -#: port_matrix.cc:514 +#: port_matrix.cc:516 msgid "Flip" msgstr "Drehen" -#: port_matrix.cc:702 +#: port_matrix.cc:704 msgid "" "It is not possible to add a port here, as the first processor in the track " "or buss cannot support the new configuration." msgstr "" -"Hier kann kein Port hinzugefügt werden, da das erste Plugin der Spur/des " +"Hier kann kein Port hinzugefügt werden, da der erste Prozessor der Spur/des " "Busses die neue Portanzahl nicht unterstützt." -#: port_matrix.cc:705 +#: port_matrix.cc:707 msgid "Cannot add port" msgstr "Kann Port nicht hinzufügen" -#: port_matrix.cc:727 +#: port_matrix.cc:729 msgid "Port removal not allowed" msgstr "Entfernen des Ports nicht erlaubt" -#: port_matrix.cc:728 +#: port_matrix.cc:730 msgid "" "This port cannot be removed, as the first plugin in the track or buss cannot " "accept the new number of inputs." @@ -8443,17 +8497,17 @@ msgstr "" "Der Port kann nicht entfernt werden, da das erste Plugin der Spur die neue " "Portanzahl nicht unterstützt." -#: port_matrix.cc:945 +#: port_matrix.cc:947 #, c-format msgid "Remove '%s'" msgstr "Lösche '%s'" -#: port_matrix.cc:960 +#: port_matrix.cc:962 #, c-format msgid "%s all from '%s'" msgstr "alle von '%s' %s" -#: port_matrix.cc:1026 +#: port_matrix.cc:1028 msgid "channel" msgstr "Kanal" @@ -8465,36 +8519,41 @@ msgstr "Es gibt keine Ports, zu denen verbunden werden kann." msgid "There are no %1 ports to connect." msgstr "Es gibt keine %1 Ports, zu denen verbunden werden kann." -#: processor_box.cc:255 +#: processor_box.cc:256 msgid "" "<b>%1</b>\n" "Double-click to show GUI.\n" "Alt+double-click to show generic GUI." msgstr "" +"<b>%1</b>\n" +"Doppelklick, um GUI zu zeigen.\n" +"Alt-Doppelklick, um einfaches GUI zu zeigen." -#: processor_box.cc:258 +#: processor_box.cc:259 msgid "" "<b>%1</b>\n" "Double-click to show generic GUI." msgstr "" +"<b>%1</b>\n" +"Alt-Doppelklick, um einfaches GUI zu zeigen." -#: processor_box.cc:371 +#: processor_box.cc:372 msgid "Show All Controls" msgstr "Alle Regler zeigen" -#: processor_box.cc:375 +#: processor_box.cc:376 msgid "Hide All Controls" msgstr "Alle Regler verbergen" -#: processor_box.cc:464 +#: processor_box.cc:465 msgid "on" msgstr "an" -#: processor_box.cc:464 rc_option_editor.cc:1903 rc_option_editor.cc:1917 +#: processor_box.cc:465 rc_option_editor.cc:1903 rc_option_editor.cc:1917 msgid "off" msgstr "Aus" -#: processor_box.cc:729 +#: processor_box.cc:742 msgid "" "Right-click to add/remove/edit\n" "plugins,inserts,sends and more" @@ -8502,15 +8561,15 @@ msgstr "" "Rechtsklick, um Plugins, Inserts, Sends etc.\n" "hinzuzufügen/zu editieren/zu löschen" -#: processor_box.cc:1184 processor_box.cc:1578 +#: processor_box.cc:1197 processor_box.cc:1591 msgid "Plugin Incompatibility" msgstr "Plugin-Inkompatibilität" -#: processor_box.cc:1187 +#: processor_box.cc:1200 msgid "You attempted to add the plugin \"%1\" in slot %2.\n" msgstr "Sie haben versucht, das Plugin \"%1\" im Einschub %2 hinzuzufügen.\n" -#: processor_box.cc:1193 +#: processor_box.cc:1206 msgid "" "\n" "This plugin has:\n" @@ -8518,19 +8577,19 @@ msgstr "" "\n" "Dieses Plugin hat:\n" -#: processor_box.cc:1196 +#: processor_box.cc:1209 msgid "\t%1 MIDI input\n" msgid_plural "\t%1 MIDI inputs\n" msgstr[0] "\t%1 MIDI Eingang\n" msgstr[1] "\t%1 MIDI Eingänge\n" -#: processor_box.cc:1200 +#: processor_box.cc:1213 msgid "\t%1 audio input\n" msgid_plural "\t%1 audio inputs\n" msgstr[0] "\t%1 Audio-Eingang\n" msgstr[1] "\t%1 Audio-Eingänge\n" -#: processor_box.cc:1203 +#: processor_box.cc:1216 msgid "" "\n" "but at the insertion point, there are:\n" @@ -8538,19 +8597,19 @@ msgstr "" "\n" "aber am Einfügepunkt gibt es:\n" -#: processor_box.cc:1206 +#: processor_box.cc:1219 msgid "\t%1 MIDI channel\n" msgid_plural "\t%1 MIDI channels\n" msgstr[0] "\t%1 MIDI-Kanal\n" msgstr[1] "\t%1 MIDI-Kanäle\n" -#: processor_box.cc:1210 +#: processor_box.cc:1223 msgid "\t%1 audio channel\n" msgid_plural "\t%1 audio channels\n" msgstr[0] "\t%1 Audio-Kanal\n" msgstr[1] "\t%1 Audio-Kanäle\n" -#: processor_box.cc:1213 +#: processor_box.cc:1226 msgid "" "\n" "%1 is unable to insert this plugin here.\n" @@ -8558,11 +8617,11 @@ msgstr "" "\n" "%1 kann dieses Plugin hier nicht einfügen.\n" -#: processor_box.cc:1249 +#: processor_box.cc:1262 msgid "Cannot set up new send: %1" msgstr "Kann keinen neuen Send erstellen: %1" -#: processor_box.cc:1581 +#: processor_box.cc:1594 msgid "" "You cannot reorder these plugins/sends/inserts\n" "in that way because the inputs and\n" @@ -8572,21 +8631,21 @@ msgstr "" "nicht auf diese Weise verändern, sonst würden\n" "die Ein-/Ausgänge nicht mehr richtig funktionieren." -#: processor_box.cc:1765 +#: processor_box.cc:1778 msgid "Rename Processor" msgstr "Prozessor umbenennen" -#: processor_box.cc:1796 +#: processor_box.cc:1809 msgid "At least 100 IO objects exist with a name like %1 - name not changed" msgstr "" "Es gibt mindestens 100 E/A-Objekte mit einem Namen wie %1 - Name nicht " "geändert" -#: processor_box.cc:1930 +#: processor_box.cc:1943 msgid "plugin insert constructor failed" msgstr "Einfügen des Plugins gescheitert" -#: processor_box.cc:1941 +#: processor_box.cc:1954 msgid "" "Copying the set of processors on the clipboard failed,\n" "probably because the I/O configuration of the plugins\n" @@ -8596,84 +8655,83 @@ msgstr "" "kopieren, vermutlich weil die E/A Konfiguration der Plugins\n" "nicht mit der dieser Spur übereinstimmt." -#: processor_box.cc:1987 +#: processor_box.cc:2000 msgid "" "Do you really want to remove all processors from %1?\n" "(this cannot be undone)" msgstr "" -"Wollen Sie wirklich alle Redirects von %1 entfernen?\n" +"Wollen Sie wirklich alle Prozessoren von %1 entfernen?\n" "(Dies kann nicht rückgängig gemacht werden)" -#: processor_box.cc:1991 processor_box.cc:2016 +#: processor_box.cc:2004 processor_box.cc:2029 msgid "Yes, remove them all" msgstr "Ja, alle löschen" -#: processor_box.cc:1993 processor_box.cc:2018 +#: processor_box.cc:2006 processor_box.cc:2031 msgid "Remove processors" msgstr "Prozessoren entfernen" -#: processor_box.cc:2008 +#: processor_box.cc:2021 msgid "" "Do you really want to remove all pre-fader processors from %1?\n" "(this cannot be undone)" msgstr "" -"Wollen Sie wirklich alle Pre-Fader-Redirects von %1 entfernen?\n" +"Wollen Sie wirklich alle Pre-Fader-Prozessoren von %1 entfernen?\n" "(Dies kann nicht rückgängig gemacht werden)" -#: processor_box.cc:2011 +#: processor_box.cc:2024 msgid "" "Do you really want to remove all post-fader processors from %1?\n" "(this cannot be undone)" msgstr "" -"Wollen Sie wirklich alle Post-Fader-Redirects von %1 entfernen?\n" +"Wollen Sie wirklich alle Post-Fader-Prozessoren von %1 entfernen?\n" "(Dies kann nicht rückgängig gemacht werden)" -#: processor_box.cc:2198 +#: processor_box.cc:2200 msgid "New Plugin" msgstr "Plugin einfügen" -#: processor_box.cc:2201 +#: processor_box.cc:2203 msgid "New Insert" msgstr "Insert einfügen" -#: processor_box.cc:2204 +#: processor_box.cc:2206 msgid "New External Send ..." msgstr "Neuer externer Send..." -#: processor_box.cc:2208 +#: processor_box.cc:2210 msgid "New Aux Send ..." msgstr "Neuer Aux-Send..." -#: processor_box.cc:2212 +#: processor_box.cc:2214 msgid "Clear (all)" msgstr "Leeren (alle)" -#: processor_box.cc:2214 +#: processor_box.cc:2216 msgid "Clear (pre-fader)" msgstr "Leeren (Pre-Fader)" -#: processor_box.cc:2216 +#: processor_box.cc:2218 msgid "Clear (post-fader)" msgstr "Leeren (Post-Fader)" -#: processor_box.cc:2242 +#: processor_box.cc:2244 msgid "Activate All" msgstr "Alle aktivieren" -#: processor_box.cc:2244 +#: processor_box.cc:2246 msgid "Deactivate All" msgstr "Alle deaktivieren" -#: processor_box.cc:2246 +#: processor_box.cc:2248 msgid "A/B Plugins" msgstr "A/B Plugins" -#: processor_box.cc:2255 -#, fuzzy +#: processor_box.cc:2257 msgid "Edit with generic controls..." msgstr "Mit einfachen Kontrollelementen editieren..." -#: processor_box.cc:2531 +#: processor_box.cc:2557 msgid "%1: %2 (by %3)" msgstr "%1: %2 (by %3)" @@ -8763,7 +8821,7 @@ msgstr "Bearbeiten mit:" #: rc_option_editor.cc:321 rc_option_editor.cc:347 rc_option_editor.cc:374 msgid "+ button" -msgstr "und Maustaste" +msgstr "+ Maustaste" #: rc_option_editor.cc:341 msgid "Delete using:" @@ -8794,9 +8852,8 @@ msgid "Recording (seconds of buffering):" msgstr "Aufnahme (gepufferte Sekunden):" #: rc_option_editor.cc:656 -#, fuzzy msgid "Control Surface Protocol" -msgstr "Eingabegeräte / Controller" +msgstr "Eingabegeräteprotokoll" #: rc_option_editor.cc:660 msgid "Feedback" @@ -8810,37 +8867,42 @@ msgstr "" #: rc_option_editor.cc:817 msgid "Show Video Export Info before export" -msgstr "" +msgstr "Zeige Video-Exportinformationen vor dem Exportieren" #: rc_option_editor.cc:818 msgid "Show Video Server Startup Dialog" -msgstr "" +msgstr "Zeige den Videoserver-Startdialog" #: rc_option_editor.cc:819 msgid "Advanced Setup (remote video server)" -msgstr "" +msgstr "Ausführliche Einrichtung (entfernter Videoserver)" #: rc_option_editor.cc:827 msgid "" "<b>When enabled</b> you can speficify a custom video-server URL and docroot. " "- Do not enable this option unless you know what you are doing." msgstr "" +"<b>Wenn aktiviert</b>, können Sie eine benutzerdefinierte URL und docroot " +"für den Videoserver eingeben. - Aktivieren Sie diese Option nur, wenn Sie " +"wissen, was Sie tun." #: rc_option_editor.cc:829 msgid "Video Server URL:" -msgstr "" +msgstr "Videoserver URL:" #: rc_option_editor.cc:834 msgid "" "Base URL of the video-server including http prefix. This is usually 'http://" "hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when " -"the video-server is runing locally" +"the video-server is running locally" msgstr "" +"Basis-URL des Videoservers mit http-Prefix. Dies ist normalerweise 'http://" +"hostname.example.org:1554/' und ist auf 'http://localhost:1554/' " +"voreingestellt, wenn der Videoserver lokal läuft" #: rc_option_editor.cc:836 -#, fuzzy msgid "Video Folder:" -msgstr "Ordner:" +msgstr "Videoordner:" #: rc_option_editor.cc:841 msgid "" @@ -8850,18 +8912,27 @@ msgid "" "docroot or be left empty if it is unvailable. It is used for the local video-" "monitor and file-browsing when opening/adding a video file." msgstr "" +"Lokaler Pfad zum document-root des Videoservers. Nur Dateien unterhalb " +"dieses Verzeichnisses sind dem Videoserver zugänglich.Falls der Server auf " +"einem entfernten Rechner läuft, sollte der Pfad auf ein im Netzwerk " +"gemountetes Verzeichnis der docroot des Servers verweisen, oder leergelassen " +"werden, falls es nicht zugänglich ist. Wird für den lokalen Videomonitor und " +"die Dateisuche beim Öffnen/Hinzufügen einer Videodatei benutzt." #: rc_option_editor.cc:848 msgid "" "<b>When enabled</b> an information window with details is displayed before " "the video-export dialog." msgstr "" +"<b>Wenn aktiviert</b> , wird vor dem Videoexport-Dialog ein " +"Informationsfenster mit Details angezeigt." #: rc_option_editor.cc:853 msgid "" "<b>When enabled</b> the video server is never launched automatically without " "confirmation" msgstr "" +"<b>Wenn aktiviert</b>, wird der Videoserver nie ohne Bestätigung gestartet" #: rc_option_editor.cc:993 msgid "%1 Preferences" @@ -8885,7 +8956,7 @@ msgstr "Alle verfügbaren Prozessoren" #: rc_option_editor.cc:1017 msgid "%1 processors" -msgstr "%1 Prozessor(en)" +msgstr "%1 Prozessoren" #: rc_option_editor.cc:1020 msgid "This setting will only take effect when %1 is restarted." @@ -8923,7 +8994,7 @@ msgstr "Maximale Anzahl kürzlich geöffneter Projekte" msgid "Click gain level" msgstr "Lautstärke für Klick" -#: rc_option_editor.cc:1083 route_time_axis.cc:206 route_time_axis.cc:667 +#: rc_option_editor.cc:1083 route_time_axis.cc:215 route_time_axis.cc:676 msgid "Automation" msgstr "Automationen" @@ -9311,7 +9382,7 @@ msgstr "Umgang des Prozessors mit Denormals" #: rc_option_editor.cc:1532 msgid "no processor handling" -msgstr "Keine Korrekturen" +msgstr "nicht behandeln" #: rc_option_editor.cc:1537 msgid "use FlushToZero" @@ -9375,11 +9446,11 @@ msgstr "Abgreifpunkt der PFL Signale" #: rc_option_editor.cc:1622 msgid "before pre-fader processors" -msgstr "Vor den Pre-Fader Effekten" +msgstr "Vor den Pre-Fader Prozessoren" #: rc_option_editor.cc:1623 msgid "pre-fader but after pre-fader processors" -msgstr "Pre-Fader, aber nach den Effekten" +msgstr "Pre-Fader, aber nach den Prozessoren" #: rc_option_editor.cc:1629 msgid "AFL signals come from" @@ -9391,7 +9462,7 @@ msgstr "Direkt nach dem Fader" #: rc_option_editor.cc:1635 msgid "after post-fader processors (before pan)" -msgstr "Nach den Post-Fader Effekten (vor Pan)" +msgstr "Nach den Post-Fader Prozessoren (vor Pan)" #: rc_option_editor.cc:1644 msgid "Exclusive solo" @@ -9507,10 +9578,11 @@ msgstr "folgt Reihenfolge im Editor" #: rc_option_editor.cc:1838 rc_option_editor.cc:1846 rc_option_editor.cc:1856 #: rc_option_editor.cc:1877 rc_option_editor.cc:1886 rc_option_editor.cc:1894 -#: rc_option_editor.cc:1908 rc_option_editor.cc:1925 -#, fuzzy +#: rc_option_editor.cc:1908 rc_option_editor.cc:1927 rc_option_editor.cc:1943 +#: rc_option_editor.cc:1959 rc_option_editor.cc:1973 rc_option_editor.cc:1987 +#: rc_option_editor.cc:1989 msgid "Preferences|GUI" -msgstr "Globale Einstellungen" +msgstr "GUI" #: rc_option_editor.cc:1841 msgid "Graphically indicate mouse pointer hovering over various widgets" @@ -9537,14 +9609,14 @@ msgid "Use narrow strips in the mixer by default" msgstr "Standardmäßig schmale Mixer-Kanalzüge verwenden" #: rc_option_editor.cc:1898 -msgid "Meter hold time" -msgstr "Pegelanzeige halten" +msgid "Peak hold time" +msgstr "Haltezeit für Spitzenwert" #: rc_option_editor.cc:1904 msgid "short" msgstr "Kurz" -#: rc_option_editor.cc:1905 rc_option_editor.cc:1920 +#: rc_option_editor.cc:1905 msgid "medium" msgstr "Mittel" @@ -9553,28 +9625,112 @@ msgid "long" msgstr "Lange" #: rc_option_editor.cc:1912 -msgid "Meter fall-off" -msgstr "Abfall der Pegelanzeige" +msgid "DPM fall-off" +msgstr "Abfall der digitalen Pegelanzeige" #: rc_option_editor.cc:1918 -msgid "slowest" -msgstr "Am langsamstem" +msgid "slowest [6.6dB/sec]" +msgstr "am langsamsten [6.6dB/sec]" #: rc_option_editor.cc:1919 -msgid "slow" -msgstr "Langsam" +msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)" +msgstr "langsam [8.6dB/sec] (BBC PPM, EBU PPM)" + +#: rc_option_editor.cc:1920 +msgid "slowish [12.0dB/sec] (DIN)" +msgstr "etwas langsam [12.0dB/sec] (DIN)" #: rc_option_editor.cc:1921 -msgid "fast" -msgstr "Schnell" +msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)" +msgstr "mäßig [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)" #: rc_option_editor.cc:1922 -msgid "faster" -msgstr "Schneller" +msgid "medium [20dB/sec]" +msgstr "mittel [20dB/sec]" #: rc_option_editor.cc:1923 -msgid "fastest" -msgstr "Schnellstmöglich" +msgid "fast [32dB/sec]" +msgstr "schnell [32dB/sec]" + +#: rc_option_editor.cc:1924 +msgid "faster [46dB/sec]" +msgstr "schneller [46dB/sec]" + +#: rc_option_editor.cc:1925 +msgid "fastest [70dB/sec]" +msgstr "am schnellsten [70dB/sec]" + +#: rc_option_editor.cc:1931 +msgid "Meter line-up level; 0dBu" +msgstr "Ausrichtung der Pegelanzeige; 0dBu" + +#: rc_option_editor.cc:1936 rc_option_editor.cc:1952 +msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)" +msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)" + +#: rc_option_editor.cc:1937 rc_option_editor.cc:1953 +msgid "-20dBFS (SMPTE RP.0155)" +msgstr "-20dBFS (SMPTE RP.0155)" + +#: rc_option_editor.cc:1938 rc_option_editor.cc:1954 +msgid "-18dBFS (EBU, BBC)" +msgstr "-18dBFS (EBU, BBC)" + +#: rc_option_editor.cc:1939 rc_option_editor.cc:1955 +msgid "-15dBFS (DIN)" +msgstr "-15dBFS (DIN)" + +#: rc_option_editor.cc:1941 +msgid "" +"Configure meter-marks and color-knee point for dBFS scale DPM, set reference " +"level for IEC1/Nordic, IEC2 PPM and VU meter." +msgstr "" +"Konfiguriere Skalierung und Farbschwellwert für DPM mit dBFS-Skala, setze" +"Referenzpegel für IEC1/Nordisch, IEC2 PPM und VU Pegelanzeigen." + +#: rc_option_editor.cc:1947 +msgid "IEC1/DIN Meter line-up level; 0dBu" +msgstr "Ausrichtung der IEC1/DIN Pegelanzeige; 0dBu" + +#: rc_option_editor.cc:1957 +msgid "Reference level for IEC1/DIN meter." +msgstr "Referenzpegel für IEC1/DIN Pegelanzeige." + +#: rc_option_editor.cc:1963 +msgid "VU Meter standard" +msgstr "Standard für VU-Pegelanzeige" + +#: rc_option_editor.cc:1968 +msgid "0VU = -2dBu (France)" +msgstr "0VU = -2dBu (Frankreich)" + +#: rc_option_editor.cc:1969 +msgid "0VU = 0dBu (North America, Australia)" +msgstr "0VU = 0dBu (Nordamerika, Australien)" + +#: rc_option_editor.cc:1970 +msgid "0VU = +4dBu (standard)" +msgstr "0VU = +4dBu (Standard)" + +#: rc_option_editor.cc:1971 +msgid "0VU = +8dBu" +msgstr "0VU = +8dBu" + +#: rc_option_editor.cc:1977 +msgid "Peak threshold [dBFS]" +msgstr "Schwelle für Spitzenwert [dBFS]" + +#: rc_option_editor.cc:1985 +msgid "" +"Specify the audio signal level in dbFS at and above which the meter-peak " +"indicator will flash red." +msgstr "" +"Geben Sie den Signalpegel in dbFS an, bei dessen Erreichen oder " +"Überschreitung die Spitzenwertanzeige in der Pegelanzeige rot blinkt" + +#: rc_option_editor.cc:1992 +msgid "LED meter style" +msgstr "Pegelanzeigen im LED-Stil" #: region_editor.cc:79 msgid "audition this region" @@ -9588,7 +9744,7 @@ msgstr "Position:" msgid "End:" msgstr "Ende:" -#: region_editor.cc:92 sfdb_ui.cc:140 +#: region_editor.cc:92 sfdb_ui.cc:141 msgid "Length:" msgstr "Länge:" @@ -9612,23 +9768,23 @@ msgstr "Quellen:" msgid "Source:" msgstr "Quelle:" -#: region_editor.cc:167 +#: region_editor.cc:166 msgid "Region '%1'" msgstr "Region '%1'" -#: region_editor.cc:274 +#: region_editor.cc:273 msgid "change region start position" msgstr "Startposition der Region ändern" -#: region_editor.cc:290 +#: region_editor.cc:289 msgid "change region end position" msgstr "Endposition der Region ändern" -#: region_editor.cc:310 +#: region_editor.cc:309 msgid "change region length" msgstr "Länge der Region verändern" -#: region_editor.cc:404 region_editor.cc:416 +#: region_editor.cc:403 region_editor.cc:415 msgid "change region sync point" msgstr "Synchronisationspunkt der Region ändern" @@ -9756,7 +9912,7 @@ msgstr "Threshold" #: rhythm_ferret.cc:128 msgid "Peak threshold" -msgstr "Peak threshold" +msgstr "Schwelle für Spitzenwert" #: rhythm_ferret.cc:133 msgid "Silence threshold" @@ -9821,320 +9977,319 @@ msgstr "" "Es gibt bereits eine Bearbeitungsgruppe mit diesem Namen. Bitte wahlen Sie " "einen anderen." -#: route_params_ui.cc:82 +#: route_params_ui.cc:83 msgid "Tracks/Busses" msgstr "Spuren/Busse" -#: route_params_ui.cc:101 +#: route_params_ui.cc:102 msgid "Inputs" msgstr "Eingänge" -#: route_params_ui.cc:102 +#: route_params_ui.cc:103 msgid "Outputs" msgstr "Ausgänge" -#: route_params_ui.cc:103 +#: route_params_ui.cc:104 msgid "Plugins, Inserts & Sends" msgstr "Plugins, Inserts & Sends" -#: route_params_ui.cc:211 +#: route_params_ui.cc:208 msgid "route display list item for renamed route not found!" msgstr "" "Konnte Bezeichnung für umbenannten Verbindung nicht in der Liste der " "Verbindungen finden!" -#: route_params_ui.cc:258 route_params_ui.cc:286 +#: route_params_ui.cc:255 route_params_ui.cc:283 #, c-format msgid "Playback delay: %<PRId64> samples" msgstr "Wiedergabeverzögerung: %<PRId64> Samples" -#: route_params_ui.cc:478 +#: route_params_ui.cc:475 msgid "NO TRACK" msgstr "KEINE SPUR" -#: route_params_ui.cc:611 route_params_ui.cc:612 +#: route_params_ui.cc:613 route_params_ui.cc:614 msgid "No Track or Bus Selected" msgstr "Keine Spuren oder Busse ausgewählt" -#: route_time_axis.cc:96 +#: route_time_axis.cc:97 msgid "g" msgstr "g" -#: route_time_axis.cc:97 +#: route_time_axis.cc:98 msgid "p" msgstr "w" -#: route_time_axis.cc:98 +#: route_time_axis.cc:99 msgid "a" msgstr "a" -#: route_time_axis.cc:168 +#: route_time_axis.cc:173 msgid "Record (Right-click for Step Edit)" msgstr "Aufnahme (Rechtsklick für Step Entry)" -#: route_time_axis.cc:171 +#: route_time_axis.cc:176 msgid "Record" msgstr "Aufnahme" -#: route_time_axis.cc:201 +#: route_time_axis.cc:210 msgid "Route Group" msgstr "Bearbeitungsgruppe" -#: route_time_axis.cc:204 +#: route_time_axis.cc:213 msgid "MIDI Controllers and Automation" msgstr "MIDI-Controller und Automation" -#: route_time_axis.cc:381 +#: route_time_axis.cc:390 msgid "Show All Automation" msgstr "Alle Automationen anzeigen" -#: route_time_axis.cc:384 +#: route_time_axis.cc:393 msgid "Show Existing Automation" msgstr "Genutzte Automationen zeigen" -#: route_time_axis.cc:387 +#: route_time_axis.cc:396 msgid "Hide All Automation" msgstr "Alle Automationen verbergen" -#: route_time_axis.cc:396 -#, fuzzy +#: route_time_axis.cc:405 msgid "Processor automation" -msgstr "Automation zurücksetzen" +msgstr "Prozessorautomation" -#: route_time_axis.cc:415 +#: route_time_axis.cc:424 msgid "Color..." msgstr "Farbe..." -#: route_time_axis.cc:472 +#: route_time_axis.cc:481 msgid "Overlaid" msgstr "Overlaid" -#: route_time_axis.cc:478 +#: route_time_axis.cc:487 msgid "Stacked" msgstr "Stacked" -#: route_time_axis.cc:486 +#: route_time_axis.cc:495 msgid "Layers" msgstr "Layers" -#: route_time_axis.cc:555 +#: route_time_axis.cc:564 msgid "Automatic (based on I/O connections)" msgstr "Automatisch (auf den I/O Verbindungen basierend)" -#: route_time_axis.cc:564 +#: route_time_axis.cc:573 msgid "(Currently: Existing Material)" msgstr "(Momentan: An vorhandenem Material ausrichten)" -#: route_time_axis.cc:567 +#: route_time_axis.cc:576 msgid "(Currently: Capture Time)" msgstr "(Momentan: An Aufnahmezeit ausrichten)" -#: route_time_axis.cc:575 +#: route_time_axis.cc:584 msgid "Align With Existing Material" msgstr "An vorhandenem Material ausrichten" -#: route_time_axis.cc:580 +#: route_time_axis.cc:589 msgid "Align With Capture Time" msgstr "An Aufnahmezeit ausrichten" -#: route_time_axis.cc:585 +#: route_time_axis.cc:594 msgid "Alignment" msgstr "Ausrichtung" -#: route_time_axis.cc:620 +#: route_time_axis.cc:629 msgid "Normal Mode" msgstr "Normaler Modus" -#: route_time_axis.cc:626 +#: route_time_axis.cc:635 msgid "Tape Mode" msgstr "Band-Modus" -#: route_time_axis.cc:632 +#: route_time_axis.cc:641 msgid "Non-Layered Mode" msgstr "Non-Layered Mode" -#: route_time_axis.cc:645 route_time_axis.cc:1587 +#: route_time_axis.cc:654 route_time_axis.cc:1601 msgid "Playlist" msgstr "Wiedergabeliste" -#: route_time_axis.cc:965 +#: route_time_axis.cc:979 msgid "Rename Playlist" msgstr "Wiedergabeliste umbenennen" -#: route_time_axis.cc:966 +#: route_time_axis.cc:980 msgid "New name for playlist:" msgstr "Neuer Name für Wiedergabeliste:" -#: route_time_axis.cc:1051 +#: route_time_axis.cc:1065 msgid "New Copy Playlist" msgstr "Neue Kopie der Wiedergabeliste" -#: route_time_axis.cc:1052 route_time_axis.cc:1105 +#: route_time_axis.cc:1066 route_time_axis.cc:1119 msgid "Name for new playlist:" msgstr "Name für die neue Wiedergabeliste:" -#: route_time_axis.cc:1104 +#: route_time_axis.cc:1118 msgid "New Playlist" msgstr "Neue Wiedergabeliste" -#: route_time_axis.cc:1295 +#: route_time_axis.cc:1309 msgid "You cannot create a track with that name as it is reserved for %1" msgstr "" "Sie können keine Spur mit einem Namen erstellen, der für %1 reserviert ist." -#: route_time_axis.cc:1476 +#: route_time_axis.cc:1490 msgid "New Copy..." msgstr "Neue Kopie..." -#: route_time_axis.cc:1480 +#: route_time_axis.cc:1494 msgid "New Take" msgstr "Neuer Take" -#: route_time_axis.cc:1481 +#: route_time_axis.cc:1495 msgid "Copy Take" msgstr "Take kopieren" -#: route_time_axis.cc:1486 +#: route_time_axis.cc:1500 msgid "Clear Current" msgstr "Aktuelle leeren" -#: route_time_axis.cc:1489 +#: route_time_axis.cc:1503 msgid "Select From All..." msgstr "Aus allen auswählen..." -#: route_time_axis.cc:1577 +#: route_time_axis.cc:1591 msgid "Take: %1.%2" msgstr "Take: %1.%2" -#: route_time_axis.cc:2267 +#: route_time_axis.cc:2291 msgid "Underlays" msgstr "Darunterliegende" -#: route_time_axis.cc:2270 +#: route_time_axis.cc:2294 msgid "Remove \"%1\"" msgstr "Lösche \"%1\"" -#: route_time_axis.cc:2320 route_time_axis.cc:2357 +#: route_time_axis.cc:2344 route_time_axis.cc:2381 msgid "programming error: underlay reference pointer pairs are inconsistent!" msgstr "programming error: underlay reference pointer pairs are inconsistent!" -#: route_time_axis.cc:2388 +#: route_time_axis.cc:2408 msgid "After-fade listen (AFL)" msgstr "After-Fader (AFL)" -#: route_time_axis.cc:2392 +#: route_time_axis.cc:2412 msgid "Pre-fade listen (PFL)" msgstr "Pre-Fader (PFL)" -#: route_time_axis.cc:2396 +#: route_time_axis.cc:2416 msgid "s" msgstr "s" -#: route_time_axis.cc:2400 +#: route_time_axis.cc:2419 msgid "m" msgstr "m" -#: route_ui.cc:114 +#: route_ui.cc:119 msgid "Mute this track" msgstr "Diese Spur stummschalten" -#: route_ui.cc:118 +#: route_ui.cc:123 msgid "Mute other (non-soloed) tracks" msgstr "Andere (nicht Solo-)Spuren stummschalten" -#: route_ui.cc:124 +#: route_ui.cc:129 msgid "Enable recording on this track" msgstr "Aktiviere die Aufnahme auf dieser Spur" -#: route_ui.cc:128 +#: route_ui.cc:133 msgid "make mixer strips show sends to this bus" msgstr "Channel strips zeigen Sends zu diesem Bus" -#: route_ui.cc:133 +#: route_ui.cc:138 msgid "Monitor input" msgstr "Eingang abhören" -#: route_ui.cc:139 +#: route_ui.cc:144 msgid "Monitor playback" msgstr "Vorhandenes Material abhören" -#: route_ui.cc:586 +#: route_ui.cc:591 msgid "Not connected to JACK - cannot engage record" msgstr "Nicht mit JACK verbunden - konnte die Aufnahme nicht starten" -#: route_ui.cc:781 +#: route_ui.cc:786 msgid "Step Entry" msgstr "Eingabemodus (Step Entry)" -#: route_ui.cc:854 +#: route_ui.cc:859 msgid "Assign all tracks (prefader)" msgstr "Alle Audiospuren zuweisen (Pre-Fader)" -#: route_ui.cc:858 +#: route_ui.cc:863 msgid "Assign all tracks and buses (prefader)" msgstr "Alle Audiospuren und Busse zuweisen (Pre-Fader)" -#: route_ui.cc:862 +#: route_ui.cc:867 msgid "Assign all tracks (postfader)" msgstr "Alle Audiospuren zuweisen (Post-Fader)" -#: route_ui.cc:866 +#: route_ui.cc:871 msgid "Assign all tracks and buses (postfader)" msgstr "Alle Audiospuren und Busse zuweisen (Post-Fader)" -#: route_ui.cc:870 +#: route_ui.cc:875 msgid "Assign selected tracks (prefader)" msgstr "Ausgewählte Audiospuren zuweisen (Pre-Fader)" -#: route_ui.cc:874 +#: route_ui.cc:879 msgid "Assign selected tracks and buses (prefader)" msgstr "Ausgewählte Audiospuren und Busse zuweisen (Pre-Fader)" -#: route_ui.cc:877 +#: route_ui.cc:882 msgid "Assign selected tracks (postfader)" msgstr "Ausgewählte Audiospuren zuweisen (Post-Fader)" -#: route_ui.cc:881 +#: route_ui.cc:886 msgid "Assign selected tracks and buses (postfader)" msgstr "Ausgewählte Audiospuren und Busse zuweisen (Post-Fader)" -#: route_ui.cc:884 +#: route_ui.cc:889 msgid "Copy track/bus gains to sends" msgstr "Lautstärken der Spuren/Busse auf ihre Sends kopieren" -#: route_ui.cc:885 +#: route_ui.cc:890 msgid "Set sends gain to -inf" msgstr "Setze Sends-Lautstärken to -inf" -#: route_ui.cc:886 +#: route_ui.cc:891 msgid "Set sends gain to 0dB" msgstr "Setze Sends-Lautstärken to 0dB" -#: route_ui.cc:1206 +#: route_ui.cc:1211 msgid "Solo Isolate" msgstr "Isoliertes Solo" -#: route_ui.cc:1235 +#: route_ui.cc:1240 msgid "Pre Fader" msgstr "Pre Fader" -#: route_ui.cc:1241 +#: route_ui.cc:1246 msgid "Post Fader" msgstr "Post Fader" -#: route_ui.cc:1247 +#: route_ui.cc:1252 msgid "Control Outs" msgstr "Vorhörausgang" -#: route_ui.cc:1253 +#: route_ui.cc:1258 msgid "Main Outs" msgstr "Hauptausgänge" -#: route_ui.cc:1385 +#: route_ui.cc:1390 msgid "Color Selection" msgstr "Farbauswahl" -#: route_ui.cc:1472 +#: route_ui.cc:1477 msgid "" "Do you really want to remove track \"%1\" ?\n" "\n" @@ -10148,7 +10303,7 @@ msgstr "" "\n" "(Dies kann nicht rückgängig gemacht werden!)" -#: route_ui.cc:1474 +#: route_ui.cc:1479 msgid "" "Do you really want to remove bus \"%1\" ?\n" "\n" @@ -10157,15 +10312,15 @@ msgstr "" "Wollen Sie den Bus \"%1\" wirklich löschen?\n" "(Dies kann nicht rückgängig gemacht werden!)" -#: route_ui.cc:1482 +#: route_ui.cc:1487 msgid "Remove track" msgstr "Spur löschen" -#: route_ui.cc:1484 +#: route_ui.cc:1489 msgid "Remove bus" msgstr "Bus löschen" -#: route_ui.cc:1511 +#: route_ui.cc:1516 msgid "" "The use of colons (':') is discouraged in track and bus names.\n" "Do you want to use this new name?" @@ -10174,47 +10329,47 @@ msgstr "" "wird nicht empfohlen.\n" "Wollen Sie diesen neuen Namen verwenden?" -#: route_ui.cc:1515 +#: route_ui.cc:1520 msgid "Use the new name" msgstr "Neuen Namen verwenden" -#: route_ui.cc:1516 +#: route_ui.cc:1521 msgid "Re-edit the name" msgstr "Namen bearbeiten" -#: route_ui.cc:1529 +#: route_ui.cc:1534 msgid "Rename Track" msgstr "Spur umbenennen" -#: route_ui.cc:1531 +#: route_ui.cc:1536 msgid "Rename Bus" msgstr "Bus umbenennen" -#: route_ui.cc:1690 +#: route_ui.cc:1695 msgid " latency" msgstr " Latenz" -#: route_ui.cc:1703 +#: route_ui.cc:1708 msgid "Cannot create route template directory %1" msgstr "Kann das Vorlagenverzeichnis für Spuren/Busse %1 nicht erzeugen" -#: route_ui.cc:1709 +#: route_ui.cc:1714 msgid "Save As Template" msgstr "Als Vorlage speichern" -#: route_ui.cc:1710 +#: route_ui.cc:1715 msgid "Template name:" msgstr "Name der Vorlage:" -#: route_ui.cc:1783 +#: route_ui.cc:1788 msgid "Remote Control ID" msgstr "ID für Fernsteuerung" -#: route_ui.cc:1793 +#: route_ui.cc:1798 msgid "Remote control ID:" msgstr "ID für Fernsteuerung:" -#: route_ui.cc:1807 +#: route_ui.cc:1812 msgid "" "The remote control ID of %1 is: %2\n" "\n" @@ -10226,15 +10381,15 @@ msgstr "" "\n" "Die Fernbedienungs-ID von %3 kann nicht geändert werden." -#: route_ui.cc:1811 +#: route_ui.cc:1816 msgid "the master bus" msgstr "der Master-Bus" -#: route_ui.cc:1811 +#: route_ui.cc:1816 msgid "the monitor bus" msgstr "der Monitor-Bus" -#: route_ui.cc:1813 +#: route_ui.cc:1818 msgid "" "The remote control ID of %6 is: %3\n" "\n" @@ -10253,15 +10408,15 @@ msgstr "" "%4Sie können dies im Tab \"Benutzerinteraktion\" im Fenster Einstellungen " "ändern%5" -#: route_ui.cc:1816 +#: route_ui.cc:1821 msgid "the mixer" msgstr "der Mixer" -#: route_ui.cc:1816 +#: route_ui.cc:1821 msgid "the editor" msgstr "der Editor" -#: route_ui.cc:1871 +#: route_ui.cc:1876 msgid "" "Left-click to invert (phase reverse) channel %1 of this track. Right-click " "to show menu." @@ -10269,7 +10424,7 @@ msgstr "" "Linksklick, um die Phase von Kanal %1 zu invertieren. Rechtsklick zeigt das " "Menü." -#: route_ui.cc:1873 +#: route_ui.cc:1878 msgid "Click to show a menu of channels for inversion (phase reverse)" msgstr "" "Klicken, um ein Menü zum Invertieren der Kanäle (Phasendrehung) anzuzeigen" @@ -10588,11 +10743,15 @@ msgid "" "Use Video File's FPS Instead of Timecode Value for Timeline and Video " "Monitor." msgstr "" +"Benutze FPS aus Videodatei statt des Timecode-Wertes für Zeitleiste und " +"Videomonitor." #: session_option_editor.cc:91 msgid "" "Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless in JACK-sync)." msgstr "" +"Wende Pull-Up/Down auf Videozeitleiste und Videomonitor an (ausser bei JACK-" +"sync)." #: session_option_editor.cc:96 msgid "Ext Timecode Offsets" @@ -10771,87 +10930,135 @@ msgstr "Neue Marker an Takte und Schläge binden" msgid "Glue new regions to bars and beats" msgstr "Neue Regionen an Takte und Schläge binden" -#: sfdb_ui.cc:87 sfdb_ui.cc:107 sfdb_ui.cc:116 +#: session_option_editor.cc:275 session_option_editor.cc:277 +#: session_option_editor.cc:284 session_option_editor.cc:291 +#: session_option_editor.cc:298 session_option_editor.cc:300 +#: session_option_editor.cc:307 session_option_editor.cc:314 +#: session_option_editor.cc:321 session_option_editor.cc:323 +msgid "Meterbridge" +msgstr "Meterbridge" + +#: session_option_editor.cc:275 +msgid "Route Display" +msgstr "Routenanzeige" + +#: session_option_editor.cc:279 +msgid "Show Midi Tracks" +msgstr "Zeige MIDI-Spuren" + +#: session_option_editor.cc:286 +msgid "Show Busses" +msgstr "Zeige Busse" + +#: session_option_editor.cc:293 +msgid "Include Master Bus" +msgstr "Zeige Master-Bus" + +#: session_option_editor.cc:298 +msgid "Button Area" +msgstr "Schaltflächenbereich" + +#: session_option_editor.cc:302 +msgid "Rec-enable Button" +msgstr "Schaltfläche für Aufnahmebereitschaft" + +#: session_option_editor.cc:309 +msgid "Mute Button" +msgstr "Schaltfläche für Stummschaltung" + +#: session_option_editor.cc:316 +msgid "Solo Button" +msgstr "Schaltfläche für Solostatus" + +#: session_option_editor.cc:321 +msgid "Name Labels" +msgstr "Namensfelder" + +#: session_option_editor.cc:325 +msgid "Track Name" +msgstr "Spurname" + +#: sfdb_ui.cc:88 sfdb_ui.cc:108 sfdb_ui.cc:117 msgid "as new tracks" msgstr "als neue Spuren" -#: sfdb_ui.cc:89 sfdb_ui.cc:109 +#: sfdb_ui.cc:90 sfdb_ui.cc:110 msgid "to selected tracks" msgstr "zu ausgewählten Spuren" -#: sfdb_ui.cc:91 sfdb_ui.cc:111 +#: sfdb_ui.cc:92 sfdb_ui.cc:112 msgid "to region list" msgstr "zur Liste der Regionen" -#: sfdb_ui.cc:93 sfdb_ui.cc:113 +#: sfdb_ui.cc:94 sfdb_ui.cc:114 msgid "as new tape tracks" msgstr "als neue Band-Spuren" -#: sfdb_ui.cc:97 +#: sfdb_ui.cc:98 msgid "programming error: unknown import mode string %1" msgstr "Programmierfehler: unbekannter Importmodus %1" -#: sfdb_ui.cc:124 +#: sfdb_ui.cc:125 msgid "Auto-play" msgstr "Auto-Play" -#: sfdb_ui.cc:130 sfdb_ui.cc:237 +#: sfdb_ui.cc:131 sfdb_ui.cc:238 msgid "<b>Sound File Information</b>" msgstr "<b>Eigenschaften der Audiodatei</b>" -#: sfdb_ui.cc:142 +#: sfdb_ui.cc:143 msgid "Timestamp:" msgstr "Zeitstempel:" -#: sfdb_ui.cc:144 +#: sfdb_ui.cc:145 msgid "Format:" msgstr "Format:" -#: sfdb_ui.cc:183 sfdb_ui.cc:530 +#: sfdb_ui.cc:184 sfdb_ui.cc:530 msgid "Tags:" msgstr "Stichworte:" -#: sfdb_ui.cc:320 +#: sfdb_ui.cc:321 msgid "Auditioning of MIDI files is not yet supported" msgstr "Vorhören von MIDI-Dateien wird noch nicht unterstützt" -#: sfdb_ui.cc:327 +#: sfdb_ui.cc:328 msgid "Could not read file: %1 (%2)." msgstr "Konnte Datei nicht lesen: %1 (%2)." -#: sfdb_ui.cc:349 +#: sfdb_ui.cc:351 msgid "Could not access soundfile: " msgstr "Konnte auf Audiodatei nicht zugreifen: " -#: sfdb_ui.cc:403 +#: sfdb_ui.cc:405 msgid "SoundFileBox: Could not tokenize string: " msgstr "SoundFileBox: Konnte Zeichenkette nicht zerlegen: " -#: sfdb_ui.cc:423 sfdb_ui.cc:425 +#: sfdb_ui.cc:425 sfdb_ui.cc:427 msgid "Search" msgstr "Suchen" -#: sfdb_ui.cc:449 +#: sfdb_ui.cc:451 msgid "Audio and MIDI files" msgstr "Audio- und MIDIdateien" -#: sfdb_ui.cc:452 +#: sfdb_ui.cc:454 msgid "Audio files" msgstr "Audiodateien" -#: sfdb_ui.cc:455 +#: sfdb_ui.cc:457 msgid "MIDI files" msgstr "MIDI-Dateien" -#: sfdb_ui.cc:458 add_video_dialog.cc:131 +#: sfdb_ui.cc:460 add_video_dialog.cc:131 msgid "All files" msgstr "Alle Dateien" -#: sfdb_ui.cc:477 add_video_dialog.cc:142 +#: sfdb_ui.cc:479 add_video_dialog.cc:142 msgid "Browse Files" msgstr "Durchsuchen" -#: sfdb_ui.cc:506 +#: sfdb_ui.cc:508 msgid "Paths" msgstr "Pfade" @@ -10897,132 +11104,120 @@ msgstr "Am schlechtesten bewertetes" #: sfdb_ui.cc:555 msgid "More" -msgstr "" +msgstr "Mehr" + +#: sfdb_ui.cc:559 +msgid "Similar" +msgstr "Ähnlich" -#: sfdb_ui.cc:572 +#: sfdb_ui.cc:571 msgid "ID" msgstr "ID" -#: sfdb_ui.cc:573 add_video_dialog.cc:83 +#: sfdb_ui.cc:572 add_video_dialog.cc:83 msgid "Filename" msgstr "Dateiname" -#: sfdb_ui.cc:575 +#: sfdb_ui.cc:574 msgid "Duration" msgstr "Dauer" -#: sfdb_ui.cc:576 +#: sfdb_ui.cc:575 msgid "Size" msgstr "Größe" -#: sfdb_ui.cc:577 +#: sfdb_ui.cc:576 msgid "Samplerate" msgstr "Samplerate" -#: sfdb_ui.cc:578 +#: sfdb_ui.cc:577 msgid "License" msgstr "Lizenz" -#: sfdb_ui.cc:594 +#: sfdb_ui.cc:595 msgid "Search Freesound" msgstr "Freesound durchsuchen" -#: sfdb_ui.cc:615 +#: sfdb_ui.cc:616 msgid "Press to import selected files and close this window" msgstr "" "Drücken Sie hier, um die angewählten Dateien zu importieren und dieses " "Fenster zu schließen" -#: sfdb_ui.cc:616 +#: sfdb_ui.cc:617 msgid "Press to import selected files and leave this window open" msgstr "" "Drücken Sie hier, um die angewählten Dateien zu importieren und dieses " "Fenster offen zu lassen" -#: sfdb_ui.cc:617 +#: sfdb_ui.cc:618 msgid "Press to close this window without importing any files" msgstr "" "Drücken Sie hier, um dieses Fenster zu schließen, ohne Dateien zu importieren" -#: sfdb_ui.cc:846 -msgid "found %1 match" -msgid_plural "found %1 matches" -msgstr[0] "%1 Treffer gefunden" -msgstr[1] "%1 Treffer gefunden" - -#: sfdb_ui.cc:862 +#: sfdb_ui.cc:814 msgid "SoundFileBrowser: Could not tokenize string: " msgstr "SoundFileBrowser: Konnte Zeichenkete nicht zerlegen:" -#: sfdb_ui.cc:960 +#: sfdb_ui.cc:1014 msgid "%1 more page of 100 results available" msgid_plural "%1 more pages of 100 results available" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%1 weitere Seite von 100 Ergebnissen verfügbar" +msgstr[1] "%1 weitere Seiten von 100 Ergebnissen verfügbar" -#: sfdb_ui.cc:965 +#: sfdb_ui.cc:1019 msgid "No more results available" -msgstr "" +msgstr "Keine weiteren Ergebnisse verfügbar" -#: sfdb_ui.cc:1029 +#: sfdb_ui.cc:1083 msgid "B" msgstr "B" -#: sfdb_ui.cc:1031 +#: sfdb_ui.cc:1085 msgid "kB" msgstr "kB" -#: sfdb_ui.cc:1033 sfdb_ui.cc:1035 +#: sfdb_ui.cc:1087 sfdb_ui.cc:1089 msgid "MB" msgstr "MB" -#: sfdb_ui.cc:1037 +#: sfdb_ui.cc:1091 msgid "GB" msgstr "GB" -#: sfdb_ui.cc:1070 -msgid "Search returned no results." -msgstr "Die Suche erbrachte keine Ergebnisse" - -#: sfdb_ui.cc:1072 -msgid "Found %1 match" -msgid_plural "Found %1 matches" -msgstr[0] "%1 Treffer gefunden" -msgstr[1] "%1 Treffer gefunden" - -#: sfdb_ui.cc:1277 sfdb_ui.cc:1585 sfdb_ui.cc:1635 sfdb_ui.cc:1653 +#: sfdb_ui.cc:1305 sfdb_ui.cc:1613 sfdb_ui.cc:1663 sfdb_ui.cc:1681 msgid "one track per file" msgstr "eine Spur pro Datei" -#: sfdb_ui.cc:1280 sfdb_ui.cc:1636 sfdb_ui.cc:1654 +#: sfdb_ui.cc:1308 sfdb_ui.cc:1664 sfdb_ui.cc:1682 msgid "one track per channel" msgstr "eine Spur pro Kanal" -#: sfdb_ui.cc:1288 sfdb_ui.cc:1638 sfdb_ui.cc:1655 +#: sfdb_ui.cc:1316 sfdb_ui.cc:1666 sfdb_ui.cc:1683 msgid "sequence files" msgstr "Dateien aneinanderreihen" -#: sfdb_ui.cc:1291 sfdb_ui.cc:1643 +#: sfdb_ui.cc:1319 sfdb_ui.cc:1671 msgid "all files in one track" msgstr "Alle Dateien in eine Spur" -#: sfdb_ui.cc:1292 sfdb_ui.cc:1637 +#: sfdb_ui.cc:1320 sfdb_ui.cc:1665 msgid "merge files" msgstr "Dateien zusammenfügen" -#: sfdb_ui.cc:1298 sfdb_ui.cc:1640 +#: sfdb_ui.cc:1326 sfdb_ui.cc:1668 msgid "one region per file" msgstr "eine Region pro Datei" -#: sfdb_ui.cc:1301 sfdb_ui.cc:1641 +#: sfdb_ui.cc:1329 sfdb_ui.cc:1669 msgid "one region per channel" msgstr "eine Region pro Kanal" -#: sfdb_ui.cc:1306 sfdb_ui.cc:1642 sfdb_ui.cc:1656 +#: sfdb_ui.cc:1334 sfdb_ui.cc:1670 sfdb_ui.cc:1684 msgid "all files in one region" msgstr "alle Dateien in einer Region" -#: sfdb_ui.cc:1373 +#: sfdb_ui.cc:1401 msgid "" "One or more of the selected files\n" "cannot be used by %1" @@ -11030,55 +11225,55 @@ msgstr "" "Eine oder mehrere der ausgewählten Dateien\n" "können von %1 nicht verwendet werden" -#: sfdb_ui.cc:1513 +#: sfdb_ui.cc:1541 msgid "Copy files to session" msgstr "Kopiere Dateien in Projekt" -#: sfdb_ui.cc:1530 sfdb_ui.cc:1693 +#: sfdb_ui.cc:1558 sfdb_ui.cc:1721 msgid "file timestamp" msgstr "Zeitstempel" -#: sfdb_ui.cc:1531 sfdb_ui.cc:1695 +#: sfdb_ui.cc:1559 sfdb_ui.cc:1723 msgid "edit point" msgstr "Arbeitspunkt" -#: sfdb_ui.cc:1532 sfdb_ui.cc:1697 +#: sfdb_ui.cc:1560 sfdb_ui.cc:1725 msgid "playhead" msgstr "Positionszeiger" -#: sfdb_ui.cc:1533 +#: sfdb_ui.cc:1561 msgid "session start" msgstr "Projektanfang" -#: sfdb_ui.cc:1538 +#: sfdb_ui.cc:1566 msgid "<b>Add files as ...</b>" msgstr "<b>Füge Dateien hinzu als...</b>" -#: sfdb_ui.cc:1560 +#: sfdb_ui.cc:1588 msgid "<b>Insert at</b>" msgstr "<b>Einfügen bei</b>" -#: sfdb_ui.cc:1573 +#: sfdb_ui.cc:1601 msgid "<b>Mapping</b>" msgstr "<b>Zuordnung</b>" -#: sfdb_ui.cc:1591 +#: sfdb_ui.cc:1619 msgid "<b>Conversion quality</b>" msgstr "<b>Konvertierungsqualität:</b>" -#: sfdb_ui.cc:1603 sfdb_ui.cc:1709 +#: sfdb_ui.cc:1631 sfdb_ui.cc:1737 msgid "Best" msgstr "bestmöglich" -#: sfdb_ui.cc:1604 sfdb_ui.cc:1711 +#: sfdb_ui.cc:1632 sfdb_ui.cc:1739 msgid "Good" msgstr "gut" -#: sfdb_ui.cc:1605 sfdb_ui.cc:1713 +#: sfdb_ui.cc:1633 sfdb_ui.cc:1741 msgid "Quick" msgstr "schnell" -#: sfdb_ui.cc:1607 +#: sfdb_ui.cc:1635 msgid "Fastest" msgstr "Schnellstmöglich" @@ -11166,21 +11361,21 @@ msgstr "Erweiterte Optionen für dieses Projekt" #: startup.cc:194 msgid "" -"<b>Welcome to this BETA release of Ardour 3.0</b>\n" +"<b>Welcome to this BETA release of Ardour %1</b>\n" "\n" -"Ardour 3.0 has been released for Linux but because of the lack of testers,\n" +"Ardour %1 has been released for Linux but because of the lack of testers,\n" "it is still at the beta stage on OS X. So, a few guidelines:\n" "\n" "1) Please do <b>NOT</b> use this software with the expectation that it is " "stable or reliable\n" " though it may be so, depending on your workflow.\n" -"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n" -"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to " +"2) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n" +"3) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to " "report issues\n" -" making sure to note the product version number as 3.0-beta.\n" -"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and " +" making sure to note the product version number as %1-beta.\n" +"4) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and " "pass on comments.\n" -"6) Please <b>DO</b> join us on IRC for real time discussions about ardour3. " +"5) Please <b>DO</b> join us on IRC for real time discussions about ardour3. " "You\n" " can get there directly from Ardour via the Help->Chat menu option.\n" "\n" @@ -11188,27 +11383,25 @@ msgid "" "\n" " http://ardour.org/support\n" msgstr "" -"<b>Willkommen zu diesem BETA-Release von Ardour 3.0</b>\n" +"<b>Willkommen zu diesem BETA-Release von Ardour %1</b>\n" "\n" -"Ardour 3.0 für Linux ist veröffentlicht worden, aufgrund des Mangels an " +"Ardour %1 für Linux ist veröffentlicht worden, aufgrund des Mangels an " "Testern \n" "ist es für OS X jedoch immer noch im Beta-Stadium. Daher ein paar " "Richtlinien:\n" "\n" "1) Bitte verwenden Sie diese Software <b>NICHT</b> mit der Erwartung, sie " "wäre stabil\n" -" oder Zuverlässig, auch wenn sie das je nach Ihrem Workflow sein mag.\n" -"2) Bitte besuchen Sie http://ardour.org/a3_features für eine Einführung in " -"die neuen Features.\n" -"3) <b>Bitte verwenden Sie NICHT die Foren von ardour.org, um Probleme zu " +" oder zuverlässig, auch wenn sie das je nach Ihrem Workflow sein mag.\n" +"2) <b>Bitte verwenden Sie NICHT die Foren von ardour.org, um Probleme zu " "melden</b>.\n" -"4) Bitte <b>VERWENDEN</b> Sie den Bugtracker http://tracker.ardour.org/ um " +"3) Bitte <b>VERWENDEN</b> Sie den Bugtracker http://tracker.ardour.org/ um " "Probleme\n" " zu melden. Geben Sie dabei Die Versionsnummer 3.0-beta an.\n" -"5) Bitte <b>VERWENDEN</b> Sie die ardour-users Mailingliste (auf Englisch), " +"4) Bitte <b>VERWENDEN</b> Sie die ardour-users Mailingliste (auf Englisch), " "um Ideen\n" " zu diskutieren und Kommentare zur Software abzugeben.\n" -"6) Bitte <b>BESUCHEN</b> Sie uns in unserem IRC Channel, um in Echtzeit über " +"5) Bitte <b>BESUCHEN</b> Sie uns in unserem IRC-Kanal, um in Echtzeit über " "Ardour3\n" " zu diskutieren (auch auf Englisch). Sie können direkt aus Ardour über " "Hilfe -> Chat\n" @@ -11351,10 +11544,6 @@ msgstr "Informieren Sie sich auf der Webseite weiter..." msgid "Click to open the program website in your web browser" msgstr "Klicken Sie, um die Webseite in Ihrem Web-Browse zu öffnen" -#: startup.cc:594 -msgid "What would you like to do ?" -msgstr "Was möchten Sie tun?" - #: startup.cc:729 msgid "Open" msgstr "Öffnen" @@ -11367,83 +11556,83 @@ msgstr "Projektname:" msgid "Create session folder in:" msgstr "Ort des Projektverzeichnisses:" -#: startup.cc:813 +#: startup.cc:821 msgid "Select folder for session" msgstr "Ordner für Projekt wählen" -#: startup.cc:845 +#: startup.cc:853 msgid "Use this template" msgstr "Diese Vorlage verwenden" -#: startup.cc:848 +#: startup.cc:856 msgid "no template" msgstr "keine Vorlage" -#: startup.cc:876 +#: startup.cc:884 msgid "Use an existing session as a template:" msgstr "Ein vorhandenes Projekt als Vorlage verwenden:" -#: startup.cc:888 +#: startup.cc:896 msgid "Select template" msgstr "Vorlage auswählen" -#: startup.cc:914 +#: startup.cc:922 msgid "New Session" msgstr "Neues Projekt" -#: startup.cc:1068 +#: startup.cc:1077 msgid "Select session file" msgstr "Projektdatei auswählen" -#: startup.cc:1084 +#: startup.cc:1093 msgid "Browse:" msgstr "Durchsuchen:" -#: startup.cc:1093 +#: startup.cc:1102 msgid "Select a session" msgstr "Projekt auswählen" -#: startup.cc:1119 startup.cc:1120 startup.cc:1121 +#: startup.cc:1129 startup.cc:1130 startup.cc:1131 msgid "channels" msgstr "Kanäle" -#: startup.cc:1135 +#: startup.cc:1145 msgid "<b>Busses</b>" msgstr "<b>Busse</b>" -#: startup.cc:1136 +#: startup.cc:1146 msgid "<b>Inputs</b>" msgstr "<b>Eingänge</b>" -#: startup.cc:1137 +#: startup.cc:1147 msgid "<b>Outputs</b>" msgstr "<b>Ausgänge</b>" -#: startup.cc:1145 +#: startup.cc:1155 msgid "Create master bus" msgstr "Master-Bus erstellen" -#: startup.cc:1155 +#: startup.cc:1165 msgid "Automatically connect to physical inputs" msgstr "Automatisch mit Audioeingängen verbinden" -#: startup.cc:1162 startup.cc:1221 +#: startup.cc:1172 startup.cc:1231 msgid "Use only" msgstr "Benutze nur" -#: startup.cc:1215 +#: startup.cc:1225 msgid "Automatically connect outputs" msgstr "Ausgänge automatisch verbinden" -#: startup.cc:1237 +#: startup.cc:1247 msgid "... to master bus" msgstr "... mit dem Master-Bus" -#: startup.cc:1247 +#: startup.cc:1257 msgid "... to physical outputs" msgstr "... mit den Audioausgängen" -#: startup.cc:1297 +#: startup.cc:1307 msgid "Advanced Session Options" msgstr "Erweiterte Einstellungen" @@ -11967,7 +12156,7 @@ msgstr "Zeichne \"flache\" Schaltflächen" #: theme_manager.cc:61 msgid "All floating windows are dialogs" -msgstr "" +msgstr "Alle schwebenden Fenster sind Dialoge" #: theme_manager.cc:62 msgid "Draw waveforms with color gradient" @@ -11984,6 +12173,10 @@ msgid "" "This may help with some window managers. This requires a restart of %1 to " "take effect" msgstr "" +"Markiere alle schwebenden Fenster als Typ \"Dialog\", statt für einige " +"\"Utility\" zu verwenden.\n" +"Dies kann bei einigen Fenstermanagern helfen. Sie müssen %1 starten, um " +"diese Option zu aktivieren" #: theme_manager.cc:229 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange" @@ -12124,19 +12317,19 @@ msgstr "Konfigurationsdatei %1 nicht gespeichert" msgid "bad XPM header %1" msgstr "Fehlerhafter XPM Header %1" -#: utils.cc:292 +#: utils.cc:292 utils.cc:324 msgid "missing RGBA style for \"%1\"" msgstr "Fehlender RGBA Style für \"%1\"" -#: utils.cc:544 +#: utils.cc:591 msgid "cannot find XPM file for %1" msgstr "Konnte XPM-Datei für %1 nicht finden" -#: utils.cc:570 +#: utils.cc:617 msgid "cannot find icon image for %1 using %2" msgstr "Konnte Icon-Bild für %1 unter %2 nicht finden" -#: utils.cc:585 +#: utils.cc:632 msgid "Caught exception while loading icon named %1" msgstr "" "Während des Ladens des Icons mit dem Namen %1 trat ein Ausnahmefehler auf" @@ -12146,104 +12339,112 @@ msgid "VerboseCanvasCursor" msgstr "Ausführlicher Canvas-Cursor" #: add_video_dialog.cc:54 -#, fuzzy msgid "Set Video Track" -msgstr "Audiospur hinzufügen" +msgstr "Videospur-Einstellungen" #: add_video_dialog.cc:62 -#, fuzzy msgid "Launch External Video Monitor" -msgstr "Monitor" +msgstr "Externen Videomonitor starten" #: add_video_dialog.cc:63 msgid "Adjust Session Framerate to Match Video Framerate" -msgstr "" +msgstr "Projekt-Framerate an Video-Framerate anpassen" #: add_video_dialog.cc:65 msgid "Reload docroot" -msgstr "" +msgstr "docroot neu laden" #: add_video_dialog.cc:110 add_video_dialog.cc:114 -#, fuzzy msgid "VideoServerIndex" -msgstr "Video-Server anhalten" +msgstr "VideoServerIndex" #: add_video_dialog.cc:128 -#, fuzzy msgid "Video files" -msgstr "Audiodateien" +msgstr "Videodateien" #: add_video_dialog.cc:163 -#, fuzzy msgid "<b>Video Information</b>" -msgstr "<b>Eigenschaften der Audiodatei</b>" +msgstr "<b>Videoinformationen</b>" #: add_video_dialog.cc:166 -#, fuzzy msgid "Start:" -msgstr "Start" +msgstr "Start:" #: add_video_dialog.cc:172 -#, fuzzy msgid "Frame rate:" -msgstr "Samplerate:" +msgstr "Framerate:" #: add_video_dialog.cc:175 msgid "Aspect Ratio:" -msgstr "" +msgstr "Seitenverhältnis:" #: add_video_dialog.cc:653 msgid " %1 fps" -msgstr "" +msgstr " %1 fps" -#: editor_videotimeline.cc:138 -#, fuzzy +#: editor_videotimeline.cc:146 msgid "Export Successful: %1" -msgstr "Exportiere MIDI: %1" +msgstr "Export erfolgreich: %1" -#: video_timeline.cc:467 +#: video_timeline.cc:468 msgid "" "Parsing video file info failed. Is the Video Server running? Is the file " "readable by the Video Server? Does the docroot match? Is it a video file?" msgstr "" +"Fehler beim Parsen der Videodatei. Läuft der Videoserver? Ist die Datei für " +"den Videoserver lesbar? Ist die docroot passend eingestellt? Ist die Datei " +"tatsächlich eine Videodatei?" -#: video_timeline.cc:501 -msgid "Failed to set session-framerate: " -msgstr "" - -#: video_timeline.cc:501 -msgid " does not have a corresponding option setting in Ardour." +#: video_timeline.cc:506 +msgid "" +"Failed to set session-framerate: '%1' does not have a corresponding option " +"setting in %2." msgstr "" +"Setzen der Projektframerate fehlgeschlagen: '%1' hat keine entsprechende " +"Einstellungsoption in %2." -#: video_timeline.cc:507 +#: video_timeline.cc:514 msgid "" -"Video file's framerate is not equal to Ardour session timecode's framerate: " +"Video file's framerate is not equal to %1 session timecode's framerate: '%2' " +"vs '%3'" msgstr "" +"Framerate der Videodatei entspricht nicht der Framerate des Timecodes im %1-" +"Projekt: '%2' vs. '%3'" -#: video_timeline.cc:508 -msgid " vs " +#: video_timeline.cc:587 +msgid "" +"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually " +"means that the video server was not started by ardour and uses a different " +"document-root." msgstr "" +"MDocroot des Videoserver stimmt nicht überein. %1: '%2', Videoserver: '%3'. " +"Das bedeutet üblicherweise, dass der Videoserver nicht von Ardour gestartet " +"wurde und einen anderen Dokumenten-Wurzelpfad verwendet." -#: video_timeline.cc:690 +#: video_timeline.cc:736 msgid "" "Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ " "(a custom path to xjadeo can be specified by setting the XJREMOTE " "environment variable. It should point to an application compatible with " "xjadeo's remote-control interface 'xjremote')." msgstr "" +"Der Videomonitor 'xjadeo' wurde nicht gefunden. Bitte installieren Sie " +"http://xjadeo.sf.net/ (ein benutzerspezifischer Pfad für xjadeo kann durch " +"Setzen der Umgebungsvariablen XJREMOTE angegeben werden. Er sollte auf ein " +"Programm zeigen, das zu dem Fernsteuerungsprotokoll 'xjremote' von xjadeo " +"kompatibel ist)." -#: video_monitor.cc:282 -#, fuzzy +#: video_monitor.cc:281 msgid "Video Monitor: File Not Found." -msgstr "Monitor" +msgstr "Videomonitor: Datei nicht gefunden." -#: transcode_ffmpeg.cc:71 +#: transcode_ffmpeg.cc:72 msgid "" "No ffprobe or ffmpeg executables could be found on this system.\n" "Video import and export is not possible until you install those tools.\n" -"Ardour requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n" +"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n" "\n" -"The tools are included with the Ardour releases from ardour.org and also " +"The tools are included with the %1 releases from ardour.org and also " "available with the video-server at http://x42.github.com/harvid/\n" "\n" "Important: the files need to be installed in $PATH and named ffmpeg_harvid " @@ -12252,38 +12453,48 @@ msgid "" "recommend creating symbolic links from ffmpeg to ffmpeg_harvid and from " "ffprobe to ffprobe_harvid.\n" msgstr "" +"Die Programme ffprobe oder ffmpeg konnten auf diesem System nicht gefunden " +"werden.\n" +"Bis diese Werkzeuge installiert sind, ist Videoexport nicht möglich.\n" +"%1 benötigt ffmpeg und ffprobe von ffmpeg.org in der Version 1.1 oder " +"neuer.\n" +"\n" +"Diese Werkzeuge sind in den %1-Paketen von ardour.org inkludiert und auch " +"mit dem Videoserver auf http://x42.github.com/harvid/ erhältlich.\n" +"\n" +"Wichtig: die Dateien müssen in $PATH installiert sein und die Namen " +"ffmpeg_harvid und ffprobe_harvid.\n" +"Falls Sie bereits eine ffmpeg Installation auf Ihrem System haben, empfehlen " +"wir, symbolische Links von ffmpeg zu ffmpeg_harvid und von ffprobe zu " +"ffprobe_harvid anzulegen.\n" #: transcode_video_dialog.cc:55 -#, fuzzy msgid "Transcode/Import Video File " -msgstr "Exportiere Audio-Datei(en)..." +msgstr "Videodatei transkodieren/importieren" #: transcode_video_dialog.cc:57 -#, fuzzy msgid "Output File:" -msgstr "Ausgabegerät:" +msgstr "Ausgabedatei:" #: transcode_video_dialog.cc:60 export_video_dialog.cc:72 msgid "Abort" -msgstr "" +msgstr "Abbruch" #: transcode_video_dialog.cc:62 -#, fuzzy msgid "Height = " -msgstr "Höhe" +msgstr "Höhe =" #: transcode_video_dialog.cc:65 msgid "Manual Override" -msgstr "" +msgstr "Manuelle Eingabe" -#: transcode_video_dialog.cc:69 -msgid "Debug Mode: Print ffmpeg Command and Output to stdout." -msgstr "" +#: transcode_video_dialog.cc:69 export_video_dialog.cc:88 +msgid "Debug Mode: Print ffmpeg command and output to stdout." +msgstr "Debug-Modus: gibt die ffmpeg-Befehlszeile und -Ausgabe an stdout aus." #: transcode_video_dialog.cc:106 -#, fuzzy msgid "<b>File Information</b>" -msgstr "<b>Eigenschaften der Audiodatei</b>" +msgstr "<b>Dateiinformationen</b>" #: transcode_video_dialog.cc:112 msgid "" @@ -12291,230 +12502,223 @@ msgid "" "is not possible until you install those tools. See the Log widow for more " "information." msgstr "" +"Die Programme ffprobe oder ffmpeg konnten auf diesem System nicht gefunden " +"werden. Bis diese Werkzeuge installiert sind, ist Videoimport nicht möglich. " +"Sehen Sie im Log-Fenster nach weiteren Informationen." #: transcode_video_dialog.cc:119 msgid "" "File-info can not be read. Most likely '%1' is not a valid video-file or an " "unsupported video codec or format." msgstr "" +"Dateiinformationen können nicht gelesen werden. Vermutlich ist '%1' keine " +"gültige Videodatei, oder enthält einen nicht unterstützten Videocodec bzw. " +"ein nicht unterstütztes Videoformat." #: transcode_video_dialog.cc:133 msgid "FPS:" -msgstr "" +msgstr "FPS:" #: transcode_video_dialog.cc:135 -#, fuzzy msgid "Duration:" -msgstr "Dauer" +msgstr "Dauer:" #: transcode_video_dialog.cc:137 msgid "Codec:" -msgstr "" +msgstr "Codec:" #: transcode_video_dialog.cc:139 msgid "Geometry:" -msgstr "" +msgstr "Geometrie:" #: transcode_video_dialog.cc:154 -#, fuzzy msgid "??" -msgstr "???" +msgstr "??" #: transcode_video_dialog.cc:175 -#, fuzzy msgid "<b>Import Settings</b>" -msgstr "<b>Optionen</b>" +msgstr "<b>Importeinstellungen</b>" #: transcode_video_dialog.cc:180 msgid "Do Not Import Video" -msgstr "" +msgstr "Video nicht importieren" #: transcode_video_dialog.cc:181 msgid "Reference From Current Location" -msgstr "" +msgstr "Referenz von momentaner Position" #: transcode_video_dialog.cc:183 -#, fuzzy msgid "Import/Transcode Video to Session" -msgstr "Aus Projekt importieren" +msgstr "Video ins Projekt transkodieren/importieren" #: transcode_video_dialog.cc:197 msgid "Scale Video: Width = " -msgstr "" +msgstr "Video skalieren: Breite = " #: transcode_video_dialog.cc:204 msgid "Original Width" -msgstr "" +msgstr "Originalbreite" #: transcode_video_dialog.cc:219 msgid "Bitrate (KBit/s):" -msgstr "" +msgstr "Bitrate (KBit/s):" #: transcode_video_dialog.cc:224 -#, fuzzy msgid "Extract Audio:" -msgstr "Audio exportieren" +msgstr "Audio extrahieren:" #: transcode_video_dialog.cc:344 -#, fuzzy msgid "Extracting Audio.." -msgstr "Audio exportieren" +msgstr "Extrahiere Audio..." #: transcode_video_dialog.cc:347 msgid "Audio Extraction Failed." -msgstr "" +msgstr "Extrahieren des Audio gescheitert." #: transcode_video_dialog.cc:373 msgid "Transcoding Video.." -msgstr "" +msgstr "Transkodiere Video.." #: transcode_video_dialog.cc:407 msgid "Transcoding Failed." -msgstr "" +msgstr "Transkodieren gescheitert" #: transcode_video_dialog.cc:490 -#, fuzzy msgid "Save Transcoded Video File" -msgstr "Exportiere Audio-Datei(en)..." +msgstr "Sichere transkodierte Videodatei" #: video_server_dialog.cc:42 -#, fuzzy msgid "Launch Video Server" -msgstr "Video-Server anhalten" +msgstr "Video-Server starten" #: video_server_dialog.cc:43 msgid "Server Executable:" -msgstr "" +msgstr "Server-Datei:" #: video_server_dialog.cc:45 -#, fuzzy msgid "Server Docroot:" -msgstr "Server:" +msgstr "Server Docroot:" #: video_server_dialog.cc:51 msgid "Don't show this dialog again. (Reset in Edit->Preferences)." msgstr "" +"Diesen Dialog nicht mehr anzeigen (kann in Einstellungen geändert werden)." -#: video_server_dialog.cc:90 +#: video_server_dialog.cc:91 msgid "" "The external video server 'harvid' can not be found. The tool is included " -"with the Ardour releases from ardour.org, alternatively you can download it " -"from http://x42.github.com/harvid/ or acquire it from your distribution." +"with the %1 releases from ardour.org, alternatively you can download it from " +"http://x42.github.com/harvid/ or acquire it from your distribution." msgstr "" +"Der externe Videoserver \"harvid\" kann nicht gefunden werden. Das Werkzeug " +"ist in den %1-Paketen von ardour.org inkludiert, aber Sie können es " +"alternativ auch von http://x42.github.com/harvid/ herunterladen oder über " +"das Paketmanagement Ihrer Distribution beziehen." -#: video_server_dialog.cc:117 +#: video_server_dialog.cc:119 msgid "Listen Address:" -msgstr "" +msgstr "Eingehende Adresse:" -#: video_server_dialog.cc:122 -#, fuzzy +#: video_server_dialog.cc:124 msgid "Listen Port:" -msgstr "Abhörpunkt" +msgstr "Eingehender Port:" -#: video_server_dialog.cc:127 -#, fuzzy +#: video_server_dialog.cc:129 msgid "Cache Size:" -msgstr "Maximale Größe" +msgstr "Cachegröße" -#: video_server_dialog.cc:132 +#: video_server_dialog.cc:135 msgid "" -"Ardour relies on an external Video Server for the videotimeline.\n" +"%1 relies on an external Video Server for the videotimeline.\n" "The server configured in Edit -> Prefereces -> Video is not reachable.\n" "Do you want ardour to launch 'harvid' on this machine?" msgstr "" +"%1 benötigt einen externen Videoserver für die Video-Zeitleiste.\n" +"Der in Bearbeiten -> Globale Einstellungen -> Video konfigurierte Server ist " +"nicht erreichbar.\n" +"Möchten Sie, daß Ardour \"harvid\" auf diesem Computer startet?" -#: video_server_dialog.cc:171 -#, fuzzy +#: video_server_dialog.cc:175 msgid "Set Video Server Executable" -msgstr "Der eingestellte Video-Server ist keine ausführbare Datei." +msgstr "Setze Video-Serverpfad" -#: video_server_dialog.cc:191 +#: video_server_dialog.cc:195 msgid "Server docroot" -msgstr "" +msgstr "Server-docroot" #: utils_videotl.cc:52 msgid "Destination is outside Video Server's docroot. " -msgstr "" +msgstr "Ziel ist ausserhalb der docroot des Videoservers." #: utils_videotl.cc:53 msgid "" "The destination file path is outside of the Video Server's docroot. The file " "will not be readable by the Video Server. Do you still want to continue?" msgstr "" +"Der Dateipfad des Zieles befindet sich ausserhalb der docroot des " +"Videoservers. Die Datei wird für den Videoserver nicht lesbar sein. Wollen " +"Sie wirklich fortfahren?" #: utils_videotl.cc:56 msgid "Continue" -msgstr "" +msgstr "Fortfahren" #: utils_videotl.cc:62 -#, fuzzy msgid "Confirm Overwrite" -msgstr "Bestätige das Überschreiben des Schnappschusses" +msgstr "Bestätige das Überschreiben" #: utils_videotl.cc:63 -#, fuzzy msgid "A file with the same name already exists. Do you want to overwrite it?" msgstr "" -"Ein Schnappschuss mit diesem Namen existiert bereits. Wollen Sie ihn " -"überschreiben?" +"Eine Datei mit diesem Namen existiert bereits. Wollen Sie sie überschreiben?" #: utils_videotl.cc:73 utils_videotl.cc:89 -#, fuzzy msgid "Cannot create video folder \"%1\" (%2)" -msgstr "Kann benutzerspezifischen %3-Ordner %1 nicht erstellen: %2" +msgstr "Kann Videoordner \"%1\" nicht erstellen (%2)" #: export_video_dialog.cc:65 -#, fuzzy msgid "Export Video File " -msgstr "Exportiere Audio-Datei(en)..." +msgstr "Exportiere Videodatei" #: export_video_dialog.cc:69 -#, fuzzy msgid "Video:" -msgstr "Mike Start" +msgstr "Video:" #: export_video_dialog.cc:73 msgid "Scale Video (W x H):" -msgstr "" +msgstr "Skaliere Video (W x H):" #: export_video_dialog.cc:78 msgid "Set Aspect Ratio:" -msgstr "" +msgstr "Seitenverhältnis:" #: export_video_dialog.cc:79 -#, fuzzy msgid "Normalize Audio" -msgstr "Normalisieren auf:" +msgstr "Audio normalisieren" #: export_video_dialog.cc:80 msgid "2 Pass Encoding" -msgstr "" +msgstr "Enkodiere in 2 Durchgängen" #: export_video_dialog.cc:81 msgid "Codec Optimizations:" -msgstr "" +msgstr "Codec-Optimierungen:" #: export_video_dialog.cc:83 -#, fuzzy msgid "Deinterlace" -msgstr "Positionszeiger zentrieren" +msgstr "Deinterlacing anwenden" #: export_video_dialog.cc:84 msgid "Use [2] B-frames (MPEG 2 or 4 only)" -msgstr "" +msgstr "Verwende [2] B-frames (nur MPEG 2 oder 4)" #: export_video_dialog.cc:85 msgid "Override FPS (Default is to retain FPS from the input video file):" -msgstr "" +msgstr "FPS erzwingen (Voreinstellung: FPS der Videodatei wird beibehalten):" #: export_video_dialog.cc:86 -#, fuzzy msgid "Include Session Metadata" -msgstr "Projekt-Metadaten bearbeiten" - -#: export_video_dialog.cc:88 -msgid "Enable Debug Mode: Print ffmpeg Command & Output to stdout." -msgstr "" +msgstr "Projekt-Metadaten verwenden" #: export_video_dialog.cc:106 msgid "" @@ -12522,156 +12726,202 @@ msgid "" "is not possible until you install those tools. See the Log widow for more " "information." msgstr "" +"Die Programme ffprobe oder ffmpeg konnten auf diesem System nicht gefunden " +"werden. Bis diese Werkzeuge installiert sind, ist Videoexport nicht möglich. " +"Sehen Sie im Log-Fenster nach weiteren Informationen." #: export_video_dialog.cc:116 -#, fuzzy msgid "<b>Output:</b>" -msgstr "<b>Ausgänge</b>" +msgstr "<b>Ausgang:</b>" #: export_video_dialog.cc:126 -#, fuzzy msgid "<b>Input:</b>" -msgstr "<b>Eingänge</b>" +msgstr "<b>Eingang:</b>" #: export_video_dialog.cc:137 -#, fuzzy msgid "Audio:" -msgstr "Audio" +msgstr "Audio:" #: export_video_dialog.cc:139 -#, fuzzy msgid "Master Bus" -msgstr "der Master-Bus" +msgstr "Masterbus" + +#: export_video_dialog.cc:144 +msgid "from the %1 session's start to the session's end" +msgstr "von %1 Projektbeginn bis -ende" + +#: export_video_dialog.cc:148 +msgid "from 00:00:00:00 to the video's end" +msgstr "von 00:00:00:00 bis Videoende" -#: export_video_dialog.cc:166 -#, fuzzy +#: export_video_dialog.cc:150 +msgid "from the video's start to the video's end" +msgstr "von Videostart bis Videoende" + +#: export_video_dialog.cc:183 msgid "<b>Settings:</b>" -msgstr "<b>Ziele</b>" +msgstr "<b>Einstellungen:</b>" -#: export_video_dialog.cc:174 -#, fuzzy +#: export_video_dialog.cc:191 msgid "Range:" -msgstr "Bereiche" +msgstr "Bereich:" -#: export_video_dialog.cc:177 -#, fuzzy +#: export_video_dialog.cc:194 msgid "Preset:" -msgstr "Preset" +msgstr "Preset:" -#: export_video_dialog.cc:180 -#, fuzzy +#: export_video_dialog.cc:197 msgid "Video Codec:" -msgstr "Ordner:" +msgstr "Videocodec:" -#: export_video_dialog.cc:183 -#, fuzzy +#: export_video_dialog.cc:200 msgid "Video KBit/s:" -msgstr "Mike Start" +msgstr "Video KBit/s:" -#: export_video_dialog.cc:186 -#, fuzzy +#: export_video_dialog.cc:203 msgid "Audio Codec:" -msgstr "Audio-Modus:" +msgstr "Audiocodec:" -#: export_video_dialog.cc:189 -#, fuzzy +#: export_video_dialog.cc:206 msgid "Audio KBit/s:" -msgstr "Audiodateien" +msgstr "Audio KBit/s:" -#: export_video_dialog.cc:192 -#, fuzzy +#: export_video_dialog.cc:209 msgid "Audio Samplerate:" -msgstr "Samplerate:" +msgstr "Audiosamplerate:" -#: export_video_dialog.cc:369 -#, fuzzy +#: export_video_dialog.cc:386 msgid "Normalizing audio" -msgstr "Normalisieren" +msgstr "Audio normalisieren" -#: export_video_dialog.cc:373 -#, fuzzy +#: export_video_dialog.cc:390 msgid "Exporting audio" -msgstr "Audio exportieren" +msgstr "Exportiere Audio" -#: export_video_dialog.cc:419 -#, fuzzy -msgid "Exporting Audio.." -msgstr "Audio exportieren" +#: export_video_dialog.cc:436 +msgid "Exporting Audio..." +msgstr "Exportiere Audio..." -#: export_video_dialog.cc:476 +#: export_video_dialog.cc:493 msgid "" "Export Video: Cannot query duration of video-file, using duration from " "timeline instead." msgstr "" +"Exportiere Video: Kann die Dauer der Videodatei nicht eruieren, verwende " +"statt dessen die Dauer aus der Zeitleiste." -#: export_video_dialog.cc:505 +#: export_video_dialog.cc:522 msgid "Export Video: No Master Out Ports to Connect for Audio Export" msgstr "" +"Exportiere Video: Keine Master-Ausgangsports zum Verbinden für den " +"Audioexport" -#: export_video_dialog.cc:544 -msgid "Encoding Video.." -msgstr "" +#: export_video_dialog.cc:561 +msgid "Encoding Video..." +msgstr "Enkodiere Video..." -#: export_video_dialog.cc:563 +#: export_video_dialog.cc:580 msgid "Export Video: Video input file cannot be read." -msgstr "" +msgstr "Exportiere Video: Die Videoquelldatei kann nicht gelesen werden." -#: export_video_dialog.cc:661 +#: export_video_dialog.cc:678 msgid "Encoding Video.. Pass 1/2" -msgstr "" +msgstr "Kodiere Video.. Durchgang 1/2" -#: export_video_dialog.cc:673 +#: export_video_dialog.cc:690 msgid "Encoding Video.. Pass 2/2" -msgstr "" +msgstr "Kodiere Video.. Durchgang 2/2" -#: export_video_dialog.cc:761 +#: export_video_dialog.cc:778 msgid "Transcoding failed." -msgstr "" +msgstr "Transkodieren fehlgeschlagen." -#: export_video_dialog.cc:930 export_video_dialog.cc:950 -#, fuzzy +#: export_video_dialog.cc:947 export_video_dialog.cc:967 msgid "Save Exported Video File" -msgstr "Exportiere Audio-Datei(en)..." +msgstr "Sichere exportierte Videodatei" #: export_video_infobox.cc:30 -#, fuzzy msgid "Video Export Info" -msgstr "Monitor" +msgstr "Video-Exportinformationen" #: export_video_infobox.cc:31 msgid "Do Not Show This Dialog Again (Reset in Edit > Preferences > Video)." msgstr "" +"Diesen Dialog nicht wieder anzeigen (kann in Bearbeiten > Globale " +"Einstellungen > Video zurückgesetzt werden)." #: export_video_infobox.cc:43 msgid "<b>Video Export Info</b>" -msgstr "" +msgstr "<b>Videoexport Informationen</b>" -#: export_video_infobox.cc:46 +#: export_video_infobox.cc:48 msgid "" -"Ardour video export is not recommended for mastering!\n" -"While 'ffmpeg' (which is used by ardour) can produce high-quality files, " -"this export lacks the possibility to tweak many settings. We recommend to " -"use 'winff', 'devede' or 'dvdauthor' to mux & master. Nevertheless this " -"video-export comes in handy to do quick snapshots, intermediates, dailies or " -"online videos.\n" +"Video encoding is a non-trivial task with many details.\n" "\n" -"The soundtrack is created from the master-bus of the current Ardour " -"session.\n" +"Please see the manual at %1/video-timeline/operations/#export.\n" "\n" -"The video soure defaults to the file used in the video timeline, which may " -"not the best quality to start with, you should the original video file.\n" +"Open Manual in Browser? " +msgstr "" +"Das Kodieren von Video ist eine komplexe Aufgabe mit vielen Details.\n" "\n" -"If the export-range is longer than the original video, black video frames " -"are prefixed and/or appended. This process may fail with non-standard pixel-" -"aspect-ratios.\n" +"Lesen Sie bitte darüber im Handbuch unter %1/video-timeline/operations/" +"#export nach.\n" "\n" -"The file-format is determined by the extension that you choose for the " -"output file (.avi, .mov, .flv, .ogv,...)\n" -"Note: not all combinations of format+codec+settings produce files which are " -"according so spec. e.g. flv files require sample-rates of 22.1kHz or " -"44.1kHz, mpeg containers can not be used with ac3 audio-codec, etc. If in " -"doubt, use one of the built-in presets." -msgstr "" +"Handbuch im Browser öffnen? " + +#~ msgid "Failed to set session-framerate: " +#~ msgstr "Konnte Projekt-Framerate nicht einstellen: " + +#~ msgid " vs " +#~ msgstr " vs. " + +#~ msgid "-24dB" +#~ msgstr "-24dB" + +#~ msgid "-15dB" +#~ msgstr "-15dB" + +#~ msgid "Configure meter-ticks and color-knee point." +#~ msgstr "Maßstriche und Farbbereiche der Pegelanzeige konfigurieren" + +#~ msgid "Enable Debug Mode: Print ffmpeg Command & Output to stdout." +#~ msgstr "" +#~ "Debug-Modus einschalten: gibt die ffmpeg-Befehlszeile und -Ausgabe an " +#~ "stdout aus." + +#~ msgid "-Inf" +#~ msgstr "-Inf" + +#~ msgid "slowest" +#~ msgstr "Am langsamstem" + +#~ msgid "slow" +#~ msgstr "Langsam" + +#~ msgid "fast" +#~ msgstr "Schnell" + +#~ msgid "faster" +#~ msgstr "Schneller" + +#~ msgid "fastest" +#~ msgstr "Schnellstmöglich" + +#~ msgid "found %1 match" +#~ msgid_plural "found %1 matches" +#~ msgstr[0] "%1 Treffer gefunden" +#~ msgstr[1] "%1 Treffer gefunden" + +#~ msgid "Search returned no results." +#~ msgstr "Die Suche erbrachte keine Ergebnisse" + +#~ msgid "Found %1 match" +#~ msgid_plural "Found %1 matches" +#~ msgstr[0] "%1 Treffer gefunden" +#~ msgstr[1] "%1 Treffer gefunden" + +#~ msgid "What would you like to do ?" +#~ msgstr "Was möchten Sie tun?" #~ msgid "Connect" #~ msgstr "Verbinden" diff --git a/gtk2_ardour/port_group.cc b/gtk2_ardour/port_group.cc index a25c2e0f84..5b4f151da8 100644 --- a/gtk2_ardour/port_group.cc +++ b/gtk2_ardour/port_group.cc @@ -564,8 +564,22 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp } for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) { - if (!extra_other[*i].empty()) { - boost::shared_ptr<Bundle> b = make_bundle_from_ports (extra_other[*i], *i, inputs); + if (extra_other[*i].empty()) continue; + std::string cp; + std::vector<std::string> nb; + for (uint32_t j = 0; j < extra_other[*i].size(); ++j) { + std::string nn = extra_other[*i][j]; + std::string pf = nn.substr (0, nn.find_first_of (":") + 1); + if (pf != cp && !nb.empty()) { + boost::shared_ptr<Bundle> b = make_bundle_from_ports (nb, *i, inputs); + other->add_bundle (b); + nb.clear(); + } + cp = pf; + nb.push_back(extra_other[*i][j]); + } + if (!nb.empty()) { + boost::shared_ptr<Bundle> b = make_bundle_from_ports (nb, *i, inputs); other->add_bundle (b); } } diff --git a/gtk2_ardour/port_matrix.cc b/gtk2_ardour/port_matrix.cc index bac415d72f..2872ad6605 100644 --- a/gtk2_ardour/port_matrix.cc +++ b/gtk2_ardour/port_matrix.cc @@ -152,6 +152,7 @@ PortMatrix::init () /* and also bundles */ _session->BundleAdded.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context()); + _session->BundleRemoved.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context()); /* and also ports */ _session->engine().PortRegisteredOrUnregistered.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context()); @@ -180,6 +181,7 @@ PortMatrix::reconnect_to_routes () boost::shared_ptr<RouteList> routes = _session->get_routes (); for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) { (*i)->processors_changed.connect (_route_connections, invalidator (*this), boost::bind (&PortMatrix::route_processors_changed, this, _1), gui_context()); + (*i)->DropReferences.connect (_route_connections, invalidator (*this), boost::bind (&PortMatrix::routes_changed, this), gui_context()); } } @@ -198,6 +200,7 @@ PortMatrix::route_processors_changed (RouteProcessorChange c) void PortMatrix::routes_changed () { + if (!_session) return; reconnect_to_routes (); setup_global_ports (); } @@ -206,7 +209,10 @@ PortMatrix::routes_changed () void PortMatrix::setup () { - if (!_session) return; // session went away + if (!_session) { + _route_connections.drop_connections (); + return; // session went away + } /* this needs to be done first, as the visible_ports() method uses the notebook state to decide which ports are being shown */ @@ -330,6 +336,13 @@ PortMatrix::select_arrangement () _vbox.pack_end (_vnotebook, false, false); _vbox.pack_end (_vspacer, true, true); +#define REMOVE_FROM_GTK_PARENT(WGT) if ((WGT).get_parent()) { (WGT).get_parent()->remove(WGT);} + REMOVE_FROM_GTK_PARENT(*_body) + REMOVE_FROM_GTK_PARENT(_vscroll) + REMOVE_FROM_GTK_PARENT(_hscroll) + REMOVE_FROM_GTK_PARENT(_vbox) + REMOVE_FROM_GTK_PARENT(_hbox) + attach (*_body, 2, 3, 1, 2, FILL | EXPAND, FILL | EXPAND); attach (_vscroll, 3, 4, 1, 2, SHRINK); attach (_hscroll, 2, 3, 3, 4, FILL | EXPAND, SHRINK); @@ -349,6 +362,12 @@ PortMatrix::select_arrangement () _vbox.pack_end (_vnotebook, false, false); _vbox.pack_end (_vlabel, false, false); + REMOVE_FROM_GTK_PARENT(*_body) + REMOVE_FROM_GTK_PARENT(_vscroll) + REMOVE_FROM_GTK_PARENT(_hscroll) + REMOVE_FROM_GTK_PARENT(_vbox) + REMOVE_FROM_GTK_PARENT(_hbox) + attach (*_body, 1, 2, 2, 3, FILL | EXPAND, FILL | EXPAND); attach (_vscroll, 3, 4, 2, 3, SHRINK); attach (_hscroll, 1, 2, 3, 4, FILL | EXPAND, SHRINK); @@ -727,7 +746,7 @@ PortMatrix::remove_channel (ARDOUR::BundleChannel b) int const r = io->remove_port (p, this); if (r == -1) { ArdourDialog d (_("Port removal not allowed")); - Label l (_("This port cannot be removed, as the first plugin in the track or buss cannot accept the new number of inputs.")); + Label l (_("This port cannot be removed.\nEither the first plugin in the track or buss cannot accept\nthe new number of inputs or the last plugin has more outputs.")); d.get_vbox()->pack_start (l); d.add_button (Stock::OK, RESPONSE_ACCEPT); d.set_modal (true); diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index 55d1e60101..54b96bbb8d 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -1315,6 +1315,14 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_track_meters) )); + add_option (_("Editor"), + new BoolOption ( + "show-editor-meter", + _("Display master-meter in the toolbar"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_editor_meter), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_editor_meter) + )); + bco = new BoolComboOption ( "use-overlap-equivalency", _("Regions in active edit groups are edited together"), @@ -1933,15 +1941,30 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_level) ); - mlu->add (MeteringLineUp24, _("-24dBFS")); - mlu->add (MeteringLineUp20, _("-20dBFS (SMPTE)")); + mlu->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)")); + mlu->add (MeteringLineUp20, _("-20dBFS (SMPTE RP.0155)")); mlu->add (MeteringLineUp18, _("-18dBFS (EBU, BBC)")); mlu->add (MeteringLineUp15, _("-15dBFS (DIN)")); - Gtkmm2ext::UI::instance()->set_tip (mlu->tip_widget(), _("Configure meter-ticks and color-knee point for dBFS scale DPM, set reference/offset level for IEC PPM.")); + Gtkmm2ext::UI::instance()->set_tip (mlu->tip_widget(), _("Configure meter-marks and color-knee point for dBFS scale DPM, set reference level for IEC1/Nordic, IEC2 PPM and VU meter.")); add_option (S_("Preferences|GUI"), mlu); + ComboOption<MeterLineUp>* mld = new ComboOption<MeterLineUp> ( + "meter-line-up-din", + _("IEC1/DIN Meter line-up level; 0dBu"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_line_up_din), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_din) + ); + + mld->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)")); + mld->add (MeteringLineUp20, _("-20dBFS (SMPTE RP.0155)")); + mld->add (MeteringLineUp18, _("-18dBFS (EBU, BBC)")); + mld->add (MeteringLineUp15, _("-15dBFS (DIN)")); + + Gtkmm2ext::UI::instance()->set_tip (mld->tip_widget(), _("Reference level for IEC1/DIN meter.")); + + add_option (S_("Preferences|GUI"), mld); ComboOption<VUMeterStandard>* mvu = new ComboOption<VUMeterStandard> ( "meter-vu-standard", @@ -1950,9 +1973,10 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_vu_standard) ); - mvu->add (MeteringVUfrench, _("+2dB (France)")); - mvu->add (MeteringVUamerican, _(" 0dB (North America, Australia)")); - mvu->add (MeteringVUstandard, _("-4dB (standard)")); + mvu->add (MeteringVUfrench, _("0VU = -2dBu (France)")); + mvu->add (MeteringVUamerican, _("0VU = 0dBu (North America, Australia)")); + mvu->add (MeteringVUstandard, _("0VU = +4dBu (standard)")); + mvu->add (MeteringVUeight, _("0VU = +8dBu")); add_option (S_("Preferences|GUI"), mvu); @@ -1969,6 +1993,15 @@ RCOptionEditor::RCOptionEditor () _("Specify the audio signal level in dbFS at and above which the meter-peak indicator will flash red.")); add_option (S_("Preferences|GUI"), mpks); + + add_option (S_("Preferences|GUI"), + new BoolOption ( + "meter-style-led", + _("LED meter style"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_style_led), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_style_led) + )); + } void diff --git a/gtk2_ardour/route_params_ui.cc b/gtk2_ardour/route_params_ui.cc index bd8edde448..76f3d4e264 100644 --- a/gtk2_ardour/route_params_ui.cc +++ b/gtk2_ardour/route_params_ui.cc @@ -32,6 +32,7 @@ #include "ardour/return.h" #include "ardour/route.h" #include "ardour/send.h" +#include "ardour/internal_send.h" #include "ardour_ui.h" #include "gui_thread.h" @@ -510,7 +511,12 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc) boost::shared_ptr<PluginInsert> plugin_insert; boost::shared_ptr<PortInsert> port_insert; - if ((send = boost::dynamic_pointer_cast<Send> (proc)) != 0) { + if ((boost::dynamic_pointer_cast<InternalSend> (proc)) != 0) { + cleanup_view(); + _processor.reset ((Processor*) 0); + update_title(); + return; + } else if ((send = boost::dynamic_pointer_cast<Send> (proc)) != 0) { SendUI *send_ui = new SendUI (this, send, _session); diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index 9e6bebfe0e..8cc1512d3b 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -61,7 +61,7 @@ using namespace ARDOUR; using namespace PBD; uint32_t RouteUI::_max_invert_buttons = 3; -sigc::signal<void, boost::shared_ptr<Route> > RouteUI::BusSendDisplayChanged; +PBD::Signal1<void, boost::shared_ptr<Route> > RouteUI::BusSendDisplayChanged; boost::weak_ptr<Route> RouteUI::_showing_sends_to; RouteUI::RouteUI (ARDOUR::Session* sess) @@ -171,7 +171,7 @@ RouteUI::init () monitor_disk_button->signal_button_press_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_press)); monitor_disk_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_release)); - BusSendDisplayChanged.connect (sigc::mem_fun (*this, &RouteUI::bus_send_display_changed)); + BusSendDisplayChanged.connect_same_thread (*this, boost::bind(&RouteUI::bus_send_display_changed, this, _1)); } void diff --git a/gtk2_ardour/route_ui.h b/gtk2_ardour/route_ui.h index 0501c78937..245101f616 100644 --- a/gtk2_ardour/route_ui.h +++ b/gtk2_ardour/route_ui.h @@ -225,7 +225,7 @@ class RouteUI : public virtual AxisView * by a click on the `Sends' button. The parameter is the route that the sends are * to, or 0 if no route is now in this mode. */ - static sigc::signal<void, boost::shared_ptr<ARDOUR::Route> > BusSendDisplayChanged; + static PBD::Signal1<void, boost::shared_ptr<ARDOUR::Route> > BusSendDisplayChanged; protected: PBD::ScopedConnectionList route_connections; diff --git a/gtk2_ardour/system_exec.cc b/gtk2_ardour/system_exec.cc index 55dbc60bb4..59f3647e51 100644 --- a/gtk2_ardour/system_exec.cc +++ b/gtk2_ardour/system_exec.cc @@ -724,10 +724,8 @@ SystemExec::start (int stderr_mode) signal(SIGPIPE, SIG_DFL); #endif -#ifndef __WIN32__ - int good_fds[1] = { 0 }; + int good_fds[1] = { -1 }; close_allv(good_fds); -#endif ::execve(argp[0], argp, envp); /* if we reach here something went wrong.. */ diff --git a/gtk2_ardour/transcode_ffmpeg.cc b/gtk2_ardour/transcode_ffmpeg.cc index b35f843d15..ea753104db 100644 --- a/gtk2_ardour/transcode_ffmpeg.cc +++ b/gtk2_ardour/transcode_ffmpeg.cc @@ -33,6 +33,7 @@ #include "i18n.h" using namespace PBD; +using namespace VideoUtils; TranscodeFfmpeg::TranscodeFfmpeg (std::string f) : infile(f) diff --git a/gtk2_ardour/transcode_video_dialog.cc b/gtk2_ardour/transcode_video_dialog.cc index ee0d755b17..3be2450ca7 100644 --- a/gtk2_ardour/transcode_video_dialog.cc +++ b/gtk2_ardour/transcode_video_dialog.cc @@ -50,6 +50,7 @@ using namespace Gtk; using namespace std; using namespace PBD; using namespace ARDOUR; +using namespace VideoUtils; TranscodeVideoDialog::TranscodeVideoDialog (Session* s, std::string infile) : ArdourDialog (_("Transcode/Import Video File ")) diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index 6c2330414d..8b05eb7108 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -302,6 +302,53 @@ rgba_from_style (string style, uint32_t r, uint32_t g, uint32_t b, uint32_t a, s } bool +rgba_p_from_style (string style, float *r, float *g, float *b, string attr, int state) +{ + static Gtk::Window* window = 0; + assert (r && g && b); + + if (window == 0) { + window = new Window (WINDOW_TOPLEVEL); + } + + Gtk::EventBox foo; + + window->add (foo); + + foo.set_name (style); + foo.ensure_style (); + + GtkRcStyle* rc = foo.get_style()->gobj()->rc_style; + + if (!rc) { + warning << string_compose (_("missing RGBA style for \"%1\""), style) << endl; + return false; + } + if (attr == "fg") { + *r = rc->fg[state].red / 65535.0; + *g = rc->fg[state].green / 65535.0; + *b = rc->fg[state].blue / 65535.0; + } else if (attr == "bg") { + *r = rc->bg[state].red / 65535.0; + *g = rc->bg[state].green / 65535.0; + *b = rc->bg[state].blue / 65535.0; + } else if (attr == "base") { + *r = rc->base[state].red / 65535.0; + *g = rc->base[state].green / 65535.0; + *b = rc->base[state].blue / 65535.0; + } else if (attr == "text") { + *r = rc->text[state].red / 65535.0; + *g = rc->text[state].green / 65535.0; + *b = rc->text[state].blue / 65535.0; + } else { + return false; + } + + window->remove (); + return true; +} + +bool canvas_item_visible (ArdourCanvas::Item* item) { return (item->gobj()->object.flags & GNOME_CANVAS_ITEM_VISIBLE) ? true : false; diff --git a/gtk2_ardour/utils.h b/gtk2_ardour/utils.h index d3110104fb..5d7bf000ea 100644 --- a/gtk2_ardour/utils.h +++ b/gtk2_ardour/utils.h @@ -56,6 +56,8 @@ Pango::FontDescription get_font_for_style (std::string widgetname); uint32_t rgba_from_style (std::string, uint32_t, uint32_t, uint32_t, uint32_t, std::string = "fg", int = Gtk::STATE_NORMAL, bool = true); +bool rgba_p_from_style (std::string, float*, float*, float*, std::string = "fg", int = Gtk::STATE_NORMAL); + void decorate (Gtk::Window& w, Gdk::WMDecoration d); bool canvas_item_visible (ArdourCanvas::Item* item); diff --git a/gtk2_ardour/utils_videotl.cc b/gtk2_ardour/utils_videotl.cc index 504fc3d2eb..ed1bfad766 100644 --- a/gtk2_ardour/utils_videotl.cc +++ b/gtk2_ardour/utils_videotl.cc @@ -35,9 +35,10 @@ using namespace Gtk; using namespace std; using namespace PBD; using namespace ARDOUR; +using namespace VideoUtils; bool -confirm_video_outfn (std::string outfn, std::string docroot) +VideoUtils::confirm_video_outfn (std::string outfn, std::string docroot) { /* replace docroot's '/' to G_DIR_SEPARATOR for the comparison */ size_t look_here = 0; @@ -77,7 +78,7 @@ confirm_video_outfn (std::string outfn, std::string docroot) } std::string -video_dest_dir (const std::string sessiondir, const std::string docroot) +VideoUtils::video_dest_dir (const std::string sessiondir, const std::string docroot) { std::string dir = docroot; if (dir.empty() || !dir.compare(0, dir.length(), sessiondir, 0, dir.length())) { @@ -92,7 +93,7 @@ video_dest_dir (const std::string sessiondir, const std::string docroot) } std::string -video_get_docroot (ARDOUR::RCConfiguration* config) +VideoUtils::video_get_docroot (ARDOUR::RCConfiguration* config) { if (config->get_video_advanced_setup()) { return config->get_video_server_docroot(); @@ -101,7 +102,7 @@ video_get_docroot (ARDOUR::RCConfiguration* config) } std::string -video_get_server_url (ARDOUR::RCConfiguration* config) +VideoUtils::video_get_server_url (ARDOUR::RCConfiguration* config) { if (config->get_video_advanced_setup()) { return config->get_video_server_url(); @@ -111,7 +112,7 @@ video_get_server_url (ARDOUR::RCConfiguration* config) std::string -strip_file_extension (const std::string infile) +VideoUtils::strip_file_extension (const std::string infile) { std::string rv; char *ext, *bn = strdup(infile.c_str()); @@ -126,7 +127,7 @@ strip_file_extension (const std::string infile) } std::string -get_file_extension (const std::string infile) +VideoUtils::get_file_extension (const std::string infile) { std::string rv = ""; char *ext, *bn = strdup(infile.c_str()); @@ -140,13 +141,13 @@ get_file_extension (const std::string infile) } std::string -video_dest_file (const std::string dir, const std::string infile) +VideoUtils::video_dest_file (const std::string dir, const std::string infile) { return dir + "a3_" + strip_file_extension(Glib::path_get_basename(infile)) + ".avi"; } std::string -video_map_path (std::string server_docroot, std::string filepath) +VideoUtils::video_map_path (std::string server_docroot, std::string filepath) { std::string rv = filepath; @@ -179,7 +180,7 @@ video_map_path (std::string server_docroot, std::string filepath) } void -ParseCSV (const std::string &csv, std::vector<std::vector<std::string> > &lines) +VideoUtils::ParseCSV (const std::string &csv, std::vector<std::vector<std::string> > &lines) { bool inQuote(false); bool newLine(false); @@ -236,7 +237,7 @@ ParseCSV (const std::string &csv, std::vector<std::vector<std::string> > &lines) } bool -video_query_info ( +VideoUtils::video_query_info ( std::string video_server_url, std::string filepath, double &video_file_fps, @@ -247,52 +248,32 @@ video_query_info ( { char url[2048]; - snprintf(url, sizeof(url), "%s%sinfo/?file=%s&format=plain" + snprintf(url, sizeof(url), "%s%sinfo/?file=%s&format=csv" , video_server_url.c_str() , (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/" , filepath.c_str()); - char *res = curl_http_get(url, NULL); - int pid=0; - if (res) { - char *pch, *pst; - int version; - pch = strtok_r(res, "\n", &pst); - while (pch) { -#if 0 /* DEBUG */ - printf("VideoFileInfo [%i] -> '%s'\n", pid, pch); -#endif - switch (pid) { - case 0: - version = atoi(pch); - if (version != 1) break; - case 1: - video_file_fps = atof(pch); - break; - case 2: - video_duration = atoll(pch); - break; - case 3: - video_start_offset = atof(pch); - break; - case 4: - video_aspect_ratio = atof(pch); - break; - default: - break; - } - pch = strtok_r(NULL,"\n", &pst); - ++pid; - } - free(res); + char *res = a3_curl_http_get(url, NULL); + if (!res) { + return false; } - if (pid!=5) { + + std::vector<std::vector<std::string> > lines; + ParseCSV(std::string(res), lines); + free(res); + + if (lines.empty() || lines.at(0).empty() || lines.at(0).size() != 6) { return false; } + if (atoi(lines.at(0).at(0)) != 1) return false; // version + video_start_offset = 0.0; + video_aspect_ratio = atof (lines.at(0).at(3)); + video_file_fps = atof (lines.at(0).at(4)); + video_duration = atoll(lines.at(0).at(5)); return true; } void -video_draw_cross (Glib::RefPtr<Gdk::Pixbuf> img) +VideoUtils::video_draw_cross (Glib::RefPtr<Gdk::Pixbuf> img) { int rowstride = img->get_rowstride(); @@ -319,7 +300,7 @@ video_draw_cross (Glib::RefPtr<Gdk::Pixbuf> img) extern "C" { #include <curl/curl.h> - struct MemoryStruct { + struct A3MemoryStruct { char *data; size_t size; }; @@ -327,7 +308,7 @@ extern "C" { static size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) { size_t realsize = size * nmemb; - struct MemoryStruct *mem = (struct MemoryStruct *)data; + struct A3MemoryStruct *mem = (struct A3MemoryStruct *)data; mem->data = (char *)realloc(mem->data, mem->size + realsize + 1); if (mem->data) { @@ -338,10 +319,10 @@ extern "C" { return realsize; } - char *curl_http_get (const char *u, int *status) { + char *a3_curl_http_get (const char *u, int *status) { CURL *curl; CURLcode res; - struct MemoryStruct chunk; + struct A3MemoryStruct chunk; long int httpstatus; if (status) *status = 0; //usleep(500000); return NULL; // TEST & DEBUG @@ -370,7 +351,7 @@ extern "C" { if (status) *status = httpstatus; if (res) { #ifdef CURLERRORDEBUG - printf("curl_http_get() failed: %s\n", curlerror); + printf("a3_curl_http_get() failed: %s\n", curlerror); #endif return NULL; } diff --git a/gtk2_ardour/utils_videotl.h b/gtk2_ardour/utils_videotl.h index 89daadc40e..7f6f6052af 100644 --- a/gtk2_ardour/utils_videotl.h +++ b/gtk2_ardour/utils_videotl.h @@ -32,6 +32,8 @@ #include "ardour/template_utils.h" #include "ardour_dialog.h" +namespace VideoUtils { + bool confirm_video_outfn (std::string, std::string docroot=""); std::string video_dest_dir (const std::string, const std::string); std::string video_dest_file (const std::string, const std::string); @@ -52,9 +54,10 @@ bool video_query_info ( double &video_start_offset, double &video_aspect_ratio ); +}; extern "C" { - char *curl_http_get (const char *u, int *status); + char *a3_curl_http_get (const char *u, int *status); } #endif /* __gtk_ardour_video_utils_h__ */ diff --git a/gtk2_ardour/video_image_frame.cc b/gtk2_ardour/video_image_frame.cc index 3c39dea77b..38a7a5994f 100644 --- a/gtk2_ardour/video_image_frame.cc +++ b/gtk2_ardour/video_image_frame.cc @@ -36,6 +36,7 @@ using namespace std; using namespace ARDOUR; +using namespace VideoUtils; VideoImageFrame::VideoImageFrame (PublicEditor& ed, ArdourCanvas::Group& parent, int w, int h, std::string vsurl, std::string vfn) : editor (ed) @@ -196,7 +197,7 @@ http_get_thread (void *arg) { int timeout = 1000; // * 5ms -> 5sec char *res = NULL; do { - res=curl_http_get(url, &status); + res=a3_curl_http_get(url, &status); if (status == 503) usleep(5000); // try-again } while (status == 503 && --timeout > 0); diff --git a/gtk2_ardour/video_server_dialog.cc b/gtk2_ardour/video_server_dialog.cc index d7a018a045..811c00f64f 100644 --- a/gtk2_ardour/video_server_dialog.cc +++ b/gtk2_ardour/video_server_dialog.cc @@ -37,6 +37,7 @@ using namespace Gtk; using namespace std; using namespace PBD; using namespace ARDOUR; +using namespace VideoUtils; VideoServerDialog::VideoServerDialog (Session* s) : ArdourDialog (_("Launch Video Server")) diff --git a/gtk2_ardour/video_timeline.cc b/gtk2_ardour/video_timeline.cc index 8f68174997..75f6150691 100644 --- a/gtk2_ardour/video_timeline.cc +++ b/gtk2_ardour/video_timeline.cc @@ -45,6 +45,7 @@ using namespace std; using namespace ARDOUR; using namespace PBD; using namespace Timecode; +using namespace VideoUtils; VideoTimeLine::VideoTimeLine (PublicEditor *ed, ArdourCanvas::Group *vbg, int initial_height) : editor (ed) @@ -502,14 +503,18 @@ VideoTimeLine::video_file_info (std::string filename, bool local) _session->config.set_timecode_format(timecode_60); break; default: - warning << _("Failed to set session-framerate: ") << video_file_fps << _(" does not have a corresponding option setting in Ardour.") << endmsg; /* TODO: gettext arg */ + warning << string_compose ( + _("Failed to set session-framerate: '%1' does not have a corresponding option setting in %2."), + video_file_fps, PROGRAM_NAME ) << endmsg; break; } _session->config.set_video_pullup(0); /* TODO only set if set_timecode_format() was successful ?!*/ } 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; + warning << string_compose( + _("Video file's framerate is not equal to %1 session timecode's framerate: '%2' vs '%3'"), + PROGRAM_NAME, video_file_fps, _session->timecode_frames_per_second()) + << endmsg; } flush_local_cache (); @@ -548,7 +553,7 @@ VideoTimeLine::check_server () , video_server_url.c_str() , (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/" ); - char *res=curl_http_get(url, NULL); + char *res=a3_curl_http_get(url, NULL); if (res) { if (strstr(res, "status: ok, online.")) { ok = true; } free(res); @@ -570,7 +575,7 @@ VideoTimeLine::check_server_docroot () , video_server_url.c_str() , (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/" ); - char *res=curl_http_get(url, NULL); + char *res=a3_curl_http_get(url, NULL); if (!res) { return false; } @@ -580,8 +585,8 @@ VideoTimeLine::check_server_docroot () || lines.at(0).empty() || lines.at(0).at(0) != video_get_docroot(Config)) { warning << string_compose( - _("Video-server docroot mismatch. Ardour: '%1', video-server: '%2'. This usually means that the video server was not started by ardour and uses a different document-root."), - video_get_docroot(Config), lines.at(0).at(0)) + _("Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually means that the video server was not started by ardour and uses a different document-root."), + PROGRAM_NAME, video_get_docroot(Config), lines.at(0).at(0)) << endmsg; ok = false; // TODO allow to override } @@ -666,7 +671,7 @@ VideoTimeLine::flush_cache () { , video_server_url.c_str() , (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/" ); - char *res=curl_http_get(url, NULL); + char *res=a3_curl_http_get(url, NULL); if (res) { free (res); } @@ -814,8 +819,8 @@ VideoTimeLine::terminated_video_monitor () { vmonitor->save_session(); delete vmonitor; } - GuiUpdate("set-xjadeo-active-off"); vmonitor=0; + GuiUpdate("set-xjadeo-active-off"); if (reopen_vmonitor) { reopen_vmonitor=false; open_video_monitor(); diff --git a/gtk2_ardour/video_timeline.h b/gtk2_ardour/video_timeline.h index fbf563ecf8..c96c9b1320 100644 --- a/gtk2_ardour/video_timeline.h +++ b/gtk2_ardour/video_timeline.h @@ -96,7 +96,7 @@ class VideoTimeLine : public sigc::trackable, public ARDOUR::SessionHandlePtr, p float get_apv(); /* audio frames per video frame; */ ARDOUR::framecnt_t get_duration () { return video_duration;} ARDOUR::frameoffset_t get_offset () { return video_offset;} - ARDOUR::frameoffset_t quantify_frames_to_apv (ARDOUR::frameoffset_t offset) { return floor(offset/get_apv())*get_apv(); } + ARDOUR::frameoffset_t quantify_frames_to_apv (ARDOUR::frameoffset_t offset) { return rint(offset/get_apv())*get_apv(); } void set_offset (ARDOUR::frameoffset_t offset) { video_offset = quantify_frames_to_apv(offset); } // this function does not update video_offset_p, call save_undo() to finalize changes to this! - this fn is currently only used from editor_drag.cc protected: diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index f60240fd57..c97d624440 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -61,7 +61,7 @@ Amp::display_name() const } bool -Amp::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +Amp::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in; return true; diff --git a/libs/ardour/ardour/amp.h b/libs/ardour/ardour/amp.h index 23cc0ad0a8..e21cf62d62 100644 --- a/libs/ardour/ardour/amp.h +++ b/libs/ardour/ardour/amp.h @@ -40,7 +40,7 @@ public: bool visible () const; - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); diff --git a/libs/ardour/ardour/audio_diskstream.h b/libs/ardour/ardour/audio_diskstream.h index 21efc5c20c..5a856e9b36 100644 --- a/libs/ardour/ardour/audio_diskstream.h +++ b/libs/ardour/ardour/audio_diskstream.h @@ -152,6 +152,7 @@ class AudioDiskstream : public Diskstream friend class AudioTrack; int process (BufferSet&, framepos_t transport_frame, pframes_t nframes, framecnt_t &, bool need_disk_signal); + frameoffset_t calculate_playback_distance (pframes_t nframes); bool commit (framecnt_t); private: diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h index 36e82da802..007390b34a 100644 --- a/libs/ardour/ardour/audio_unit.h +++ b/libs/ardour/ardour/audio_unit.h @@ -104,7 +104,7 @@ class AUPlugin : public ARDOUR::Plugin bool has_editor () const; - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); ChanCount output_streams() const; ChanCount input_streams() const; bool configure_io (ChanCount in, ChanCount out); diff --git a/libs/ardour/ardour/capturing_processor.h b/libs/ardour/ardour/capturing_processor.h index b672d1ac07..5b9ea51557 100644 --- a/libs/ardour/ardour/capturing_processor.h +++ b/libs/ardour/ardour/capturing_processor.h @@ -38,7 +38,7 @@ class CapturingProcessor : public Processor int set_block_size (pframes_t nframes); void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool result_required); bool configure_io (ChanCount in, ChanCount out); - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); virtual XMLNode& state (bool); private: diff --git a/libs/ardour/ardour/delivery.h b/libs/ardour/ardour/delivery.h index 314b223538..4a6d4368a6 100644 --- a/libs/ardour/ardour/delivery.h +++ b/libs/ardour/ardour/delivery.h @@ -67,7 +67,7 @@ public: std::string display_name() const; Role role() const { return _role; } - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h index 85ca03caff..427b52b054 100644 --- a/libs/ardour/ardour/diskstream.h +++ b/libs/ardour/ardour/diskstream.h @@ -193,6 +193,7 @@ class Diskstream : public SessionObject, public PublicDiskstream friend class Track; virtual int process (BufferSet&, framepos_t transport_frame, pframes_t nframes, framecnt_t &, bool need_disk_signal) = 0; + virtual frameoffset_t calculate_playback_distance (pframes_t nframes) = 0; virtual bool commit (framecnt_t) = 0; //private: diff --git a/libs/ardour/ardour/internal_return.h b/libs/ardour/ardour/internal_return.h index c7fe04cc42..4d2b32f031 100644 --- a/libs/ardour/ardour/internal_return.h +++ b/libs/ardour/ardour/internal_return.h @@ -39,7 +39,7 @@ class InternalReturn : public Return void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); bool configure_io (ChanCount, ChanCount); - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); void add_send (InternalSend *); void remove_send (InternalSend *); diff --git a/libs/ardour/ardour/internal_send.h b/libs/ardour/ardour/internal_send.h index 8bfb0de887..a7f0f73e6e 100644 --- a/libs/ardour/ardour/internal_send.h +++ b/libs/ardour/ardour/internal_send.h @@ -42,7 +42,7 @@ class InternalSend : public Send void cycle_start (pframes_t); void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); bool feeds (boost::shared_ptr<Route> other) const; - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); int set_block_size (pframes_t); diff --git a/libs/ardour/ardour/meter.h b/libs/ardour/ardour/meter.h index 4ac140fd04..df1e381bb4 100644 --- a/libs/ardour/ardour/meter.h +++ b/libs/ardour/ardour/meter.h @@ -56,7 +56,7 @@ public: void reset (); void reset_max (); - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); /* special method for meter, to ensure that it can always handle the maximum @@ -75,6 +75,9 @@ public: /** Compute peaks */ void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); + void activate () { } + void deactivate () { } + ChanCount input_streams () const { return current_meters; } ChanCount output_streams () const { return current_meters; } diff --git a/libs/ardour/ardour/midi_diskstream.h b/libs/ardour/ardour/midi_diskstream.h index d6ad71863a..34fa0ae79a 100644 --- a/libs/ardour/ardour/midi_diskstream.h +++ b/libs/ardour/ardour/midi_diskstream.h @@ -125,6 +125,7 @@ class MidiDiskstream : public Diskstream friend class MidiTrack; int process (BufferSet&, framepos_t transport_frame, pframes_t nframes, framecnt_t &, bool need_diskstream); + frameoffset_t calculate_playback_distance (pframes_t nframes); bool commit (framecnt_t nframes); static framecnt_t midi_readahead; diff --git a/libs/ardour/ardour/monitor_processor.h b/libs/ardour/ardour/monitor_processor.h index 5b724b5e8d..64d3b86bfb 100644 --- a/libs/ardour/ardour/monitor_processor.h +++ b/libs/ardour/ardour/monitor_processor.h @@ -118,7 +118,7 @@ public: int set_state (const XMLNode&, int /* version */); bool configure_io (ChanCount in, ChanCount out); - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); void set_cut_all (bool); void set_dim_all (bool); diff --git a/libs/ardour/ardour/panner_shell.h b/libs/ardour/ardour/panner_shell.h index 7d24adb46f..dba5826370 100644 --- a/libs/ardour/ardour/panner_shell.h +++ b/libs/ardour/ardour/panner_shell.h @@ -53,7 +53,7 @@ public: std::string describe_parameter (Evoral::Parameter param); - bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) const { return true; }; + bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) { return true; }; void configure_io (ChanCount in, ChanCount out); /// The fundamental Panner function diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h index 9e4f5c40fd..55b76fbb08 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -242,7 +242,7 @@ class Plugin : public PBD::StatefulDestructible, public Latent /* specific types of plugins can overload this. As of September 2008, only AUPlugin does this. */ - virtual bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) const { return false; } + virtual bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) { return false; } virtual ChanCount output_streams() const; virtual ChanCount input_streams() const; diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h index d80c759cff..a1b9c5a685 100644 --- a/libs/ardour/ardour/plugin_insert.h +++ b/libs/ardour/ardour/plugin_insert.h @@ -69,7 +69,7 @@ class PluginInsert : public Processor bool set_count (uint32_t num); uint32_t get_count () const { return _plugins.size(); } - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); bool has_no_inputs() const; @@ -160,6 +160,8 @@ class PluginInsert : public Processor BufferSet _signal_analysis_inputs; BufferSet _signal_analysis_outputs; + ChanCount midi_bypass; + /** Description of how we can match our plugin's IO to our own insert IO */ struct Match { Match () : method (Impossible), plugins (0) {} @@ -170,7 +172,7 @@ class PluginInsert : public Processor ChanCount hide; ///< number of channels to hide }; - Match private_can_support_io_configuration (ChanCount const &, ChanCount &) const; + Match private_can_support_io_configuration (ChanCount const &, ChanCount &); /** details of the match currently being used */ Match _match; diff --git a/libs/ardour/ardour/port_insert.h b/libs/ardour/ardour/port_insert.h index 657c2c0de6..abd9fb73cc 100644 --- a/libs/ardour/ardour/port_insert.h +++ b/libs/ardour/ardour/port_insert.h @@ -57,7 +57,7 @@ class PortInsert : public IOProcessor bool set_name (const std::string& name); - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); void activate (); diff --git a/libs/ardour/ardour/process_thread.h b/libs/ardour/ardour/process_thread.h index 0c197e9fb2..f96595fbbf 100644 --- a/libs/ardour/ardour/process_thread.h +++ b/libs/ardour/ardour/process_thread.h @@ -45,7 +45,8 @@ public: */ static BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO); - static BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO); + static BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO, bool silence = false); + static BufferSet& get_route_buffers (ChanCount count = ChanCount::ZERO, bool silence = false); static BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO); static gain_t* gain_automation_buffer (); static gain_t* send_gain_automation_buffer (); diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h index d497f56dd3..772ae3520d 100644 --- a/libs/ardour/ardour/processor.h +++ b/libs/ardour/ardour/processor.h @@ -82,7 +82,7 @@ class Processor : public SessionObject, public Automatable, public Latent /* Derived classes should override these, or processor appears as an in-place pass-through */ - virtual bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const = 0; + virtual bool can_support_io_configuration (const ChanCount& in, ChanCount& out) = 0; virtual ChanCount input_streams () const { return _configured_input; } virtual ChanCount output_streams() const { return _configured_output; } diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index 5716fa5105..e05efbd510 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -148,10 +148,13 @@ CONFIG_VARIABLE (bool, super_rapid_clock_update, "super-rapid-clock-update", fal /* metering */ CONFIG_VARIABLE (float, meter_hold, "meter-hold", 100.0f) -CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 32.0f) -CONFIG_VARIABLE (VUMeterStandard, meter_vu_standard, "meter-vu-standard", MeteringVUfrench) +CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 13.3f) +CONFIG_VARIABLE (VUMeterStandard, meter_vu_standard, "meter-vu-standard", MeteringVUstandard) CONFIG_VARIABLE (MeterLineUp, meter_line_up_level, "meter-line-up-level", MeteringLineUp18) +CONFIG_VARIABLE (MeterLineUp, meter_line_up_din, "meter-line-up-din", MeteringLineUp15) CONFIG_VARIABLE (float, meter_peak, "meter-peak", 0.0f) +CONFIG_VARIABLE (bool, meter_style_led, "meter-style-led", true) +CONFIG_VARIABLE (bool, show_editor_meter, "show-editor-meter", true) /* miscellany */ diff --git a/libs/ardour/ardour/return.h b/libs/ardour/ardour/return.h index 55ca2d84f6..6dcd6ac2fc 100644 --- a/libs/ardour/ardour/return.h +++ b/libs/ardour/ardour/return.h @@ -56,7 +56,7 @@ public: uint32_t pans_required() const { return _configured_input.n_audio(); } - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); static uint32_t how_many_returns(); diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 2e44d00984..23f24cb275 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -530,6 +530,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, void silence_unlocked (framecnt_t); ChanCount processor_max_streams; + ChanCount processor_out_streams; uint32_t pans_required() const; ChanCount n_process_buffers (); @@ -553,8 +554,10 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, void output_change_handler (IOChange, void *src); bool input_port_count_changing (ChanCount); + bool output_port_count_changing (ChanCount); bool _in_configure_processors; + bool _initial_io_setup; int configure_processors_unlocked (ProcessorStreams*); std::list<std::pair<ChanCount, ChanCount> > try_configure_processors (ChanCount, ProcessorStreams *); diff --git a/libs/ardour/ardour/send.h b/libs/ardour/ardour/send.h index fa023a3b68..1a21d1d050 100644 --- a/libs/ardour/ardour/send.h +++ b/libs/ardour/ardour/send.h @@ -56,7 +56,7 @@ class Send : public Delivery void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); void activate (); diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 4c005ffa74..a12f816c1e 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -200,7 +200,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi void process (pframes_t nframes); BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO); - BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO); + BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO, bool silence = true ); + BufferSet& get_route_buffers (ChanCount count = ChanCount::ZERO, bool silence = true); BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO); bool have_rec_enabled_track () const; @@ -813,6 +814,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi void send_mmc_locate (framepos_t); int send_full_time_code (framepos_t); + void send_song_position_pointer (framepos_t); bool step_editing() const { return (_step_editors > 0); } @@ -1209,6 +1211,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi double ltc_enc_cnt; framepos_t ltc_enc_off; bool restarting; + framepos_t ltc_prev_cycle; framepos_t ltc_timecode_offset; bool ltc_timecode_negative_offset; diff --git a/libs/ardour/ardour/session_configuration_vars.h b/libs/ardour/ardour/session_configuration_vars.h index ebeebbe1fd..5e93c01b79 100644 --- a/libs/ardour/ardour/session_configuration_vars.h +++ b/libs/ardour/ardour/session_configuration_vars.h @@ -64,3 +64,4 @@ CONFIG_VARIABLE (bool, show_rec_on_meterbridge, "show-rec-on-meterbridge", true) CONFIG_VARIABLE (bool, show_mute_on_meterbridge, "show-mute-on-meterbridge", false) CONFIG_VARIABLE (bool, show_solo_on_meterbridge, "show-solo-on-meterbridge", false) CONFIG_VARIABLE (bool, show_name_on_meterbridge, "show-name-on-meterbridge", true) +CONFIG_VARIABLE (uint32_t, meterbridge_label_height, "meterbridge-label-height", 0) diff --git a/libs/ardour/ardour/thread_buffers.h b/libs/ardour/ardour/thread_buffers.h index cd0b76511a..9d92454887 100644 --- a/libs/ardour/ardour/thread_buffers.h +++ b/libs/ardour/ardour/thread_buffers.h @@ -38,6 +38,7 @@ public: BufferSet* silent_buffers; BufferSet* scratch_buffers; + BufferSet* route_buffers; BufferSet* mix_buffers; gain_t* gain_automation_buffer; gain_t* send_gain_automation_buffer; diff --git a/libs/ardour/ardour/ticker.h b/libs/ardour/ardour/ticker.h index 23d2ef2fe6..b6e5376c12 100644 --- a/libs/ardour/ardour/ticker.h +++ b/libs/ardour/ardour/ticker.h @@ -19,6 +19,7 @@ */ #include <boost/noncopyable.hpp> +#include <boost/scoped_ptr.hpp> #include "pbd/signals.h" @@ -42,7 +43,7 @@ class MidiClockTicker : public SessionHandlePtr, boost::noncopyable { public: MidiClockTicker (); - virtual ~MidiClockTicker() {}; + virtual ~MidiClockTicker(); void tick (const framepos_t& transport_frames); @@ -63,6 +64,9 @@ public: /// slot for the signal session::TransportLooped void transport_looped(); + /// slot for the signal session::Located + void session_located(); + /// pulses per quarter note (default 24) void set_ppqn(int ppqn) { _ppqn = ppqn; } @@ -71,12 +75,16 @@ private: int _ppqn; double _last_tick; + class Position; + boost::scoped_ptr<Position> _pos; + double one_ppqn_in_frames (framepos_t transport_position); void send_midi_clock_event (pframes_t offset); void send_start_event (pframes_t offset); void send_continue_event (pframes_t offset); void send_stop_event (pframes_t offset); + void send_position_event (uint32_t midi_clocks, pframes_t offset); }; } diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index b00b03e060..2fb4ec9691 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -384,9 +384,10 @@ namespace ARDOUR { }; enum VUMeterStandard { - MeteringVUfrench, // + 2 - MeteringVUamerican, // +-0 - MeteringVUstandard // -4 + MeteringVUfrench, // 0VU = -2dBu + MeteringVUamerican, // 0VU = 0dBu + MeteringVUstandard, // 0VU = +4dBu + MeteringVUeight // 0VU = +8dBu }; enum MeterLineUp { diff --git a/libs/ardour/ardour/unknown_processor.h b/libs/ardour/ardour/unknown_processor.h index 36981030ce..61a5734df2 100644 --- a/libs/ardour/ardour/unknown_processor.h +++ b/libs/ardour/ardour/unknown_processor.h @@ -49,7 +49,7 @@ public: return false; } - bool can_support_io_configuration (const ChanCount &, ChanCount &) const { + bool can_support_io_configuration (const ChanCount &, ChanCount &) { return false; } diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc index 5c98271e5f..77c14de103 100644 --- a/libs/ardour/audio_diskstream.cc +++ b/libs/ardour/audio_diskstream.cc @@ -700,6 +700,31 @@ AudioDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t return 0; } +frameoffset_t +AudioDiskstream::calculate_playback_distance (pframes_t nframes) +{ + frameoffset_t playback_distance = nframes; + + if (record_enabled()) { + playback_distance = nframes; + } else if (_actual_speed != 1.0f && _actual_speed != -1.0f) { + interpolation.set_speed (_target_speed); + boost::shared_ptr<ChannelList> c = channels.reader(); + int channel = 0; + for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) { + playback_distance = interpolation.interpolate (channel, nframes, NULL, NULL); + } + } else { + playback_distance = nframes; + } + + if (_actual_speed < 0.0) { + return -playback_distance; + } else { + return playback_distance; + } +} + /** Update various things including playback_sample, read pointer on each channel's playback_buf * and write pointer on each channel's capture_buf. Also wout whether the butler is needed. * @return true if the butler is required. @@ -900,7 +925,7 @@ AudioDiskstream::internal_playback_seek (framecnt_t distance) boost::shared_ptr<ChannelList> c = channels.reader(); for (chan = c->begin(); chan != c->end(); ++chan) { - (*chan)->playback_buf->increment_read_ptr (distance); + (*chan)->playback_buf->increment_read_ptr (llabs(distance)); } if (first_recordable_frame < max_framepos) { diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc index 4b33bbd4c6..0530dbfce9 100644 --- a/libs/ardour/audio_track.cc +++ b/libs/ardour/audio_track.cc @@ -313,6 +313,12 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); if (!lm.locked()) { + boost::shared_ptr<AudioDiskstream> diskstream = audio_diskstream(); + framecnt_t playback_distance = diskstream->calculate_playback_distance(nframes); + if (can_internal_playback_seek(llabs(playback_distance))) { + /* TODO should declick */ + internal_playback_seek(playback_distance); + } return 0; } @@ -353,7 +359,7 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram _silent = false; _amp->apply_gain_automation(false); - BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers ()); + BufferSet& bufs = _session.get_route_buffers (n_process_buffers ()); fill_buffers_with_input (bufs, _input, nframes); diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc index 20a55e49f9..538a905ca2 100644 --- a/libs/ardour/audio_unit.cc +++ b/libs/ardour/audio_unit.cc @@ -998,7 +998,7 @@ AUPlugin::output_streams() const } bool -AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out) { // Note: We never attempt to multiply-instantiate plugins to meet io configurations. @@ -1824,7 +1824,6 @@ AUPlugin::do_save_preset (string preset_name) CFPropertyListRef propertyList; vector<Glib::ustring> v; Glib::ustring user_preset_path; - bool ret = true; std::string m = maker(); std::string n = name(); @@ -1843,12 +1842,12 @@ AUPlugin::do_save_preset (string preset_name) if (g_mkdir_with_parents (user_preset_path.c_str(), 0775) < 0) { error << string_compose (_("Cannot create user plugin presets folder (%1)"), user_preset_path) << endmsg; - return false; + return string(); } DEBUG_TRACE (DEBUG::AudioUnits, "get current preset\n"); if (unit->GetAUPreset (propertyList) != noErr) { - return false; + return string(); } // add the actual preset name */ @@ -1863,7 +1862,7 @@ AUPlugin::do_save_preset (string preset_name) if (save_property_list (propertyList, user_preset_path)) { error << string_compose (_("Saving plugin state to %1 failed"), user_preset_path) << endmsg; - ret = false; + return string(); } CFRelease(propertyList); diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc index 74dd52d504..84a5b687f9 100644 --- a/libs/ardour/audiosource.cc +++ b/libs/ardour/audiosource.cc @@ -182,7 +182,7 @@ AudioSource::touch_peakfile () struct utimbuf tbuf; tbuf.actime = statbuf.st_atime; - tbuf.modtime = time ((time_t) 0); + tbuf.modtime = time ((time_t*) 0); utime (peakpath.c_str(), &tbuf); } diff --git a/libs/ardour/capturing_processor.cc b/libs/ardour/capturing_processor.cc index f14e018097..ce4a546fb4 100644 --- a/libs/ardour/capturing_processor.cc +++ b/libs/ardour/capturing_processor.cc @@ -62,7 +62,7 @@ CapturingProcessor::configure_io (ChanCount in, ChanCount out) } bool -CapturingProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +CapturingProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in; return true; diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index 9eaf843f7c..dfbe4c960a 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -124,7 +124,7 @@ Delivery::display_name () const } bool -Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out) { if (_role == Main) { diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index e60977a3e5..ab181d2956 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -226,6 +226,7 @@ setup_enum_writer () REGISTER_ENUM (MeteringVUfrench); REGISTER_ENUM (MeteringVUamerican); REGISTER_ENUM (MeteringVUstandard); + REGISTER_ENUM (MeteringVUeight); REGISTER (_VUMeterStandard); REGISTER_ENUM (MeteringLineUp24); diff --git a/libs/ardour/internal_return.cc b/libs/ardour/internal_return.cc index af6b6110b6..fc5963603b 100644 --- a/libs/ardour/internal_return.cc +++ b/libs/ardour/internal_return.cc @@ -80,7 +80,7 @@ InternalReturn::get_state() } bool -InternalReturn::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +InternalReturn::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in; return true; diff --git a/libs/ardour/internal_send.cc b/libs/ardour/internal_send.cc index 4b8c469a9d..8136985e1f 100644 --- a/libs/ardour/internal_send.cc +++ b/libs/ardour/internal_send.cc @@ -284,7 +284,7 @@ InternalSend::connect_when_legal () } bool -InternalSend::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +InternalSend::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in; return true; diff --git a/libs/ardour/kmeterdsp.cc b/libs/ardour/kmeterdsp.cc index d4460f94cb..181378cf76 100644 --- a/libs/ardour/kmeterdsp.cc +++ b/libs/ardour/kmeterdsp.cc @@ -49,45 +49,37 @@ void Kmeterdsp::process (float *p, int n) // p : pointer to sample buffer // n : number of samples to process - float s, t, z1, z2; + float s, z1, z2; // Get filter state. z1 = _z1; z2 = _z2; - // Process n samples. Find digital peak value for this - // period and perform filtering. The second filter is - // evaluated only every 4th sample - this is just an - // optimisation. - t = 0; + // Perform filtering. The second filter is evaluated + // only every 4th sample - this is just an optimisation. n /= 4; // Loop is unrolled by 4. while (n--) { s = *p++; s *= s; - if (t < s) t = s; // Update digital peak. z1 += _omega * (s - z1); // Update first filter. s = *p++; s *= s; - if (t < s) t = s; // Update digital peak. z1 += _omega * (s - z1); // Update first filter. s = *p++; s *= s; - if (t < s) t = s; // Update digital peak. z1 += _omega * (s - z1); // Update first filter. s = *p++; s *= s; - if (t < s) t = s; // Update digital peak. z1 += _omega * (s - z1); // Update first filter. z2 += 4 * _omega * (z1 - z2); // Update second filter. } - t = sqrtf (t); // Save filter state. The added constants avoid denormals. _z1 = z1 + 1e-20f; _z2 = z2 + 1e-20f; - s = sqrtf (2 * z2); + s = sqrtf (2.0f * z2); if (_flag) // Display thread has read the rms value. { diff --git a/libs/ardour/ladspa_plugin.cc b/libs/ardour/ladspa_plugin.cc index 1ab00e0b34..5a6e577f2d 100644 --- a/libs/ardour/ladspa_plugin.cc +++ b/libs/ardour/ladspa_plugin.cc @@ -562,7 +562,7 @@ LadspaPlugin::connect_and_run (BufferSet& bufs, cycles_t then = get_cycles (); BufferSet& silent_bufs = _session.get_silent_buffers(ChanCount(DataType::AUDIO, 1)); - BufferSet& scratch_bufs = _session.get_silent_buffers(ChanCount(DataType::AUDIO, 1)); + BufferSet& scratch_bufs = _session.get_scratch_buffers(ChanCount(DataType::AUDIO, 1)); uint32_t audio_in_index = 0; uint32_t audio_out_index = 0; diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index 1f0859bc8d..95a29b7c8f 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -970,7 +970,7 @@ LV2Plugin::find_presets() lilv_node_as_string(name)))); } else { warning << string_compose( - _("Plugin \"%1\% preset \"%2%\" is missing a label\n"), + _("Plugin \"%1\" preset \"%2\" is missing a label\n"), lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)), lilv_node_as_string(preset)) << endmsg; } @@ -1651,7 +1651,7 @@ LV2Plugin::connect_and_run(BufferSet& bufs, } } else if (!valid) { // Nothing we understand or care about, connect to scratch - _ev_buffers[port_index] = silent_bufs.get_lv2_midi( + _ev_buffers[port_index] = scratch_bufs.get_lv2_midi( (flags & PORT_INPUT), 0, (flags & PORT_EVENT)); } buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]); diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index cc014caf63..a7857f5859 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -43,6 +43,8 @@ PeakMeter::PeakMeter (Session& s, const std::string& name) Iec1ppmdsp::init(s.nominal_frame_rate()); Iec2ppmdsp::init(s.nominal_frame_rate()); Vumeterdsp::init(s.nominal_frame_rate()); + _pending_active = true; + _meter_type = MeterPeak; } PeakMeter::~PeakMeter () @@ -163,7 +165,7 @@ PeakMeter::reset_max () } bool -PeakMeter::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +PeakMeter::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in; return true; @@ -186,20 +188,20 @@ PeakMeter::configure_io (ChanCount in, ChanCount out) void PeakMeter::reflect_inputs (const ChanCount& in) { - current_meters = in; - - const size_t limit = min (_peak_signal.size(), (size_t) current_meters.n_total ()); - const size_t n_midi = min (_peak_signal.size(), (size_t) current_meters.n_midi()); - - for (size_t n = 0; n < limit; ++n) { - if (n < n_midi) { - _visible_peak_power[n] = 0; - } else { - _visible_peak_power[n] = -INFINITY; + for (uint32_t i = in.n_total(); i < current_meters.n_total(); ++i) { + if (i < _peak_signal.size()) { + _peak_signal[i] = 0.0f; } } + for (uint32_t i = in.n_audio(); i < current_meters.n_audio(); ++i) { + if (i >= _kmeter.size()) continue; + _kmeter[i]->reset(); + _iec1meter[i]->reset(); + _iec2meter[i]->reset(); + _vumeter[i]->reset(); + } - reset(); + current_meters = in; reset_max(); ConfigurationChanged (in, in); /* EMIT SIGNAL */ @@ -268,7 +270,17 @@ PeakMeter::meter () return; } - assert(_visible_peak_power.size() == _peak_signal.size()); + // TODO block this thread while PeakMeter::reset_max_channels() is + // reallocating channels. + // (may happen with Session > New: old session not yet closed, + // meter-thread still active while new one is initializing and + // maybe on other occasions, too) + if ( (_visible_peak_power.size() != _peak_signal.size()) + || (_max_peak_power.size() != _peak_signal.size()) + || (_max_peak_signal.size() != _peak_signal.size()) + ) { + return; + } const size_t limit = min (_peak_signal.size(), (size_t) current_meters.n_total ()); const size_t n_midi = min (_peak_signal.size(), (size_t) current_meters.n_midi()); @@ -325,6 +337,8 @@ PeakMeter::meter () } } +#define CHECKSIZE(MTR) (n < MTR.size() + n_midi && n >= n_midi) + float PeakMeter::meter_level(uint32_t n, MeterType type) { switch (type) { @@ -333,7 +347,7 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { case MeterK14: { const uint32_t n_midi = current_meters.n_midi(); - if ((n - n_midi) < _kmeter.size() && (n - n_midi) >= 0) { + if (CHECKSIZE(_kmeter)) { return accurate_coefficient_to_dB (_kmeter[n - n_midi]->read()); } } @@ -342,7 +356,7 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { case MeterIEC1NOR: { const uint32_t n_midi = current_meters.n_midi(); - if ((n - n_midi) < _iec1meter.size() && (n - n_midi) >= 0) { + if (CHECKSIZE(_iec1meter)) { return accurate_coefficient_to_dB (_iec1meter[n - n_midi]->read()); } } @@ -351,7 +365,7 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { case MeterIEC2EBU: { const uint32_t n_midi = current_meters.n_midi(); - if ((n - n_midi) < _iec2meter.size() && (n - n_midi) >= 0) { + if (CHECKSIZE(_iec2meter)) { return accurate_coefficient_to_dB (_iec2meter[n - n_midi]->read()); } } @@ -359,7 +373,7 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { case MeterVU: { const uint32_t n_midi = current_meters.n_midi(); - if ((n - n_midi) < _vumeter.size() && (n - n_midi) >= 0) { + if (CHECKSIZE(_vumeter)) { return accurate_coefficient_to_dB (_vumeter[n - n_midi]->read()); } } diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index ff6147d285..e67ce9b831 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -517,6 +517,20 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t return 0; } +frameoffset_t +MidiDiskstream::calculate_playback_distance (pframes_t nframes) +{ + frameoffset_t playback_distance = nframes; + + /* XXX: should be doing varispeed stuff once it's implemented in ::process() above */ + + if (_actual_speed < 0.0) { + return -playback_distance; + } else { + return playback_distance; + } +} + bool MidiDiskstream::commit (framecnt_t playback_distance) { diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index c7768c7249..f88c331c2c 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -319,6 +319,12 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame { Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); if (!lm.locked()) { + boost::shared_ptr<MidiDiskstream> diskstream = midi_diskstream(); + framecnt_t playback_distance = diskstream->calculate_playback_distance(nframes); + if (can_internal_playback_seek(llabs(playback_distance))) { + /* TODO should declick, and/or note-off */ + internal_playback_seek(playback_distance); + } return 0; } @@ -353,7 +359,7 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame return dret; } - BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers()); + BufferSet& bufs = _session.get_route_buffers (n_process_buffers()); fill_buffers_with_input (bufs, _input, nframes); diff --git a/libs/ardour/monitor_processor.cc b/libs/ardour/monitor_processor.cc index e55428b666..ed06647860 100644 --- a/libs/ardour/monitor_processor.cc +++ b/libs/ardour/monitor_processor.cc @@ -355,7 +355,7 @@ MonitorProcessor::configure_io (ChanCount in, ChanCount out) } bool -MonitorProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +MonitorProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in; return true; diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index c5d52f7345..bb79801c9f 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -250,7 +250,7 @@ Playlist::Playlist (boost::shared_ptr<const Playlist> other, framepos_t start, f plist.add (Properties::layer, region->layer()); plist.add (Properties::layering_index, region->layering_index()); - new_region = RegionFactory::RegionFactory::create (region, plist); + new_region = RegionFactory::create (region, plist); add_region_internal (new_region, position); } @@ -284,7 +284,7 @@ Playlist::copy_regions (RegionList& newlist) const RegionReadLock rlock (const_cast<Playlist *> (this)); for (RegionList::const_iterator i = regions.begin(); i != regions.end(); ++i) { - newlist.push_back (RegionFactory::RegionFactory::create (*i, true)); + newlist.push_back (RegionFactory::create (*i, true)); } } diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 998a03e3aa..b191cf4890 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -145,7 +145,7 @@ PluginInsert::output_streams() const ChanCount out = info->n_outputs; // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size())); out.set_audio (out.n_audio() * _plugins.size()); - out.set_midi (out.n_midi() * _plugins.size()); + out.set_midi (out.n_midi() * _plugins.size() + midi_bypass.n_midi()); return out; } } @@ -448,7 +448,7 @@ PluginInsert::silence (framecnt_t nframes) } for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) { - (*i)->connect_and_run (_session.get_silent_buffers ((*i)->get_info()->n_inputs), in_map, out_map, nframes, 0); + (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0); } } @@ -465,7 +465,6 @@ PluginInsert::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end } } else { - if (has_no_audio_inputs()) { /* silence all (audio) outputs. Should really declick @@ -704,7 +703,7 @@ PluginInsert::configure_io (ChanCount in, ChanCount out) * @return true if the given IO configuration can be supported. */ bool -PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) { return private_can_support_io_configuration (in, out).method != Impossible; } @@ -714,9 +713,11 @@ PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) * it can be. */ PluginInsert::Match -PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCount& out) const +PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out) { PluginInfoPtr info = _plugins.front()->get_info(); + ChanCount in; in += inx; + midi_bypass.reset(); if (info->reconfigurable_io()) { /* Plugin has flexible I/O, so delegate to it */ @@ -731,6 +732,15 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo ChanCount inputs = info->n_inputs; ChanCount outputs = info->n_outputs; + if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) { + DEBUG_TRACE ( DEBUG::Processors, string_compose ("bypassing midi-data around %1\n", name())); + midi_bypass.set(DataType::MIDI, 1); + } + if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) { + DEBUG_TRACE ( DEBUG::Processors, string_compose ("hiding midi-port from plugin %1\n", name())); + in.set(DataType::MIDI, 0); + } + bool no_inputs = true; for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { if (inputs.get (*t) != 0) { @@ -741,13 +751,13 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo if (no_inputs) { /* no inputs so we can take any input configuration since we throw it away */ - out = outputs; + out = outputs + midi_bypass; return Match (NoInputs, 1); } /* Plugin inputs match requested inputs exactly */ if (inputs == in) { - out = outputs; + out = outputs + midi_bypass; return Match (ExactMatch, 1); } @@ -789,6 +799,7 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { out.set (*t, outputs.get(*t) * f); } + out += midi_bypass; return Match (Replicate, f); } @@ -812,7 +823,7 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo } if (can_split) { - out = outputs; + out = outputs + midi_bypass; return Match (Split, 1); } @@ -836,10 +847,11 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo } if (could_hide && !cannot_hide) { - out = outputs; + out = outputs + midi_bypass; return Match (Hide, 1, hide_channels); } + midi_bypass.reset(); return Match (Impossible, 0); } diff --git a/libs/ardour/po/de.po b/libs/ardour/po/de.po index 579d5257e2..564cafd434 100644 --- a/libs/ardour/po/de.po +++ b/libs/ardour/po/de.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-06-11 08:49-0400\n" -"PO-Revision-Date: 2013-02-05 19:52+0100\n" +"POT-Creation-Date: 2013-07-17 11:09+0200\n" +"PO-Revision-Date: 2013-07-23 15:04+0200\n" "Last-Translator: Edgar Aichinger <edogawa@aon.at>\n" "Language-Team: German <ardour-dev@lists.ardour.org>\n" "Language: de\n" @@ -218,7 +218,7 @@ msgstr "" msgid "Connect session to engine" msgstr "Verbinde Projekt mit Engine" -#: audioengine.cc:844 +#: audioengine.cc:843 msgid "" "a port with the name \"%1\" already exists: check for duplicated track/bus " "names" @@ -226,7 +226,7 @@ msgstr "" "Ein Port mit Namen \"%1\" existiert bereits: Prüfen Sie auf doppelte Spur/" "Busnamen" -#: audioengine.cc:846 session.cc:1698 +#: audioengine.cc:845 session.cc:1698 msgid "" "No more JACK ports are available. You will need to stop %1 and restart JACK " "with more ports if you need this many tracks." @@ -234,35 +234,35 @@ msgstr "" "Keine JACK-Ports mehr verfügbar. Wenn Sie so viele Spuren benötigen, müssen " "Sie %1 stoppen und JACK mit mehr Ports neu starten." -#: audioengine.cc:849 +#: audioengine.cc:848 msgid "AudioEngine: cannot register port \"%1\": %2" msgstr "AudioEngine: kann Port \"%1\": %2 nicht registrieren" -#: audioengine.cc:879 +#: audioengine.cc:878 msgid "unable to create port: %1" msgstr "kann Port: %1 nicht erzeugen" -#: audioengine.cc:933 +#: audioengine.cc:932 msgid "connect called before engine was started" msgstr "Aufruf von connect vor dem Start der Engine" -#: audioengine.cc:959 +#: audioengine.cc:958 msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)" msgstr "AudioEngine: kann %1 (%2) nicht mit %3 (%4) verbinden" -#: audioengine.cc:974 audioengine.cc:1005 +#: audioengine.cc:973 audioengine.cc:1004 msgid "disconnect called before engine was started" msgstr "Aufruf von disconnect vor dem Start der Engine" -#: audioengine.cc:1053 +#: audioengine.cc:1052 msgid "get_port_by_name() called before engine was started" msgstr "Aufruf von get_port_by_name() vor dem Start der Engine" -#: audioengine.cc:1105 +#: audioengine.cc:1104 msgid "get_ports called before engine was started" msgstr "Aufruf von get_ports vor dem Start der Engine" -#: audioengine.cc:1428 +#: audioengine.cc:1427 msgid "failed to connect to JACK" msgstr "Verbindung zu JACK fehlgeschlagen" @@ -316,8 +316,8 @@ msgstr "AudioSource: kann Pfad für Peaks (b) \"%1\" nicht öffnen (%2)" msgid "" "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)" msgstr "" -"AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht lesen" -"(%5)" +"AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht " +"lesen(%5)" #: audiosource.cc:667 msgid "%1: could not write read raw data for peak computation (%2)" @@ -971,21 +971,21 @@ msgstr "R" msgid "%d" msgstr "%d" -#: ladspa_plugin.cc:87 +#: ladspa_plugin.cc:88 msgid "LADSPA: module has no descriptor function." msgstr "LADSPA: Modul hat keine Beschreibungsfunktion" -#: ladspa_plugin.cc:92 +#: ladspa_plugin.cc:93 msgid "LADSPA: plugin has gone away since discovery!" msgstr "LADSPA: Plugin ist nicht mehr auffindbar!" -#: ladspa_plugin.cc:99 +#: ladspa_plugin.cc:100 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing" msgstr "" "LADSPA: \"%1\" kann nicht verwendet werdeen, da es kein \"inplace processing" "\" beherrscht" -#: ladspa_plugin.cc:296 +#: ladspa_plugin.cc:297 msgid "" "illegal parameter number used with plugin \"%1\". This may indicate a change " "in the plugin design, and presets may be invalid" @@ -993,35 +993,35 @@ msgstr "" "Falsche Parameterzahl für Plugin \"%1\". Das auf eine Änderung im Plugin-" "Design hindeuten, und Presets sind eventuell ungültig" -#: ladspa_plugin.cc:373 ladspa_plugin.cc:418 +#: ladspa_plugin.cc:376 ladspa_plugin.cc:426 msgid "Bad node sent to LadspaPlugin::set_state" msgstr "Schlechter Knoten an LadspaPlugin::set_state gesendet" -#: ladspa_plugin.cc:386 ladspa_plugin.cc:431 +#: ladspa_plugin.cc:391 ladspa_plugin.cc:440 msgid "LADSPA: no ladspa port number" msgstr "LADSPA: keine LADSPA-Portnummer" -#: ladspa_plugin.cc:392 ladspa_plugin.cc:437 +#: ladspa_plugin.cc:397 ladspa_plugin.cc:446 msgid "LADSPA: no ladspa port data" msgstr "LADSPA: keine LADSPA-Portdaten" -#: ladspa_plugin.cc:707 +#: ladspa_plugin.cc:717 msgid "LADSPA: cannot load module from \"%1\"" msgstr "LADSPA: kann Modul nicht aus \"%1\" laden" -#: ladspa_plugin.cc:817 +#: ladspa_plugin.cc:827 msgid "Could not locate HOME. Preset not removed." msgstr "Konnte HOME nicht eruieren. Preset nicht entfernt." -#: ladspa_plugin.cc:854 ladspa_plugin.cc:860 +#: ladspa_plugin.cc:864 ladspa_plugin.cc:870 msgid "Could not create %1. Preset not saved. (%2)" msgstr "Konnte %1 nicht erzeugen. Preset nicht gesichert. (%2)" -#: ladspa_plugin.cc:867 +#: ladspa_plugin.cc:877 msgid "Error saving presets file %1." msgstr "Fehler beim Sichern der Preset-Datei %1." -#: ladspa_plugin.cc:905 +#: ladspa_plugin.cc:915 msgid "Could not locate HOME. Preset not saved." msgstr "Konnte HOME nicht eruieren. Preset nicht gesichert." @@ -1368,23 +1368,39 @@ msgstr "" "Konnte die Wiedergabeliste nicht aus den Quelldaten des Projekts " "konstruieren!" +#: plugin.cc:324 +msgid "" +"Plugin presets are not supported in this build of %1. Consider paying for a " +"full version" +msgstr "" +"Pluginpresets werden in diesem %1-Binärpaket nicht unterstützt. Erwägen Sie, " +"für die Vollversion zu bezahlen" + +#: plugin.cc:398 +msgid "" +"Saving plugin settings is not supported in this build of %1. Consider paying " +"for the full version" +msgstr "" +"Das Speichern von Pluginpresets werden in diesem %1-Binärpaket nicht " +"unterstützt. Erwägen Sie, für die Vollversion zu bezahlen" + #: plugin_insert.cc:599 msgid "programming error: " msgstr "Programmierfehler:" -#: plugin_insert.cc:908 +#: plugin_insert.cc:914 msgid "XML node describing plugin is missing the `type' field" msgstr "Dem XML-Knoten zur Beschreibung des Plugins fehlt das \"type\"-Feld" -#: plugin_insert.cc:923 +#: plugin_insert.cc:929 msgid "unknown plugin type %1 in plugin insert state" msgstr "Unbekannter Plugintyp %1 im Einfüge-Status des Plugins" -#: plugin_insert.cc:951 +#: plugin_insert.cc:957 msgid "Plugin has no unique ID field" msgstr "Das Plugin hat kein Feld für die eindeutige ID" -#: plugin_insert.cc:960 +#: plugin_insert.cc:966 msgid "" "Found a reference to a plugin (\"%1\") that is unknown.\n" "Perhaps it was removed or moved since it was last used." @@ -1392,15 +1408,15 @@ msgstr "" "Referenz auf ein unbekanntes Plugin (\"%1\") gefunden.\n" "Vielleicht wurde es seit der letzten Verwendung entfernt oder verschoben." -#: plugin_insert.cc:1076 +#: plugin_insert.cc:1082 msgid "PluginInsert: Auto: no ladspa port number" msgstr "PluginInsert: Auto: keine LADSPA Portnummer" -#: plugin_insert.cc:1083 +#: plugin_insert.cc:1089 msgid "PluginInsert: Auto: port id out of range" msgstr "PluginInsert: Auto: Port-ID Bereichsüberschreitung" -#: plugin_insert.cc:1119 +#: plugin_insert.cc:1125 msgid "PluginInsert: automatable control %1 not found - ignored" msgstr "" "PluginInsert: automatisierbares Kontrollelement %1 nicht gefunden - ignoriert" @@ -1550,23 +1566,23 @@ msgstr "Import: Fehler in src_new() : %1" msgid "return %1" msgstr "Rückgabewert: %1" -#: route.cc:1100 route.cc:2550 +#: route.cc:1101 route.cc:2557 msgid "unknown Processor type \"%1\"; ignored" msgstr "unbekannter Prozessortyp \"%1\"; ignoriert" -#: route.cc:1112 +#: route.cc:1113 msgid "processor could not be created. Ignored." msgstr "Prozessor konnte nicht erzeugt werden. Ignoriert." -#: route.cc:1983 route.cc:2203 +#: route.cc:1986 route.cc:2210 msgid "Bad node sent to Route::set_state() [%1]" msgstr "Schlechter Knoten an Route::set_state() gesendet [%1]" -#: route.cc:2042 +#: route.cc:2045 msgid "Pannable state found for route (%1) without a panner!" msgstr "Pannerziel-Status für Route (%1) ohne Panner gefunden!" -#: route.cc:2106 route.cc:2110 route.cc:2317 route.cc:2321 +#: route.cc:2113 route.cc:2117 route.cc:2324 route.cc:2328 msgid "badly formed order key string in state file! [%1] ... ignored." msgstr "" "schlecht geformte Zeichenkette für den Schlüssel der Sortierreihenfolge in " @@ -1857,18 +1873,17 @@ msgstr "Session: kann quarter-frame MTC-Nachricht nicht senden (%1)" msgid "Session: cannot create Playlist from XML description." msgstr "Session: kann Wiedergabeliste nicht aus der XML-Beschreibung erzeugen" -#: session_process.cc:135 +#: session_process.cc:133 msgid "Session: error in no roll for %1" msgstr "Session: Fehler in no_roll für %1" -#: session_process.cc:1160 +#: session_process.cc:1158 msgid "Programming error: illegal event type in process_event (%1)" msgstr "Programmierfehler: illegaler Ereignistyp in process_event (%1)" #: session_state.cc:139 -#, fuzzy msgid "Could not use path %1 (%2)" -msgstr "Konnte Pfad %1 nicht benutzen (%s)" +msgstr "Konnte Pfad %1 nicht benutzen (%2)" #: session_state.cc:267 msgid "solo cut control (dB)" @@ -2406,7 +2421,7 @@ msgstr "" msgid "attempt to write a non-writable audio file source (%1)" msgstr "Versuch, in eine schreibgeschützte Audio-Dateiquelle zu schreiben (%1)" -#: sndfilesource.cc:396 utils.cc:497 utils.cc:521 utils.cc:535 utils.cc:554 +#: sndfilesource.cc:396 utils.cc:507 utils.cc:531 utils.cc:545 utils.cc:564 msgid "programming error: %1 %2" msgstr "Programmierfehler: %1 %2" @@ -2672,11 +2687,11 @@ msgstr "M-Clock" msgid "LTC" msgstr "LTC" -#: utils.cc:589 +#: utils.cc:599 msgid "programming error: unknown native header format: %1" msgstr "Programmierfehler: unbekanntes natives Dateikopfformat: %1" -#: utils.cc:604 +#: utils.cc:614 msgid "cannot open directory %1 (%2)" msgstr "kann Verzeichnis %1 nicht öffnen (%2)" diff --git a/libs/ardour/port_insert.cc b/libs/ardour/port_insert.cc index b7f74b458e..d64920b1e2 100644 --- a/libs/ardour/port_insert.cc +++ b/libs/ardour/port_insert.cc @@ -266,7 +266,7 @@ PortInsert::configure_io (ChanCount in, ChanCount out) } bool -PortInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +PortInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in; return true; diff --git a/libs/ardour/process_thread.cc b/libs/ardour/process_thread.cc index e10ccf160c..d4a3d2f390 100644 --- a/libs/ardour/process_thread.cc +++ b/libs/ardour/process_thread.cc @@ -90,7 +90,7 @@ ProcessThread::get_silent_buffers (ChanCount count) } BufferSet& -ProcessThread::get_scratch_buffers (ChanCount count) +ProcessThread::get_scratch_buffers (ChanCount count, bool silence) { ThreadBuffers* tb = _private_thread_buffers.get(); assert (tb); @@ -105,6 +105,41 @@ ProcessThread::get_scratch_buffers (ChanCount count) sb->set_count (sb->available()); } + if (silence) { + for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { + for (uint32_t i = 0; i < sb->count().get(*t); ++i) { + sb->get(*t, i).clear(); + } + } + } + + return *sb; +} + +BufferSet& +ProcessThread::get_route_buffers (ChanCount count, bool silence) +{ + ThreadBuffers* tb = _private_thread_buffers.get(); + assert (tb); + + BufferSet* sb = tb->route_buffers; + assert (sb); + + if (count != ChanCount::ZERO) { + assert(sb->available() >= count); + sb->set_count (count); + } else { + sb->set_count (sb->available()); + } + + if (silence) { + for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { + for (uint32_t i = 0; i < sb->count().get(*t); ++i) { + sb->get(*t, i).clear(); + } + } + } + return *sb; } diff --git a/libs/ardour/return.cc b/libs/ardour/return.cc index 921be6a53a..4f9e8b958a 100644 --- a/libs/ardour/return.cc +++ b/libs/ardour/return.cc @@ -136,7 +136,7 @@ Return::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pfra } bool -Return::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +Return::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in + _input->n_ports(); return true; diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index eabfbaacc0..8e0ac8604e 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -98,9 +98,13 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type) , _default_type (default_type) , _remote_control_id (0) , _in_configure_processors (false) + , _initial_io_setup (false) , _custom_meter_position_noted (false) , _last_custom_meter_was_at_end (false) { + if (is_master()) { + _meter_type = MeterK20; + } processor_max_streams.reset(); } @@ -133,6 +137,7 @@ Route::init () _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1)); _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2)); + _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1)); /* add amp processor */ @@ -540,11 +545,10 @@ Route::process_output_buffers (BufferSet& bufs, if (bufs.count() != (*i)->input_streams()) { DEBUG_TRACE ( DEBUG::Processors, string_compose ( - "%1 bufs = %2 input for %3 = %4\n", + "input port mismatch %1 bufs = %2 input for %3 = %4\n", _name, bufs.count(), (*i)->name(), (*i)->input_streams() ) ); - continue; } } #endif @@ -568,7 +572,7 @@ void Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick) { assert (is_monitor()); - BufferSet& bufs (_session.get_scratch_buffers (n_process_buffers())); + BufferSet& bufs (_session.get_route_buffers (n_process_buffers())); passthru (bufs, start_frame, end_frame, nframes, declick); } @@ -594,7 +598,7 @@ Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, void Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick) { - BufferSet& bufs (_session.get_silent_buffers (n_process_buffers())); + BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true)); bufs.set_count (_input->n_ports()); write_out_of_band_data (bufs, start_frame, end_frame, nframes); @@ -1651,7 +1655,8 @@ Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err) if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) { DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n"); - break; + DEBUG_TRACE (DEBUG::Processors, "}\n"); + return list<pair<ChanCount, ChanCount> > (); } if ((*p)->can_support_io_configuration(in, out)) { @@ -1701,6 +1706,9 @@ Route::configure_processors_unlocked (ProcessorStreams* err) } ChanCount out; + bool seen_mains_out = false; + processor_out_streams = _input->n_ports(); + processor_max_streams.reset(); list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin(); for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) { @@ -1713,8 +1721,21 @@ Route::configure_processors_unlocked (ProcessorStreams* err) processor_max_streams = ChanCount::max(processor_max_streams, c->first); processor_max_streams = ChanCount::max(processor_max_streams, c->second); out = c->second; + + if (boost::dynamic_pointer_cast<Delivery> (*p) + && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) { + /* main delivery will increase port count to match input. + * the Delivery::Main is usually the last processor - followed only by + * 'MeterOutput'. + */ + seen_mains_out = true; + } + if (!seen_mains_out) { + processor_out_streams = out; + } } + if (_meter) { _meter->reset_max_channels (processor_max_streams); } @@ -1992,6 +2013,7 @@ Route::set_state (const XMLNode& node, int version) } set_id (node); + _initial_io_setup = true; if ((prop = node.property (X_("flags"))) != 0) { _flags = Flag (string_2_enum (prop->value(), _flags)); @@ -2059,6 +2081,8 @@ Route::set_state (const XMLNode& node, int version) _meter_type = MeterType (string_2_enum (prop->value (), _meter_type)); } + _initial_io_setup = false; + set_processor_state (processor_state); // this looks up the internal instrument in processors @@ -2939,6 +2963,9 @@ void Route::output_change_handler (IOChange change, void * /*src*/) { bool need_to_queue_solo_change = true; + if (_initial_io_setup) { + return; + } if ((change.type & IOChange::ConfigurationChanged)) { /* This is called with the process lock held if change @@ -3013,7 +3040,7 @@ Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, */ } - BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers()); + BufferSet& bufs = _session.get_route_buffers (n_process_buffers()); fill_buffers_with_input (bufs, _input, nframes); @@ -3052,7 +3079,7 @@ Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, in _silent = false; - BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers()); + BufferSet& bufs = _session.get_route_buffers (n_process_buffers()); fill_buffers_with_input (bufs, _input, nframes); @@ -3152,9 +3179,6 @@ Route::set_meter_point (MeterPoint p, bool force) */ } - _meter->reset(); - _meter->reset_max(); - meter_change (); /* EMIT SIGNAL */ bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user); @@ -3754,6 +3778,19 @@ Route::input_port_count_changing (ChanCount to) return false; } +/** Called when there is a proposed change to the output port count */ +bool +Route::output_port_count_changing (ChanCount to) +{ + for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { + if (processor_out_streams.get(*t) > to.get(*t)) { + return true; + } + } + /* The change is ok */ + return false; +} + list<string> Route::unknown_processors () const { diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc index 107cf9862b..e74fd7f8ce 100644 --- a/libs/ardour/send.cc +++ b/libs/ardour/send.cc @@ -270,7 +270,7 @@ Send::set_state_2X (const XMLNode& node, int /* version */) } bool -Send::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +Send::can_support_io_configuration (const ChanCount& in, ChanCount& out) { /* sends have no impact at all on the channel configuration of the streams passing through the route. so, out == in. diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index e1634db536..9667bbcd2c 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -4170,12 +4170,19 @@ Session::get_silent_buffers (ChanCount count) } BufferSet& -Session::get_scratch_buffers (ChanCount count) +Session::get_scratch_buffers (ChanCount count, bool silence) { - return ProcessThread::get_scratch_buffers (count); + return ProcessThread::get_scratch_buffers (count, silence); } BufferSet& +Session::get_route_buffers (ChanCount count, bool silence) +{ + return ProcessThread::get_route_buffers (count, silence); +} + + +BufferSet& Session::get_mix_buffers (ChanCount count) { return ProcessThread::get_mix_buffers (count); diff --git a/libs/ardour/session_ltc.cc b/libs/ardour/session_ltc.cc index 11c97ba147..d52d9e919a 100644 --- a/libs/ardour/session_ltc.cc +++ b/libs/ardour/session_ltc.cc @@ -82,6 +82,7 @@ Session::ltc_tx_initialize() * since the fps can change and A3's min fps: 24000/1001 */ ltc_enc_buf = (ltcsnd_sample_t*) calloc((nominal_frame_rate() / 23), sizeof(ltcsnd_sample_t)); ltc_speed = 0; + ltc_prev_cycle = -1; ltc_tx_reset(); ltc_tx_resync_latency(); Xrun.connect_same_thread (*this, boost::bind (&Session::ltc_tx_reset, this)); @@ -132,6 +133,7 @@ Session::ltc_tx_parse_offset() { offset_tc.drop = timecode_drop_frames(); timecode_to_sample(offset_tc, ltc_timecode_offset, false, false); ltc_timecode_negative_offset = !offset_tc.negative; + ltc_prev_cycle = -1; } void @@ -214,7 +216,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end if (cur_timecode != ltc_enc_tcformat) { DEBUG_TRACE (DEBUG::LTC, string_compose("LTC TX1: TC format mismatch - reinit sr: %1 fps: %2\n", nominal_frame_rate(), timecode_to_frames_per_second(cur_timecode))); if (ltc_encoder_reinit(ltc_encoder, nominal_frame_rate(), - timecode_to_frames_per_second(cur_timecode), + timecode_to_frames_per_second(cur_timecode), TV_STANDARD(cur_timecode), 0 )) { PBD::error << _("LTC encoder: invalid framerate - LTC encoding is disabled for the remainder of this session.") << endmsg; @@ -244,10 +246,25 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end * The _generated timecode_ is offset by the port-latency, * therefore the offset depends on the direction of transport. */ - framepos_t cycle_start_frame = (current_speed < 0) ? (start_frame - ltc_out_latency.max) : (start_frame + ltc_out_latency.max); + framepos_t cycle_start_frame; + + if (current_speed < 0) { + cycle_start_frame = (start_frame - ltc_out_latency.max); + } else if (current_speed > 0) { + cycle_start_frame = (start_frame + ltc_out_latency.max); + } else { + /* There is no need to compensate for latency when not rolling + * rather send the accurate NOW timecode + * (LTC encoder compenates latency by sending earlier timecode) + */ + cycle_start_frame = start_frame; + } /* LTC TV standard offset */ - cycle_start_frame -= ltc_frame_alignment(frames_per_timecode_frame(), TV_STANDARD(cur_timecode)); + if (current_speed != 0) { + /* ditto - send "NOW" if not rolling */ + cycle_start_frame -= ltc_frame_alignment(frames_per_timecode_frame(), TV_STANDARD(cur_timecode)); + } /* cycle-start may become negative due to latency compensation */ if (cycle_start_frame < 0) { cycle_start_frame = 0; } @@ -262,7 +279,13 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end ltc_tx_reset(); } - if (ltc_speed != new_ltc_speed) { + if (ltc_speed != new_ltc_speed + /* but only once if, current_speed changes to 0. In that case + * new_ltc_speed is > 0 because (end_frame - start_frame) == jack-period for no-roll + * but ltc_speed will still be 0 + */ + && (current_speed != 0 || ltc_speed != current_speed) + ) { /* check ./libs/ardour/interpolation.cc CubicInterpolation::interpolate * if target_speed != current_speed we should interpolate, too. * @@ -272,7 +295,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end * end_frame is calculated from 'frames_moved' which includes the interpolation. * so we're good. */ - DEBUG_TRACE (DEBUG::LTC, string_compose("LTC TX2: speed change old: %1 cur: %2 tgt: %3 ctd: %4\n", ltc_speed, current_speed, target_speed, fabs(current_speed) - target_speed)); + DEBUG_TRACE (DEBUG::LTC, string_compose("LTC TX2: speed change old: %1 cur: %2 tgt: %3 ctd: %4\n", ltc_speed, current_speed, target_speed, fabs(current_speed) - target_speed, new_ltc_speed)); speed_changed = true; ltc_encoder_set_filter(ltc_encoder, LTC_RISE_TIME(new_ltc_speed)); } @@ -292,6 +315,10 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end ltc_speed = new_ltc_speed; return; } + if (start_frame != ltc_prev_cycle) { + DEBUG_TRACE (DEBUG::LTC, string_compose("LTC TX2: no-roll seek from %1 to %2 (%3)\n", ltc_prev_cycle, start_frame, cycle_start_frame)); + ltc_tx_reset(); + } } if (fabs(new_ltc_speed) > 10.0) { @@ -375,6 +402,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end } } + ltc_prev_cycle = start_frame; ltc_speed = new_ltc_speed; DEBUG_TRACE (DEBUG::LTC, string_compose("LTC TX2: transport speed %1.\n", ltc_speed)); @@ -400,6 +428,9 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end /* difference between current frame and TC frame in samples */ frameoffset_t soff = cycle_start_frame - tc_sample_start; + if (current_speed == 0) { + soff = 0; + } DEBUG_TRACE (DEBUG::LTC, string_compose("LTC TX3: A3cycle: %1 = A3tc: %2 +off: %3\n", cycle_start_frame, tc_sample_start, soff)); @@ -501,7 +532,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end restarting = true; } - if (cyc_off > 0 && cyc_off <= nframes) { + if (cyc_off >= 0 && cyc_off <= nframes) { /* offset in this cycle */ txf= rint(cyc_off / fabs(ltc_speed)); memset(out, 0, cyc_off * sizeof(Sample)); diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc index 50a7178f1b..d137e5167c 100644 --- a/libs/ardour/session_midi.cc +++ b/libs/ardour/session_midi.cc @@ -45,6 +45,7 @@ #include "ardour/midi_ui.h" #include "ardour/session.h" #include "ardour/slave.h" +#include "ardour/ticker.h" #include "i18n.h" @@ -581,6 +582,19 @@ Session::mmc_step_timeout () return true; } +/*********************************************************************** + OUTBOUND SYSTEM COMMON STUFF +**********************************************************************/ + + +void +Session::send_song_position_pointer (framepos_t t) +{ + if (midi_clock) { + /* Do nothing for the moment */ + } +} + int Session::start_midi_thread () { diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 0b0351f506..08e9a89481 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -384,6 +384,7 @@ Session::butler_transport_work () g_atomic_int_dec_and_test (&_butler->should_do_transport_work); DEBUG_TRACE (DEBUG::Transport, X_("Butler transport work all done\n")); + DEBUG_TRACE (DEBUG::Transport, X_(string_compose ("Frame %1\n", _transport_frame))); } void @@ -1007,6 +1008,7 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool send_mmc_locate (_transport_frame); } + _last_roll_location = _last_roll_or_reversal_location = _transport_frame; Located (); /* EMIT SIGNAL */ } diff --git a/libs/ardour/thread_buffers.cc b/libs/ardour/thread_buffers.cc index 34f6f9828b..fd3160bb15 100644 --- a/libs/ardour/thread_buffers.cc +++ b/libs/ardour/thread_buffers.cc @@ -30,6 +30,7 @@ using namespace std; ThreadBuffers::ThreadBuffers () : silent_buffers (new BufferSet) , scratch_buffers (new BufferSet) + , route_buffers (new BufferSet) , mix_buffers (new BufferSet) , gain_automation_buffer (0) , send_gain_automation_buffer (0) @@ -64,6 +65,7 @@ ThreadBuffers::ensure_buffers (ChanCount howmany) scratch_buffers->ensure_buffers (*t, count, size); mix_buffers->ensure_buffers (*t, count, size); silent_buffers->ensure_buffers (*t, count, size); + route_buffers->ensure_buffers (*t, count, size); } delete [] gain_automation_buffer; diff --git a/libs/ardour/ticker.cc b/libs/ardour/ticker.cc index 5d078952a1..f32cdf9415 100644 --- a/libs/ardour/ticker.cc +++ b/libs/ardour/ticker.cc @@ -32,15 +32,84 @@ #include "ardour/debug.h" using namespace ARDOUR; +using namespace PBD; + +/** MIDI Clock Position tracking */ +class MidiClockTicker::Position : public Timecode::BBT_Time +{ +public: + + Position() : speed(0.0f), frame(0) { } + ~Position() { } + + /** Sync timing information taken from the given Session + @return True if timings differed */ + bool sync (Session* s) { + + bool didit = false; + + double sp = s->transport_speed(); + framecnt_t fr = s->transport_frame(); + + if (speed != sp) { + speed = sp; + didit = true; + } + + if (frame != fr) { + frame = fr; + didit = true; + } + + /* Midi beats and clocks always gets updated for now */ + + s->bbt_time (this->frame, *this); + + const TempoMap& tempo = s->tempo_map(); + + const double divisions = tempo.meter_at(frame).divisions_per_bar(); + const double divisor = tempo.meter_at(frame).note_divisor(); + const double qnote_scale = divisor * 0.25f; + + /** Midi Beats in terms of Song Position Pointer is equivalent to total + sixteenth notes at 'time' */ + + midi_beats = (((bars - 1) * divisions) + beats - 1); + midi_beats += (double)ticks / (double)Position::ticks_per_beat * qnote_scale; + midi_beats *= 16.0f / divisor; + + midi_clocks = midi_beats * 6.0f; + + return didit; + } + + double speed; + framecnt_t frame; + double midi_beats; + double midi_clocks; + + void print (std::ostream& s) { + s << "frames: " << frame << " midi beats: " << midi_beats << " speed: " << speed; + } +}; + MidiClockTicker::MidiClockTicker () : _midi_port (0) , _ppqn (24) , _last_tick (0.0) { + _pos.reset (new Position()); +} + +MidiClockTicker::~MidiClockTicker() +{ + _midi_port = 0; + _pos.reset (0); } -void MidiClockTicker::set_session (Session* s) +void +MidiClockTicker::set_session (Session* s) { SessionHandlePtr::set_session (s); @@ -48,23 +117,67 @@ void MidiClockTicker::set_session (Session* s) _session->TransportStateChange.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::transport_state_changed, this)); _session->PositionChanged.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::position_changed, this, _1)); _session->TransportLooped.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::transport_looped, this)); + _session->Located.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::session_located, this)); + update_midi_clock_port(); + _pos->sync (_session); } } void +MidiClockTicker::session_located() +{ + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Session Located: %1, speed: %2\n", _session->transport_frame(), _session->transport_speed())); + + if (0 == _session || ! _pos->sync (_session)) { + return; + } + + _last_tick = _pos->frame; + + if (!Config->get_send_midi_clock()) { + return; + } + + if (_pos->speed == 0.0f) { + uint32_t where = llrint (_pos->midi_beats); + send_position_event (where, 0); + } else if (_pos->speed == 1.0f) { +#if 1 + /* Experimental. To really do this and have accuracy, the + stop/locate/continue sequence would need queued to send immediately + before the next midi clock. */ + + send_stop_event (0); + + if (_pos->frame == 0) { + send_start_event (0); + } else { + uint32_t where = llrint (_pos->midi_beats); + send_position_event (where, 0); + send_continue_event (0); + } +#endif + } else { + /* Varispeed not supported */ + } +} + +void MidiClockTicker::session_going_away () { SessionHandlePtr::session_going_away(); _midi_port = 0; } -void MidiClockTicker::update_midi_clock_port() +void +MidiClockTicker::update_midi_clock_port() { _midi_port = MIDI::Manager::instance()->midi_clock_output_port(); } -void MidiClockTicker::transport_state_changed() +void +MidiClockTicker::transport_state_changed() { if (_session->exporting()) { /* no midi clock during export, for now */ @@ -76,57 +189,70 @@ void MidiClockTicker::transport_state_changed() return; } - float speed = _session->transport_speed(); - framepos_t position = _session->transport_frame(); + if (! _pos->sync (_session)) { + return; + } - DEBUG_TRACE (PBD::DEBUG::MidiClock, - string_compose ("Transport state change @ %4, speed: %1 position: %2 play loop: %3\n", speed, position, _session->get_play_loop(), position) - ); + DEBUG_TRACE (DEBUG::MidiClock, + string_compose ("Transport state change @ %4, speed: %1 position: %2 play loop: %3\n", + _pos->speed, _pos->frame, _session->get_play_loop(), _pos->frame) + ); - if (speed == 1.0f) { - _last_tick = position; + _last_tick = _pos->frame; + + if (! Config->get_send_midi_clock()) { + return; + } - if (!Config->get_send_midi_clock()) - return; + if (_pos->speed == 1.0f) { if (_session->get_play_loop()) { assert(_session->locations()->auto_loop_location()); - if (position == _session->locations()->auto_loop_location()->start()) { + + if (_pos->frame == _session->locations()->auto_loop_location()->start()) { send_start_event(0); } else { send_continue_event(0); } - } else if (position == 0) { + + } else if (_pos->frame == 0) { send_start_event(0); } else { send_continue_event(0); } - send_midi_clock_event(0); + // send_midi_clock_event (0); - } else if (speed == 0.0f) { - if (!Config->get_send_midi_clock()) - return; - - send_stop_event(0); + } else if (_pos->speed == 0.0f) { + send_stop_event (0); + send_position_event (llrint (_pos->midi_beats), 0); } - tick (position); + // tick (_pos->frame); } -void MidiClockTicker::position_changed (framepos_t position) +void +MidiClockTicker::position_changed (framepos_t) { - DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Position change: %1\n", position)); +#if 0 + const double speed = _session->transport_speed(); + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Transport Position Change: %1, speed: %2\n", position, speed)); + + if (speed == 0.0f && Config->get_send_midi_clock()) { + send_position_event (position, 0); + } _last_tick = position; +#endif } -void MidiClockTicker::transport_looped() +void +MidiClockTicker::transport_looped() { Location* loop_location = _session->locations()->auto_loop_location(); assert(loop_location); - DEBUG_TRACE (PBD::DEBUG::MidiClock, + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Transport looped, position: %1, loop start: %2, loop end: %3, play loop: %4\n", _session->transport_frame(), loop_location->start(), loop_location->end(), _session->get_play_loop()) ); @@ -143,21 +269,29 @@ void MidiClockTicker::transport_looped() } } -void MidiClockTicker::tick (const framepos_t& transport_frame) +void +MidiClockTicker::tick (const framepos_t& /* transport_frame */) { if (!Config->get_send_midi_clock() || _session == 0 || _session->transport_speed() != 1.0f || _midi_port == 0) { return; } + MIDI::JackMIDIPort* mp = dynamic_cast<MIDI::JackMIDIPort*> (_midi_port); + if (! mp) { + return; + } + + const framepos_t end = _pos->frame + mp->nframes_this_cycle(); + double iter = _last_tick; + while (true) { - double next_tick = _last_tick + one_ppqn_in_frames (transport_frame); - frameoffset_t next_tick_offset = llrint (next_tick) - transport_frame; + double clock_delta = one_ppqn_in_frames (llrint (iter)); + double next_tick = iter + clock_delta; + frameoffset_t next_tick_offset = llrint (next_tick) - end; - MIDI::JackMIDIPort* mp = dynamic_cast<MIDI::JackMIDIPort*> (_midi_port); - - DEBUG_TRACE (PBD::DEBUG::MidiClock, - string_compose ("Transport: %1, last tick time: %2, next tick time: %3, offset: %4, cycle length: %5\n", - transport_frame, _last_tick, next_tick, next_tick_offset, mp ? mp->nframes_this_cycle() : 0)); + DEBUG_TRACE (DEBUG::MidiClock, + string_compose ("Tick: iter: %1, last tick time: %2, next tick time: %3, offset: %4, cycle length: %5\n", + iter, _last_tick, next_tick, next_tick_offset, mp ? mp->nframes_this_cycle() : 0)); if (!mp || (next_tick_offset >= mp->nframes_this_cycle())) { break; @@ -167,11 +301,16 @@ void MidiClockTicker::tick (const framepos_t& transport_frame) send_midi_clock_event (next_tick_offset); } - _last_tick = next_tick; + iter = next_tick; } + + _last_tick = iter; + _pos->frame = end; } -double MidiClockTicker::one_ppqn_in_frames (framepos_t transport_position) + +double +MidiClockTicker::one_ppqn_in_frames (framepos_t transport_position) { const Tempo& current_tempo = _session->tempo_map().tempo_at (transport_position); double frames_per_beat = current_tempo.frames_per_beat (_session->nominal_frame_rate()); @@ -182,47 +321,77 @@ double MidiClockTicker::one_ppqn_in_frames (framepos_t transport_position) return frames_per_quarter_note / double (_ppqn); } -void MidiClockTicker::send_midi_clock_event (pframes_t offset) +void +MidiClockTicker::send_midi_clock_event (pframes_t offset) { if (!_midi_port) { return; } - DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Tick with offset %1\n", offset)); + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Tick with offset %1\n", offset)); static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_CLOCK }; _midi_port->write (_midi_clock_tick, 1, offset); } -void MidiClockTicker::send_start_event (pframes_t offset) +void +MidiClockTicker::send_start_event (pframes_t offset) { if (!_midi_port) { return; } + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Start %1\n", _last_tick)); + static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_START }; _midi_port->write (_midi_clock_tick, 1, offset); } -void MidiClockTicker::send_continue_event (pframes_t offset) +void +MidiClockTicker::send_continue_event (pframes_t offset) { if (!_midi_port) { return; } + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Continue %1\n", _last_tick)); + static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_CONTINUE }; _midi_port->write (_midi_clock_tick, 1, offset); } -void MidiClockTicker::send_stop_event (pframes_t offset) +void +MidiClockTicker::send_stop_event (pframes_t offset) { if (!_midi_port) { return; } + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Stop %1\n", _last_tick)); + static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_STOP }; _midi_port->write (_midi_clock_tick, 1, offset); } +void +MidiClockTicker::send_position_event (uint32_t midi_beats, pframes_t offset) +{ + if (!_midi_port) { + return; + } + /* can only use 14bits worth */ + if (midi_beats > 0x3fff) { + return; + } + + /* split midi beats into a 14bit value */ + MIDI::byte msg[3]; + msg[0] = MIDI_CMD_COMMON_SONG_POS; + msg[1] = midi_beats & 0x007f; + msg[2] = midi_beats >> 7; + _midi_port->midimsg (msg, sizeof (msg), offset); + + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Song Position Sent: %1\n", midi_beats)); +} diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index c6a348ddfb..f02863393e 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -398,6 +398,9 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, case MonitoringInput: be_silent = false; break; + default: + be_silent = false; + break; } } @@ -436,7 +439,8 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, } if (no_meter) { - _meter->reset(); + BufferSet& bufs (_session.get_silent_buffers (n_process_buffers())); + _meter->run (bufs, 0, 0, nframes, true); _input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, nframes); } else { _input->process_input (_meter, start_frame, end_frame, nframes); @@ -447,7 +451,7 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, } else { - BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers()); + BufferSet& bufs = _session.get_route_buffers (n_process_buffers()); fill_buffers_with_input (bufs, _input, nframes); @@ -473,6 +477,10 @@ Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /* { Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); if (!lm.locked()) { + framecnt_t playback_distance = _diskstream->calculate_playback_distance(nframes); + if (can_internal_playback_seek(playback_distance)) { + internal_playback_seek(playback_distance); + } return 0; } @@ -492,7 +500,7 @@ Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /* framecnt_t playback_distance; - BufferSet& bufs (_session.get_silent_buffers (n_process_buffers())); + BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true)); int const dret = _diskstream->process (bufs, _session.transport_frame(), nframes, playback_distance, false); need_butler = _diskstream->commit (playback_distance); diff --git a/libs/gtkmm2ext/fastmeter.cc b/libs/gtkmm2ext/fastmeter.cc index 817b11ff6c..d826def7ff 100644 --- a/libs/gtkmm2ext/fastmeter.cc +++ b/libs/gtkmm2ext/fastmeter.cc @@ -44,6 +44,9 @@ bool FastMeter::no_rgba_overlay = false; FastMeter::Pattern10Map FastMeter::vm_pattern_cache; FastMeter::PatternBgMap FastMeter::vb_pattern_cache; +FastMeter::Pattern10Map FastMeter::hm_pattern_cache; +FastMeter::PatternBgMap FastMeter::hb_pattern_cache; + FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len, int clr0, int clr1, int clr2, int clr3, int clr4, int clr5, int clr6, int clr7, @@ -51,19 +54,25 @@ FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len, int bgc0, int bgc1, int bgh0, int bgh1, float stp0, float stp1, - float stp2, float stp3 + float stp2, float stp3, + int styleflags ) + : pixheight(0) + , pixwidth(0) + , _styleflags(styleflags) + , orientation(o) + , hold_cnt(hold) + , hold_state(0) + , bright_hold(false) + , current_level(0) + , current_peak(0) + , highlight(false) { - orientation = o; - hold_cnt = hold; - hold_state = 0; - bright_hold = false; - current_peak = 0; - current_level = 0; last_peak_rect.width = 0; last_peak_rect.height = 0; + last_peak_rect.x = 0; + last_peak_rect.y = 0; - highlight = false; no_rgba_overlay = ! Glib::getenv("NO_METER_SHADE").empty(); _clr[0] = clr0; @@ -96,10 +105,18 @@ FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len, if (!len) { len = 250; } - fgpattern = request_vertical_meter(dimen, len, _clr, _stp, true); - bgpattern = request_vertical_background (dimen, len, _bgc, false); - pixheight = len; - pixwidth = dimen; + if (orientation == Vertical) { + pixheight = len; + pixwidth = dimen; + fgpattern = request_vertical_meter(pixwidth + 2, pixheight + 2, _clr, _stp, _styleflags); + bgpattern = request_vertical_background (pixwidth + 2, pixheight + 2, _bgc, false); + + } else { + pixheight = dimen; + pixwidth = len; + fgpattern = request_horizontal_meter(pixwidth + 2, pixheight + 2, _clr, _stp, _styleflags); + bgpattern = request_horizontal_background (pixwidth + 2, pixheight + 2, _bgc, false); + } pixrect.width = pixwidth; pixrect.height = pixheight; @@ -107,7 +124,7 @@ FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len, request_width = pixrect.width + 2; request_height= pixrect.height + 2; - queue_draw (); + clear (); } FastMeter::~FastMeter () @@ -116,11 +133,12 @@ FastMeter::~FastMeter () Cairo::RefPtr<Cairo::Pattern> FastMeter::generate_meter_pattern ( - int width, int height, int *clr, float *stp, bool shade) + int width, int height, int *clr, float *stp, int styleflags, bool horiz) { guint8 r,g,b,a; double knee; - double soft = 1.5 / (double) height; + const double soft = 3.0 / (double) height; + const double offs = -1.0 / (double) height; cairo_pattern_t* pat = cairo_pattern_create_linear (0.0, 0.0, 0.0, height); @@ -133,54 +151,55 @@ FastMeter::generate_meter_pattern ( cairo_pattern_add_color_stop_rgb (pat, 0.0, r/255.0, g/255.0, b/255.0); - knee = ((float)height * stp[3] / 115.0f); // -0dB + knee = offs + stp[3] / 115.0f; // -0dB UINT_TO_RGBA (clr[8], &r, &g, &b, &a); - cairo_pattern_add_color_stop_rgb (pat, 1.0 - (knee/(double)height) - soft, + cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee, r/255.0, g/255.0, b/255.0); UINT_TO_RGBA (clr[7], &r, &g, &b, &a); - cairo_pattern_add_color_stop_rgb (pat, 1.0 - (knee/(double)height) + soft, + cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee + soft, r/255.0, g/255.0, b/255.0); - knee = ((float)height * stp[2]/ 115.0f); // -3dB || -2dB + knee = offs + stp[2]/ 115.0f; // -3dB || -2dB UINT_TO_RGBA (clr[6], &r, &g, &b, &a); - cairo_pattern_add_color_stop_rgb (pat, 1.0 - (knee/(double)height) - soft, + cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee, r/255.0, g/255.0, b/255.0); UINT_TO_RGBA (clr[5], &r, &g, &b, &a); - cairo_pattern_add_color_stop_rgb (pat, 1.0 - (knee/(double)height) + soft, + cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee + soft, r/255.0, g/255.0, b/255.0); - knee = ((float)height * stp[1] / 115.0f); // -9dB + knee = offs + stp[1] / 115.0f; // -9dB UINT_TO_RGBA (clr[4], &r, &g, &b, &a); - cairo_pattern_add_color_stop_rgb (pat, 1.0 - (knee/(double)height) - soft, + cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee, r/255.0, g/255.0, b/255.0); UINT_TO_RGBA (clr[3], &r, &g, &b, &a); - cairo_pattern_add_color_stop_rgb (pat, 1.0 - (knee/(double)height) + soft, + cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee + soft, r/255.0, g/255.0, b/255.0); - knee = ((float)height * stp[0] / 115.0f); // -18dB + knee = offs + stp[0] / 115.0f; // -18dB UINT_TO_RGBA (clr[2], &r, &g, &b, &a); - cairo_pattern_add_color_stop_rgb (pat, 1.0 - (knee/(double)height) - soft, + cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee, r/255.0, g/255.0, b/255.0); UINT_TO_RGBA (clr[1], &r, &g, &b, &a); - cairo_pattern_add_color_stop_rgb (pat, 1.0 - (knee/(double)height) + soft, + cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee + soft, r/255.0, g/255.0, b/255.0); UINT_TO_RGBA (clr[0], &r, &g, &b, &a); // bottom cairo_pattern_add_color_stop_rgb (pat, 1.0, r/255.0, g/255.0, b/255.0); - if (shade && !no_rgba_overlay) { + if ((styleflags & 1) && !no_rgba_overlay) { cairo_pattern_t* shade_pattern = cairo_pattern_create_linear (0.0, 0.0, width, 0.0); - cairo_pattern_add_color_stop_rgba (shade_pattern, 0, 1.0, 1.0, 1.0, 0.2); - cairo_pattern_add_color_stop_rgba (shade_pattern, 1, 0.0, 0.0, 0.0, 0.3); + cairo_pattern_add_color_stop_rgba (shade_pattern, 0, 0.0, 0.0, 0.0, 0.15); + cairo_pattern_add_color_stop_rgba (shade_pattern, 0.4, 1.0, 1.0, 1.0, 0.05); + cairo_pattern_add_color_stop_rgba (shade_pattern, 1, 0.0, 0.0, 0.0, 0.25); cairo_surface_t* surface; cairo_t* tc = 0; @@ -189,31 +208,49 @@ FastMeter::generate_meter_pattern ( cairo_set_source (tc, pat); cairo_rectangle (tc, 0, 0, width, height); cairo_fill (tc); - - cairo_save (tc); - cairo_set_line_width(tc, 1.0); - cairo_set_source_rgba(tc, .1, .1, .1, .5); - //cairo_set_operator (tc, CAIRO_OPERATOR_SOURCE); - for (float y=.5; y < height; y+= 2.0) { - cairo_move_to(tc, 0, y); - cairo_line_to(tc, width, y); - cairo_stroke (tc); - } - cairo_restore (tc); + cairo_pattern_destroy (pat); cairo_set_source (tc, shade_pattern); cairo_rectangle (tc, 0, 0, width, height); cairo_fill (tc); - - cairo_pattern_destroy (pat); cairo_pattern_destroy (shade_pattern); - pat = cairo_pattern_create_for_surface (surface); + if (styleflags & 2) { // LED stripes + cairo_save (tc); + cairo_set_line_width(tc, 1.0); + cairo_set_source_rgba(tc, .0, .0, .0, 0.4); + //cairo_set_operator (tc, CAIRO_OPERATOR_SOURCE); + for (float y=0.5; y < height; y+= 2.0) { + cairo_move_to(tc, 0, y); + cairo_line_to(tc, width, y); + cairo_stroke (tc); + } + cairo_restore (tc); + } + pat = cairo_pattern_create_for_surface (surface); cairo_destroy (tc); cairo_surface_destroy (surface); } + if (horiz) { + cairo_surface_t* surface; + cairo_t* tc = 0; + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, height, width); + tc = cairo_create (surface); + + cairo_matrix_t m; + cairo_matrix_init_rotate (&m, -M_PI/2.0); + cairo_matrix_translate (&m, -height, 0); + cairo_pattern_set_matrix (pat, &m); + cairo_set_source (tc, pat); + cairo_rectangle (tc, 0, 0, height, width); + cairo_fill (tc); + cairo_pattern_destroy (pat); + pat = cairo_pattern_create_for_surface (surface); + cairo_destroy (tc); + cairo_surface_destroy (surface); + } Cairo::RefPtr<Cairo::Pattern> p (new Cairo::Pattern (pat, false)); return p; @@ -222,7 +259,7 @@ FastMeter::generate_meter_pattern ( Cairo::RefPtr<Cairo::Pattern> FastMeter::generate_meter_background ( - int width, int height, int *clr, bool shade) + int width, int height, int *clr, bool shade, bool horiz) { guint8 r0,g0,b0,r1,g1,b1,a; @@ -263,6 +300,25 @@ FastMeter::generate_meter_background ( cairo_surface_destroy (surface); } + if (horiz) { + cairo_surface_t* surface; + cairo_t* tc = 0; + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, height, width); + tc = cairo_create (surface); + + cairo_matrix_t m; + cairo_matrix_init_rotate (&m, -M_PI/2.0); + cairo_matrix_translate (&m, -height, 0); + cairo_pattern_set_matrix (pat, &m); + cairo_set_source (tc, pat); + cairo_rectangle (tc, 0, 0, height, width); + cairo_fill (tc); + cairo_pattern_destroy (pat); + pat = cairo_pattern_create_for_surface (surface); + cairo_destroy (tc); + cairo_surface_destroy (surface); + } + Cairo::RefPtr<Cairo::Pattern> p (new Cairo::Pattern (pat, false)); return p; @@ -270,18 +326,16 @@ FastMeter::generate_meter_background ( Cairo::RefPtr<Cairo::Pattern> FastMeter::request_vertical_meter( - int width, int height, int *clr, float *stp, bool shade) + int width, int height, int *clr, float *stp, int styleflags) { - if (height < min_pattern_metric_size) - height = min_pattern_metric_size; - if (height > max_pattern_metric_size) - height = max_pattern_metric_size; + height = max(height, min_pattern_metric_size); + height = min(height, max_pattern_metric_size); const Pattern10MapKey key (width, height, stp[0], stp[1], stp[2], stp[3], clr[0], clr[1], clr[2], clr[3], clr[4], clr[5], clr[6], clr[7], - clr[8], clr[9]); + clr[8], clr[9], styleflags); Pattern10Map::iterator i; if ((i = vm_pattern_cache.find (key)) != vm_pattern_cache.end()) { @@ -290,7 +344,7 @@ FastMeter::request_vertical_meter( // TODO flush pattern cache if it gets too large Cairo::RefPtr<Cairo::Pattern> p = generate_meter_pattern ( - width, height, clr, stp, shade); + width, height, clr, stp, styleflags, false); vm_pattern_cache[key] = p; return p; @@ -300,12 +354,11 @@ Cairo::RefPtr<Cairo::Pattern> FastMeter::request_vertical_background( int width, int height, int *bgc, bool shade) { - if (height < min_pattern_metric_size) - height = min_pattern_metric_size; - if (height > max_pattern_metric_size) - height = max_pattern_metric_size; + height = max(height, min_pattern_metric_size); + height = min(height, max_pattern_metric_size); + height += 2; - const PatternBgMapKey key (width, height, bgc[0], bgc[1]); + const PatternBgMapKey key (width, height, bgc[0], bgc[1], shade); PatternBgMap::iterator i; if ((i = vb_pattern_cache.find (key)) != vb_pattern_cache.end()) { return i->second; @@ -313,12 +366,62 @@ FastMeter::request_vertical_background( // TODO flush pattern cache if it gets too large Cairo::RefPtr<Cairo::Pattern> p = generate_meter_background ( - width, height, bgc, shade); + width, height, bgc, shade, false); vb_pattern_cache[key] = p; return p; } +Cairo::RefPtr<Cairo::Pattern> +FastMeter::request_horizontal_meter( + int width, int height, int *clr, float *stp, int styleflags) +{ + width = max(width, min_pattern_metric_size); + width = min(width, max_pattern_metric_size); + + const Pattern10MapKey key (width, height, + stp[0], stp[1], stp[2], stp[3], + clr[0], clr[1], clr[2], clr[3], + clr[4], clr[5], clr[6], clr[7], + clr[8], clr[9], styleflags); + + Pattern10Map::iterator i; + if ((i = hm_pattern_cache.find (key)) != hm_pattern_cache.end()) { + return i->second; + } + // TODO flush pattern cache if it gets too large + + Cairo::RefPtr<Cairo::Pattern> p = generate_meter_pattern ( + height, width, clr, stp, styleflags, true); + + hm_pattern_cache[key] = p; + return p; +} + +Cairo::RefPtr<Cairo::Pattern> +FastMeter::request_horizontal_background( + int width, int height, int *bgc, bool shade) +{ + width = max(width, min_pattern_metric_size); + width = min(width, max_pattern_metric_size); + width += 2; + + const PatternBgMapKey key (width, height, bgc[0], bgc[1], shade); + PatternBgMap::iterator i; + if ((i = hb_pattern_cache.find (key)) != hb_pattern_cache.end()) { + return i->second; + } + // TODO flush pattern cache if it gets too large + + Cairo::RefPtr<Cairo::Pattern> p = generate_meter_background ( + height, width, bgc, shade, true); + + hb_pattern_cache[key] = p; + + return p; +} + + void FastMeter::set_hold_count (long val) @@ -337,6 +440,16 @@ FastMeter::set_hold_count (long val) void FastMeter::on_size_request (GtkRequisition* req) { + if (orientation == Vertical) { + vertical_size_request (req); + } else { + horizontal_size_request (req); + } +} + +void +FastMeter::vertical_size_request (GtkRequisition* req) +{ req->height = request_height; req->height = max(req->height, min_pattern_metric_size); req->height = min(req->height, max_pattern_metric_size); @@ -346,8 +459,30 @@ FastMeter::on_size_request (GtkRequisition* req) } void +FastMeter::horizontal_size_request (GtkRequisition* req) +{ + req->width = request_width; + req->width = max(req->width, min_pattern_metric_size); + req->width = min(req->width, max_pattern_metric_size); + req->width += 2; + + req->height = request_height; +} + +void FastMeter::on_size_allocate (Gtk::Allocation &alloc) { + if (orientation == Vertical) { + vertical_size_allocate (alloc); + } else { + horizontal_size_allocate (alloc); + } + queue_draw (); +} + +void +FastMeter::vertical_size_allocate (Gtk::Allocation &alloc) +{ if (alloc.get_width() != request_width) { alloc.set_width (request_width); } @@ -361,7 +496,7 @@ FastMeter::on_size_allocate (Gtk::Allocation &alloc) } if (pixheight != h) { - fgpattern = request_vertical_meter (request_width, h, _clr, _stp, true); + fgpattern = request_vertical_meter (request_width, h, _clr, _stp, _styleflags); bgpattern = request_vertical_background (request_width, h, highlight ? _bgh : _bgc, highlight); pixheight = h - 2; pixwidth = request_width - 2; @@ -370,10 +505,39 @@ FastMeter::on_size_allocate (Gtk::Allocation &alloc) DrawingArea::on_size_allocate (alloc); } +void +FastMeter::horizontal_size_allocate (Gtk::Allocation &alloc) +{ + if (alloc.get_height() != request_height) { + alloc.set_height (request_height); + } + + int w = alloc.get_width(); + w = max (w, min_pattern_metric_size + 2); + w = min (w, max_pattern_metric_size + 2); + + if (w != alloc.get_width()) { + alloc.set_width (w); + } + + if (pixwidth != w) { + fgpattern = request_horizontal_meter (w, request_height, _clr, _stp, _styleflags); + bgpattern = request_horizontal_background (w, request_height, highlight ? _bgh : _bgc, highlight); + pixwidth = w - 2; + pixheight = request_height - 2; + } + + DrawingArea::on_size_allocate (alloc); +} + bool FastMeter::on_expose_event (GdkEventExpose* ev) { - return vertical_expose (ev); + if (orientation == Vertical) { + return vertical_expose (ev); + } else { + return horizontal_expose (ev); + } } bool @@ -390,7 +554,7 @@ FastMeter::vertical_expose (GdkEventExpose* ev) cairo_clip (cr); cairo_set_source_rgb (cr, 0, 0, 0); // black - rounded_rectangle (cr, 0, 0, pixrect.width + 2, pixheight + 2, 2); + rounded_rectangle (cr, 0, 0, pixwidth + 2, pixheight + 2, 2); cairo_stroke (cr); top_of_meter = (gint) floor (pixheight * current_level); @@ -425,14 +589,87 @@ FastMeter::vertical_expose (GdkEventExpose* ev) last_peak_rect.x = 1; last_peak_rect.width = pixwidth; last_peak_rect.y = max(1, 1 + pixheight - (gint) floor (pixheight * current_peak)); - if (bright_hold) { - last_peak_rect.height = max(0, min(4, pixheight - last_peak_rect.y -1 )); + if (bright_hold || (_styleflags & 2)) { + last_peak_rect.height = max(0, min(3, pixheight - last_peak_rect.y - 1 )); + } else { + last_peak_rect.height = max(0, min(2, pixheight - last_peak_rect.y - 1 )); + } + + cairo_set_source (cr, fgpattern->cobj()); + cairo_rectangle (cr, last_peak_rect.x, last_peak_rect.y, last_peak_rect.width, last_peak_rect.height); + + if (bright_hold && !no_rgba_overlay) { + cairo_fill_preserve (cr); + cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.3); + } + cairo_fill (cr); + + } else { + last_peak_rect.width = 0; + last_peak_rect.height = 0; + } + + cairo_destroy (cr); + + return TRUE; +} + +bool +FastMeter::horizontal_expose (GdkEventExpose* ev) +{ + Glib::RefPtr<Gdk::Window> win = get_window (); + gint right_of_meter; + GdkRectangle intersection; + GdkRectangle background; + + cairo_t* cr = gdk_cairo_create (get_window ()->gobj()); + + cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); // black + rounded_rectangle (cr, 0, 0, pixwidth + 2, pixheight + 2, 2); + cairo_stroke (cr); + + right_of_meter = (gint) floor (pixwidth * current_level); + + /* reset the height & origin of the rect that needs to show the pixbuf + */ + + pixrect.width = right_of_meter; + + background.x = 1 + right_of_meter; + background.y = 1; + background.width = pixwidth - right_of_meter; + background.height = pixheight; + + if (gdk_rectangle_intersect (&background, &ev->area, &intersection)) { + cairo_set_source (cr, bgpattern->cobj()); + cairo_rectangle (cr, intersection.x, intersection.y, intersection.width, intersection.height); + cairo_fill (cr); + } + + if (gdk_rectangle_intersect (&pixrect, &ev->area, &intersection)) { + cairo_set_source (cr, fgpattern->cobj()); + cairo_rectangle (cr, intersection.x, intersection.y, intersection.width, intersection.height); + cairo_fill (cr); + } + + // draw peak bar + + if (hold_state) { + last_peak_rect.y = 1; + last_peak_rect.height = pixheight; + const int xpos = floor (pixwidth * current_peak); + if (bright_hold || (_styleflags & 2)) { + last_peak_rect.width = min(3, xpos ); } else { - last_peak_rect.height = max(0, min(2, pixheight - last_peak_rect.y -1 )); + last_peak_rect.width = min(2, xpos ); } + last_peak_rect.x = 1 + max(0, xpos - last_peak_rect.width); cairo_set_source (cr, fgpattern->cobj()); - cairo_rectangle (cr, 1, last_peak_rect.y, pixwidth, last_peak_rect.height); + cairo_rectangle (cr, last_peak_rect.x, last_peak_rect.y, last_peak_rect.width, last_peak_rect.height); if (bright_hold && !no_rgba_overlay) { cairo_fill_preserve (cr); @@ -456,6 +693,8 @@ FastMeter::set (float lvl, float peak) float old_level = current_level; float old_peak = current_peak; + if (pixwidth <= 0 || pixheight <=0) return; + if (peak == -1) { if (lvl >= current_peak) { current_peak = lvl; @@ -487,7 +726,11 @@ FastMeter::set (float lvl, float peak) return; } - queue_vertical_redraw (win, old_level); + if (orientation == Vertical) { + queue_vertical_redraw (win, old_level); + } else { + queue_horizontal_redraw (win, old_level); + } } void @@ -550,8 +793,8 @@ FastMeter::queue_vertical_redraw (const Glib::RefPtr<Gdk::Window>& win, float ol } rect.x = 1; rect.y = max(1, 1 + pixheight - (gint) floor (pixheight * current_peak)); - if (bright_hold) { - rect.height = max(0, min(4, pixheight - last_peak_rect.y -1 )); + if (bright_hold || (_styleflags & 2)) { + rect.height = max(0, min(3, pixheight - last_peak_rect.y -1 )); } else { rect.height = max(0, min(2, pixheight - last_peak_rect.y -1 )); } @@ -569,13 +812,88 @@ FastMeter::queue_vertical_redraw (const Glib::RefPtr<Gdk::Window>& win, float ol } void +FastMeter::queue_horizontal_redraw (const Glib::RefPtr<Gdk::Window>& win, float old_level) +{ + GdkRectangle rect; + + gint new_right = (gint) floor (pixwidth * current_level); + + rect.height = pixheight; + rect.y = 1; + + if (current_level > old_level) { + rect.x = 1 + pixrect.width; + /* colored/pixbuf got larger, just draw the new section */ + rect.width = new_right - pixrect.width; + } else { + /* it got smaller, compute the difference */ + rect.x = 1 + new_right; + /* rect.height is the old.x (smaller) minus the new.x (larger) */ + rect.width = pixrect.width - new_right; + } + + GdkRegion* region = 0; + bool queue = false; + + if (rect.height != 0) { + + /* ok, first region to draw ... */ + + region = gdk_region_rectangle (&rect); + queue = true; + } + + /* redraw the last place where the last peak hold bar was; + the next expose will draw the new one whether its part of + expose region or not. + */ + + if (last_peak_rect.width * last_peak_rect.height != 0) { + if (!queue) { + region = gdk_region_new (); + queue = true; + } + gdk_region_union_with_rect (region, &last_peak_rect); + } + + if (hold_state && current_peak > 0) { + if (!queue) { + region = gdk_region_new (); + queue = true; + } + rect.y = 1; + rect.height = pixheight; + const int xpos = floor (pixwidth * current_peak); + if (bright_hold || (_styleflags & 2)) { + rect.width = min(3, xpos); + } else { + rect.width = min(2, xpos); + } + rect.x = 1 + max(0, xpos - rect.width); + gdk_region_union_with_rect (region, &rect); + } + + if (queue) { + gdk_window_invalidate_region (win->gobj(), region, true); + } + if (region) { + gdk_region_destroy(region); + region = 0; + } +} + +void FastMeter::set_highlight (bool onoff) { if (highlight == onoff) { return; } highlight = onoff; - bgpattern = request_vertical_background (request_width, pixheight, highlight ? _bgh : _bgc, highlight); + if (orientation == Vertical) { + bgpattern = request_vertical_background (pixwidth + 2, pixheight + 2, highlight ? _bgh : _bgc, highlight); + } else { + bgpattern = request_horizontal_background (pixwidth + 2, pixheight + 2, highlight ? _bgh : _bgc, highlight); + } queue_draw (); } diff --git a/libs/gtkmm2ext/gtkmm2ext/fastmeter.h b/libs/gtkmm2ext/gtkmm2ext/fastmeter.h index 15c962deb4..8070748963 100644 --- a/libs/gtkmm2ext/gtkmm2ext/fastmeter.h +++ b/libs/gtkmm2ext/gtkmm2ext/fastmeter.h @@ -47,7 +47,8 @@ class FastMeter : public Gtk::DrawingArea { float stp0 = 55.0, // log_meter(-18); float stp1 = 77.5, // log_meter(-9); float stp2 = 92.5, // log_meter(-3); // 95.0, // log_meter(-2); - float stp3 = 100.0 + float stp3 = 100.0, + int styleflags = 3 ); virtual ~FastMeter (); @@ -67,7 +68,6 @@ protected: bool on_expose_event (GdkEventExpose*); void on_size_request (GtkRequisition*); void on_size_allocate (Gtk::Allocation&); - private: Cairo::RefPtr<Cairo::Pattern> fgpattern; @@ -79,6 +79,7 @@ private: int _clr[10]; int _bgc[2]; int _bgh[2]; + int _styleflags; Orientation orientation; GdkRectangle pixrect; @@ -94,19 +95,30 @@ private: bool highlight; bool vertical_expose (GdkEventExpose*); + void vertical_size_request (GtkRequisition*); + void vertical_size_allocate (Gtk::Allocation&); void queue_vertical_redraw (const Glib::RefPtr<Gdk::Window>&, float); + bool horizontal_expose (GdkEventExpose*); + void horizontal_size_request (GtkRequisition*); + void horizontal_size_allocate (Gtk::Allocation&); + void queue_horizontal_redraw (const Glib::RefPtr<Gdk::Window>&, float); + static bool no_rgba_overlay; static Cairo::RefPtr<Cairo::Pattern> generate_meter_pattern ( - int w, int h, int *clr, float *stp, bool shade); + int, int, int *, float *, int, bool); static Cairo::RefPtr<Cairo::Pattern> request_vertical_meter ( - int w, int h, int *clr, float *stp, bool shade); + int, int, int *, float *, int); + static Cairo::RefPtr<Cairo::Pattern> request_horizontal_meter ( + int, int, int *, float *, int); static Cairo::RefPtr<Cairo::Pattern> generate_meter_background ( - int w, int h, int *bgc, bool shade); + int, int, int *, bool, bool); static Cairo::RefPtr<Cairo::Pattern> request_vertical_background ( - int w, int h, int *bgc, bool shade); + int, int, int *, bool); + static Cairo::RefPtr<Cairo::Pattern> request_horizontal_background ( + int, int, int *, bool); struct Pattern10MapKey { Pattern10MapKey ( @@ -114,38 +126,45 @@ private: float stp0, float stp1, float stp2, float stp3, int c0, int c1, int c2, int c3, int c4, int c5, int c6, int c7, - int c8, int c9 + int c8, int c9, int st ) : dim(w, h) , stp(stp0, stp1, stp2, stp3) , cols(c0, c1, c2, c3, c4, c5, c6, c7, c8, c9) + , style(st) {} inline bool operator<(const Pattern10MapKey& rhs) const { return (dim < rhs.dim) || (dim == rhs.dim && stp < rhs.stp) - || (dim == rhs.dim && stp == rhs.stp && cols < rhs.cols); + || (dim == rhs.dim && stp == rhs.stp && cols < rhs.cols) + || (dim == rhs.dim && stp == rhs.stp && cols == rhs.cols && style < rhs.style); } boost::tuple<int, int> dim; boost::tuple<float, float, float, float> stp; boost::tuple<int, int, int, int, int, int, int, int, int, int> cols; + int style; }; typedef std::map<Pattern10MapKey, Cairo::RefPtr<Cairo::Pattern> > Pattern10Map; struct PatternBgMapKey { - PatternBgMapKey (int w, int h, int c0, int c1) + PatternBgMapKey (int w, int h, int c0, int c1, bool shade) : dim(w, h) , cols(c0, c1) + , sh(shade) {} inline bool operator<(const PatternBgMapKey& rhs) const { - return (dim < rhs.dim) || (dim == rhs.dim && cols < rhs.cols); + return (dim < rhs.dim) || (dim == rhs.dim && cols < rhs.cols) || (dim == rhs.dim && cols == rhs.cols && (sh && !rhs.sh)); } boost::tuple<int, int> dim; boost::tuple<int, int> cols; + bool sh; }; typedef std::map<PatternBgMapKey, Cairo::RefPtr<Cairo::Pattern> > PatternBgMap; static Pattern10Map vm_pattern_cache; static PatternBgMap vb_pattern_cache; + static Pattern10Map hm_pattern_cache; + static PatternBgMap hb_pattern_cache; static int min_pattern_metric_size; // min dimension for axis that displays the meter level static int max_pattern_metric_size; // max dimension for axis that displays the meter level }; diff --git a/libs/pbd/cocoa_open_uri.mm b/libs/pbd/cocoa_open_uri.mm index 2c6822ac94..90a3995d71 100644 --- a/libs/pbd/cocoa_open_uri.mm +++ b/libs/pbd/cocoa_open_uri.mm @@ -1,6 +1,7 @@ #include <CoreFoundation/CFLocale.h> #import <CoreFoundation/CFString.h> #import <Foundation/NSString.h> +#import <Foundation/NSURL.h> #import <Foundation/NSAutoreleasePool.h> #import <AppKit/NSWorkspace.h> diff --git a/libs/pbd/pbd/ringbuffer.h b/libs/pbd/pbd/ringbuffer.h index f14fa71851..652457b493 100644 --- a/libs/pbd/pbd/ringbuffer.h +++ b/libs/pbd/pbd/ringbuffer.h @@ -233,6 +233,7 @@ RingBuffer<T>::get_read_vector (RingBuffer<T>::rw_vector *vec) vec->buf[0] = &buf[r]; vec->len[0] = free_cnt; + vec->buf[1] = 0; vec->len[1] = 0; } } diff --git a/libs/pbd/pbd/stl_delete.h b/libs/pbd/pbd/stl_delete.h index ac2161560c..bca0ea9e21 100644 --- a/libs/pbd/pbd/stl_delete.h +++ b/libs/pbd/pbd/stl_delete.h @@ -21,17 +21,10 @@ #define __libmisc_stl_delete_h__ -#if __clang__ && __APPLE__ && __cplusplus >= 201103L -#include <vector> -#ifndef _CPP_VECTOR -#define _CPP_VECTOR -#endif -#endif - /* To actually use any of these deletion functions, you need to first include the revelant container type header. */ -#if defined(_CPP_VECTOR) || defined(_GLIBCXX_VECTOR) || defined(__SGI_STL_VECTOR) +#if defined(_CPP_VECTOR) || defined(_GLIBCXX_VECTOR) || defined(__SGI_STL_VECTOR) || defined(_LIBCPP_VECTOR) template<class T> void vector_delete (std::vector<T *> *vec) { typename std::vector<T *>::iterator i; @@ -41,7 +34,7 @@ template<class T> void vector_delete (std::vector<T *> *vec) } vec->clear (); } -#endif // _CPP_VECTOR || _GLIBCXX_VECTOR || __SGI_STL_VECTOR +#endif // _CPP_VECTOR || _GLIBCXX_VECTOR || __SGI_STL_VECTOR || _LIBCPP_VECTOR #if defined(_CPP_MAP) || defined(_GLIBCXX_MAP) || defined(__SGI_STL_MAP) template<class K, class T> void map_delete (std::map<K, T *> *m) diff --git a/libs/pbd/wscript b/libs/pbd/wscript index 5c8ed194a8..0655e1ca48 100644 --- a/libs/pbd/wscript +++ b/libs/pbd/wscript @@ -128,12 +128,13 @@ def build(bld): obj.uselib = 'GLIBMM SIGCPP XML UUID SNDFILE GIOMM' if sys.platform == 'darwin': TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cc'] - obj.source += [ 'cocoa_open_uri.mm' ] + if 'cocoa_open_uri.mm' not in obj.source: + obj.source += [ 'cocoa_open_uri.mm' ] obj.uselib += ' OSX' obj.vnum = LIBPBD_LIB_VERSION obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3') obj.defines = ['PACKAGE="' + I18N_PACKAGE + '"'] - + if bld.env['build_target'] == 'x86_64': obj.defines += [ 'USE_X86_64_ASM' ] diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index 5c3422799b..84dd0d9c86 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -188,7 +188,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \ return static_cast<OSC*>(user_data)->cb_ ## name (path, types, argv, argc, data); \ } \ - int cb_ ## name (const char *, const char *, lo_arg **argv, int argc, void *data) { \ + int cb_ ## name (const char *, const char *, lo_arg **argv, int argc, void *) { \ if (argc > 1) { \ name (argv[0]->arg1type, argv[1]->arg2type,argv[2]->arg3type); \ } \ @@ -199,7 +199,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \ return static_cast<OSC*>(user_data)->cb_ ## name (path, types, argv, argc, data); \ } \ - int cb_ ## name (const char *, const char *, lo_arg **argv, int argc, void *data) { \ + int cb_ ## name (const char *, const char *, lo_arg **argv, int argc, void *) { \ if (argc > 1) { \ name (argv[0]->arg1type, argv[1]->arg2type,argv[2]->arg3type,argv[3]->arg4type); \ } \ diff --git a/libs/timecode/src/time.cc b/libs/timecode/src/time.cc index a0d56c7264..6f954a8d51 100644 --- a/libs/timecode/src/time.cc +++ b/libs/timecode/src/time.cc @@ -806,7 +806,7 @@ sample_to_timecode ( double timecode_frames_fraction; int64_t timecode_frames_left; const double frames_per_timecode_frame = sample_frame_rate / timecode_frames_per_second; - const int64_t frames_per_hour = (int32_t)(3600 * rint(timecode_frames_per_second) * frames_per_timecode_frame); + const int64_t frames_per_hour = (int64_t)(3600 * rint(timecode_frames_per_second) * frames_per_timecode_frame); timecode.hours = offset_sample / frames_per_hour; @@ -818,7 +818,7 @@ sample_to_timecode ( timecode.subframes = (int32_t) rint(timecode_frames_fraction * subframes_per_frame); timecode_frames_left = (int64_t) floor (timecode_frames_left_exact); - if (timecode.subframes == subframes_per_frame) { + if (use_subframes && timecode.subframes == subframes_per_frame) { timecode_frames_left++; timecode.subframes = 0; } diff --git a/tools/valgrind.supp b/tools/valgrind.supp index 1d1e1bd1e4..8741d9c901 100644 --- a/tools/valgrind.supp +++ b/tools/valgrind.supp @@ -135,3 +135,17 @@ fun:ladspa_descriptor fun:* } +{ + <glib utf8> + Memcheck:Addr8 + fun:wcslen + fun:wcscoll_l + fun:* +} +{ + <glib utf8> + Memcheck:Addr8 + fun:wcslen + fun:wcsxfrm_l + fun:* +} @@ -373,8 +373,12 @@ def set_compiler_flags (conf,opt): conf.env.append_value('CFLAGS', '-DBOOST_SYSTEM_NO_DEPRECATED') conf.env.append_value('CXXFLAGS', '-DBOOST_SYSTEM_NO_DEPRECATED') + # need ISOC9X for llabs() + conf.env.append_value('CFLAGS', '-D_ISOC9X_SOURCE') conf.env.append_value('CFLAGS', '-D_LARGEFILE64_SOURCE') conf.env.append_value('CFLAGS', '-D_FILE_OFFSET_BITS=64') + # need ISOC9X for llabs() + conf.env.append_value('CXXFLAGS', '-D_ISOC9X_SOURCE') conf.env.append_value('CXXFLAGS', '-D_LARGEFILE64_SOURCE') conf.env.append_value('CXXFLAGS', '-D_FILE_OFFSET_BITS=64') |