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 @@
-
+
+
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 paths, framepos_t frame, double ypos, bool copy);
void drop_paths_part_two (const std::vector& paths, framepos_t frame, double ypos, bool copy);
- int import_sndfiles (std::vector paths, Editing::ImportMode mode, ARDOUR::SrcQuality, framepos_t& pos,
+ int import_sndfiles (std::vector paths, Editing::ImportDisposition, Editing::ImportMode mode,
+ ARDOUR::SrcQuality, framepos_t& pos,
int target_regions, int target_tracks, boost::shared_ptr&, bool);
- int embed_sndfiles (std::vector paths, bool multiple_files, bool& check_sample_rate, Editing::ImportMode mode,
+ int embed_sndfiles (std::vector 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&);
- int add_sources (std::vector paths, ARDOUR::SourceList& sources, framepos_t& pos, Editing::ImportMode,
+ int add_sources (std::vector paths, ARDOUR::SourceList& sources, framepos_t& pos,
+ Editing::ImportDisposition, Editing::ImportMode,
int target_regions, int target_tracks, boost::shared_ptr&, bool add_channel_suffix);
+
int finish_bringing_in_material (boost::shared_ptr region, uint32_t, uint32_t, framepos_t& pos, Editing::ImportMode mode,
boost::shared_ptr& 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 paths, ImportDisposition chns, ImportMode mode, SrcQuality quality, framepos_t& pos)
+Editor::do_import (vector paths, ImportDisposition disposition, ImportMode mode, SrcQuality quality, framepos_t& pos)
{
boost::shared_ptr