summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/add_video_dialog.cc5
-rw-r--r--gtk2_ardour/ardour3_styles.rc.in22
-rw-r--r--gtk2_ardour/ardour3_ui_default.conf3
-rw-r--r--gtk2_ardour/ardour3_widget_list.rc5
-rw-r--r--gtk2_ardour/ardour_ui.cc50
-rw-r--r--gtk2_ardour/ardour_ui.h10
-rw-r--r--gtk2_ardour/ardour_ui2.cc3
-rw-r--r--gtk2_ardour/ardour_ui_dialogs.cc64
-rw-r--r--gtk2_ardour/ardour_ui_options.cc9
-rw-r--r--gtk2_ardour/audio_clock.cc2
-rw-r--r--gtk2_ardour/canvas_vars.h1
-rw-r--r--gtk2_ardour/editor_drag.cc3
-rw-r--r--gtk2_ardour/editor_ops.cc2
-rw-r--r--gtk2_ardour/engine_dialog.cc4
-rw-r--r--gtk2_ardour/export_video_dialog.cc1
-rw-r--r--gtk2_ardour/gain_meter.cc24
-rw-r--r--gtk2_ardour/gain_meter.h4
-rw-r--r--gtk2_ardour/level_meter.cc184
-rw-r--r--gtk2_ardour/level_meter.h41
-rw-r--r--gtk2_ardour/logmeter.h24
-rw-r--r--gtk2_ardour/lv2_plugin_ui.cc27
-rw-r--r--gtk2_ardour/lv2_plugin_ui.h2
-rw-r--r--gtk2_ardour/meter_patterns.cc352
-rw-r--r--gtk2_ardour/meter_strip.cc255
-rw-r--r--gtk2_ardour/meter_strip.h26
-rw-r--r--gtk2_ardour/meterbridge.cc97
-rw-r--r--gtk2_ardour/meterbridge.h6
-rw-r--r--gtk2_ardour/midi_tracer.cc4
-rw-r--r--gtk2_ardour/mixer_ui.cc2
-rw-r--r--gtk2_ardour/po/de.po2488
-rw-r--r--gtk2_ardour/port_group.cc18
-rw-r--r--gtk2_ardour/port_matrix.cc23
-rw-r--r--gtk2_ardour/rc_option_editor.cc45
-rw-r--r--gtk2_ardour/route_params_ui.cc8
-rw-r--r--gtk2_ardour/route_ui.cc4
-rw-r--r--gtk2_ardour/route_ui.h2
-rw-r--r--gtk2_ardour/system_exec.cc4
-rw-r--r--gtk2_ardour/transcode_ffmpeg.cc1
-rw-r--r--gtk2_ardour/transcode_video_dialog.cc1
-rw-r--r--gtk2_ardour/utils.cc47
-rw-r--r--gtk2_ardour/utils.h2
-rw-r--r--gtk2_ardour/utils_videotl.cc83
-rw-r--r--gtk2_ardour/utils_videotl.h5
-rw-r--r--gtk2_ardour/video_image_frame.cc3
-rw-r--r--gtk2_ardour/video_server_dialog.cc1
-rw-r--r--gtk2_ardour/video_timeline.cc23
-rw-r--r--gtk2_ardour/video_timeline.h2
-rw-r--r--libs/ardour/amp.cc2
-rw-r--r--libs/ardour/ardour/amp.h2
-rw-r--r--libs/ardour/ardour/audio_diskstream.h1
-rw-r--r--libs/ardour/ardour/audio_unit.h2
-rw-r--r--libs/ardour/ardour/capturing_processor.h2
-rw-r--r--libs/ardour/ardour/delivery.h2
-rw-r--r--libs/ardour/ardour/diskstream.h1
-rw-r--r--libs/ardour/ardour/internal_return.h2
-rw-r--r--libs/ardour/ardour/internal_send.h2
-rw-r--r--libs/ardour/ardour/meter.h5
-rw-r--r--libs/ardour/ardour/midi_diskstream.h1
-rw-r--r--libs/ardour/ardour/monitor_processor.h2
-rw-r--r--libs/ardour/ardour/panner_shell.h2
-rw-r--r--libs/ardour/ardour/plugin.h2
-rw-r--r--libs/ardour/ardour/plugin_insert.h6
-rw-r--r--libs/ardour/ardour/port_insert.h2
-rw-r--r--libs/ardour/ardour/process_thread.h3
-rw-r--r--libs/ardour/ardour/processor.h2
-rw-r--r--libs/ardour/ardour/rc_configuration_vars.h7
-rw-r--r--libs/ardour/ardour/return.h2
-rw-r--r--libs/ardour/ardour/route.h3
-rw-r--r--libs/ardour/ardour/send.h2
-rw-r--r--libs/ardour/ardour/session.h5
-rw-r--r--libs/ardour/ardour/session_configuration_vars.h1
-rw-r--r--libs/ardour/ardour/thread_buffers.h1
-rw-r--r--libs/ardour/ardour/ticker.h10
-rw-r--r--libs/ardour/ardour/types.h7
-rw-r--r--libs/ardour/ardour/unknown_processor.h2
-rw-r--r--libs/ardour/audio_diskstream.cc27
-rw-r--r--libs/ardour/audio_track.cc8
-rw-r--r--libs/ardour/audio_unit.cc9
-rw-r--r--libs/ardour/audiosource.cc2
-rw-r--r--libs/ardour/capturing_processor.cc2
-rw-r--r--libs/ardour/delivery.cc2
-rw-r--r--libs/ardour/enums.cc1
-rw-r--r--libs/ardour/internal_return.cc2
-rw-r--r--libs/ardour/internal_send.cc2
-rw-r--r--libs/ardour/kmeterdsp.cc16
-rw-r--r--libs/ardour/ladspa_plugin.cc2
-rw-r--r--libs/ardour/lv2_plugin.cc4
-rw-r--r--libs/ardour/meter.cc48
-rw-r--r--libs/ardour/midi_diskstream.cc14
-rw-r--r--libs/ardour/midi_track.cc8
-rw-r--r--libs/ardour/monitor_processor.cc2
-rw-r--r--libs/ardour/playlist.cc4
-rw-r--r--libs/ardour/plugin_insert.cc30
-rw-r--r--libs/ardour/po/de.po105
-rw-r--r--libs/ardour/port_insert.cc2
-rw-r--r--libs/ardour/process_thread.cc37
-rw-r--r--libs/ardour/return.cc2
-rw-r--r--libs/ardour/route.cc57
-rw-r--r--libs/ardour/send.cc2
-rw-r--r--libs/ardour/session.cc11
-rw-r--r--libs/ardour/session_ltc.cc43
-rw-r--r--libs/ardour/session_midi.cc14
-rw-r--r--libs/ardour/session_transport.cc2
-rw-r--r--libs/ardour/thread_buffers.cc2
-rw-r--r--libs/ardour/ticker.cc249
-rw-r--r--libs/ardour/track.cc14
-rw-r--r--libs/gtkmm2ext/fastmeter.cc456
-rw-r--r--libs/gtkmm2ext/gtkmm2ext/fastmeter.h39
-rw-r--r--libs/pbd/cocoa_open_uri.mm1
-rw-r--r--libs/pbd/pbd/ringbuffer.h1
-rw-r--r--libs/pbd/pbd/stl_delete.h11
-rw-r--r--libs/pbd/wscript5
-rw-r--r--libs/surfaces/osc/osc.h4
-rw-r--r--libs/timecode/src/time.cc4
-rw-r--r--tools/valgrind.supp14
-rw-r--r--wscript4
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\">&gt;24 hrs</span>"
msgstr "Disk: <span foreground=\"green\">&gt;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:*
+}
diff --git a/wscript b/wscript
index 66d7c655e5..956925cb42 100644
--- a/wscript
+++ b/wscript
@@ -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')