summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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.cc40
-rw-r--r--gtk2_ardour/ardour_ui.h7
-rw-r--r--gtk2_ardour/ardour_ui2.cc1
-rw-r--r--gtk2_ardour/ardour_ui_dialogs.cc27
-rw-r--r--gtk2_ardour/audio_clock.cc2
-rw-r--r--gtk2_ardour/canvas_vars.h1
-rw-r--r--gtk2_ardour/editor.cc4
-rw-r--r--gtk2_ardour/editor.h25
-rw-r--r--gtk2_ardour/editor_audio_import.cc83
-rw-r--r--gtk2_ardour/editor_drag.cc1
-rw-r--r--gtk2_ardour/editor_ops.cc2
-rw-r--r--gtk2_ardour/editor_videotimeline.cc2
-rw-r--r--gtk2_ardour/engine_dialog.cc10
-rw-r--r--gtk2_ardour/export_video_dialog.cc2
-rw-r--r--gtk2_ardour/gain_meter.cc59
-rw-r--r--gtk2_ardour/gain_meter.h7
-rw-r--r--gtk2_ardour/level_meter.cc290
-rw-r--r--gtk2_ardour/level_meter.h41
-rw-r--r--gtk2_ardour/logmeter.h79
-rw-r--r--gtk2_ardour/meter_patterns.cc926
-rw-r--r--gtk2_ardour/meter_patterns.h4
-rw-r--r--gtk2_ardour/meter_strip.cc273
-rw-r--r--gtk2_ardour/meter_strip.h34
-rw-r--r--gtk2_ardour/meterbridge.cc181
-rw-r--r--gtk2_ardour/meterbridge.h8
-rw-r--r--gtk2_ardour/mixer_strip.cc9
-rw-r--r--gtk2_ardour/mixer_ui.cc2
-rw-r--r--gtk2_ardour/po/de.po2488
-rw-r--r--gtk2_ardour/processor_box.cc23
-rw-r--r--gtk2_ardour/rc_option_editor.cc53
-rw-r--r--gtk2_ardour/route_params_ui.cc8
-rw-r--r--gtk2_ardour/route_ui.cc9
-rw-r--r--gtk2_ardour/route_ui.h2
-rw-r--r--gtk2_ardour/sfdb_ui.cc3
-rw-r--r--gtk2_ardour/startup.cc10
-rw-r--r--gtk2_ardour/system_exec.cc4
-rw-r--r--gtk2_ardour/transcode_ffmpeg.cc11
-rw-r--r--gtk2_ardour/transcode_video_dialog.cc2
-rw-r--r--gtk2_ardour/utils.cc49
-rw-r--r--gtk2_ardour/utils.h2
-rw-r--r--gtk2_ardour/video_server_dialog.cc10
-rw-r--r--gtk2_ardour/video_timeline.cc16
-rw-r--r--libs/ardour/ardour/iec1ppmdsp.h51
-rw-r--r--libs/ardour/ardour/iec2ppmdsp.h51
-rw-r--r--libs/ardour/ardour/kmeterdsp.h (renamed from libs/ardour/kmeterdsp.h)5
-rw-r--r--libs/ardour/ardour/meter.h13
-rw-r--r--libs/ardour/ardour/process_thread.h3
-rw-r--r--libs/ardour/ardour/rc_configuration_vars.h5
-rw-r--r--libs/ardour/ardour/session.h4
-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.h3
-rw-r--r--libs/ardour/ardour/types.h24
-rw-r--r--libs/ardour/ardour/vumeterdsp.h49
-rw-r--r--libs/ardour/audio_track.cc2
-rw-r--r--libs/ardour/audio_unit.cc7
-rw-r--r--libs/ardour/audiosource.cc2
-rw-r--r--libs/ardour/enums.cc28
-rw-r--r--libs/ardour/iec1ppmdsp.cc100
-rw-r--r--libs/ardour/iec2ppmdsp.cc100
-rw-r--r--libs/ardour/kmeterdsp.cc39
-rw-r--r--libs/ardour/ladspa_plugin.cc2
-rw-r--r--libs/ardour/lv2_plugin.cc2
-rw-r--r--libs/ardour/meter.cc173
-rw-r--r--libs/ardour/midi_track.cc2
-rw-r--r--libs/ardour/plugin_insert.cc2
-rw-r--r--libs/ardour/po/de.po105
-rw-r--r--libs/ardour/process_thread.cc37
-rw-r--r--libs/ardour/route.cc11
-rw-r--r--libs/ardour/session.cc11
-rw-r--r--libs/ardour/session_midi.cc14
-rw-r--r--libs/ardour/thread_buffers.cc2
-rw-r--r--libs/ardour/ticker.cc86
-rw-r--r--libs/ardour/track.cc10
-rw-r--r--libs/ardour/vumeterdsp.cc89
-rw-r--r--libs/ardour/wscript3
-rw-r--r--libs/gtkmm2ext/fastmeter.cc446
-rw-r--r--libs/gtkmm2ext/gtkmm2ext/fastmeter.h39
-rw-r--r--libs/gtkmm2ext/gtkmm2ext/keyboard.h2
-rw-r--r--libs/gtkmm2ext/keyboard.cc11
-rw-r--r--libs/pbd/pbd/ringbuffer.h1
-rw-r--r--libs/pbd/pbd/stl_delete.h11
-rw-r--r--libs/surfaces/osc/osc.h4
-rw-r--r--tools/valgrind.supp14
87 files changed, 4607 insertions, 1798 deletions
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 9577444120..6de90c15c2 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -185,6 +185,8 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
, solo_alert_button (_("solo"))
, feedback_alert_button (_("feedback"))
+ , editor_meter(0)
+
, speaker_config_window (X_("speaker-config"), _("Speaker Configuration"))
, theme_manager (X_("theme-manager"), _("Theme Manager"))
, key_editor (X_("key-editor"), _("Key Bindings"))
@@ -1037,6 +1039,9 @@ ARDOUR_UI::every_point_zero_something_seconds ()
// august 2007: actual update frequency: 25Hz (40ms), not 100Hz
SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
+ if (editor_meter) {
+ editor_meter->update_meters();
+ }
return TRUE;
}
@@ -1492,7 +1497,14 @@ ARDOUR_UI::open_session ()
open_session_selector->set_current_folder(Config->get_default_session_parent_dir());
}
- open_session_selector->add_shortcut_folder (Config->get_default_session_parent_dir());
+ string default_session_folder = Config->get_default_session_parent_dir();
+ try {
+ /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */
+ open_session_selector->add_shortcut_folder (default_session_folder);
+ }
+ catch (Glib::Error & e) {
+ std::cerr << "open_session_selector->add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl;
+ }
FileFilter session_filter;
session_filter.add_pattern ("*.ardour");
@@ -4119,3 +4131,29 @@ 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();
+}
+
+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 7a8a0193f1..e2eae36977 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,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
ArdourButton feedback_alert_button;
Gtk::VBox alert_box;
+ Gtk::VBox meter_box;
+ LevelMeterHBox * editor_meter;
void solo_blink (bool);
void sync_blink (bool);
diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc
index 50affa6c96..d9ff245b67 100644
--- a/gtk2_ardour/ardour_ui2.cc
+++ b/gtk2_ardour/ardour_ui2.cc
@@ -417,6 +417,7 @@ 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);
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 c0fd97cfd6..f5fc16651a 100644
--- a/gtk2_ardour/ardour_ui_dialogs.cc
+++ b/gtk2_ardour/ardour_ui_dialogs.cc
@@ -43,6 +43,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"
@@ -190,6 +191,26 @@ 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;
+ }
+
+ 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);
+ 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));
+ }
+
}
int
@@ -229,6 +250,12 @@ 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;
+ }
+
ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
rec_button.set_sensitive (false);
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.cc b/gtk2_ardour/editor.cc
index d3e3ae9828..300e317a38 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -697,7 +697,7 @@ Editor::Editor ()
signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler));
signal_delete_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::exit_on_main_window_close));
- Gtkmm2ext::Keyboard::the_keyboard().ShiftReleased.connect (sigc::mem_fun (*this, &Editor::shift_key_released));
+ Gtkmm2ext::Keyboard::the_keyboard().ZoomVerticalModifierReleased.connect (sigc::mem_fun (*this, &Editor::zoom_vertical_modifier_released));
/* allow external control surfaces/protocols to do various things */
@@ -5499,7 +5499,7 @@ Editor::popup_control_point_context_menu (ArdourCanvas::Item* item, GdkEvent* ev
}
void
-Editor::shift_key_released ()
+Editor::zoom_vertical_modifier_released()
{
_stepping_axis_view = 0;
}
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index 919d6e0781..033888c4b6 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -1249,13 +1249,17 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
bool idle_drop_paths (std::vector<std::string> paths, framepos_t frame, double ypos, bool copy);
void drop_paths_part_two (const std::vector<std::string>& paths, framepos_t frame, double ypos, bool copy);
- int import_sndfiles (std::vector<std::string> paths, Editing::ImportMode mode, ARDOUR::SrcQuality, framepos_t& pos,
+ int import_sndfiles (std::vector<std::string> paths, Editing::ImportDisposition, Editing::ImportMode mode,
+ ARDOUR::SrcQuality, framepos_t& pos,
int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::Track>&, bool);
- int embed_sndfiles (std::vector<std::string> paths, bool multiple_files, bool& check_sample_rate, Editing::ImportMode mode,
+ int embed_sndfiles (std::vector<std::string> paths, bool multiple_files, bool& check_sample_rate,
+ Editing::ImportDisposition disposition, Editing::ImportMode mode,
framepos_t& pos, int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::Track>&);
- int add_sources (std::vector<std::string> paths, ARDOUR::SourceList& sources, framepos_t& pos, Editing::ImportMode,
+ int add_sources (std::vector<std::string> paths, ARDOUR::SourceList& sources, framepos_t& pos,
+ Editing::ImportDisposition, Editing::ImportMode,
int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::Track>&, bool add_channel_suffix);
+
int finish_bringing_in_material (boost::shared_ptr<ARDOUR::Region> region, uint32_t, uint32_t, framepos_t& pos, Editing::ImportMode mode,
boost::shared_ptr<ARDOUR::Track>& existing_track);
@@ -2078,15 +2082,16 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
bool _control_point_toggled_on_press;
/** This is used by TimeAxisView to keep a track of the TimeAxisView that is currently being
- stepped in height using Shift-Scrollwheel. When a scroll event occurs, we do the step on
- this _stepping_axis_view if it is non-0 (and we set up this _stepping_axis_view with the
- TimeAxisView underneath the mouse if it is 0). Then Editor resets _stepping_axis_view when
- the shift key is released. In this (hacky) way, pushing shift and moving the scroll wheel
- will operate on the same track until shift is released (rather than skipping about to whatever
- happens to be underneath the mouse at the time).
+ stepped in height using ScrollZoomVerticalModifier+Scrollwheel. When a scroll event
+ occurs, we do the step on this _stepping_axis_view if it is non-0 (and we set up this
+ _stepping_axis_view with the TimeAxisView underneath the mouse if it is 0). Then Editor
+ resets _stepping_axis_view when the modifier key is released. In this (hacky) way,
+ pushing the modifier key and moving the scroll wheel will operate on the same track
+ until the key is released (rather than skipping about to whatever happens to be
+ underneath the mouse at the time).
*/
TimeAxisView* _stepping_axis_view;
- void shift_key_released ();
+ void zoom_vertical_modifier_released();
friend class Drag;
friend class RegionDrag;
diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc
index 31ccdb7a53..3cb2d378c2 100644
--- a/gtk2_ardour/editor_audio_import.cc
+++ b/gtk2_ardour/editor_audio_import.cc
@@ -264,7 +264,7 @@ Editor::get_nth_selected_midi_track (int nth) const
}
void
-Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode, SrcQuality quality, framepos_t& pos)
+Editor::do_import (vector<string> paths, ImportDisposition disposition, ImportMode mode, SrcQuality quality, framepos_t& pos)
{
boost::shared_ptr<Track> track;
vector<string> to_import;
@@ -280,7 +280,7 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
bool ok = true;
- if (chns == Editing::ImportMergeFiles) {
+ if (disposition == Editing::ImportMergeFiles) {
/* create 1 region from all paths, add to 1 track,
ignore "track"
@@ -299,7 +299,7 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
ok = false;
} else {
ipw.show ();
- ok = (import_sndfiles (paths, mode, quality, pos, 1, 1, track, false) == 0);
+ ok = (import_sndfiles (paths, disposition, mode, quality, pos, 1, 1, track, false) == 0);
}
} else {
@@ -334,7 +334,7 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
ipw.show ();
- switch (chns) {
+ switch (disposition) {
case Editing::ImportDistinctFiles:
to_import.clear ();
@@ -344,7 +344,7 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
track = get_nth_selected_audio_track (nth++);
}
- ok = (import_sndfiles (to_import, mode, quality, pos, 1, -1, track, replace) == 0);
+ ok = (import_sndfiles (to_import, disposition, mode, quality, pos, 1, -1, track, replace) == 0);
break;
case Editing::ImportDistinctChannels:
@@ -352,7 +352,7 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
to_import.clear ();
to_import.push_back (*a);
- ok = (import_sndfiles (to_import, mode, quality, pos, -1, -1, track, replace) == 0);
+ ok = (import_sndfiles (to_import, disposition, mode, quality, pos, -1, -1, track, replace) == 0);
break;
case Editing::ImportSerializeFiles:
@@ -360,7 +360,7 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
to_import.clear ();
to_import.push_back (*a);
- ok = (import_sndfiles (to_import, mode, quality, pos, 1, 1, track, replace) == 0);
+ ok = (import_sndfiles (to_import, disposition, mode, quality, pos, 1, 1, track, replace) == 0);
break;
case Editing::ImportMergeFiles:
@@ -378,7 +378,7 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
}
void
-Editor::do_embed (vector<string> paths, ImportDisposition chns, ImportMode mode, framepos_t& pos)
+Editor::do_embed (vector<string> paths, ImportDisposition import_as, ImportMode mode, framepos_t& pos)
{
boost::shared_ptr<Track> track;
bool check_sample_rate = true;
@@ -388,7 +388,7 @@ Editor::do_embed (vector<string> paths, ImportDisposition chns, ImportMode mode,
int nth = 0;
bool use_timestamp = (pos == -1);
- switch (chns) {
+ switch (import_as) {
case Editing::ImportDistinctFiles:
for (vector<string>::iterator a = paths.begin(); a != paths.end(); ++a) {
@@ -404,7 +404,7 @@ Editor::do_embed (vector<string> paths, ImportDisposition chns, ImportMode mode,
track = get_nth_selected_audio_track (nth++);
}
- if (embed_sndfiles (to_embed, multi, check_sample_rate, mode, pos, 1, -1, track) < -1) {
+ if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, 1, -1, track) < -1) {
goto out;
}
}
@@ -421,14 +421,14 @@ Editor::do_embed (vector<string> paths, ImportDisposition chns, ImportMode mode,
to_embed.clear ();
to_embed.push_back (*a);
- if (embed_sndfiles (to_embed, multi, check_sample_rate, mode, pos, -1, -1, track) < -1) {
+ if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, -1, -1, track) < -1) {
goto out;
}
}
break;
case Editing::ImportMergeFiles:
- if (embed_sndfiles (paths, multi, check_sample_rate, mode, pos, 1, 1, track) < -1) {
+ if (embed_sndfiles (paths, multi, check_sample_rate, import_as, mode, pos, 1, 1, track) < -1) {
goto out;
}
break;
@@ -444,7 +444,7 @@ Editor::do_embed (vector<string> paths, ImportDisposition chns, ImportMode mode,
to_embed.clear ();
to_embed.push_back (*a);
- if (embed_sndfiles (to_embed, multi, check_sample_rate, mode, pos, 1, 1, track) < -1) {
+ if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, 1, 1, track) < -1) {
goto out;
}
}
@@ -460,7 +460,7 @@ Editor::do_embed (vector<string> paths, ImportDisposition chns, ImportMode mode,
}
int
-Editor::import_sndfiles (vector<string> paths, ImportMode mode, SrcQuality quality, framepos_t& pos,
+Editor::import_sndfiles (vector<string> paths, ImportDisposition disposition, ImportMode mode, SrcQuality quality, framepos_t& pos,
int target_regions, int target_tracks, boost::shared_ptr<Track>& track, bool replace)
{
import_status.paths = paths;
@@ -501,6 +501,7 @@ Editor::import_sndfiles (vector<string> paths, ImportMode mode, SrcQuality quali
import_status.paths,
import_status.sources,
import_status.pos,
+ disposition,
import_status.mode,
import_status.target_regions,
import_status.target_tracks,
@@ -518,7 +519,8 @@ Editor::import_sndfiles (vector<string> paths, ImportMode mode, SrcQuality quali
int
Editor::embed_sndfiles (vector<string> paths, bool multifile,
- bool& check_sample_rate, ImportMode mode, framepos_t& pos, int target_regions, int target_tracks,
+ bool& check_sample_rate, ImportDisposition disposition, ImportMode mode,
+ framepos_t& pos, int target_regions, int target_tracks,
boost::shared_ptr<Track>& track)
{
boost::shared_ptr<AudioFileSource> source;
@@ -603,6 +605,7 @@ Editor::embed_sndfiles (vector<string> paths, bool multifile,
set_canvas_cursor (_cursors->wait);
for (int n = 0; n < finfo.channels; ++n) {
+
try {
/* check if we have this thing embedded already */
@@ -613,7 +616,7 @@ Editor::embed_sndfiles (vector<string> paths, bool multifile,
source = boost::dynamic_pointer_cast<AudioFileSource> (
SourceFactory::createExternal (DataType::AUDIO, *_session,
- path, n,
+ path, n,
(mode == ImportAsTapeTrack
? Source::Destructive
: Source::Flag (0)),
@@ -638,7 +641,8 @@ Editor::embed_sndfiles (vector<string> paths, bool multifile,
goto out;
}
- ret = add_sources (paths, sources, pos, mode, target_regions, target_tracks, track, true);
+
+ ret = add_sources (paths, sources, pos, disposition, mode, target_regions, target_tracks, track, true);
out:
set_canvas_cursor (current_canvas_cursor);
@@ -646,7 +650,7 @@ Editor::embed_sndfiles (vector<string> paths, bool multifile,
}
int
-Editor::add_sources (vector<string> paths, SourceList& sources, framepos_t& pos, ImportMode mode,
+Editor::add_sources (vector<string> paths, SourceList& sources, framepos_t& pos, ImportDisposition disposition, ImportMode mode,
int target_regions, int target_tracks, boost::shared_ptr<Track>& track, bool /*add_channel_suffix*/)
{
vector<boost::shared_ptr<Region> > regions;
@@ -654,7 +658,7 @@ Editor::add_sources (vector<string> paths, SourceList& sources, framepos_t& pos,
uint32_t input_chan = 0;
uint32_t output_chan = 0;
bool use_timestamp;
-
+
use_timestamp = (pos == -1);
// kludge (for MIDI we're abusing "channel" for "track" here)
@@ -707,10 +711,43 @@ Editor::add_sources (vector<string> paths, SourceList& sources, framepos_t& pos,
boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (*x);
- if (fs) {
- region_name = region_name_from_path (fs->path(), false, false, sources.size(), n);
- } else{
- region_name = (*x)->name();
+ if (sources.size() > 1 && disposition == ImportDistinctChannels) {
+
+ /* generate a per-channel region name so that things work as
+ * intended
+ */
+
+ string path;
+
+ if (fs) {
+ region_name = basename_nosuffix (fs->path());
+ } else {
+ region_name = (*x)->name();
+ }
+
+ switch (sources.size()) {
+ /* zero and one channel handled
+ by previous if() condition
+ */
+ case 2:
+ if (n == 0) {
+ region_name += "-L";
+ } else {
+ region_name += "-R";
+ }
+ break;
+ default:
+ region_name += (char) '-';
+ region_name += (char) ('1' + n);
+ break;
+ }
+
+ } else {
+ if (fs) {
+ region_name = region_name_from_path (fs->path(), false, false, sources.size(), n);
+ } else{
+ region_name = (*x)->name();
+ }
}
PropertyList plist;
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc
index 8f992266e7..35828830b0 100644
--- a/gtk2_ardour/editor_drag.cc
+++ b/gtk2_ardour/editor_drag.cc
@@ -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/editor_videotimeline.cc b/gtk2_ardour/editor_videotimeline.cc
index 5da8a295b7..e9360d9d09 100644
--- a/gtk2_ardour/editor_videotimeline.cc
+++ b/gtk2_ardour/editor_videotimeline.cc
@@ -111,7 +111,7 @@ Editor::embed_audio_from_video (std::string path, framepos_t n)
ipw.show ();
boost::shared_ptr<ARDOUR::Track> track;
- bool ok = (import_sndfiles (paths, Editing::ImportAsTrack, ARDOUR::SrcBest, n, 1, 1, track, false) == 0);
+ bool ok = (import_sndfiles (paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, ARDOUR::SrcBest, n, 1, 1, track, false) == 0);
if (ok && track) {
boost::shared_ptr<ARDOUR::Playlist> pl = track->playlist();
pl->find_next_region(n, ARDOUR::End, 0)->set_video_locked(true);
diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc
index a9e04d8db0..05cd9a661e 100644
--- a/gtk2_ardour/engine_dialog.cc
+++ b/gtk2_ardour/engine_dialog.cc
@@ -167,8 +167,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 ());
@@ -439,6 +443,12 @@ EngineControl::build_command_line (vector<string>& cmd)
cmd.push_back ("-T"); // temporary */
+ /* setup coremidi before the driver, otherwise jack won't start */
+
+ if (midi_driver_combo.get_active_text() == _("coremidi")) {
+ cmd.push_back ("-X coremidi");
+ }
+
/* next the driver */
cmd.push_back ("-d");
diff --git a/gtk2_ardour/export_video_dialog.cc b/gtk2_ardour/export_video_dialog.cc
index 7538c504f4..fafdd7a50d 100644
--- a/gtk2_ardour/export_video_dialog.cc
+++ b/gtk2_ardour/export_video_dialog.cc
@@ -87,7 +87,7 @@ ExportVideoDialog::ExportVideoDialog (PublicEditor& ed, Session* s)
, fps_checkbox (_("Override FPS (Default is to retain FPS from the input video file):"))
, meta_checkbox (_("Include Session Metadata"))
#if 1 /* tentative debug mode */
- , debug_checkbox (_("Enable Debug Mode: Print ffmpeg Command & Output to stdout."))
+ , debug_checkbox (_("Debug Mode: Print ffmpeg command and output to stdout."))
#endif
{
set_session (s);
diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc
index 1148c6b889..67f9ce9370 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
@@ -950,6 +953,8 @@ GainMeter::GainMeter (Session* s, int fader_length)
meter_hbox.pack_start (meter_metric_area, false, false);
}
+GainMeter::~GainMeter () { }
+
void
GainMeter::set_controls (boost::shared_ptr<Route> r,
boost::shared_ptr<PeakMeter> meter,
@@ -977,6 +982,10 @@ GainMeter::set_controls (boost::shared_ptr<Route> r,
}
+ if (_route) {
+ _route->active_changed.connect (model_connections, invalidator (*this), boost::bind (&GainMeter::route_active_changed, this), gui_context ());
+ }
+
/*
if we have a non-hidden route (ie. we're not the click or the auditioner),
pack some route-dependent stuff.
@@ -1013,19 +1022,31 @@ GainMeter::get_gm_width ()
gint
GainMeter::meter_metrics_expose (GdkEventExpose *ev)
{
- return meter_expose_metrics(ev, _types, &meter_metric_area);
+ 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)
{
- return meter_expose_ticks(ev, _types, &meter_ticks1_area);
+ 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)
{
- return meter_expose_ticks(ev, _types, &meter_ticks2_area);
+ 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);
}
boost::shared_ptr<PBD::Controllable>
@@ -1067,18 +1088,21 @@ GainMeter::meter_configuration_changed (ChanCount c)
set_meter_strip_name ("AudioBusMetricsInactive");
}
}
- else if (type == (1 << DataType::AUDIO)) {
+ else if (
+ (type == (1 << DataType::MIDI))
+ || (_route && boost::dynamic_pointer_cast<MidiTrack>(_route))
+ ) {
if (!_route || _route->active()) {
- set_meter_strip_name ("AudioTrackMetrics");
+ set_meter_strip_name ("MidiTrackMetrics");
} else {
- set_meter_strip_name ("AudioTrackMetricsInactive");
+ set_meter_strip_name ("MidiTrackMetricsInactive");
}
}
- else if (type == (1 << DataType::MIDI)) {
+ else if (type == (1 << DataType::AUDIO)) {
if (!_route || _route->active()) {
- set_meter_strip_name ("MidiTrackMetrics");
+ set_meter_strip_name ("AudioTrackMetrics");
} else {
- set_meter_strip_name ("MidiTrackMetricsInactive");
+ set_meter_strip_name ("AudioTrackMetricsInactive");
}
} else {
if (!_route || _route->active()) {
@@ -1087,11 +1111,22 @@ GainMeter::meter_configuration_changed (ChanCount c)
set_meter_strip_name ("AudioMidiTrackMetricsInactive");
}
}
+
+ setup_meters();
meter_clear_pattern_cache(4);
}
void
+GainMeter::route_active_changed ()
+{
+ if (_meter) {
+ meter_configuration_changed (_meter->input_streams ());
+ }
+}
+
+void
GainMeter::meter_type_changed (MeterType t)
{
_route->set_meter_type(t);
+ RedrawMetrics();
}
diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h
index 9353cfeaad..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;
@@ -201,7 +201,7 @@ class GainMeter : public GainMeterBase, public Gtk::VBox
{
public:
GainMeter (ARDOUR::Session*, int);
- ~GainMeter () {}
+ virtual ~GainMeter ();
virtual void set_controls (boost::shared_ptr<ARDOUR::Route> route,
boost::shared_ptr<ARDOUR::PeakMeter> meter,
@@ -210,6 +210,7 @@ class GainMeter : public GainMeterBase, public Gtk::VBox
int get_gm_width ();
void setup_meters (int len=0);
void set_type (ARDOUR::MeterType);
+ void route_active_changed ();
protected:
void hide_all_meters ();
diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc
index 6a120fdb80..66dda804b1 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,48 @@ 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_cfg(MeterLineUp lul, float offset) {
+ switch (lul) {
+ case MeteringLineUp24:
+ return offset + 6.0;
+ case MeteringLineUp20:
+ return offset + 2.0;
+ case MeteringLineUp18:
+ return offset;
+ case MeteringLineUp15:
+ return offset - 3.0;
+ default:
+ break;
+ }
+ 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()) {
+ default:
+ case MeteringVUfrench: // 0VU = -2dBu
+ return 0;
+ case MeteringVUamerican: // 0VU = 0dBu
+ return -2;
+ 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;
@@ -114,7 +150,19 @@ LevelMeter::update_meters ()
const float peak = _meter->meter_level (n, meter_type);
if (meter_type == MeterPeak) {
(*i).meter->set (log_meter (peak));
- } else {
+ } 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_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) {
+ (*i).meter->set (meter_deflect_vu (peak + vu_standard() + meter_lineup(0)));
+ } else if (meter_type == MeterK14) {
+ (*i).meter->set (meter_deflect_k (peak, 14), meter_deflect_k(_meter->meter_level(n, MeterPeak), 14));
+ } else if (meter_type == MeterK20) {
+ (*i).meter->set (meter_deflect_k (peak, 20), meter_deflect_k(_meter->meter_level(n, MeterPeak), 20));
+ } else { // RMS
(*i).meter->set (log_meter (peak), log_meter(_meter->meter_level(n, MeterPeak)));
}
}
@@ -124,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;
@@ -140,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;
@@ -151,32 +203,34 @@ 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;
+ setup_meters (meter_length, regular_meter_width, thin_meter_width);
MeterTypeChanged(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 ();
@@ -206,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();
@@ -227,33 +287,6 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width)
stp[2] = 115.0 * 100.0 / 128.0;
stp[3] = 115.0 * 112.0 / 128.0;
} else {
- switch (Config->get_meter_line_up_level()) {
- case MeteringLineUp24:
- stp[0] = 42.0;
- stp[1] = 77.5;
- stp[2] = 92.5;
- stp[3] = 100.0;
- break;
- case MeteringLineUp20:
- stp[0] = 50.0;
- stp[1] = 77.5;
- stp[2] = 92.5;
- stp[3] = 100.0;
- break;
- default:
- case MeteringLineUp18:
- stp[0] = 55.0;
- stp[1] = 77.5;
- stp[2] = 92.5;
- stp[3] = 100.0;
- break;
- case MeteringLineUp15:
- stp[0] = 62.5;
- stp[1] = 77.5;
- stp[2] = 92.5;
- stp[3] = 100.0;
- break;
- }
c[0] = ARDOUR_UI::config()->canvasvar_MeterColor0.get();
c[1] = ARDOUR_UI::config()->canvasvar_MeterColor1.get();
c[2] = ARDOUR_UI::config()->canvasvar_MeterColor2.get();
@@ -264,57 +297,145 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width)
c[7] = ARDOUR_UI::config()->canvasvar_MeterColor7.get();
c[8] = ARDOUR_UI::config()->canvasvar_MeterColor8.get();
c[9] = ARDOUR_UI::config()->canvasvar_MeterColor9.get();
+
+ switch (meter_type) {
+ case MeterK20:
+ stp[0] = 115.0 * meter_deflect_k(-40, 20); //-20
+ stp[1] = 115.0 * meter_deflect_k(-20, 20); // 0
+ stp[2] = 115.0 * meter_deflect_k(-18, 20); // +2
+ stp[3] = 115.0 * meter_deflect_k(-16, 20); // +4
+ c[0] = c[1] = 0x008800ff;
+ c[2] = c[3] = 0x00ff00ff;
+ c[4] = c[5] = 0xffff00ff;
+ c[6] = c[7] = 0xffff00ff;
+ c[8] = c[9] = 0xff0000ff;
+ break;
+ case MeterK14:
+ stp[0] = 115.0 * meter_deflect_k(-34, 14); //-20
+ stp[1] = 115.0 * meter_deflect_k(-14, 14); // 0
+ stp[2] = 115.0 * meter_deflect_k(-12, 14); // +2
+ stp[3] = 115.0 * meter_deflect_k(-10, 14); // +4
+ c[0] = c[1] = 0x008800ff;
+ c[2] = c[3] = 0x00ff00ff;
+ c[4] = c[5] = 0xffff00ff;
+ c[6] = c[7] = 0xffff00ff;
+ c[8] = c[9] = 0xff0000ff;
+ break;
+ case MeterIEC2BBC:
+ 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(-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); // 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); // ignored
+ stp[1] = 115.0 * meter_deflect_din(-18);
+ 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)
+ stp[2] = 92.5; // 115 * log_meter(-3)
+ stp[3] = 100.0; // 115 * log_meter(0)
+ switch (Config->get_meter_line_up_level()) {
+ case MeteringLineUp24:
+ stp[0] = 42.0;
+ break;
+ case MeteringLineUp20:
+ stp[0] = 50.0;
+ break;
+ default:
+ case MeteringLineUp18:
+ stp[0] = 55.0;
+ break;
+ case MeteringLineUp15:
+ stp[0] = 62.5;
+ break;
+ }
+ }
}
- 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();
@@ -325,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 d861509080..a244fb4bbe 100644
--- a/gtk2_ardour/logmeter.h
+++ b/gtk2_ardour/logmeter.h
@@ -34,7 +34,17 @@ alt_log_meter (float power)
}
#endif
-inline float
+/* prototypes - avoid compiler warning */
+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);
+
+
+
+static inline float
log_meter (float db)
{
gfloat def = 0.0f; /* Meter deflection %age */
@@ -65,4 +75,71 @@ log_meter (float db)
return def/115.0f;
}
+static inline float
+meter_deflect_ppm (float db)
+{
+ if (db < -30) {
+ // 2.258 == ((-30 + 32.0)/ 28.0) / 10^(-30 / 20);
+ return (dB_to_coefficient(db) * 2.258769757f);
+ } else {
+ const float rv = (db + 32.0f) / 28.0f;
+ if (rv < 1.0) {
+ return rv;
+ } else {
+ return 1.0;
+ }
+ }
+}
+
+static inline float
+meter_deflect_din (float db)
+{
+ float rv = dB_to_coefficient(db);
+ rv = sqrtf (sqrtf (2.3676f * rv)) - 0.1803f;
+ if (rv >= 1.0) {
+ return 1.0;
+ } else {
+ return (rv > 0 ? rv : 0.0);
+ }
+}
+
+static inline float
+meter_deflect_nordic (float db)
+{
+ if (db < -60) {
+ return 0.0;
+ } else {
+ const float rv = (db + 60.0f) / 54.0f;
+ if (rv < 1.0) {
+ return rv;
+ } else {
+ return 1.0;
+ }
+ }
+}
+
+static inline float
+meter_deflect_vu (float db)
+{
+ const float rv = 6.77165f * dB_to_coefficient(db);
+ if (rv > 1.0) return 1.0;
+ return rv;
+}
+
+static inline float
+meter_deflect_k (float db, float krange)
+{
+ db+=krange;
+ if (db < -40.0f) {
+ return (dB_to_coefficient(db) * 500.0f / (krange + 45.0f));
+ } else {
+ const float rv = (db + 45.0f) / (krange + 45.0f);
+ if (rv < 1.0) {
+ return rv;
+ } else {
+ return 1.0;
+ }
+ }
+}
+
#endif /* __ardour_gtk_log_meter_h__ */
diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc
index 7818711922..f392dc0872 100644
--- a/gtk2_ardour/meter_patterns.cc
+++ b/gtk2_ardour/meter_patterns.cc
@@ -39,6 +39,8 @@ using namespace ArdourMeter;
static const int max_pattern_metric_size = 1026;
+/* signals used by meters */
+
sigc::signal<void> ArdourMeter::ResetAllPeakDisplays;
sigc::signal<void,ARDOUR::Route*> ArdourMeter::ResetRoutePeakDisplays;
sigc::signal<void,ARDOUR::RouteGroup*> ArdourMeter::ResetGroupPeakDisplays;
@@ -46,13 +48,30 @@ sigc::signal<void> ArdourMeter::RedrawMetrics;
sigc::signal<void, int, ARDOUR::RouteGroup*, ARDOUR::MeterType> ArdourMeter::SetMeterTypeMulti;
+
+/* pattern cache */
+
+struct MeterMatricsMapKey {
+ 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) || (_n == rhs._n && _t == rhs._t && _dt < rhs._dt);
+ }
+ std::string _n;
+ MeterType _t;
+ int _dt;
+};
+
namespace ArdourMeter {
- typedef std::map<std::string,cairo_pattern_t*> TickPatterns;
- typedef std::map<std::string,cairo_pattern_t*> MetricPatterns;
+ typedef std::map<MeterMatricsMapKey, cairo_pattern_t*> MetricPatternMap;
}
-static ArdourMeter::TickPatterns ticks_patterns;
-static ArdourMeter::MetricPatterns metric_patterns;
+static ArdourMeter::MetricPatternMap ticks_patterns;
+static ArdourMeter::MetricPatternMap metric_patterns;
+
const std::string
ArdourMeter::meter_type_string (ARDOUR::MeterType mt)
@@ -64,31 +83,231 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt)
case MeterKrms:
return _("RMS + Peak");
break;
+ case MeterIEC1DIN:
+ return _("IEC1/DIN");
+ break;
+ case MeterIEC1NOR:
+ return _("IEC1/Nordic");
+ break;
+ case MeterIEC2BBC:
+ return _("IEC2/BBC");
+ break;
+ case MeterIEC2EBU:
+ return _("IEC2/EBU");
+ break;
+ case MeterK20:
+ return _("K20");
+ break;
+ case MeterK14:
+ return _("K14");
+ break;
+ case MeterVU:
+ return _("VU");
+ break;
default:
return _("???");
break;
}
}
+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)
+{
+ float fraction = 0;
+
+ switch (mt) {
+ default:
+ case MeterKrms:
+ case MeterPeak:
+ fraction = log_meter (val);
+ if (val >= 0 || val == -9) {
+ 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());
+ }
+ break;
+ case MeterIEC2BBC:
+ case MeterIEC2EBU:
+ fraction = meter_deflect_ppm(val);
+ 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 0
+ if (val == -18.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());
+ }
+#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 || val == -15 || val == -18) {
+ 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());
+ }
+ break;
+ case MeterVU:
+ fraction = meter_deflect_vu(val);
+ if (val >= -20.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());
+ }
+ break;
+ case MeterK20:
+ fraction = meter_deflect_k (val, 20);
+ if (val >= -16.0) {
+ cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); // red
+ } else if (val >= -20.0) {
+ cairo_set_source_rgb (cr, 0.8, 0.8, 0.0); // yellow
+ } else {
+ cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); // green
+ }
+ break;
+ case MeterK14:
+ if (val >= -10.0) {
+ cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); // red
+ } else if (val >= -14.0) {
+ cairo_set_source_rgb (cr, 0.8, 0.8, 0.0); // yellow
+ } else {
+ cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); // green
+ }
+ fraction = meter_deflect_k (val, 14);
+ break;
+ }
+ 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, vector<ARDOUR::DataType> types)
+meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> types)
{
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);
@@ -99,85 +318,208 @@ meter_render_ticks (Gtk::Widget& w, vector<ARDOUR::DataType> types)
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());
}
- std::map<int,float> points;
+ // tick-maker position in dBFS, line-thickness
+ std::map<float,float> points;
switch (*i) {
case DataType::AUDIO:
- points.insert (std::pair<int,float>(-60, 0.5));
- points.insert (std::pair<int,float>(-50, 0.5));
- points.insert (std::pair<int,float>(-40, 0.5));
- points.insert (std::pair<int,float>(-30, 0.5));
- if (Config->get_meter_line_up_level() == MeteringLineUp24) {
- points.insert (std::pair<int,float>(-24, 0.5));
- } else {
- points.insert (std::pair<int,float>(-25, 0.5));
+
+ switch (type) {
+ case MeterK14:
+ points.insert (std::pair<float,float>(-54.0f, 1.0));
+ points.insert (std::pair<float,float>(-44.0f, 1.0));
+ points.insert (std::pair<float,float>(-34.0f, 1.0));
+ 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)); // 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:
+ points.insert (std::pair<float,float>(-60.0f, 1.0));
+ points.insert (std::pair<float,float>(-50.0f, 1.0));
+ points.insert (std::pair<float,float>(-40.0f, 1.0));
+ 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)); // 0
+ points.insert (std::pair<float,float>(-17.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)); //+20
+ break;
+ case MeterIEC2EBU:
+ points.insert (std::pair<float,float>(-30.0f, 1.0));
+ points.insert (std::pair<float,float>(-28.0f, 0.5));
+ points.insert (std::pair<float,float>(-26.0f, 1.0));
+ points.insert (std::pair<float,float>(-24.0f, 0.5));
+ points.insert (std::pair<float,float>(-22.0f, 1.0));
+ points.insert (std::pair<float,float>(-20.0f, 0.5));
+ points.insert (std::pair<float,float>(-18.0f, 1.0));
+ points.insert (std::pair<float,float>(-16.0f, 0.5));
+ 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.8));
+ points.insert (std::pair<float,float>( -8.0f, 0.5));
+ points.insert (std::pair<float,float>( -6.0f, 1.0));
+ break;
+ case MeterIEC2BBC:
+ 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>(-22.0f, 1.0));
+ points.insert (std::pair<float,float>(-18.0f, 1.0));
+ points.insert (std::pair<float,float>(-14.0f, 1.0));
+ points.insert (std::pair<float,float>(-10.0f, 1.0));
+ points.insert (std::pair<float,float>( -6.0f, 1.0));
+ break;
+ case MeterIEC1NOR:
+ points.insert (std::pair<float,float>(-60.0f, 1.0)); // -42
+ points.insert (std::pair<float,float>(-57.0f, 0.5));
+ points.insert (std::pair<float,float>(-54.0f, 1.0));
+ points.insert (std::pair<float,float>(-51.0f, 0.5));
+ points.insert (std::pair<float,float>(-48.0f, 1.0));
+ points.insert (std::pair<float,float>(-45.0f, 0.5));
+ points.insert (std::pair<float,float>(-42.0f, 1.0));
+ 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, 0.5));
+ points.insert (std::pair<float,float>(-30.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, 0.5));
+
+ points.insert (std::pair<float,float>(-18.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, 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));
+ 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.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)); //+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>(-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)); //-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>(-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:
+ points.insert (std::pair<float,float>(-60, 0.5));
+ points.insert (std::pair<float,float>(-50, 1.0));
+ points.insert (std::pair<float,float>(-40, 1.0));
+ points.insert (std::pair<float,float>(-30, 1.0));
+ if (Config->get_meter_line_up_level() == MeteringLineUp24) {
+ points.insert (std::pair<float,float>(-24, 1.0));
+ } else {
+ points.insert (std::pair<float,float>(-25, 1.0));
+ }
+ points.insert (std::pair<float,float>(-20, 1.0));
+
+ points.insert (std::pair<float,float>(-19, 0.5));
+ points.insert (std::pair<float,float>(-18, 1.0));
+ points.insert (std::pair<float,float>(-17, 0.5));
+ points.insert (std::pair<float,float>(-16, 0.5));
+ points.insert (std::pair<float,float>(-15, 1.0));
+
+ points.insert (std::pair<float,float>(-14, 0.5));
+ points.insert (std::pair<float,float>(-13, 0.5));
+ points.insert (std::pair<float,float>(-12, 0.5));
+ points.insert (std::pair<float,float>(-11, 0.5));
+ points.insert (std::pair<float,float>(-10, 1.0));
+
+ points.insert (std::pair<float,float>( -9, 1.0));
+ points.insert (std::pair<float,float>( -8, 0.5));
+ points.insert (std::pair<float,float>( -7, 0.5));
+ points.insert (std::pair<float,float>( -6, 0.5));
+ points.insert (std::pair<float,float>( -5, 1.0));
+ points.insert (std::pair<float,float>( -4, 0.5));
+ points.insert (std::pair<float,float>( -3, 1.0));
+ points.insert (std::pair<float,float>( -2, 0.5));
+ points.insert (std::pair<float,float>( -1, 0.5));
+
+ points.insert (std::pair<float,float>( 0, 1.0));
+ points.insert (std::pair<float,float>( 1, 0.5));
+ points.insert (std::pair<float,float>( 2, 0.5));
+ points.insert (std::pair<float,float>( 3, 1.0));
+ points.insert (std::pair<float,float>( 4, 0.5));
+ points.insert (std::pair<float,float>( 5, 0.5));
+ break;
}
- points.insert (std::pair<int,float>(-20, 1.0));
-
- points.insert (std::pair<int,float>(-19, 0.5));
- points.insert (std::pair<int,float>(-18, 1.0));
- points.insert (std::pair<int,float>(-17, 0.5));
- points.insert (std::pair<int,float>(-16, 0.5));
- points.insert (std::pair<int,float>(-15, 1.0));
-
- points.insert (std::pair<int,float>(-14, 0.5));
- points.insert (std::pair<int,float>(-13, 0.5));
- points.insert (std::pair<int,float>(-12, 0.5));
- points.insert (std::pair<int,float>(-11, 0.5));
- points.insert (std::pair<int,float>(-10, 1.0));
-
- points.insert (std::pair<int,float>( -9, 0.5));
- points.insert (std::pair<int,float>( -8, 0.5));
- points.insert (std::pair<int,float>( -7, 0.5));
- points.insert (std::pair<int,float>( -6, 0.5));
- points.insert (std::pair<int,float>( -5, 1.0));
- points.insert (std::pair<int,float>( -4, 0.5));
- points.insert (std::pair<int,float>( -3, 0.5));
- points.insert (std::pair<int,float>( -2, 0.5));
- points.insert (std::pair<int,float>( -1, 0.5));
-
- points.insert (std::pair<int,float>( 0, 1.0));
- points.insert (std::pair<int,float>( 1, 0.5));
- points.insert (std::pair<int,float>( 2, 0.5));
- points.insert (std::pair<int,float>( 3, 0.5));
- points.insert (std::pair<int,float>( 4, 0.5));
- points.insert (std::pair<int,float>( 5, 0.5));
break;
case DataType::MIDI:
- points.insert (std::pair<int,float>( 0, 1.0));
- points.insert (std::pair<int,float>( 16, 0.5));
- points.insert (std::pair<int,float>( 32, 0.5));
- points.insert (std::pair<int,float>( 48, 0.5));
- points.insert (std::pair<int,float>( 64, 1.0));
- points.insert (std::pair<int,float>( 80, 0.5));
- points.insert (std::pair<int,float>( 96, 0.5));
- points.insert (std::pair<int,float>(100, 1.0));
- points.insert (std::pair<int,float>(112, 0.5));
- points.insert (std::pair<int,float>(127, 1.0));
+ points.insert (std::pair<float,float>( 0, 1.0));
+ points.insert (std::pair<float,float>( 16, 0.5));
+ points.insert (std::pair<float,float>( 32, 0.5));
+ points.insert (std::pair<float,float>( 48, 0.5));
+ points.insert (std::pair<float,float>( 64, 1.0));
+ points.insert (std::pair<float,float>( 80, 0.5));
+ points.insert (std::pair<float,float>( 96, 0.5));
+ points.insert (std::pair<float,float>(100, 1.0));
+ points.insert (std::pair<float,float>(112, 0.5));
+ points.insert (std::pair<float,float>(127, 1.0));
break;
}
- for (std::map<int,float>::const_iterator j = points.begin(); j != points.end(); ++j) {
+ for (std::map<float,float>::const_iterator j = points.begin(); j != points.end(); ++j) {
cairo_set_line_width (cr, (j->second));
float fraction = 0;
@@ -185,16 +527,10 @@ meter_render_ticks (Gtk::Widget& w, vector<ARDOUR::DataType> types)
switch (*i) {
case DataType::AUDIO:
- if (j->first >= 0 || j->first == -9) {
- 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());
- }
- fraction = log_meter (j->first);
+ fraction = mtr_col_and_fract(cr, &c, peakcolor, type, j->first);
+
pos = height - (gint) floor (height * fraction);
+ pos = max (pos, 1);
cairo_move_to(cr, 0, pos + .5);
cairo_line_to(cr, 3, pos + .5);
cairo_stroke (cr);
@@ -203,6 +539,7 @@ meter_render_ticks (Gtk::Widget& w, vector<ARDOUR::DataType> types)
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;
@@ -218,19 +555,24 @@ meter_render_ticks (Gtk::Widget& w, vector<ARDOUR::DataType> types)
return pattern;
}
-
static cairo_pattern_t*
-meter_render_metrics (Gtk::Widget& w, vector<DataType> types)
+meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
{
Glib::RefPtr<Gdk::Window> win (w.get_window());
- bool tickleft;
+ bool tickleft, tickright;
bool background;
+ int overlay_midi = 1;
gint width, height;
win->get_size (width, height);
tickleft = w.get_name().substr(w.get_name().length() - 4) == "Left";
- background = types.size() == 0 || tickleft || w.get_name().substr(w.get_name().length() - 5) == "Right";
+ tickright = w.get_name().substr(w.get_name().length() - 5) == "Right";
+ background = types.size() == 0 || tickleft || tickright;
+
+ if (!tickleft && !tickright) {
+ tickright = true;
+ }
cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
cairo_t* cr = cairo_create (surface);
@@ -243,182 +585,361 @@ meter_render_metrics (Gtk::Widget& w, vector<DataType> types)
Pango::AttrFontDesc* font_attr;
Pango::FontDescription font;
- font = Pango::FontDescription (""); // use defaults
- //font = get_font_for_style("gain-fader");
- //font = w.get_style()->get_font();
+ font = Pango::FontDescription ("ArdourMono");
+ double fixfontsize = 81920.0 / (double) ARDOUR::Config->get_font_scale();
font.set_weight (Pango::WEIGHT_NORMAL);
- font.set_size (9.0 * PANGO_SCALE);
+ font.set_size (9.0 * PANGO_SCALE * fixfontsize);
font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font));
audio_font_attributes.change (*font_attr);
delete font_attr;
font.set_weight (Pango::WEIGHT_ULTRALIGHT);
font.set_stretch (Pango::STRETCH_ULTRA_CONDENSED);
- font.set_size (7.5 * PANGO_SCALE);
+ font.set_size (8.0 * PANGO_SCALE * fixfontsize);
font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font));
midi_font_attributes.change (*font_attr);
delete font_attr;
- font.set_size (7.0 * PANGO_SCALE);
+ font.set_size (6.0 * PANGO_SCALE * fixfontsize);
font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font));
unit_font_attributes.change (*font_attr);
delete font_attr;
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);
+ cairo_set_line_width (cr, 1.0);
+
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 && (*i) == DataType::MIDI && overlay_midi == 0) {
+ continue;
+ }
- if (types.size() > 1) {
+ if (types.size() > 1 && (*i) == DataType::MIDI) {
/* we're overlaying more than 1 set of marks, so use different colours */
- Gdk::Color c;
- 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());
}
- std::map<int,float> points;
+ std::map<float,string> points; // map: label-pos in dBFS, label-text
switch (*i) {
case DataType::AUDIO:
layout->set_attributes (audio_font_attributes);
- points.insert (std::pair<int,float>(-50, 0.5));
- points.insert (std::pair<int,float>(-40, 0.5));
- points.insert (std::pair<int,float>(-30, 0.5));
- points.insert (std::pair<int,float>(-20, 1.0));
- if (types.size() == 1) {
- if (Config->get_meter_line_up_level() == MeteringLineUp24) {
- points.insert (std::pair<int,float>(-24, 0.5));
- } else {
- points.insert (std::pair<int,float>(-25, 0.5));
- }
- points.insert (std::pair<int,float>(-15, 1.0));
+ 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>(-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>(-17.0f, "+3"));
+ points.insert (std::pair<float,string>(-14.0f, "+6"));
+ points.insert (std::pair<float,string>(-10.0f, "+10"));
+ points.insert (std::pair<float,string>( -5.0f, "+15"));
+ points.insert (std::pair<float,string>( 0.0f, "+20"));
+ break;
+ default:
+ case MeterPeak:
+ case MeterKrms:
+ points.insert (std::pair<float,string>(-50.0f, "-50"));
+ points.insert (std::pair<float,string>(-40.0f, "-40"));
+ points.insert (std::pair<float,string>(-30.0f, "-30"));
+ points.insert (std::pair<float,string>(-20.0f, "-20"));
+ if (types.size() == 1) {
+ if (Config->get_meter_line_up_level() == MeteringLineUp24) {
+ points.insert (std::pair<float,string>(-24.0f, "-24"));
+ } else {
+ points.insert (std::pair<float,string>(-25.0f, "-25"));
+ }
+ points.insert (std::pair<float,string>(-15.0f, "-15"));
+ }
+ points.insert (std::pair<float,string>(-18.0f, "-18"));
+ points.insert (std::pair<float,string>(-10.0f, "-10"));
+ points.insert (std::pair<float,string>( -5.0f, "-5"));
+ points.insert (std::pair<float,string>( -3.0f, "-3"));
+ points.insert (std::pair<float,string>( 0.0f, "+0"));
+ points.insert (std::pair<float,string>( 3.0f, "+3"));
+ 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"));
+ points.insert (std::pair<float,string>(-18.0f, "TST"));
+ points.insert (std::pair<float,string>(-14.0f, "+4"));
+ points.insert (std::pair<float,string>(-10.0f, "+8"));
+ points.insert (std::pair<float,string>( -6.0f, "+12"));
+ 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 "));
+ points.insert (std::pair<float,string>(-18.0f, " 4 "));
+ points.insert (std::pair<float,string>(-14.0f, " 5 "));
+ points.insert (std::pair<float,string>(-10.0f, " 6 "));
+ points.insert (std::pair<float,string>( -6.0f, " 7 "));
+ 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>(-30.0f, "-12"));
+ //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>(-18.0f, "TST"));
+ //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"));
+ break;
+
+ case MeterIEC1DIN:
+ overlay_midi = 2;
+ //points.insert (std::pair<float,string>( -3.0f, "200%"));
+ 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, "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>(-21.0f, "-1"));
+ points.insert (std::pair<float,string>(-22.0f, "-2"));
+ points.insert (std::pair<float,string>(-23.0f, "-3"));
+ points.insert (std::pair<float,string>(-25.0f, "-5"));
+ points.insert (std::pair<float,string>(-27.0f, "-7"));
+ points.insert (std::pair<float,string>(-30.0f, "-10"));
+ points.insert (std::pair<float,string>(-40.0f, "-20"));
+ break;
}
- points.insert (std::pair<int,float>(-18, 1.0));
- points.insert (std::pair<int,float>(-10, 1.0));
- points.insert (std::pair<int,float>( -5, 1.0));
- points.insert (std::pair<int,float>( -3, 0.5));
- points.insert (std::pair<int,float>( 0, 1.0));
- points.insert (std::pair<int,float>( 3, 0.5));
break;
-
case DataType::MIDI:
layout->set_attributes (midi_font_attributes);
- points.insert (std::pair<int,float>( 0, 1.0));
if (types.size() == 1) {
- points.insert (std::pair<int,float>( 16, 0.5));
- points.insert (std::pair<int,float>( 32, 0.5));
- points.insert (std::pair<int,float>( 48, 0.5));
- points.insert (std::pair<int,float>( 64, 1.0));
- points.insert (std::pair<int,float>( 80, 0.5));
- points.insert (std::pair<int,float>( 96, 0.5));
- points.insert (std::pair<int,float>(100, 0.5));
- points.insert (std::pair<int,float>(112, 0.5));
+ 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"));
+ points.insert (std::pair<float,string>( 64, "64"));
+ points.insert (std::pair<float,string>( 80, "80"));
+ points.insert (std::pair<float,string>( 96, "96"));
+ 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<int,float>( 24, 0.5));
- points.insert (std::pair<int,float>( 48, 0.5));
- points.insert (std::pair<int,float>( 72, 0.5));
+ 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<int,float>(127, 1.0));
break;
}
- char buf[32];
- gint pos;
-
- for (std::map<int,float>::const_iterator j = points.begin(); j != points.end(); ++j) {
+ gint pos = -1;
+ for (std::map<float,string>::const_iterator j = points.begin(); j != points.end(); ++j) {
float fraction = 0;
+ bool align_center = background; // this is true for meterbridge meters w/ fixed background
switch (*i) {
- case DataType::AUDIO:
- cairo_set_line_width (cr, (j->second));
- if (j->first >= 0) {
- cairo_set_source_rgb (cr,
- UINT_RGBA_R_FLT(peakcolor),
- UINT_RGBA_G_FLT(peakcolor),
- UINT_RGBA_B_FLT(peakcolor));
- }
- fraction = log_meter (j->first);
- snprintf (buf, sizeof (buf), "%+2d", j->first);
- pos = height - (gint) floor (height * fraction);
- if (tickleft) {
- cairo_move_to(cr, width-1.5, pos + .5);
- cairo_line_to(cr, width, pos + .5);
- } else {
- cairo_move_to(cr, 0, pos + .5);
- cairo_line_to(cr, 1.5, pos + .5);
- }
- cairo_stroke (cr);
- break;
- case DataType::MIDI:
- cairo_set_line_width (cr, 1.0);
- fraction = (j->first) / 127.0;
- snprintf (buf, sizeof (buf), "%3d", j->first);
- pos = 1 + height - (gint) rintf (height * fraction);
- pos = min (pos, height);
- if (tickleft) {
- cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI);
- } else {
- cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI);
- }
- cairo_fill(cr);
- break;
+ case DataType::AUDIO:
+ fraction = mtr_col_and_fract(cr, &c, peakcolor, type, j->first);
+
+ pos = height - (gint) floor (height * fraction);
+ pos = max (pos, 1);
+ if (tickleft) {
+ cairo_move_to(cr, width-1.5, pos + .5);
+ cairo_line_to(cr, width, pos + .5);
+ cairo_stroke (cr);
+ } else if (tickright) {
+ cairo_move_to(cr, 0, pos + .5);
+ cairo_line_to(cr, 1.5, pos + .5);
+ cairo_stroke (cr);
+ }
+ break;
+
+ case DataType::MIDI:
+ align_center = false; // don't bleed into legend
+ 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);
+ } else if (tickright) {
+ cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI);
+ cairo_fill(cr);
+ }
+ break;
}
- layout->set_text(buf);
+ if (pos < 0) continue;
- /* we want logical extents, not ink extents here */
+ layout->set_text(j->second.c_str());
int tw, th;
layout->get_pixel_size(tw, th);
- int p = pos - (th / 2);
+ int p = pos - (th / 2) - 1;
p = min (p, height - th);
p = max (p, 0);
- cairo_move_to (cr, width-3-tw, p);
+ if (align_center) {
+ cairo_move_to (cr, (width-tw)/2.0, p);
+ } 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);
}
}
- if (types.size() == 1) {
+ // add legend
+ if (types.size() == 1 || overlay_midi == 0) {
int tw, th;
layout->set_attributes (unit_font_attributes);
switch (types.at(0)) {
case DataType::AUDIO:
- layout->set_text("dBFS");
+ switch (type) {
+ case MeterK20:
+ layout->set_text("K20");
+ break;
+ case MeterK14:
+ layout->set_text("K14");
+ break;
+ default:
+ case MeterPeak:
+ case MeterKrms:
+ layout->set_text("dBFS");
+ break;
+ case MeterIEC2EBU:
+ layout->set_text("EBU");
+ break;
+ case MeterIEC2BBC:
+ layout->set_text("BBC");
+ break;
+ case MeterIEC1DIN:
+ layout->set_text("DIN");
+ break;
+ case MeterIEC1NOR:
+ layout->set_text("NOR");
+ break;
+ case MeterVU:
+ layout->set_text("VU");
+ break;
+ }
layout->get_pixel_size(tw, th);
break;
case DataType::MIDI:
- layout->set_text("vel");
+ layout->set_text("mid");
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());
- cairo_move_to (cr, 2, height - th - 1.5);
+ if (tickleft) {
+ cairo_move_to (cr, width - 2 - tw, height - th - 0.5);
+ } else {
+ cairo_move_to (cr, 2, height - th - 0.5);
+ }
pango_cairo_show_layout (cr, layout->gobj());
}
@@ -430,9 +951,8 @@ meter_render_metrics (Gtk::Widget& w, vector<DataType> types)
return pattern;
}
-
gint
-ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mta)
+ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, MeterType type, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mta)
{
Glib::RefPtr<Gdk::Window> win (mta->get_window());
cairo_t* cr;
@@ -445,11 +965,12 @@ ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, std::vector<ARDOUR::DataTyp
cairo_clip (cr);
cairo_pattern_t* pattern;
- TickPatterns::iterator i = ticks_patterns.find (mta->get_name());
+ const MeterMatricsMapKey key (mta->get_name(), type, types_to_bit(types));
+ MetricPatternMap::iterator i = ticks_patterns.find (key);
if (i == ticks_patterns.end()) {
- pattern = meter_render_ticks (*mta, types);
- ticks_patterns[mta->get_name()] = pattern;
+ pattern = meter_render_ticks (*mta, type, types);
+ ticks_patterns[key] = pattern;
} else {
pattern = i->second;
}
@@ -469,7 +990,7 @@ ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, std::vector<ARDOUR::DataTyp
}
gint
-ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mma)
+ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, MeterType type, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mma)
{
Glib::RefPtr<Gdk::Window> win (mma->get_window());
cairo_t* cr;
@@ -482,11 +1003,12 @@ ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, std::vector<ARDOUR::DataT
cairo_clip (cr);
cairo_pattern_t* pattern;
- MetricPatterns::iterator i = metric_patterns.find (mma->get_name());
+ const MeterMatricsMapKey key (mma->get_name(), type, types_to_bit(types));
+ MetricPatternMap::iterator i = metric_patterns.find (key);
if (i == metric_patterns.end()) {
- pattern = meter_render_metrics (*mma, types);
- metric_patterns[mma->get_name()] = pattern;
+ pattern = meter_render_metrics (*mma, type, types);
+ metric_patterns[key] = pattern;
} else {
pattern = i->second;
}
@@ -507,12 +1029,13 @@ ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, std::vector<ARDOUR::DataT
void
ArdourMeter::meter_clear_pattern_cache(int which) {
- MetricPatterns::iterator i = metric_patterns.begin();
- TickPatterns::iterator j = ticks_patterns.begin();
+ MetricPatternMap::iterator i = metric_patterns.begin();
+ MetricPatternMap::iterator j = ticks_patterns.begin();
while (i != metric_patterns.end()) {
int m = 4;
- std::string n = i->first;
+ MeterMatricsMapKey const * const key = &(i->first);
+ std::string n = key->_n;
if (n.substr(n.length() - 4) == "Left") { m = 1; }
if (n.substr(n.length() - 5) == "Right") { m = 2; }
if (which & m) {
@@ -525,7 +1048,8 @@ ArdourMeter::meter_clear_pattern_cache(int which) {
while (j != ticks_patterns.end()) {
int m = 4;
- std::string n = j->first;
+ MeterMatricsMapKey const * const key = &(j->first);
+ std::string n = key->_n;
if (n.substr(n.length() - 4) == "Left") { m = 1; }
if (n.substr(n.length() - 5) == "Right") { m = 2; }
if (which & m) {
diff --git a/gtk2_ardour/meter_patterns.h b/gtk2_ardour/meter_patterns.h
index 90ef4ec980..f505ba37c7 100644
--- a/gtk2_ardour/meter_patterns.h
+++ b/gtk2_ardour/meter_patterns.h
@@ -37,8 +37,8 @@ extern sigc::signal<void> RedrawMetrics;
extern sigc::signal<void, int, ARDOUR::RouteGroup*, ARDOUR::MeterType> SetMeterTypeMulti;
-gint meter_expose_ticks (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mta);
-gint meter_expose_metrics (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mma);
+gint meter_expose_ticks (GdkEventExpose *ev, ARDOUR::MeterType type, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mta);
+gint meter_expose_metrics (GdkEventExpose *ev, ARDOUR::MeterType type, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mma);
void meter_clear_pattern_cache(int which=7);
diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc
index 44144114a4..ede9cc2074 100644
--- a/gtk2_ardour/meter_strip.cc
+++ b/gtk2_ardour/meter_strip.cc
@@ -56,18 +56,24 @@ using namespace ArdourMeter;
PBD::Signal1<void,MeterStrip*> MeterStrip::CatchDeletion;
PBD::Signal0<void> MeterStrip::MetricChanged;
+PBD::Signal0<void> MeterStrip::ConfigurationChanged;
-MeterStrip::MeterStrip (int metricmode)
+MeterStrip::MeterStrip (int metricmode, MeterType mt)
: AxisView(0)
, RouteUI(0)
{
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);
+ set_metric_mode(metricmode, mt);
meter_metric_area.set_size_request(25, 10);
meter_metric_area.signal_expose_event().connect (
@@ -76,15 +82,30 @@ MeterStrip::MeterStrip (int metricmode)
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->setup_meters (220, meter_width, 6);
level_meter->set_type (_route->meter_type());
- level_meter->ButtonPress.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::level_meter_button_press, this, _1));
+ level_meter->setup_meters (220, meter_width, 6);
+ 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));
@@ -303,6 +348,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 +395,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 +413,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 +459,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);
@@ -394,12 +495,22 @@ MeterStrip::on_size_allocate (Gtk::Allocation& a)
gint
MeterStrip::meter_metrics_expose (GdkEventExpose *ev)
{
- return meter_expose_metrics(ev, _types, &meter_metric_area);
+ if (_route) {
+ return meter_expose_metrics(ev, _route->meter_type(), _types, &meter_metric_area);
+ } else {
+ return meter_expose_metrics(ev, metric_type, _types, &meter_metric_area);
+ }
}
void
-MeterStrip::set_metric_mode (int metricmode)
+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:
@@ -420,25 +531,50 @@ MeterStrip::set_metric_mode (int metricmode)
_types.push_back (DataType::AUDIO);
break;
}
-
+ update_background (mt);
meter_metric_area.queue_draw ();
}
void
-MeterStrip::set_pos (int pos)
+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()
{
+ assert((!_route && _strip_type == 0) || (_route && _strip_type != 0));
+ if (!_route) return metric_type;
+ return _route->meter_type();
}
gint
MeterStrip::meter_ticks1_expose (GdkEventExpose *ev)
{
- return meter_expose_ticks(ev, _types, &meter_ticks1_area);
+ assert(_route);
+ return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks1_area);
}
gint
MeterStrip::meter_ticks2_expose (GdkEventExpose *ev)
{
- return meter_expose_ticks(ev, _types, &meter_ticks2_area);
+ assert(_route);
+ return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks2_area);
}
void
@@ -546,11 +682,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);
@@ -571,8 +709,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_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);
@@ -589,8 +734,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_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_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, MeterType type)
+MeterStrip::add_level_meter_type_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, MeterType type)
{
using namespace Menu_Helpers;
@@ -603,13 +793,26 @@ 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)
{
- _route->set_meter_type(type);
+ if (_route->meter_type() != type) {
+ _route->set_meter_type(type);
+ }
+ update_background (type);
+ MetricChanged();
}
void
diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h
index 60e77eb2ef..e817f7d5c6 100644
--- a/gtk2_ardour/meter_strip.h
+++ b/gtk2_ardour/meter_strip.h
@@ -47,7 +47,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI
{
public:
MeterStrip (ARDOUR::Session*, boost::shared_ptr<ARDOUR::Route>);
- MeterStrip (int);
+ MeterStrip (int, ARDOUR::MeterType);
~MeterStrip ();
void set_session (ARDOUR::Session* s);
@@ -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*);
@@ -63,9 +64,13 @@ class MeterStrip : public Gtk::VBox, public RouteUI
void set_meter_type_multi (int, ARDOUR::RouteGroup*, ARDOUR::MeterType);
- void set_metric_mode (int);
- void set_pos(int);
+ 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();
protected:
boost::shared_ptr<ARDOUR::Route> _route;
@@ -88,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;
@@ -106,19 +116,21 @@ class MeterStrip : public Gtk::VBox, public RouteUI
ArdourButton peak_display;
std::vector<ARDOUR::DataType> _types;
+ ARDOUR::MeterType metric_type;
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*);
@@ -128,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 cdecb36c7c..a0110365c1 100644
--- a/gtk2_ardour/meterbridge.cc
+++ b/gtk2_ardour/meterbridge.cc
@@ -101,8 +101,8 @@ Meterbridge::Meterbridge ()
, VisibilityTracker (*((Gtk::Window*) this))
, _visible (false)
, _show_busses (false)
- , metrics_left (1)
- , metrics_right (2)
+ , metrics_left (1, MeterPeak)
+ , metrics_right (2, MeterPeak)
, cur_max_width (-1)
{
set_name ("Meter Bridge");
@@ -140,7 +140,8 @@ Meterbridge::Meterbridge ()
signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler));
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_same_thread (*this, boost::bind(&Meterbridge::update_metrics, this));
+ 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());
@@ -192,6 +193,10 @@ Meterbridge::Meterbridge ()
Meterbridge::~Meterbridge ()
{
+ while (_metrics.size() > 0) {
+ delete (_metrics.back());
+ _metrics.pop_back();
+ }
}
void
@@ -332,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;
@@ -349,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);
@@ -363,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);
@@ -550,7 +616,6 @@ Meterbridge::add_strips (RouteList& routes)
}
resync_order();
- update_metrics();
}
void
@@ -567,28 +632,10 @@ Meterbridge::remove_strip (MeterStrip* strip)
break;
}
}
- update_metrics();
}
void
-Meterbridge::update_metrics ()
-{
- bool have_midi = false;
- for (list<MeterBridgeStrip>::iterator i = strips.begin(); i != strips.end(); ++i) {
- if ( (*i).s->has_midi() && (*i).visible) {
- have_midi = true;
- break;
- }
- }
- if (have_midi) {
- metrics_right.set_metric_mode(2);
- } else {
- metrics_right.set_metric_mode(3);
- }
-}
-
-void
-Meterbridge::sync_order_keys (RouteSortOrderKey src)
+Meterbridge::sync_order_keys (RouteSortOrderKey)
{
Glib::Threads::Mutex::Lock lm (_resync_mutex);
@@ -597,6 +644,12 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src)
int pos = 0;
int vis = 0;
+ MeterStrip * last = 0;
+
+ unsigned int metrics = 0;
+ MeterType lmt = MeterPeak;
+ bool have_midi = false;
+ metrics_left.set_metric_mode(1, lmt);
for (list<MeterBridgeStrip>::iterator i = strips.begin(); i != strips.end(); ++i) {
@@ -642,9 +695,80 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src)
(*i).visible = true;
vis++;
}
- (*i).s->set_pos(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);
+ _metrics[metrics]->set_session(_session);
+ _metrics[metrics]->show();
+ } else {
+ _metrics[metrics]->set_metric_mode(have_midi ? 2 : 3, lmt);
+ }
+ meterarea.reorder_child(*_metrics[metrics], pos++);
+ metrics++;
+
+ lmt = nmt;
+
+ if (_metrics.size() <= metrics) {
+ _metrics.push_back(new MeterStrip(1, lmt));
+ meterarea.pack_start (*_metrics[metrics], false, false);
+ _metrics[metrics]->set_session(_session);
+ _metrics[metrics]->show();
+ } else {
+ _metrics[metrics]->set_metric_mode(1, lmt);
+ }
+ meterarea.reorder_child(*_metrics[metrics], pos++);
+ metrics++;
+ have_midi = false;
+ }
+
+ if ((*i).visible && (*i).s->has_midi()) {
+ have_midi = true;
+ }
+
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);
+
+ while (_metrics.size() > metrics) {
+ meterarea.remove(*_metrics.back());
+ 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
@@ -659,21 +783,17 @@ Meterbridge::parameter_changed (std::string const & p)
if (p == "show-busses-on-meterbridge") {
_show_busses = _session->config.get_show_busses_on_meterbridge();
resync_order();
- update_metrics();
}
else if (p == "show-master-on-meterbridge") {
_show_master = _session->config.get_show_master_on_meterbridge();
resync_order();
- update_metrics();
}
else if (p == "show-midi-on-meterbridge") {
_show_midi = _session->config.get_show_midi_on_meterbridge();
resync_order();
- update_metrics();
}
else if (p == "meter-line-up-level") {
meter_clear_pattern_cache();
- update_metrics();
}
else if (p == "show-rec-on-meterbridge") {
scroller.queue_resize();
@@ -687,6 +807,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 32ab2c929d..2fac91cd0a 100644
--- a/gtk2_ardour/meterbridge.h
+++ b/gtk2_ardour/meterbridge.h
@@ -78,7 +78,6 @@ class Meterbridge :
void add_strips (ARDOUR::RouteList&);
void remove_strip (MeterStrip *);
- void update_metrics ();
void session_going_away ();
void sync_order_keys (ARDOUR::RouteSortOrderKey src);
@@ -116,6 +115,7 @@ class Meterbridge :
MeterStrip metrics_left;
MeterStrip metrics_right;
+ std::vector<MeterStrip *> _metrics;
Gtk::VBox metrics_vpacker_left;
Gtk::VBox metrics_vpacker_right;
@@ -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/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index b6d4001e2d..9e2140fd10 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -2134,7 +2134,14 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev)
items.push_back (SeparatorElem());
add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterPeak), MeterPeak);
- add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterKrms), MeterKrms);
+ add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterKrms), MeterKrms);
+ add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN);
+ add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR);
+ add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC);
+ add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU);
+ add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK20), MeterK20);
+ add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK14), MeterK14);
+ add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterVU), MeterVU);
int _strip_type;
if (_route->is_master()) {
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/processor_box.cc b/gtk2_ardour/processor_box.cc
index 5e8be81074..77f0e2da01 100644
--- a/gtk2_ardour/processor_box.cc
+++ b/gtk2_ardour/processor_box.cc
@@ -213,6 +213,7 @@ void
ProcessorEntry::set_enum_width (Width w)
{
_width = w;
+ _button.set_text (name (_width));
}
void
@@ -658,7 +659,8 @@ PluginInsertProcessorEntry::SplittingIcon::on_expose_event (GdkEventExpose* ev)
cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
cairo_clip (cr);
- cairo_set_line_width (cr, 1);
+ cairo_set_line_width (cr, 1.5);
+ cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
Gtk::Allocation a = get_allocation();
double const width = a.get_width();
@@ -673,12 +675,19 @@ PluginInsertProcessorEntry::SplittingIcon::on_expose_event (GdkEventExpose* ev)
Gdk::Color const fg = get_style()->get_fg (STATE_NORMAL);
cairo_set_source_rgb (cr, fg.get_red_p (), fg.get_green_p (), fg.get_blue_p ());
- cairo_move_to (cr, width * 0.3, height);
- cairo_line_to (cr, width * 0.3, height * 0.5);
- cairo_line_to (cr, width * 0.7, height * 0.5);
- cairo_line_to (cr, width * 0.7, height);
- cairo_move_to (cr, width * 0.5, height * 0.5);
- cairo_line_to (cr, width * 0.5, 0);
+ const float si_l = rint(width * 0.3) + .5;
+ const float si_c = rint(width * 0.5) + .5;
+ const float si_r = rint(width * 0.7) + .5;
+ const float si_m = rint(height * 0.5) + .5;
+
+ cairo_move_to (cr, si_l, height);
+ cairo_line_to (cr, si_l, si_m);
+ cairo_line_to (cr, si_r, si_m);
+ cairo_line_to (cr, si_r, height);
+
+ cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT);
+ cairo_move_to (cr, si_c, si_m);
+ cairo_line_to (cr, si_c, 0);
cairo_stroke (cr);
return true;
diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc
index f78f5fc182..17ca374f60 100644
--- a/gtk2_ardour/rc_option_editor.cc
+++ b/gtk2_ardour/rc_option_editor.cc
@@ -831,7 +831,7 @@ public:
t->attach (*l, 0, 1, 1, 2, FILL);
t->attach (_video_server_url_entry, 1, 2, 1, 2, FILL);
Gtkmm2ext::UI::instance()->set_tip (_video_server_url_entry,
- _("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"));
+ _("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 running locally"));
l = manage (new Label (_("Video Folder:")));
l->set_alignment (0, 0.5);
@@ -1928,20 +1928,50 @@ RCOptionEditor::RCOptionEditor ()
ComboOption<MeterLineUp>* mlu = new ComboOption<MeterLineUp> (
"meter-line-up-level",
- _("Meter line-up level"),
+ _("Meter line-up level; 0dBu"),
sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_line_up_level),
sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_level)
);
- mlu->add (MeteringLineUp24, _("-24dB"));
- mlu->add (MeteringLineUp20, _("-20dB (SMPTE)"));
- mlu->add (MeteringLineUp18, _("-18dB (EBU)"));
- mlu->add (MeteringLineUp15, _("-15dB"));
+ 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."));
+ 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",
+ _("VU Meter standard"),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_vu_standard),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_vu_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);
+
Gtk::Adjustment *mpk = manage (new Gtk::Adjustment(0, -10, 0, .1, .1));
HSliderOption *mpks = new HSliderOption("meter-peak",
_("Peak threshold [dBFS]"),
@@ -1955,6 +1985,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 87ccfde3ba..bb10bea16f 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 43b97bb648..9494d42353 100644
--- a/gtk2_ardour/route_ui.cc
+++ b/gtk2_ardour/route_ui.cc
@@ -61,11 +61,16 @@ 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)
: AxisView(sess)
+ , mute_menu(0)
+ , solo_menu(0)
+ , sends_menu(0)
+ , record_menu(0)
+ , _invert_menu(0)
{
if (sess) init ();
}
@@ -166,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/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc
index f116041d03..bf2b90355f 100644
--- a/gtk2_ardour/sfdb_ui.cc
+++ b/gtk2_ardour/sfdb_ui.cc
@@ -344,7 +344,8 @@ SoundFileBox::audition ()
try {
afs = boost::dynamic_pointer_cast<AudioFileSource> (
SourceFactory::createExternal (DataType::AUDIO, *_session,
- path, n, Source::Flag (0), false));
+ path, n,
+ Source::Flag (0), false));
srclist.push_back(afs);
diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc
index 0ec79667ab..e24e7d6989 100644
--- a/gtk2_ardour/startup.cc
+++ b/gtk2_ardour/startup.cc
@@ -805,7 +805,15 @@ ArdourStartup::setup_new_session_page ()
string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR);
session_parent_dir = session_parent_dir.substr(0, last_dir_sep);
new_folder_chooser.set_current_folder (session_parent_dir);
- new_folder_chooser.add_shortcut_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
+ string default_session_folder = poor_mans_glob (Config->get_default_session_parent_dir());
+
+ try {
+ /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */
+ new_folder_chooser.add_shortcut_folder (default_session_folder);
+ }
+ catch (Glib::Error & e) {
+ std::cerr << "new_folder_chooser.add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl;
+ }
} else {
new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
}
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 15b9f40919..aedd7d25eb 100644
--- a/gtk2_ardour/transcode_ffmpeg.cc
+++ b/gtk2_ardour/transcode_ffmpeg.cc
@@ -71,18 +71,19 @@ TranscodeFfmpeg::TranscodeFfmpeg (std::string f)
}
if (ffmpeg_exe.empty() || ffprobe_exe.empty()) {
- warning << _(
+ warning << string_compose(
+ _(
"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 "
+ "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 and ffprobe_harvid.\n"
"If you already have a suitable ffmpeg installation on your system, we recommend creating "
"symbolic links from ffmpeg to ffmpeg_harvid and from ffprobe to ffprobe_harvid.\n"
- ) << endmsg;
+ ), PROGRAM_NAME) << endmsg;
return;
}
ffexecok = true;
@@ -395,7 +396,7 @@ TranscodeFfmpeg::encode (std::string outfile, std::string inf_a, std::string inf
}
bool
-TranscodeFfmpeg::extract_audio (std::string outfile, ARDOUR::framecnt_t samplerate, unsigned int stream)
+TranscodeFfmpeg::extract_audio (std::string outfile, ARDOUR::framecnt_t /*samplerate*/, unsigned int stream)
{
if (!probeok) return false;
if (stream >= m_audio.size()) return false;
diff --git a/gtk2_ardour/transcode_video_dialog.cc b/gtk2_ardour/transcode_video_dialog.cc
index 92265284c6..2a4e05f076 100644
--- a/gtk2_ardour/transcode_video_dialog.cc
+++ b/gtk2_ardour/transcode_video_dialog.cc
@@ -68,7 +68,7 @@ TranscodeVideoDialog::TranscodeVideoDialog (Session* s, std::string infile)
, bitrate_adjustment (2000, 500, 10000, 10, 100, 0)
, bitrate_spinner (bitrate_adjustment)
#if 1 /* tentative debug mode */
- , debug_checkbox (_("Debug Mode: Print ffmpeg Command and Output to stdout."))
+ , debug_checkbox (_("Debug Mode: Print ffmpeg command and output to stdout."))
#endif
{
set_session (s);
diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc
index 66f87abd9c..557c86c3f6 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;
@@ -348,7 +395,7 @@ emulate_key_event (Gtk::Widget* w, unsigned int keyval)
ev.state = 0;
ev.keyval = keyval;
ev.length = 0;
- ev.string = (gchar*) "";
+ ev.string = "";
ev.hardware_keycode = keymapkey[0].keycode;
ev.group = keymapkey[0].group;
g_free(keymapkey);
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/video_server_dialog.cc b/gtk2_ardour/video_server_dialog.cc
index 468bcc5c8d..ce0633b6c3 100644
--- a/gtk2_ardour/video_server_dialog.cc
+++ b/gtk2_ardour/video_server_dialog.cc
@@ -95,8 +95,10 @@ VideoServerDialog::VideoServerDialog (Session* s)
}
else {
PBD::warning <<
- _("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.") << endmsg;
+ string_compose(
+ _("The external video server 'harvid' can not be found. The tool is included with the %1 releases from ardour.org, "
+ "alternatively you can download it from http://x42.github.com/harvid/ or acquire it from your distribution."), PROGRAM_NAME)
+ << endmsg;
}
@@ -137,7 +139,9 @@ VideoServerDialog::VideoServerDialog (Session* s)
t->attach (*l, 0, 1, 2, 3, FILL);
t->attach (cachesize_spinner, 1, 2, 2, 3);
- l = manage (new Label (_("Ardour relies on an external Video Server for the videotimeline.\nThe server configured in Edit -> Prefereces -> Video is not reachable.\nDo you want ardour to launch 'harvid' on this machine?"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false));
+ l = manage (new Label (string_compose(
+ _("%1 relies on an external Video Server for the videotimeline.\nThe server configured in Edit -> Prefereces -> Video is not reachable.\nDo you want ardour to launch 'harvid' on this machine?"), PROGRAM_NAME)
+ , Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false));
l->set_max_width_chars(80);
l->set_line_wrap();
vbox->pack_start (*l, true, true, 4);
diff --git a/gtk2_ardour/video_timeline.cc b/gtk2_ardour/video_timeline.cc
index 8f68174997..9a48fcc9e3 100644
--- a/gtk2_ardour/video_timeline.cc
+++ b/gtk2_ardour/video_timeline.cc
@@ -502,14 +502,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 ();
@@ -580,8 +584,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
}
@@ -814,8 +818,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/libs/ardour/ardour/iec1ppmdsp.h b/libs/ardour/ardour/iec1ppmdsp.h
new file mode 100644
index 0000000000..58dea97555
--- /dev/null
+++ b/libs/ardour/ardour/iec1ppmdsp.h
@@ -0,0 +1,51 @@
+/*
+ Copyright (C) 2012 Fons Adriaensen <fons@linuxaudio.org>
+ Adopted for Ardour 2013 by Robin Gareus <robin@gareus.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __IEC1PPMDSP_H
+#define __IEC1PPMDSP_H
+
+
+class Iec1ppmdsp
+{
+public:
+
+ Iec1ppmdsp (void);
+ ~Iec1ppmdsp (void);
+
+ void process (float *p, int n);
+ float read (void);
+ void reset ();
+
+ static void init (float fsamp);
+
+private:
+
+ float _z1; // filter state
+ float _z2; // filter state
+ float _m; // max value since last read()
+ bool _res; // flag to reset m
+
+ static float _w1; // attack filter coefficient
+ static float _w2; // attack filter coefficient
+ static float _w3; // release filter coefficient
+ static float _g; // gain factor
+};
+
+
+#endif
diff --git a/libs/ardour/ardour/iec2ppmdsp.h b/libs/ardour/ardour/iec2ppmdsp.h
new file mode 100644
index 0000000000..3574a8bd3f
--- /dev/null
+++ b/libs/ardour/ardour/iec2ppmdsp.h
@@ -0,0 +1,51 @@
+/*
+ Copyright (C) 2012 Fons Adriaensen <fons@linuxaudio.org>
+ Adopted for Ardour 2013 by Robin Gareus <robin@gareus.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __IEC2PPMDSP_H
+#define __IEC2PPMDSP_H
+
+
+class Iec2ppmdsp
+{
+public:
+
+ Iec2ppmdsp (void);
+ ~Iec2ppmdsp (void);
+
+ void process (float *p, int n);
+ float read (void);
+ void reset ();
+
+ static void init (float fsamp);
+
+private:
+
+ float _z1; // filter state
+ float _z2; // filter state
+ float _m; // max value since last read()
+ bool _res; // flag to reset m
+
+ static float _w1; // attack filter coefficient
+ static float _w2; // attack filter coefficient
+ static float _w3; // release filter coefficient
+ static float _g; // gain factor
+};
+
+
+#endif
diff --git a/libs/ardour/kmeterdsp.h b/libs/ardour/ardour/kmeterdsp.h
index 9c2309e09c..eca3c76695 100644
--- a/libs/ardour/kmeterdsp.h
+++ b/libs/ardour/ardour/kmeterdsp.h
@@ -1,6 +1,6 @@
/*
Copyright (C) 2008-2011 Fons Adriaensen <fons@linuxaudio.org>
- Adopted for Ardour 2013 by Robin Gareus <robin@gareus.org>
+ Adopted for Ardour 2013 by Robin Gareus <robin@gareus.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -29,9 +29,10 @@ public:
void process (float *p, int n);
float read ();
- static void init (int fsamp);
void reset ();
+ static void init (int fsamp);
+
private:
float _z1; // filter state
diff --git a/libs/ardour/ardour/meter.h b/libs/ardour/ardour/meter.h
index 31ebc76179..a4ad8ecff4 100644
--- a/libs/ardour/ardour/meter.h
+++ b/libs/ardour/ardour/meter.h
@@ -23,7 +23,11 @@
#include "ardour/types.h"
#include "ardour/processor.h"
#include "pbd/fastlog.h"
-#include "kmeterdsp.h"
+
+#include "ardour/kmeterdsp.h"
+#include "ardour/iec1ppmdsp.h"
+#include "ardour/iec2ppmdsp.h"
+#include "ardour/vumeterdsp.h"
namespace ARDOUR {
@@ -71,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; }
@@ -104,7 +111,11 @@ private:
std::vector<float> _visible_peak_power;
std::vector<float> _max_peak_signal;
std::vector<float> _max_peak_power;
+
std::vector<Kmeterdsp *> _kmeter;
+ std::vector<Iec1ppmdsp *> _iec1meter;
+ std::vector<Iec2ppmdsp *> _iec2meter;
+ std::vector<Vumeterdsp *> _vumeter;
MeterType _meter_type;
};
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/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h
index f87781c8a9..a1008df6a6 100644
--- a/libs/ardour/ardour/rc_configuration_vars.h
+++ b/libs/ardour/ardour/rc_configuration_vars.h
@@ -148,9 +148,12 @@ 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 (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)
/* miscellany */
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index 85866f99a5..1044d9a2dc 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); }
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..da728a5d54 100644
--- a/libs/ardour/ardour/ticker.h
+++ b/libs/ardour/ardour/ticker.h
@@ -42,7 +42,7 @@ class MidiClockTicker : public SessionHandlePtr, boost::noncopyable
{
public:
MidiClockTicker ();
- virtual ~MidiClockTicker() {};
+ virtual ~MidiClockTicker() {}
void tick (const framepos_t& transport_frames);
@@ -77,6 +77,7 @@ private:
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 (framepos_t transport_position, pframes_t offset);
};
}
diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h
index 05d6d0b27d..2115149872 100644
--- a/libs/ardour/ardour/types.h
+++ b/libs/ardour/ardour/types.h
@@ -178,10 +178,17 @@ namespace ARDOUR {
};
enum MeterType {
- MeterMaxSignal = 0x01,
- MeterMaxPeak = 0x02,
- MeterPeak = 0x04,
- MeterKrms = 0x08
+ MeterMaxSignal = 0x001,
+ MeterMaxPeak = 0x002,
+ MeterPeak = 0x004,
+ MeterKrms = 0x008,
+ MeterK20 = 0x010,
+ MeterK14 = 0x020,
+ MeterIEC1DIN = 0x040,
+ MeterIEC1NOR = 0x080,
+ MeterIEC2BBC = 0x100,
+ MeterIEC2EBU = 0x200,
+ MeterVU = 0x400
};
enum TrackMode {
@@ -376,6 +383,13 @@ namespace ARDOUR {
MeteringRoute ///< meter what is going through the route
};
+ enum VUMeterStandard {
+ MeteringVUfrench, // 0VU = -2dBu
+ MeteringVUamerican, // 0VU = 0dBu
+ MeteringVUstandard, // 0VU = +4dBu
+ MeteringVUeight // 0VU = +8dBu
+ };
+
enum MeterLineUp {
MeteringLineUp24,
MeteringLineUp20,
@@ -583,6 +597,7 @@ std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
+std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
@@ -605,6 +620,7 @@ std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
diff --git a/libs/ardour/ardour/vumeterdsp.h b/libs/ardour/ardour/vumeterdsp.h
new file mode 100644
index 0000000000..86487e8e8e
--- /dev/null
+++ b/libs/ardour/ardour/vumeterdsp.h
@@ -0,0 +1,49 @@
+/*
+ Copyright (C) 2012 Fons Adriaensen <fons@linuxaudio.org>
+ Adopted for Ardour 2013 by Robin Gareus <robin@gareus.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __VUMETERDSP_H
+#define __VUMETERDSP_H
+
+
+class Vumeterdsp
+{
+public:
+
+ Vumeterdsp (void);
+ ~Vumeterdsp (void);
+
+ void process (float *p, int n);
+ float read (void);
+ void reset ();
+
+ static void init (float fsamp);
+
+private:
+
+ float _z1; // filter state
+ float _z2; // filter state
+ float _m; // max value since last read()
+ bool _res; // flag to reset m
+
+ static float _w; // lowpass filter coefficient
+ static float _g; // gain factor
+};
+
+
+#endif
diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc
index 4b33bbd4c6..6de833aeb4 100644
--- a/libs/ardour/audio_track.cc
+++ b/libs/ardour/audio_track.cc
@@ -353,7 +353,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 9c86b87415..3636ebf941 100644
--- a/libs/ardour/audio_unit.cc
+++ b/libs/ardour/audio_unit.cc
@@ -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 e224186bd2..65540d4e3d 100644
--- a/libs/ardour/audiosource.cc
+++ b/libs/ardour/audiosource.cc
@@ -189,7 +189,7 @@ AudioSource::touch_peakfile ()
struct utimbuf tbuf;
tbuf.actime = statbuf.st_atime;
- tbuf.modtime = time ((time_t) 0);
+ tbuf.modtime = time ((time_t*) 0);
g_utime (peakpath.c_str(), &tbuf);
}
diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc
index 495ff0b4c3..ab181d2956 100644
--- a/libs/ardour/enums.cc
+++ b/libs/ardour/enums.cc
@@ -62,6 +62,7 @@ setup_enum_writer ()
ColorMode _ColorMode;
MeterFalloff _MeterFalloff;
MeterHold _MeterHold;
+ VUMeterStandard _VUMeterStandard;
MeterLineUp _MeterLineUp;
EditMode _EditMode;
RegionPoint _RegionPoint;
@@ -177,6 +178,13 @@ setup_enum_writer ()
REGISTER_ENUM (MeterMaxPeak);
REGISTER_ENUM (MeterPeak);
REGISTER_ENUM (MeterKrms);
+ REGISTER_ENUM (MeterK20);
+ REGISTER_ENUM (MeterK14);
+ REGISTER_ENUM (MeterIEC1DIN);
+ REGISTER_ENUM (MeterIEC1NOR);
+ REGISTER_ENUM (MeterIEC2BBC);
+ REGISTER_ENUM (MeterIEC2EBU);
+ REGISTER_ENUM (MeterVU);
REGISTER (_MeterType);
REGISTER_ENUM (Normal);
@@ -215,6 +223,12 @@ setup_enum_writer ()
REGISTER_ENUM (MeterHoldLong);
REGISTER (_MeterHold);
+ REGISTER_ENUM (MeteringVUfrench);
+ REGISTER_ENUM (MeteringVUamerican);
+ REGISTER_ENUM (MeteringVUstandard);
+ REGISTER_ENUM (MeteringVUeight);
+ REGISTER (_VUMeterStandard);
+
REGISTER_ENUM (MeteringLineUp24);
REGISTER_ENUM (MeteringLineUp20);
REGISTER_ENUM (MeteringLineUp18);
@@ -668,6 +682,20 @@ std::ostream& operator<<(std::ostream& o, const MonitorModel& var)
return o << s;
}
+std::istream& operator>>(std::istream& o, VUMeterStandard& var)
+{
+ std::string s;
+ o >> s;
+ var = (VUMeterStandard) string_2_enum (s, var);
+ return o;
+}
+
+std::ostream& operator<<(std::ostream& o, const VUMeterStandard& var)
+{
+ std::string s = enum_2_string (var);
+ return o << s;
+}
+
std::istream& operator>>(std::istream& o, MeterLineUp& var)
{
std::string s;
diff --git a/libs/ardour/iec1ppmdsp.cc b/libs/ardour/iec1ppmdsp.cc
new file mode 100644
index 0000000000..bed825048f
--- /dev/null
+++ b/libs/ardour/iec1ppmdsp.cc
@@ -0,0 +1,100 @@
+/*
+ Copyright (C) 2012 Fons Adriaensen <fons@linuxaudio.org>
+ Adopted for Ardour 2013 by Robin Gareus <robin@gareus.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <math.h>
+#include "ardour/iec1ppmdsp.h"
+
+
+float Iec1ppmdsp::_w1;
+float Iec1ppmdsp::_w2;
+float Iec1ppmdsp::_w3;
+float Iec1ppmdsp::_g;
+
+
+Iec1ppmdsp::Iec1ppmdsp (void) :
+ _z1 (0),
+ _z2 (0),
+ _m (0),
+ _res (true)
+{
+}
+
+
+Iec1ppmdsp::~Iec1ppmdsp (void)
+{
+}
+
+
+void Iec1ppmdsp::process (float *p, int n)
+{
+ float z1, z2, m, t;
+
+ z1 = _z1;
+ z2 = _z2;
+ m = _res ? 0: _m;
+ _res = false;
+
+ n /= 4;
+ while (n--)
+ {
+ z1 *= _w3;
+ z2 *= _w3;
+ t = fabsf (*p++);
+ if (t > z1) z1 += _w1 * (t - z1);
+ if (t > z2) z2 += _w2 * (t - z2);
+ t = fabsf (*p++);
+ if (t > z1) z1 += _w1 * (t - z1);
+ if (t > z2) z2 += _w2 * (t - z2);
+ t = fabsf (*p++);
+ if (t > z1) z1 += _w1 * (t - z1);
+ if (t > z2) z2 += _w2 * (t - z2);
+ t = fabsf (*p++);
+ if (t > z1) z1 += _w1 * (t - z1);
+ if (t > z2) z2 += _w2 * (t - z2);
+ t = z1 + z2;
+ if (t > m) m = t;
+ }
+
+ _z1 = z1 + 1e-10f;
+ _z2 = z2 + 1e-10f;
+ _m = m;
+}
+
+
+float Iec1ppmdsp::read (void)
+{
+ _res = true;
+ return _g * _m;
+}
+
+void Iec1ppmdsp::reset ()
+{
+ _z1 = _z2 = _m = .0f;
+ _res = true;
+}
+
+void Iec1ppmdsp::init (float fsamp)
+{
+ _w1 = 450.0f / fsamp;
+ _w2 = 1300.0f / fsamp;
+ _w3 = 1.0f - 5.4f / fsamp;
+ _g = 0.5108f;
+}
+
+/* vi:set ts=8 sts=8 sw=4: */
diff --git a/libs/ardour/iec2ppmdsp.cc b/libs/ardour/iec2ppmdsp.cc
new file mode 100644
index 0000000000..76862cccd2
--- /dev/null
+++ b/libs/ardour/iec2ppmdsp.cc
@@ -0,0 +1,100 @@
+/*
+ Copyright (C) 2012 Fons Adriaensen <fons@linuxaudio.org>
+ Adopted for Ardour 2013 by Robin Gareus <robin@gareus.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <math.h>
+#include "ardour/iec2ppmdsp.h"
+
+
+float Iec2ppmdsp::_w1;
+float Iec2ppmdsp::_w2;
+float Iec2ppmdsp::_w3;
+float Iec2ppmdsp::_g;
+
+
+Iec2ppmdsp::Iec2ppmdsp (void) :
+ _z1 (0),
+ _z2 (0),
+ _m (0),
+ _res (true)
+{
+}
+
+
+Iec2ppmdsp::~Iec2ppmdsp (void)
+{
+}
+
+
+void Iec2ppmdsp::process (float *p, int n)
+{
+ float z1, z2, m, t;
+
+ z1 = _z1;
+ z2 = _z2;
+ m = _res ? 0: _m;
+ _res = false;
+
+ n /= 4;
+ while (n--)
+ {
+ z1 *= _w3;
+ z2 *= _w3;
+ t = fabsf (*p++);
+ if (t > z1) z1 += _w1 * (t - z1);
+ if (t > z2) z2 += _w2 * (t - z2);
+ t = fabsf (*p++);
+ if (t > z1) z1 += _w1 * (t - z1);
+ if (t > z2) z2 += _w2 * (t - z2);
+ t = fabsf (*p++);
+ if (t > z1) z1 += _w1 * (t - z1);
+ if (t > z2) z2 += _w2 * (t - z2);
+ t = fabsf (*p++);
+ if (t > z1) z1 += _w1 * (t - z1);
+ if (t > z2) z2 += _w2 * (t - z2);
+ t = z1 + z2;
+ if (t > m) m = t;
+ }
+
+ _z1 = z1 + 1e-10f;
+ _z2 = z2 + 1e-10f;
+ _m = m;
+}
+
+
+float Iec2ppmdsp::read (void)
+{
+ _res = true;
+ return _g * _m;
+}
+
+void Iec2ppmdsp::reset ()
+{
+ _z1 = _z2 = _m = .0f;
+ _res = true;
+}
+
+void Iec2ppmdsp::init (float fsamp)
+{
+ _w1 = 200.0f / fsamp;
+ _w2 = 860.0f / fsamp;
+ _w3 = 1.0f - 4.0f / fsamp;
+ _g = 0.5141f;
+}
+
+/* vi:set ts=8 sts=8 sw=4: */
diff --git a/libs/ardour/kmeterdsp.cc b/libs/ardour/kmeterdsp.cc
index afd0f71719..181378cf76 100644
--- a/libs/ardour/kmeterdsp.cc
+++ b/libs/ardour/kmeterdsp.cc
@@ -1,6 +1,6 @@
/*
Copyright (C) 2008-2011 Fons Adriaensen <fons@linuxaudio.org>
- Adopted for Ardour 2013 by Robin Gareus <robin@gareus.org>
+ Adopted for Ardour 2013 by Robin Gareus <robin@gareus.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -17,12 +17,13 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-
#include <math.h>
-#include "kmeterdsp.h"
+#include "ardour/kmeterdsp.h"
+
float Kmeterdsp::_omega;
+
Kmeterdsp::Kmeterdsp (void) :
_z1 (0),
_z2 (0),
@@ -36,6 +37,10 @@ Kmeterdsp::~Kmeterdsp (void)
{
}
+void Kmeterdsp::init (int fsamp)
+{
+ _omega = 9.72f / fsamp; // ballistic filter coefficient
+}
void Kmeterdsp::process (float *p, int n)
{
@@ -44,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.
{
@@ -96,7 +93,6 @@ void Kmeterdsp::process (float *p, int n)
}
}
-
/* Returns highest _rms value since last call */
float Kmeterdsp::read ()
{
@@ -105,15 +101,10 @@ float Kmeterdsp::read ()
return rv;
}
-void Kmeterdsp::init (int fsamp)
-{
- _omega = 9.72f / fsamp; // ballistic filter coefficient
-}
-
void Kmeterdsp::reset ()
{
- _z1 = _z2 = _rms = 0.0;
- _flag=false;
+ _z1 = _z2 = _rms = .0f;
+ _flag = false;
}
-/* vi:set ts=8 sts=8 sw=8: */
+/* vi:set ts=8 sts=8 sw=4: */
diff --git a/libs/ardour/ladspa_plugin.cc b/libs/ardour/ladspa_plugin.cc
index 82bf97264f..38d0d8b944 100644
--- a/libs/ardour/ladspa_plugin.cc
+++ b/libs/ardour/ladspa_plugin.cc
@@ -574,7 +574,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 2f46db75a6..d44f9351c4 100644
--- a/libs/ardour/lv2_plugin.cc
+++ b/libs/ardour/lv2_plugin.cc
@@ -1652,7 +1652,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 3d1ab61bbc..490b75dcb2 100644
--- a/libs/ardour/meter.cc
+++ b/libs/ardour/meter.cc
@@ -40,13 +40,24 @@ PeakMeter::PeakMeter (Session& s, const std::string& name)
: Processor (s, string_compose ("meter-%1", name))
{
Kmeterdsp::init(s.nominal_frame_rate());
+ 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 ()
{
while (_kmeter.size() > 0) {
delete (_kmeter.back());
+ delete (_iec1meter.back());
+ delete (_iec2meter.back());
+ delete (_vumeter.back());
_kmeter.pop_back();
+ _iec1meter.pop_back();
+ _iec2meter.pop_back();
+ _vumeter.pop_back();
}
}
@@ -97,9 +108,18 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
// Meter audio in to the rest of the peaks
for (uint32_t i = 0; i < n_audio; ++i, ++n) {
_peak_signal[n] = compute_peak (bufs.get_audio(i).data(), nframes, _peak_signal[n]);
- if (_meter_type & MeterKrms) {
+ if (_meter_type & (MeterKrms | MeterK20 | MeterK14)) {
_kmeter[i]->process(bufs.get_audio(i).data(), nframes);
}
+ if (_meter_type & (MeterIEC1DIN | MeterIEC1NOR)) {
+ _iec1meter[i]->process(bufs.get_audio(i).data(), nframes);
+ }
+ if (_meter_type & (MeterIEC2BBC | MeterIEC2EBU)) {
+ _iec2meter[i]->process(bufs.get_audio(i).data(), nframes);
+ }
+ if (_meter_type & MeterVU) {
+ _vumeter[i]->process(bufs.get_audio(i).data(), nframes);
+ }
}
// Zero any excess peaks
@@ -119,6 +139,9 @@ PeakMeter::reset ()
for (size_t n = 0; n < _kmeter.size(); ++n) {
_kmeter[n]->reset();
+ _iec1meter[n]->reset();
+ _iec2meter[n]->reset();
+ _vumeter[n]->reset();
}
}
@@ -129,6 +152,16 @@ PeakMeter::reset_max ()
_max_peak_power[i] = -INFINITY;
_max_peak_signal[i] = 0;
}
+
+ const size_t n_midi = min (_peak_signal.size(), (size_t) current_meters.n_midi());
+
+ for (size_t n = 0; n < _peak_signal.size(); ++n) {
+ if (n < n_midi) {
+ _visible_peak_power[n] = 0;
+ } else {
+ _visible_peak_power[n] = -INFINITY;
+ }
+ }
}
bool
@@ -155,24 +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());
- const size_t n_audio = current_meters.n_audio();
-
- 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 (size_t n = 0; n < n_audio; ++n) {
- _kmeter[n]->reset();
+ 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();
}
+ current_meters = in;
reset_max();
ConfigurationChanged (in, in); /* EMIT SIGNAL */
@@ -206,12 +235,27 @@ PeakMeter::reset_max_channels (const ChanCount& chn)
/* alloc/free other audio-only meter types. */
while (_kmeter.size() > n_audio) {
delete (_kmeter.back());
+ delete (_iec1meter.back());
+ delete (_iec2meter.back());
+ delete (_vumeter.back());
_kmeter.pop_back();
+ _iec1meter.pop_back();
+ _iec2meter.pop_back();
+ _vumeter.pop_back();
}
while (_kmeter.size() < n_audio) {
_kmeter.push_back(new Kmeterdsp());
+ _iec1meter.push_back(new Iec1ppmdsp());
+ _iec2meter.push_back(new Iec2ppmdsp());
+ _vumeter.push_back(new Vumeterdsp());
}
assert(_kmeter.size() == n_audio);
+ assert(_iec1meter.size() == n_audio);
+ assert(_iec2meter.size() == n_audio);
+ assert(_vumeter.size() == n_audio);
+
+ reset();
+ reset_max();
}
/** To be driven by the Meter signal from IO.
@@ -226,11 +270,26 @@ 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());
+ /* 0.01f ^= 100 Hz update rate */
+ const float midi_meter_falloff = Config->get_meter_falloff() * 0.01f;
+ /* kmeters: 24dB / 2 sec */
+ const float audio_meter_falloff = (_meter_type & (MeterK20 | MeterK14)) ? 0.12f : midi_meter_falloff;
+
for (size_t n = 0; n < limit; ++n) {
/* grab peak since last read */
@@ -241,11 +300,11 @@ PeakMeter::meter ()
if (n < n_midi) {
_max_peak_power[n] = -INFINITY; // std::max (new_peak, _max_peak_power[n]); // XXX
_max_peak_signal[n] = 0;
- if (Config->get_meter_falloff() == 0.0f || new_peak > _visible_peak_power[n]) {
+ if (midi_meter_falloff == 0.0f || new_peak > _visible_peak_power[n]) {
;
} else {
- /* empirical WRT to falloff times , 0.01f ^= 100 Hz update rate */
- new_peak = _visible_peak_power[n] - sqrt(_visible_peak_power[n] * Config->get_meter_falloff() * 0.01f * 0.0002f);
+ /* empirical algorithm WRT to audio falloff times */
+ new_peak = _visible_peak_power[n] - sqrt(_visible_peak_power[n] * midi_meter_falloff * 0.0002f);
if (new_peak < (1.0 / 512.0)) new_peak = 0;
}
_visible_peak_power[n] = new_peak;
@@ -268,47 +327,72 @@ PeakMeter::meter ()
_max_peak_power[n] = std::max (new_peak, _max_peak_power[n]);
- if (Config->get_meter_falloff() == 0.0f || new_peak > _visible_peak_power[n]) {
+ if (audio_meter_falloff == 0.0f || new_peak > _visible_peak_power[n]) {
_visible_peak_power[n] = new_peak;
} else {
// do falloff
- new_peak = _visible_peak_power[n] - (Config->get_meter_falloff() * 0.01f);
- _visible_peak_power[n] = std::max (new_peak, (float)-INFINITY);
+ new_peak = _visible_peak_power[n] - (audio_meter_falloff);
+ _visible_peak_power[n] = std::max (new_peak, -INFINITY);
}
}
}
+#define CHECKSIZE(MTR) (n < MTR.size() + n_midi && n >= n_midi)
+
float
PeakMeter::meter_level(uint32_t n, MeterType type) {
switch (type) {
case MeterKrms:
+ case MeterK20:
+ case MeterK14:
+ {
+ const uint32_t n_midi = current_meters.n_midi();
+ if (CHECKSIZE(_kmeter)) {
+ return accurate_coefficient_to_dB (_kmeter[n - n_midi]->read());
+ }
+ }
+ break;
+ case MeterIEC1DIN:
+ case MeterIEC1NOR:
+ {
+ const uint32_t n_midi = current_meters.n_midi();
+ if (CHECKSIZE(_iec1meter)) {
+ return accurate_coefficient_to_dB (_iec1meter[n - n_midi]->read());
+ }
+ }
+ break;
+ case MeterIEC2BBC:
+ case MeterIEC2EBU:
{
- const uint32_t n_midi = current_meters.n_midi();
- if ((n - n_midi) < _kmeter.size() && (n - n_midi) >= 0) {
-#if 0
- return fast_coefficient_to_dB (_kmeter[n-n_midi]->read());
-#else
- return accurate_coefficient_to_dB (_kmeter[n-n_midi]->read());
-#endif
+ const uint32_t n_midi = current_meters.n_midi();
+ if (CHECKSIZE(_iec2meter)) {
+ return accurate_coefficient_to_dB (_iec2meter[n - n_midi]->read());
}
- return minus_infinity();
}
+ break;
+ case MeterVU:
+ {
+ const uint32_t n_midi = current_meters.n_midi();
+ if (CHECKSIZE(_vumeter)) {
+ return accurate_coefficient_to_dB (_vumeter[n - n_midi]->read());
+ }
+ }
+ break;
case MeterPeak:
return peak_power(n);
case MeterMaxSignal:
if (n < _max_peak_signal.size()) {
return _max_peak_signal[n];
- } else {
- return minus_infinity();
}
+ break;
default:
case MeterMaxPeak:
if (n < _max_peak_power.size()) {
return _max_peak_power[n];
- } else {
- return minus_infinity();
}
+ break;
}
+ return minus_infinity();
}
void
@@ -320,12 +404,31 @@ PeakMeter::set_type(MeterType t)
_meter_type = t;
- if (t & MeterKrms) {
+ if (t & (MeterKrms | MeterK20 | MeterK14)) {
const size_t n_audio = current_meters.n_audio();
for (size_t n = 0; n < n_audio; ++n) {
_kmeter[n]->reset();
}
}
+ if (t & (MeterIEC1DIN | MeterIEC1NOR)) {
+ const size_t n_audio = current_meters.n_audio();
+ for (size_t n = 0; n < n_audio; ++n) {
+ _iec1meter[n]->reset();
+ }
+ }
+ if (t & (MeterIEC2BBC | MeterIEC2EBU)) {
+ const size_t n_audio = current_meters.n_audio();
+ for (size_t n = 0; n < n_audio; ++n) {
+ _iec2meter[n]->reset();
+ }
+ }
+ if (t & MeterVU) {
+ const size_t n_audio = current_meters.n_audio();
+ for (size_t n = 0; n < n_audio; ++n) {
+ _vumeter[n]->reset();
+ }
+ }
+
TypeChanged(t);
}
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc
index 7c4ae24a2a..415ae6210f 100644
--- a/libs/ardour/midi_track.cc
+++ b/libs/ardour/midi_track.cc
@@ -352,7 +352,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/plugin_insert.cc b/libs/ardour/plugin_insert.cc
index 998a03e3aa..d519dbd7a7 100644
--- a/libs/ardour/plugin_insert.cc
+++ b/libs/ardour/plugin_insert.cc
@@ -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);
}
}
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/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/route.cc b/libs/ardour/route.cc
index 797481b7b8..671a00319d 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -101,6 +101,9 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
, _custom_meter_position_noted (false)
, _last_custom_meter_was_at_end (false)
{
+ if (is_master()) {
+ _meter_type = MeterK20;
+ }
processor_max_streams.reset();
}
@@ -568,7 +571,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 +597,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);
@@ -3017,7 +3020,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);
@@ -3056,7 +3059,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);
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index 476682158f..9817f17069 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -4174,12 +4174,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_midi.cc b/libs/ardour/session_midi.cc
index 5b5554be7c..e4fd58dedc 100644
--- a/libs/ardour/session_midi.cc
+++ b/libs/ardour/session_midi.cc
@@ -44,6 +44,7 @@
#include "ardour/midi_ui.h"
#include "ardour/session.h"
#include "ardour/slave.h"
+#include "ardour/ticker.h"
#include "i18n.h"
@@ -580,6 +581,19 @@ Session::mmc_step_timeout ()
return true;
}
+/***********************************************************************
+ OUTBOUND SYSTEM COMMON STUFF
+**********************************************************************/
+
+
+void
+Session::send_song_position_pointer (framepos_t t)
+{
+ if (midi_clock) {
+ midi_clock->position_changed (t);
+ }
+}
+
int
Session::start_midi_thread ()
{
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..4f66128943 100644
--- a/libs/ardour/ticker.cc
+++ b/libs/ardour/ticker.cc
@@ -40,7 +40,8 @@ MidiClockTicker::MidiClockTicker ()
{
}
-void MidiClockTicker::set_session (Session* s)
+void
+MidiClockTicker::set_session (Session* s)
{
SessionHandlePtr::set_session (s);
@@ -59,12 +60,14 @@ MidiClockTicker::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 */
@@ -80,8 +83,8 @@ void MidiClockTicker::transport_state_changed()
framepos_t position = _session->transport_frame();
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)
- );
+ string_compose ("Transport state change @ %4, speed: %1 position: %2 play loop: %3\n", speed, position, _session->get_play_loop(), position)
+ );
if (speed == 1.0f) {
_last_tick = position;
@@ -109,19 +112,27 @@ void MidiClockTicker::transport_state_changed()
return;
send_stop_event(0);
+ send_position_event (position, 0);
}
tick (position);
}
-void MidiClockTicker::position_changed (framepos_t position)
+void
+MidiClockTicker::position_changed (framepos_t position)
{
- DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Position change: %1\n", position));
+ const double speed = _session->transport_speed();
+ DEBUG_TRACE (PBD::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;
}
-void MidiClockTicker::transport_looped()
+void
+MidiClockTicker::transport_looped()
{
Location* loop_location = _session->locations()->auto_loop_location();
assert(loop_location);
@@ -143,7 +154,8 @@ 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;
@@ -155,9 +167,11 @@ void MidiClockTicker::tick (const framepos_t& transport_frame)
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));
+ */
if (!mp || (next_tick_offset >= mp->nframes_this_cycle())) {
break;
@@ -171,7 +185,8 @@ void MidiClockTicker::tick (const framepos_t& transport_frame)
}
}
-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 +197,88 @@ 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 (PBD::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 (PBD::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 (PBD::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 (PBD::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 (framepos_t transport_position, pframes_t offset)
+{
+ if (_midi_port == 0 || _session == 0 || _session->engine().freewheeling()) {
+ return;
+ }
+
+ const TempoMap& tempo = _session->tempo_map();
+ Timecode::BBT_Time time;
+ _session->bbt_time (transport_position, time);
+ const double beats_per_bar = tempo.meter_at(transport_position).divisions_per_bar();
+ /* Midi Beats in terms of Song Position Pointer is equivalent to total
+ sixteenth notes at 'time' */
+ const uint32_t midi_beats = 4 * (((time.bars - 1) * beats_per_bar) + time.beats - 1);
+
+ /* can only use 14bits worth */
+ if (midi_beats > 0x3fff) {
+ return;
+ }
+
+ /* split midi beats into a 14bit value */
+ MIDI::byte msg[3] = {
+ MIDI_CMD_COMMON_SONG_POS,
+ midi_beats & 0x007f,
+ midi_beats & 0x3f80
+ };
+
+ DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Song Position: %1\n", midi_beats));
+
+ _midi_port->midimsg (msg, sizeof (msg), offset);
+}
diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc
index c6a348ddfb..7d90709b6f 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);
@@ -492,7 +496,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/ardour/vumeterdsp.cc b/libs/ardour/vumeterdsp.cc
new file mode 100644
index 0000000000..67d48f6c54
--- /dev/null
+++ b/libs/ardour/vumeterdsp.cc
@@ -0,0 +1,89 @@
+/*
+ Copyright (C) 2012 Fons Adriaensen <fons@linuxaudio.org>
+ Adopted for Ardour 2013 by Robin Gareus <robin@gareus.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <math.h>
+#include "ardour/vumeterdsp.h"
+
+
+float Vumeterdsp::_w;
+float Vumeterdsp::_g;
+
+
+Vumeterdsp::Vumeterdsp (void) :
+ _z1 (0),
+ _z2 (0),
+ _m (0),
+ _res (true)
+{
+}
+
+
+Vumeterdsp::~Vumeterdsp (void)
+{
+}
+
+
+void Vumeterdsp::process (float *p, int n)
+{
+ float z1, z2, m, t1, t2;
+
+ z1 = _z1;
+ z2 = _z2;
+ m = _res ? 0: _m;
+ _res = false;
+
+ n /= 4;
+ while (n--)
+ {
+ t2 = z2 / 2;
+ t1 = fabsf (*p++) - t2;
+ z1 += _w * (t1 - z1);
+ t1 = fabsf (*p++) - t2;
+ z1 += _w * (t1 - z1);
+ t1 = fabsf (*p++) - t2;
+ z1 += _w * (t1 - z1);
+ t1 = fabsf (*p++) - t2;
+ z1 += _w * (t1 - z1);
+ z2 += 4 * _w * (z1 - z2);
+ if (z2 > m) m = z2;
+ }
+
+ _z1 = z1;
+ _z2 = z2 + 1e-10f;
+ _m = m;
+}
+
+
+float Vumeterdsp::read (void)
+{
+ _res = true;
+ return _g * _m;
+}
+
+void Vumeterdsp::reset ()
+{
+ _z1 = _z2 = _m = .0f;
+ _res = true;
+}
+
+void Vumeterdsp::init (float fsamp)
+{
+ _w = 11.1f / fsamp;
+ _g = 1.5f * 1.571f;
+}
diff --git a/libs/ardour/wscript b/libs/ardour/wscript
index 5e8b27d4ea..87dce06a2a 100644
--- a/libs/ardour/wscript
+++ b/libs/ardour/wscript
@@ -92,6 +92,8 @@ libardour_sources = [
'globals.cc',
'graph.cc',
'graphnode.cc',
+ 'iec1ppmdsp.cc',
+ 'iec2ppmdsp.cc',
'import.cc',
'instrument_info.cc',
'internal_return.cc',
@@ -209,6 +211,7 @@ libardour_sources = [
'user_bundle.cc',
'utils.cc',
'version.cc',
+ 'vumeterdsp.cc',
'worker.cc'
]
diff --git a/libs/gtkmm2ext/fastmeter.cc b/libs/gtkmm2ext/fastmeter.cc
index 6ea1a6dd4b..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,19 +208,49 @@ FastMeter::generate_meter_pattern (
cairo_set_source (tc, pat);
cairo_rectangle (tc, 0, 0, width, height);
cairo_fill (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;
@@ -210,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;
@@ -251,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;
@@ -258,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()) {
@@ -278,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;
@@ -288,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;
@@ -301,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)
@@ -325,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);
@@ -334,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);
}
@@ -349,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;
@@ -358,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
@@ -378,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);
@@ -413,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 ));
+ last_peak_rect.height = max(0, min(2, pixheight - last_peak_rect.y - 1 ));
}
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);
+ 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.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, 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);
@@ -444,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;
@@ -475,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
@@ -538,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 ));
}
@@ -557,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/gtkmm2ext/gtkmm2ext/keyboard.h b/libs/gtkmm2ext/gtkmm2ext/keyboard.h
index 84988e1525..2c6b026a42 100644
--- a/libs/gtkmm2ext/gtkmm2ext/keyboard.h
+++ b/libs/gtkmm2ext/gtkmm2ext/keyboard.h
@@ -164,7 +164,7 @@ class Keyboard : public sigc::trackable, PBD::Stateful
}
};
- sigc::signal0<void> ShiftReleased;
+ sigc::signal0<void> ZoomVerticalModifierReleased;
protected:
static Keyboard* _the_keyboard;
diff --git a/libs/gtkmm2ext/keyboard.cc b/libs/gtkmm2ext/keyboard.cc
index f694471d9a..5087f61a23 100644
--- a/libs/gtkmm2ext/keyboard.cc
+++ b/libs/gtkmm2ext/keyboard.cc
@@ -248,12 +248,15 @@ Keyboard::snooper (GtkWidget *widget, GdkEventKey *event)
keyval = event->keyval;
}
- if (keyval == GDK_Shift_L) {
+ if (event->state & ScrollZoomVerticalModifier) {
/* There is a special and rather hacky situation in Editor which makes
- it useful to know when a shift key has been released, so emit a signal
- here (see Editor::_stepping_axis_view)
+ it useful to know when the modifier key for vertical zoom has been
+ released, so emit a signal here (see Editor::_stepping_axis_view).
+ Note that the state bit for the modifier key is set for the key-up
+ event when the modifier is released, but not the key-down when it
+ is pressed, so we get here on key-up, which is what we want.
*/
- ShiftReleased (); /* EMIT SIGNAL */
+ ZoomVerticalModifierReleased (); /* EMIT SIGNAL */
}
if (event->type == GDK_KEY_PRESS) {
diff --git a/libs/pbd/pbd/ringbuffer.h b/libs/pbd/pbd/ringbuffer.h
index a1a6151542..bb5485a8f3 100644
--- a/libs/pbd/pbd/ringbuffer.h
+++ b/libs/pbd/pbd/ringbuffer.h
@@ -233,6 +233,7 @@ RingBuffer<T>::get_read_vector (typename 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/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/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:*
+}