diff --git a/gtk2_ardour/add_video_dialog.cc b/gtk2_ardour/add_video_dialog.cc
index a005b74467..57938ac3f1 100644
--- a/gtk2_ardour/add_video_dialog.cc
+++ b/gtk2_ardour/add_video_dialog.cc
@@ -42,6 +42,7 @@ using namespace Gtk;
using namespace std;
using namespace PBD;
using namespace ARDOUR;
+using namespace VideoUtils;
#define PREVIEW_WIDTH (240)
#define PREVIEW_HEIGHT (180)
@@ -482,7 +483,7 @@ AddVideoDialog::harvid_request(std::string u)
harvid_list->clear();
- char *res = curl_http_get(url, &status);
+ char *res = a3_curl_http_get(url, &status);
if (status != 200) {
printf("request failed\n"); // XXX
harvid_path.set_text(" - request failed -");
@@ -662,7 +663,7 @@ AddVideoDialog::request_preview(std::string u)
, (long long) (video_duration * seek_slider.get_value() / 1000.0)
, clip_width, clip_height, u.c_str());
- char *data = curl_http_get(url, NULL);
+ char *data = a3_curl_http_get(url, NULL);
if (!data) {
printf("image preview request failed %s\n", url);
imgbuf->fill(RGBA_TO_UINT(0,0,0,255));
diff --git a/gtk2_ardour/ardour3_styles.rc.in b/gtk2_ardour/ardour3_styles.rc.in
index 45b8458370..e3978d063a 100644
--- a/gtk2_ardour/ardour3_styles.rc.in
+++ b/gtk2_ardour/ardour3_styles.rc.in
@@ -989,3 +989,25 @@ style "default_toggle_button"
bg[ACTIVE] = @@COLPREFIX@_contrasting_indicator
fg[ACTIVE] = @@COLPREFIX@_darkest
}
+
+
+style "meter_strip_dpm" = "default"
+{
+}
+
+style "meter_strip_ppm" = "default"
+{
+ bg[NORMAL] = { 0.1, 0.1, 0.1 }
+ fg[NORMAL] = { 1.0, 1.0, 1.0 }
+}
+
+style "meter_strip_vu" = "default"
+{
+ bg[NORMAL] = { .84, .77, .58 }
+ fg[NORMAL] = { 0.0, 0.0, 0.0 }
+}
+
+style "meter_strip_sep" = "default"
+{
+ bg[NORMAL] = { 0.0, 0.0, 0.0 }
+}
diff --git a/gtk2_ardour/ardour3_ui_default.conf b/gtk2_ardour/ardour3_ui_default.conf
index 372cab8a16..7c33944dbe 100644
--- a/gtk2_ardour/ardour3_ui_default.conf
+++ b/gtk2_ardour/ardour3_ui_default.conf
@@ -221,7 +221,8 @@
-
+
+
diff --git a/gtk2_ardour/ardour3_widget_list.rc b/gtk2_ardour/ardour3_widget_list.rc
index 05ebde9421..0e7075cef4 100644
--- a/gtk2_ardour/ardour3_widget_list.rc
+++ b/gtk2_ardour/ardour3_widget_list.rc
@@ -290,6 +290,11 @@ widget "*PluginLoadButton" style:highest "small_button"
widget "*PluginLoadButton*" style:highest "small_button"
widget "*PluginEditorButton" style:highest "default_toggle_button"
+widget "*meterstripPPM" style:highest "meter_strip_ppm"
+widget "*meterstripDPM" style:highest "meter_strip_dpm"
+widget "*meterstripVU" style:highest "meter_strip_vu"
+widget "*BlackSeparator" style:highest "meter_strip_sep"
+
widget "*MetricDialogFrame" style:highest "base_frame"
widget "*MetricEntry" style:highest "medium_bold_entry"
widget "*MetricButton" style:highest "default_button"
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index c4e037a5bf..a3ea2b1612 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -182,6 +182,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
, solo_alert_button (_("solo"))
, feedback_alert_button (_("feedback"))
+ , editor_meter(0)
+ , editor_meter_peak_display()
+
, speaker_config_window (X_("speaker-config"), _("Speaker Configuration"))
, theme_manager (X_("theme-manager"), _("Theme Manager"))
, key_editor (X_("key-editor"), _("Key Bindings"))
@@ -1020,6 +1023,15 @@ ARDOUR_UI::every_point_zero_something_seconds ()
// august 2007: actual update frequency: 25Hz (40ms), not 100Hz
SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
+ if (editor_meter && Config->get_show_editor_meter()) {
+ float mpeak = editor_meter->update_meters();
+ if (mpeak > editor_meter_max_peak) {
+ if (mpeak >= Config->get_meter_peak()) {
+ editor_meter_peak_display.set_name ("meterbridge peakindicator on");
+ editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+ }
+ }
+ }
return TRUE;
}
@@ -3479,7 +3491,10 @@ ARDOUR_UI::add_video (Gtk::Window* float_window)
return;
}
if (!transcode_video_dialog->get_audiofile().empty()) {
- editor->embed_audio_from_video(transcode_video_dialog->get_audiofile());
+ editor->embed_audio_from_video(
+ transcode_video_dialog->get_audiofile(),
+ video_timeline->get_offset()
+ );
}
switch (transcode_video_dialog->import_option()) {
case VTL_IMPORT_TRANSCODED:
@@ -3543,6 +3558,10 @@ ARDOUR_UI::remove_video ()
video_timeline->close_session();
editor->toggle_ruler_video(false);
+ /* reset state */
+ video_timeline->set_offset_locked(false);
+ video_timeline->set_offset(0);
+
/* delete session state */
XMLNode* node = new XMLNode(X_("Videotimeline"));
_session->add_extra_xml(*node);
@@ -4080,3 +4099,32 @@ ARDOUR_UI::session_format_mismatch (std::string xml_path, std::string backup_pat
msg.run ();
}
+
+
+void
+ARDOUR_UI::reset_peak_display ()
+{
+ if (!_session || !_session->master_out() || !editor_meter) return;
+ editor_meter->clear_meters();
+ editor_meter_max_peak = -INFINITY;
+ editor_meter_peak_display.set_name ("meterbridge peakindicator");
+ editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+}
+
+void
+ARDOUR_UI::reset_group_peak_display (RouteGroup* group)
+{
+ if (!_session || !_session->master_out()) return;
+ if (group == _session->master_out()->route_group()) {
+ reset_peak_display ();
+ }
+}
+
+void
+ARDOUR_UI::reset_route_peak_display (Route* route)
+{
+ if (!_session || !_session->master_out()) return;
+ if (_session->master_out().get() == route) {
+ reset_peak_display ();
+ }
+}
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index c4ac0e67d7..1dcaeb0e9e 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -104,6 +104,7 @@ class SpeakerDialog;
class ThemeManager;
class TimeInfoBox;
class MidiTracer;
+class LevelMeterHBox;
class GlobalPortMatrixWindow;
class GUIObjectState;
@@ -281,6 +282,10 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void get_process_buffers ();
void drop_process_buffers ();
+ void reset_peak_display ();
+ void reset_route_peak_display (ARDOUR::Route*);
+ void reset_group_peak_display (ARDOUR::RouteGroup*);
+
const std::string& announce_string() const { return _announce_string; }
protected:
@@ -444,6 +449,11 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
ArdourButton feedback_alert_button;
Gtk::VBox alert_box;
+ Gtk::VBox meter_box;
+ LevelMeterHBox * editor_meter;
+ float editor_meter_max_peak;
+ ArdourButton editor_meter_peak_display;
+ bool editor_meter_peak_button_release (GdkEventButton*);
void solo_blink (bool);
void sync_blink (bool);
diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc
index 50affa6c96..e9ad631032 100644
--- a/gtk2_ardour/ardour_ui2.cc
+++ b/gtk2_ardour/ardour_ui2.cc
@@ -144,6 +144,7 @@ ARDOUR_UI::setup_tooltips ()
set_tip (feedback_alert_button, _("When active, there is a feedback loop."));
set_tip (primary_clock, _("Primary Clock right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify.\nText edits: right-to-left overwrite Esc: cancel; Enter: confirm; postfix the edit with '+' or '-' to enter delta times.\n"));
set_tip (secondary_clock, _("Secondary Clock right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify.\nText edits: right-to-left overwrite Esc: cancel; Enter: confirm; postfix the edit with '+' or '-' to enter delta times.\n"));
+ set_tip (editor_meter_peak_display, _("Reset Level Meter"));
synchronize_sync_source_and_video_pullup ();
@@ -417,6 +418,8 @@ ARDOUR_UI::setup_transport ()
transport_tearoff_hbox.pack_start (_editor_transport_box, false, false);
}
transport_tearoff_hbox.pack_start (alert_box, false, false);
+ transport_tearoff_hbox.pack_start (meter_box, false, false);
+ transport_tearoff_hbox.pack_start (editor_meter_peak_display, false, false);
if (Profile->get_sae()) {
Image* img = manage (new Image ((::get_icon (X_("sae")))));
diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc
index 8c78d6494d..24f6511b4c 100644
--- a/gtk2_ardour/ardour_ui_dialogs.cc
+++ b/gtk2_ardour/ardour_ui_dialogs.cc
@@ -39,6 +39,7 @@
#include "keyeditor.h"
#include "location_ui.h"
#include "main_clock.h"
+#include "meter_patterns.h"
#include "midi_tracer.h"
#include "mixer_ui.h"
#include "public_editor.h"
@@ -52,6 +53,8 @@
#include "theme_manager.h"
#include "time_info_box.h"
+#include
+
#include "i18n.h"
using namespace ARDOUR;
@@ -186,6 +189,45 @@ ARDOUR_UI::set_session (Session *s)
point_zero_something_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_something_seconds), 40);
update_format ();
+
+ if (editor_meter) {
+ meter_box.remove(*editor_meter);
+ delete editor_meter;
+ editor_meter = 0;
+ editor_meter_peak_display.hide();
+ }
+
+ if (_session && _session->master_out()) {
+ editor_meter = new LevelMeterHBox(_session);
+ editor_meter->set_meter (_session->master_out()->shared_peak_meter().get());
+ editor_meter->clear_meters();
+ editor_meter->set_type (_session->master_out()->meter_type());
+ editor_meter->setup_meters (30, 12, 6);
+ editor_meter->show();
+ meter_box.pack_start(*editor_meter);
+
+ ArdourMeter::ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_peak_display));
+ ArdourMeter::ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_route_peak_display));
+ ArdourMeter::ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_group_peak_display));
+
+ editor_meter_peak_display.set_name ("meterbridge peakindicator");
+ editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+ editor_meter_peak_display.unset_flags (Gtk::CAN_FOCUS);
+ editor_meter_peak_display.set_size_request(6, -1);
+ editor_meter_peak_display.set_corner_radius(2);
+
+ editor_meter_max_peak = -INFINITY;
+ editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false);
+
+ if (Config->get_show_editor_meter()) {
+ meter_box.show();
+ editor_meter_peak_display.show();
+ } else {
+ meter_box.hide();
+ editor_meter_peak_display.hide();
+ }
+ }
+
}
int
@@ -225,6 +267,13 @@ ARDOUR_UI::unload_session (bool hide_stuff)
point_one_second_connection.disconnect ();
point_zero_something_second_connection.disconnect();
+ if (editor_meter) {
+ meter_box.remove(*editor_meter);
+ delete editor_meter;
+ editor_meter = 0;
+ editor_meter_peak_display.hide();
+ }
+
ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
rec_button.set_sensitive (false);
@@ -497,3 +546,18 @@ ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window
return false;
}
+
+bool
+ARDOUR_UI::editor_meter_peak_button_release (GdkEventButton* ev)
+{
+ if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier|Gtkmm2ext::Keyboard::TertiaryModifier)) {
+ ArdourMeter::ResetAllPeakDisplays ();
+ } else if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier)) {
+ if (_session->master_out()) {
+ ArdourMeter::ResetGroupPeakDisplays (_session->master_out()->route_group());
+ }
+ } else if (_session->master_out()) {
+ ArdourMeter::ResetRoutePeakDisplays (_session->master_out().get());
+ }
+ return true;
+}
diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc
index 8cb1376522..6b2c9da6fa 100644
--- a/gtk2_ardour/ardour_ui_options.cc
+++ b/gtk2_ardour/ardour_ui_options.cc
@@ -413,6 +413,15 @@ ARDOUR_UI::parameter_changed (std::string p)
} else if (p == "super-rapid-clock-update") {
stop_clocking ();
start_clocking ();
+ } else if (p == "show-editor-meter") {
+ bool show = Config->get_show_editor_meter();
+ if (editor_meter && show) {
+ meter_box.show();
+ editor_meter_peak_display.show();
+ } else if (editor_meter && !show) {
+ meter_box.hide();
+ editor_meter_peak_display.hide();
+ }
}
}
diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc
index 12d3a1642f..c658160e14 100644
--- a/gtk2_ardour/audio_clock.cc
+++ b/gtk2_ardour/audio_clock.cc
@@ -2013,7 +2013,7 @@ framepos_t
AudioClock::frame_duration_from_bbt_string (framepos_t pos, const string& str) const
{
if (_session == 0) {
- error << "AudioClock::current_time() called with BBT mode but without session!" << endmsg;
+ error << "AudioClock::frame_duration_from_bbt_string() called with BBT mode but without session!" << endmsg;
return 0;
}
diff --git a/gtk2_ardour/canvas_vars.h b/gtk2_ardour/canvas_vars.h
index e2f1f42766..34116c8736 100644
--- a/gtk2_ardour/canvas_vars.h
+++ b/gtk2_ardour/canvas_vars.h
@@ -65,6 +65,7 @@ CANVAS_VARIABLE(canvasvar_MeasureLineBar, "measure line bar")
CANVAS_VARIABLE(canvasvar_MeasureLineBeat, "measure line beat")
CANVAS_VARIABLE(canvasvar_MeterBar, "meter bar")
CANVAS_VARIABLE(canvasvar_MeterBridgePeakLabel, "meterbridge peaklabel")
+CANVAS_VARIABLE(canvasvar_MeterColorBBC, "meter color BBC")
CANVAS_VARIABLE(canvasvar_MeterColor0, "meter fill: 0")
CANVAS_VARIABLE(canvasvar_MeterColor1, "meter fill: 1")
CANVAS_VARIABLE(canvasvar_MeterColor2, "meter fill: 2")
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc
index 8f992266e7..b083e851c5 100644
--- a/gtk2_ardour/editor_drag.cc
+++ b/gtk2_ardour/editor_drag.cc
@@ -1665,7 +1665,7 @@ VideoTimeLineDrag::motion (GdkEvent* event, bool first_move)
}
framecnt_t dt = adjusted_current_frame (event) - raw_grab_frame() + _pointer_frame_offset;
- dt = ARDOUR_UI::instance()->video_timeline->quantify_frames_to_apv(dt);
+ dt = ARDOUR_UI::instance()->video_timeline->quantify_frames_to_apv(_startdrag_video_offset+dt) - _startdrag_video_offset;
if (_max_backwards_drag >= 0 && dt <= - _max_backwards_drag) {
dt = - _max_backwards_drag;
@@ -2373,6 +2373,7 @@ CursorDrag::fake_locate (framepos_t t)
framepos_t const f = _editor->playhead_cursor->current_frame;
s->send_mmc_locate (f);
s->send_full_time_code (f);
+ s->send_song_position_pointer (f);
}
show_verbose_cursor_time (t);
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index b70d0f0664..93a53dd1d3 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -6950,7 +6950,7 @@ Editor::uncombine_regions ()
void
Editor::toggle_midi_input_active (bool flip_others)
{
- bool onoff;
+ bool onoff = false;
boost::shared_ptr rl (new RouteList);
for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc
index 8c67d23d36..58d7bd5fec 100644
--- a/gtk2_ardour/engine_dialog.cc
+++ b/gtk2_ardour/engine_dialog.cc
@@ -111,8 +111,12 @@ EngineControl::EngineControl ()
strings.clear ();
strings.push_back (_("None"));
+#ifdef __APPLE__
+ strings.push_back (_("coremidi"));
+#else
strings.push_back (_("seq"));
strings.push_back (_("raw"));
+#endif
set_popdown_strings (midi_driver_combo, strings);
midi_driver_combo.set_active_text (strings.front ());
diff --git a/gtk2_ardour/export_video_dialog.cc b/gtk2_ardour/export_video_dialog.cc
index 5ccfa172ea..b8f94ac55c 100644
--- a/gtk2_ardour/export_video_dialog.cc
+++ b/gtk2_ardour/export_video_dialog.cc
@@ -60,6 +60,7 @@ using namespace Gtk;
using namespace std;
using namespace PBD;
using namespace ARDOUR;
+using namespace VideoUtils;
ExportVideoDialog::ExportVideoDialog (PublicEditor& ed, Session* s)
: ArdourDialog (_("Export Video File "))
diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc
index 489564ec63..10512b24d0 100644
--- a/gtk2_ardour/gain_meter.cc
+++ b/gtk2_ardour/gain_meter.cc
@@ -84,7 +84,7 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
gain_slider = manage (new VSliderController (&gain_adjustment, fader_length, fader_girth, false));
}
- level_meter = new LevelMeter(_session);
+ level_meter = new LevelMeterHBox(_session);
level_meter->ButtonPress.connect_same_thread (_level_meter_connection, boost::bind (&GainMeterBase::level_meter_button_press, this, _1));
meter_metric_area.signal_button_press_event().connect (sigc::mem_fun (*this, &GainMeterBase::level_meter_button_press));
@@ -526,9 +526,12 @@ GainMeterBase::gain_changed ()
void
GainMeterBase::set_meter_strip_name (const char * name)
{
+ char tmp[256];
meter_metric_area.set_name (name);
- meter_ticks1_area.set_name (name);
- meter_ticks2_area.set_name (name);
+ sprintf(tmp, "Mark%sLeft", name);
+ meter_ticks1_area.set_name (tmp);
+ sprintf(tmp, "Mark%sRight", name);
+ meter_ticks2_area.set_name (tmp);
}
void
@@ -1019,21 +1022,30 @@ GainMeter::get_gm_width ()
gint
GainMeter::meter_metrics_expose (GdkEventExpose *ev)
{
- assert(_route);
+ if (!_route) {
+ if (_types.empty()) { _types.push_back(DataType::AUDIO); }
+ return meter_expose_metrics(ev, MeterPeak, _types, &meter_metric_area);
+ }
return meter_expose_metrics(ev, _route->meter_type(), _types, &meter_metric_area);
}
gint
GainMeter::meter_ticks1_expose (GdkEventExpose *ev)
{
- assert(_route);
+ if (!_route) {
+ if (_types.empty()) { _types.push_back(DataType::AUDIO); }
+ return meter_expose_ticks(ev, MeterPeak, _types, &meter_ticks1_area);
+ }
return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks1_area);
}
gint
GainMeter::meter_ticks2_expose (GdkEventExpose *ev)
{
- assert(_route);
+ if (!_route) {
+ if (_types.empty()) { _types.push_back(DataType::AUDIO); }
+ return meter_expose_ticks(ev, MeterPeak, _types, &meter_ticks2_area);
+ }
return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks2_area);
}
diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h
index 0c698d54ee..8286cbeb95 100644
--- a/gtk2_ardour/gain_meter.h
+++ b/gtk2_ardour/gain_meter.h
@@ -89,7 +89,7 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
boost::shared_ptr get_controllable();
- LevelMeter& get_level_meter() const { return *level_meter; }
+ LevelMeterHBox& get_level_meter() const { return *level_meter; }
Gtkmm2ext::SliderController& get_gain_slider() const { return *gain_slider; }
/** Emitted in the GUI thread when a button is pressed over the level meter;
@@ -117,7 +117,7 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
Gtk::DrawingArea meter_metric_area;
Gtk::DrawingArea meter_ticks1_area;
Gtk::DrawingArea meter_ticks2_area;
- LevelMeter *level_meter;
+ LevelMeterHBox *level_meter;
sigc::connection gain_watching;
diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc
index d3bb4ad5ab..6f48864992 100644
--- a/gtk2_ardour/level_meter.cc
+++ b/gtk2_ardour/level_meter.cc
@@ -22,7 +22,6 @@
#include "ardour/meter.h"
#include
-#include
#include
#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::iterator i = meters.begin(); i != meters.end(); i++) {
delete (*i).meter;
@@ -72,7 +73,7 @@ LevelMeter::~LevelMeter ()
}
void
-LevelMeter::set_meter (PeakMeter* meter)
+LevelMeterBase::set_meter (PeakMeter* meter)
{
_configuration_connection.disconnect();
_meter_type_connection.disconnect();
@@ -80,13 +81,13 @@ LevelMeter::set_meter (PeakMeter* meter)
_meter = meter;
if (_meter) {
- _meter->ConfigurationChanged.connect (_configuration_connection, invalidator (*this), boost::bind (&LevelMeter::configuration_changed, this, _1, _2), gui_context());
- _meter->TypeChanged.connect (_meter_type_connection, invalidator (*this), boost::bind (&LevelMeter::meter_type_changed, this, _1), gui_context());
+ _meter->ConfigurationChanged.connect (_configuration_connection, parent_invalidator, boost::bind (&LevelMeterBase::configuration_changed, this, _1, _2), gui_context());
+ _meter->TypeChanged.connect (_meter_type_connection, parent_invalidator, boost::bind (&LevelMeterBase::meter_type_changed, this, _1), gui_context());
}
}
-static float meter_lineup(float offset) {
- switch (Config->get_meter_line_up_level()) {
+static float meter_lineup_cfg(MeterLineUp lul, float offset) {
+ switch (lul) {
case MeteringLineUp24:
return offset + 6.0;
case MeteringLineUp20:
@@ -101,20 +102,27 @@ static float meter_lineup(float offset) {
return offset;
}
+static float meter_lineup(float offset) {
+ return meter_lineup_cfg(Config->get_meter_line_up_level(), offset);
+}
+
static float vu_standard() {
// note - default meter config is +2dB (france)
switch (Config->get_meter_vu_standard()) {
- case MeteringVUfrench: // +2dB
+ default:
+ case MeteringVUfrench: // 0VU = -2dBu
return 0;
- case MeteringVUamerican: // 0dB
+ case MeteringVUamerican: // 0VU = 0dBu
return -2;
- case MeteringVUstandard: // -4dB
+ case MeteringVUstandard: // 0VU = +4dBu
return -6;
+ case MeteringVUeight: // 0VU = +8dBu
+ return -10;
}
}
float
-LevelMeter::update_meters ()
+LevelMeterBase::update_meters ()
{
vector::iterator i;
uint32_t n;
@@ -130,7 +138,7 @@ LevelMeter::update_meters ()
const float mpeak = _meter->meter_level(n, MeterMaxPeak);
if (mpeak > (*i).max_peak) {
(*i).max_peak = mpeak;
- (*i).meter->set_highlight(mpeak > Config->get_meter_peak());
+ (*i).meter->set_highlight(mpeak >= Config->get_meter_peak());
}
if (mpeak > max_peak) {
max_peak = mpeak;
@@ -145,7 +153,7 @@ LevelMeter::update_meters ()
} else if (meter_type == MeterIEC1NOR) {
(*i).meter->set (meter_deflect_nordic (peak + meter_lineup(0)));
} else if (meter_type == MeterIEC1DIN) {
- (*i).meter->set (meter_deflect_din (peak + meter_lineup(3.0)));
+ (*i).meter->set (meter_deflect_din (peak + meter_lineup_cfg(Config->get_meter_line_up_din(), 3.0)));
} else if (meter_type == MeterIEC2BBC || meter_type == MeterIEC2EBU) {
(*i).meter->set (meter_deflect_ppm (peak + meter_lineup(0)));
} else if (meter_type == MeterVU) {
@@ -164,9 +172,9 @@ LevelMeter::update_meters ()
}
void
-LevelMeter::parameter_changed (string p)
+LevelMeterBase::parameter_changed (string p)
{
- ENSURE_GUI_THREAD (*this, &LevelMeter::parameter_changed, p)
+ ENSURE_GUI_THREAD (*this, &LevelMeterBase::parameter_changed, p)
if (p == "meter-hold") {
vector::iterator i;
@@ -180,6 +188,10 @@ LevelMeter::parameter_changed (string p)
color_changed = true;
setup_meters (meter_length, regular_meter_width, thin_meter_width);
}
+ else if (p == "meter-style-led") {
+ color_changed = true;
+ setup_meters (meter_length, regular_meter_width, thin_meter_width);
+ }
else if (p == "meter-peak") {
vector::iterator i;
uint32_t n;
@@ -191,14 +203,14 @@ LevelMeter::parameter_changed (string p)
}
void
-LevelMeter::configuration_changed (ChanCount /*in*/, ChanCount /*out*/)
+LevelMeterBase::configuration_changed (ChanCount /*in*/, ChanCount /*out*/)
{
color_changed = true;
setup_meters (meter_length, regular_meter_width, thin_meter_width);
}
void
-LevelMeter::meter_type_changed (MeterType t)
+LevelMeterBase::meter_type_changed (MeterType t)
{
meter_type = t;
color_changed = true;
@@ -207,18 +219,18 @@ LevelMeter::meter_type_changed (MeterType t)
}
void
-LevelMeter::hide_all_meters ()
+LevelMeterBase::hide_all_meters ()
{
for (vector::iterator i = meters.begin(); i != meters.end(); ++i) {
if ((*i).packed) {
- remove (*((*i).meter));
+ mtr_remove (*((*i).meter));
(*i).packed = false;
}
}
}
void
-LevelMeter::setup_meters (int len, int initial_width, int thin_width)
+LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
{
hide_all_meters ();
@@ -248,11 +260,17 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width)
meters.push_back (MeterInfo());
}
- //cerr << "LevelMeter::setup_meters() called color_changed = " << color_changed << " colors: " << endl;//DEBUG
+ //cerr << "LevelMeterBase::setup_meters() called color_changed = " << color_changed << " colors: " << endl;//DEBUG
for (int32_t n = nmeters-1; nmeters && n >= 0 ; --n) {
uint32_t c[10];
+ uint32_t b[4];
float stp[4];
+ int styleflags = Config->get_meter_style_led() ? 3 : 1;
+ b[0] = ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get();
+ b[1] = ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get();
+ b[2] = 0x991122ff; // red highlight gradient Bot
+ b[3] = 0x551111ff; // red highlight gradient Top
if (n < nmidi) {
c[0] = ARDOUR_UI::config()->canvasvar_MidiMeterColor0.get();
c[1] = ARDOUR_UI::config()->canvasvar_MidiMeterColor1.get();
@@ -303,30 +321,44 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width)
c[6] = c[7] = 0xffff00ff;
c[8] = c[9] = 0xff0000ff;
break;
- case MeterIEC2EBU:
case MeterIEC2BBC:
- stp[0] = 115.0 * meter_deflect_ppm(-18);
- stp[1] = 115.0 * meter_deflect_ppm(-14);
- stp[2] = 115.0 * meter_deflect_ppm(-10);
- stp[3] = 115.0 * meter_deflect_ppm( -8);
+ c[0] = c[1] = c[2] = c[3] = c[4] = c[5] = c[6] = c[7] = c[8] = c[9] =
+ ARDOUR_UI::config()->color_by_name ("meter color BBC");
+ stp[0] = stp[1] = stp[2] = stp[3] = 115.0;
+ break;
+ case MeterIEC2EBU:
+ stp[0] = 115.0 * meter_deflect_ppm(-24); // ignored
+ stp[1] = 115.0 * meter_deflect_ppm(-18);
+ stp[2] = 115.0 * meter_deflect_ppm( -9);
+ stp[3] = 115.0 * meter_deflect_ppm( 0); // ignored
+ c[3] = c[2] = c[1];
+ c[6] = c[7] = c[8] = c[9];
break;
case MeterIEC1NOR:
- stp[0] = 115.0 * meter_deflect_nordic(-18);
- stp[1] = 115.0 * meter_deflect_nordic(-15);
+ stp[0] = 115.0 * meter_deflect_nordic(-30); // ignored
+ stp[1] = 115.0 * meter_deflect_nordic(-18);
stp[2] = 115.0 * meter_deflect_nordic(-12);
- stp[3] = 115.0 * meter_deflect_nordic( -9);
+ stp[3] = 115.0 * meter_deflect_nordic( -9); // ignored
+ //c[2] = c[3] = c[1]; // dark-green
+ c[0] = c[1] = c[2]; // bright-green
+ c[6] = c[7] = c[8] = c[9];
break;
case MeterIEC1DIN:
- stp[0] = 115.0 * meter_deflect_din(-29);
+ stp[0] = 115.0 * meter_deflect_din(-29); // ignored
stp[1] = 115.0 * meter_deflect_din(-18);
- stp[2] = 115.0 * meter_deflect_din(-15);
+ stp[2] = 115.0 * meter_deflect_din(-15); // ignored
stp[3] = 115.0 * meter_deflect_din( -9);
+ c[0] = c[1] = c[2] = c[3] = 0x00aa00ff;
+ c[4] = c[6];
+ c[5] = c[7];
break;
case MeterVU:
stp[0] = 115.0 * meter_deflect_vu(-26); // -6
stp[1] = 115.0 * meter_deflect_vu(-23); // -3
stp[2] = 115.0 * meter_deflect_vu(-20); // 0
stp[3] = 115.0 * meter_deflect_vu(-18); // +2
+ c[0] = c[1] = c[2] = c[3] = c[4] = c[5] = 0x00aa00ff;
+ c[6] = c[7] = c[8] = c[9] = 0xff8800ff;
break;
default: // PEAK, RMS
stp[1] = 77.5; // 115 * log_meter(-10)
@@ -349,56 +381,61 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width)
}
}
}
- if (meters[n].width != width || meters[n].length != len || color_changed) {
+ if (meters[n].width != width || meters[n].length != len || color_changed || meter_type != visible_meter_type) {
+ bool hl = meters[n].meter ? meters[n].meter->get_highlight() : false;
+ meters[n].packed = false;
delete meters[n].meter;
- meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical, len,
+ meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, _meter_orientation, len,
c[0], c[1], c[2], c[3], c[4],
c[5], c[6], c[7], c[8], c[9],
- ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get(),
- ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get(),
- 0x991122ff, 0x551111ff,
- stp[0], stp[1], stp[2], stp[3]
+ b[0], b[1], b[2], b[3],
+ stp[0], stp[1], stp[2], stp[3],
+ styleflags
);
+ meters[n].meter->set_highlight(hl);
meters[n].width = width;
meters[n].length = len;
meters[n].meter->add_events (Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);
- meters[n].meter->signal_button_press_event().connect (sigc::mem_fun (*this, &LevelMeter::meter_button_press));
- meters[n].meter->signal_button_release_event().connect (sigc::mem_fun (*this, &LevelMeter::meter_button_release));
+ meters[n].meter->signal_button_press_event().connect (sigc::mem_fun (*this, &LevelMeterBase::meter_button_press));
+ meters[n].meter->signal_button_release_event().connect (sigc::mem_fun (*this, &LevelMeterBase::meter_button_release));
}
- pack_end (*meters[n].meter, false, false);
+ //pack_end (*meters[n].meter, false, false);
+ mtr_pack (*meters[n].meter);
meters[n].meter->show_all ();
meters[n].packed = true;
}
- show();
+ //show();
color_changed = false;
+ visible_meter_type = meter_type;
}
void
-LevelMeter::set_type(MeterType t)
+LevelMeterBase::set_type(MeterType t)
{
meter_type = t;
_meter->set_type(t);
}
bool
-LevelMeter::meter_button_press (GdkEventButton* ev)
+LevelMeterBase::meter_button_press (GdkEventButton* ev)
{
return ButtonPress (ev); /* EMIT SIGNAL */
}
bool
-LevelMeter::meter_button_release (GdkEventButton* ev)
+LevelMeterBase::meter_button_release (GdkEventButton* ev)
{
if (ev->button == 1) {
clear_meters (false);
}
+ ButtonRelease(ev);
return true;
}
-void LevelMeter::clear_meters (bool reset_highlight)
+void LevelMeterBase::clear_meters (bool reset_highlight)
{
for (vector::iterator i = meters.begin(); i < meters.end(); i++) {
(*i).meter->clear();
@@ -409,14 +446,53 @@ void LevelMeter::clear_meters (bool reset_highlight)
max_peak = minus_infinity();
}
-void LevelMeter::hide_meters ()
+void LevelMeterBase::hide_meters ()
{
hide_all_meters();
}
void
-LevelMeter::color_handler ()
+LevelMeterBase::color_handler ()
{
color_changed = true;
+ setup_meters (meter_length, regular_meter_width, thin_meter_width);
}
+LevelMeterHBox::LevelMeterHBox(Session* s)
+ : LevelMeterBase(s, invalidator(*this))
+{
+ set_spacing(1);
+ show();
+}
+
+
+LevelMeterHBox::~LevelMeterHBox() {}
+
+void
+LevelMeterHBox::mtr_pack(Gtk::Widget &w) {
+ pack_end (w, false, false);
+}
+
+void
+LevelMeterHBox::mtr_remove(Gtk::Widget &w) {
+ remove (w);
+}
+
+
+LevelMeterVBox::LevelMeterVBox(Session* s)
+ : LevelMeterBase(s, invalidator(*this), FastMeter::Horizontal)
+{
+ set_spacing(1);
+ show();
+}
+LevelMeterVBox::~LevelMeterVBox() {}
+
+void
+LevelMeterVBox::mtr_pack(Gtk::Widget &w) {
+ pack_end (w, false, false);
+}
+
+void
+LevelMeterVBox::mtr_remove(Gtk::Widget &w) {
+ remove (w);
+}
diff --git a/gtk2_ardour/level_meter.h b/gtk2_ardour/level_meter.h
index ead63aa50b..a355d7d285 100644
--- a/gtk2_ardour/level_meter.h
+++ b/gtk2_ardour/level_meter.h
@@ -37,6 +37,7 @@
#include
#include
#include
+#include
#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 ButtonPress;
+ PBD::Signal1 ButtonRelease;
PBD::Signal1 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 meters;
float max_peak;
ARDOUR::MeterType meter_type;
+ ARDOUR::MeterType visible_meter_type;
PBD::ScopedConnection _configuration_connection;
PBD::ScopedConnection _meter_type_connection;
@@ -120,5 +127,27 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr
void color_handler ();
};
+class LevelMeterHBox : public LevelMeterBase, public Gtk::HBox
+{
+ public:
+ LevelMeterHBox (ARDOUR::Session*);
+ ~LevelMeterHBox();
+
+ protected:
+ void mtr_pack(Gtk::Widget &w);
+ void mtr_remove(Gtk::Widget &w);
+};
+
+class LevelMeterVBox : public LevelMeterBase, public Gtk::VBox
+{
+ public:
+ LevelMeterVBox (ARDOUR::Session*);
+ ~LevelMeterVBox();
+
+ protected:
+ void mtr_pack(Gtk::Widget &w);
+ void mtr_remove(Gtk::Widget &w);
+};
+
#endif /* __ardour_gtk_track_meter_h__ */
diff --git a/gtk2_ardour/logmeter.h b/gtk2_ardour/logmeter.h
index c7b18ea6b9..a244fb4bbe 100644
--- a/gtk2_ardour/logmeter.h
+++ b/gtk2_ardour/logmeter.h
@@ -35,16 +35,16 @@ alt_log_meter (float power)
#endif
/* prototypes - avoid compiler warning */
-inline float log_meter (float db);
-inline float meter_deflect_ppm (float);
-inline float meter_deflect_din (float);
-inline float meter_deflect_nordic (float);
-inline float meter_deflect_vu (float);
-inline float meter_deflect_k (float, float);
+static inline float log_meter (float db);
+static inline float meter_deflect_ppm (float);
+static inline float meter_deflect_din (float);
+static inline float meter_deflect_nordic (float);
+static inline float meter_deflect_vu (float);
+static inline float meter_deflect_k (float, float);
-inline float
+static inline float
log_meter (float db)
{
gfloat def = 0.0f; /* Meter deflection %age */
@@ -75,7 +75,7 @@ log_meter (float db)
return def/115.0f;
}
-inline float
+static inline float
meter_deflect_ppm (float db)
{
if (db < -30) {
@@ -91,7 +91,7 @@ meter_deflect_ppm (float db)
}
}
-inline float
+static inline float
meter_deflect_din (float db)
{
float rv = dB_to_coefficient(db);
@@ -103,7 +103,7 @@ meter_deflect_din (float db)
}
}
-inline float
+static inline float
meter_deflect_nordic (float db)
{
if (db < -60) {
@@ -118,7 +118,7 @@ meter_deflect_nordic (float db)
}
}
-inline float
+static inline float
meter_deflect_vu (float db)
{
const float rv = 6.77165f * dB_to_coefficient(db);
@@ -126,7 +126,7 @@ meter_deflect_vu (float db)
return rv;
}
-inline float
+static inline float
meter_deflect_k (float db, float krange)
{
db+=krange;
diff --git a/gtk2_ardour/lv2_plugin_ui.cc b/gtk2_ardour/lv2_plugin_ui.cc
index 2fe817a6a0..f9b15714f6 100644
--- a/gtk2_ardour/lv2_plugin_ui.cc
+++ b/gtk2_ardour/lv2_plugin_ui.cc
@@ -184,11 +184,19 @@ LV2PluginUI::LV2PluginUI(boost::shared_ptr pi,
, _pi(pi)
, _lv2(lv2p)
, _gui_widget(NULL)
- , _ardour_buttons_box(NULL)
, _values(NULL)
, _external_ui_ptr(NULL)
, _inst(NULL)
{
+ _ardour_buttons_box.set_spacing (6);
+ _ardour_buttons_box.set_border_width (6);
+ _ardour_buttons_box.pack_end (focus_button, false, false);
+ _ardour_buttons_box.pack_end (bypass_button, false, false, 10);
+ _ardour_buttons_box.pack_end (delete_button, false, false);
+ _ardour_buttons_box.pack_end (save_button, false, false);
+ _ardour_buttons_box.pack_end (add_button, false, false);
+ _ardour_buttons_box.pack_end (_preset_combo, false, false);
+ _ardour_buttons_box.pack_end (_preset_modified, false, false);
}
void
@@ -219,18 +227,11 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title)
features[features_count - 1] = &_external_ui_feature;
features[features_count] = NULL;
} else {
- _ardour_buttons_box = manage (new Gtk::HBox);
- _ardour_buttons_box->set_spacing (6);
- _ardour_buttons_box->set_border_width (6);
- _ardour_buttons_box->pack_end (focus_button, false, false);
- _ardour_buttons_box->pack_end (bypass_button, false, false, 10);
- _ardour_buttons_box->pack_end (delete_button, false, false);
- _ardour_buttons_box->pack_end (save_button, false, false);
- _ardour_buttons_box->pack_end (add_button, false, false);
- _ardour_buttons_box->pack_end (_preset_combo, false, false);
- _ardour_buttons_box->pack_end (_preset_modified, false, false);
- _ardour_buttons_box->show_all();
- pack_start(*_ardour_buttons_box, false, false);
+ if (_ardour_buttons_box.get_parent()) {
+ _ardour_buttons_box.get_parent()->remove(_ardour_buttons_box);
+ }
+ pack_start(_ardour_buttons_box, false, false);
+ _ardour_buttons_box.show_all();
_gui_widget = Gtk::manage((container = new Gtk::Alignment()));
pack_start(*_gui_widget, true, true);
diff --git a/gtk2_ardour/lv2_plugin_ui.h b/gtk2_ardour/lv2_plugin_ui.h
index 9bf8c3d92b..edb90cb154 100644
--- a/gtk2_ardour/lv2_plugin_ui.h
+++ b/gtk2_ardour/lv2_plugin_ui.h
@@ -73,7 +73,7 @@ class LV2PluginUI : public PlugUIBase, public Gtk::VBox
sigc::connection _screen_update_connection;
Gtk::Widget* _gui_widget;
/** a box containing the focus, bypass, delete, save / add preset buttons etc. */
- Gtk::HBox* _ardour_buttons_box;
+ Gtk::HBox _ardour_buttons_box;
float* _values;
std::vector _controllables;
struct lv2_external_ui_host _external_ui_host;
diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc
index 193039b3eb..f392dc0872 100644
--- a/gtk2_ardour/meter_patterns.cc
+++ b/gtk2_ardour/meter_patterns.cc
@@ -52,15 +52,17 @@ sigc::signal ArdourMeter::Set
/* pattern cache */
struct MeterMatricsMapKey {
- MeterMatricsMapKey (std::string n, MeterType t)
+ MeterMatricsMapKey (std::string n, MeterType t, int dt)
: _n(n)
, _t(t)
+ , _dt(dt)
{}
inline bool operator<(const MeterMatricsMapKey& rhs) const {
- return (_n < rhs._n) || (_n == rhs._n && _t < rhs._t);
+ return (_n < rhs._n) || (_n == rhs._n && _t < rhs._t) || (_n == rhs._n && _t == rhs._t && _dt < rhs._dt);
}
std::string _n;
MeterType _t;
+ int _dt;
};
namespace ArdourMeter {
@@ -108,6 +110,14 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt)
}
}
+static inline int types_to_bit (vector types) {
+ int rv = 0;
+ for (vector::const_iterator i = types.begin(); i != types.end(); ++i) {
+ rv |= 1 << (*i);
+ }
+ return rv;
+}
+
static inline float mtr_col_and_fract(
cairo_t* cr, Gdk::Color const * const c, const uint32_t peakcolor, const MeterType mt, const float val)
{
@@ -130,18 +140,12 @@ static inline float mtr_col_and_fract(
case MeterIEC2BBC:
case MeterIEC2EBU:
fraction = meter_deflect_ppm(val);
- if (val >= -10.0) {
- cairo_set_source_rgb (cr,
- UINT_RGBA_R_FLT(peakcolor),
- UINT_RGBA_G_FLT(peakcolor),
- UINT_RGBA_B_FLT(peakcolor));
- } else {
- cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
- }
+ cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
break;
case MeterIEC1NOR:
fraction = meter_deflect_nordic(val);
- if (val >= -12.0) {
+#if 0
+ if (val == -18.0) {
cairo_set_source_rgb (cr,
UINT_RGBA_R_FLT(peakcolor),
UINT_RGBA_G_FLT(peakcolor),
@@ -149,10 +153,13 @@ static inline float mtr_col_and_fract(
} else {
cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
}
+#else
+ cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
+#endif
break;
case MeterIEC1DIN:
fraction = meter_deflect_din(val);
- if (val >= -9.0) {
+ if (val == -9.0 || val == -15 || val == -18) {
cairo_set_source_rgb (cr,
UINT_RGBA_R_FLT(peakcolor),
UINT_RGBA_G_FLT(peakcolor),
@@ -196,6 +203,65 @@ static inline float mtr_col_and_fract(
return fraction;
}
+static void mtr_red_stripe(cairo_t* cr, float l, float w, int h, float top, float bot) {
+ if (w <= 0) return;
+ int t = h - floorf (h * (top));
+ int b = h - floorf (h * (bot));
+ cairo_set_source_rgba (cr, .75, 0, 0, 0.75);
+ cairo_rectangle (cr, l, t + .5, w, b - t);
+ cairo_fill (cr);
+}
+
+static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) {
+ float r,g,b;
+ switch(type) {
+ case MeterVU:
+ if (rgba_p_from_style("meterstripVU", &r, &g, &b, "bg")) {
+ cairo_set_source_rgb (cr, r, g, b);
+ } else {
+ cairo_set_source_rgb (cr, 1.0, 1.0, 0.85);
+ }
+ break;
+ case MeterIEC1DIN:
+ case MeterIEC1NOR:
+ case MeterIEC2BBC:
+ case MeterIEC2EBU:
+ case MeterK14:
+ case MeterK20:
+ if (rgba_p_from_style("meterstripPPM", &r, &g, &b, "bg")) {
+ cairo_set_source_rgb (cr, r, g, b);
+ } else {
+ cairo_set_source_rgb (cr, 0.1, 0.1, 0.1);
+ }
+ break;
+ default:
+ {
+ Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_ACTIVE);
+ cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
+ }
+ break;
+ }
+}
+
+static void set_fg_color(Gtk::Widget&, MeterType type, Gdk::Color * c) {
+ float r,g,b;
+ switch(type) {
+ case MeterVU:
+ if (rgba_p_from_style("meterstripVU", &r, &g, &b)) {
+ c->set_rgb_p(r, g, b);
+ } else {
+ c->set_rgb_p(0.0, 0.0, 0.0);
+ }
+ break;
+ default:
+ if (rgba_p_from_style("meterstripPPM", &r, &g, &b)) {
+ c->set_rgb_p(r, g, b);
+ } else {
+ c->set_rgb_p(1.0, 1.0, 1.0);
+ }
+ break;
+ }
+}
static cairo_pattern_t*
meter_render_ticks (Gtk::Widget& w, MeterType type, vector types)
@@ -203,19 +269,45 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ
Glib::RefPtr win (w.get_window());
bool background;
+ bool tickleft, tickright;
gint width, height;
win->get_size (width, height);
- background = types.size() == 0
- || w.get_name().substr(w.get_name().length() - 4) == "Left"
- || w.get_name().substr(w.get_name().length() - 5) == "Right";
+ tickleft = w.get_name().substr(w.get_name().length() - 4) == "Left";
+ tickright = w.get_name().substr(w.get_name().length() - 5) == "Right";
+ background = types.size() == 0 || tickleft || tickright;
+
+ float box_l=0;
+ float box_w=0;
+ if (tickleft) {
+ if (w.get_name().substr(0, 3) == "Bar") {
+ box_l = width-2; box_w = 2;
+ } else if (w.get_name().substr(0, 4) == "Mark") {
+ box_l = width-2; box_w = 2;
+ background = false;
+ }
+ } else if (tickright) {
+ if (w.get_name().substr(0, 3) == "Bar") {
+ box_l = 0; box_w = 2;
+ } else if (w.get_name().substr(0, 4) == "Mark") {
+ box_l = 0; box_w = 2;
+ background = false;
+ }
+ } else {
+ box_l = 0; box_w = 3;
+ }
cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
cairo_t* cr = cairo_create (surface);
cairo_move_to (cr, 0, 0);
cairo_rectangle (cr, 0, 0, width, height);
- {
- Gdk::Color c = w.get_style()->get_bg (background ? Gtk::STATE_ACTIVE : Gtk::STATE_NORMAL);
+
+ if (background) {
+ /* meterbridge */
+ set_bg_color(w, cr, type);
+ } else {
+ /* mixer */
+ Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_NORMAL);
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
}
cairo_fill (cr);
@@ -226,23 +318,13 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ
for (vector::const_iterator i = types.begin(); i != types.end(); ++i) {
Gdk::Color c;
- c = w.get_style()->get_fg (Gtk::STATE_NORMAL);
-
- if (types.size() > 1) {
+ if (types.size() > 1 && (*i) == DataType::MIDI) {
/* we're overlaying more than 1 set of marks, so use different colours */
- switch (*i) {
- case DataType::AUDIO:
- c = w.get_style()->get_fg (Gtk::STATE_NORMAL);
- cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
- break;
- case DataType::MIDI:
- c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
- cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
- break;
- }
+ c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
+ } else if (background) {
+ set_fg_color(w, type, &c);
} else {
c = w.get_style()->get_fg (Gtk::STATE_NORMAL);
- cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
}
// tick-maker position in dBFS, line-thickness
@@ -259,10 +341,11 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ
points.insert (std::pair(-24.0f, 1.0));
points.insert (std::pair(-20.0f, 1.0));
points.insert (std::pair(-17.0f, 1.0));
- points.insert (std::pair(-14.0f, 1.0));
- points.insert (std::pair(-11.0f, 1.0));
- points.insert (std::pair( -8.0f, 1.0));
- points.insert (std::pair( -4.0f, 1.0));
+ points.insert (std::pair(-14.0f, 1.0)); // 0
+ points.insert (std::pair(-11.0f, 1.0)); // +3
+ points.insert (std::pair(-10.0f, 0.8)); // +4
+ points.insert (std::pair( -8.0f, 1.0)); // +6
+ points.insert (std::pair( -4.0f, 1.0)); // +10
points.insert (std::pair( 0.0f, 1.0));
break;
case MeterK20:
@@ -272,12 +355,13 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ
points.insert (std::pair(-30.0f, 1.0));
points.insert (std::pair(-26.0f, 1.0));
points.insert (std::pair(-23.0f, 1.0));
- points.insert (std::pair(-20.0f, 1.0));
+ points.insert (std::pair(-20.0f, 1.0)); // 0
points.insert (std::pair(-17.0f, 1.0));
- points.insert (std::pair(-14.0f, 1.0));
+ points.insert (std::pair(-16.0f, 0.8));
+ points.insert (std::pair(-14.0f, 1.0)); // +6
points.insert (std::pair(-10.0f, 1.0));
points.insert (std::pair( -5.0f, 1.0));
- points.insert (std::pair( 0.0f, 1.0));
+ points.insert (std::pair( 0.0f, 1.0)); //+20
break;
case MeterIEC2EBU:
points.insert (std::pair(-30.0f, 1.0));
@@ -291,7 +375,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ
points.insert (std::pair(-14.0f, 1.0));
points.insert (std::pair(-12.0f, 0.5));
points.insert (std::pair(-10.0f, 1.0));
- points.insert (std::pair( -9.0f, 0.5));
+ points.insert (std::pair( -9.0f, 0.8));
points.insert (std::pair( -8.0f, 0.5));
points.insert (std::pair( -6.0f, 1.0));
break;
@@ -315,44 +399,66 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ
points.insert (std::pair(-39.0f, 0.5));
points.insert (std::pair(-36.0f, 1.0));
- points.insert (std::pair(-33.0f, 1.0));
+ points.insert (std::pair(-33.0f, 0.5));
points.insert (std::pair(-30.0f, 1.0));
- points.insert (std::pair(-27.0f, 1.0));
+ points.insert (std::pair(-27.0f, 0.5));
points.insert (std::pair(-24.0f, 1.0));
- points.insert (std::pair(-21.0f, 1.0));
+ points.insert (std::pair(-21.0f, 0.5));
points.insert (std::pair(-18.0f, 1.0));
- points.insert (std::pair(-15.0f, 1.0));
+ points.insert (std::pair(-15.0f, 0.5));
points.insert (std::pair(-12.0f, 1.0));
points.insert (std::pair( -9.0f, 1.0));
- points.insert (std::pair( -6.0f, 1.0));
+ points.insert (std::pair( -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( -3.0f, 0.5)); // "200%"
- points.insert (std::pair( -4.0f, 1.0)); // "100%"
- points.insert (std::pair( -9.0f, 1.0));
+ points.insert (std::pair( -4.0f, 1.0));
+ points.insert (std::pair( -5.0f, 0.5));
+ points.insert (std::pair( -6.0f, 0.5));
+ points.insert (std::pair( -7.0f, 0.5));
+ points.insert (std::pair( -8.0f, 0.5));
+ points.insert (std::pair( -9.0f, 1.0)); // "100%"
+ points.insert (std::pair(-10.0f, 0.5));
+ points.insert (std::pair(-11.0f, 0.5));
+ points.insert (std::pair(-12.0f, 0.5));
+ points.insert (std::pair(-13.0f, 0.5));
points.insert (std::pair(-14.0f, 1.0));
- points.insert (std::pair(-15.0f, 0.5)); // "50%"
- points.insert (std::pair(-18.0f, 0.5)); // "-9"
- points.insert (std::pair(-19.0f, 1.0)); // "30%"
- points.insert (std::pair(-29.0f, 1.0)); // "10%"
- points.insert (std::pair(-35.0f, 0.5)); // "5%" " -20"
- points.insert (std::pair(-39.0f, 1.0)); // "3%"
- points.insert (std::pair(-49.0f, 0.5)); // "1%"
+ points.insert (std::pair(-15.0f, 0.8)); // "50%"
+ points.insert (std::pair(-18.0f, 0.8)); // "-9"
+ points.insert (std::pair(-19.0f, 1.0));
+ points.insert (std::pair(-24.0f, 0.5));
+ points.insert (std::pair(-29.0f, 1.0)); // "-20", "10%"
+ points.insert (std::pair(-34.0f, 0.5)); // -25
+ //points.insert (std::pair(-35.0f, 0.5)); // "5%" " -20"
+ points.insert (std::pair(-39.0f, 1.0));
+ points.insert (std::pair(-49.0f, 1.0));
+ points.insert (std::pair(-54.0f, 0.5));
points.insert (std::pair(-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(-17.0f, 1.0));
+ points.insert (std::pair(-17.0f, 1.0)); //+3 VU
points.insert (std::pair(-18.0f, 1.0));
points.insert (std::pair(-19.0f, 1.0));
- points.insert (std::pair(-20.0f, 1.0));
+ points.insert (std::pair(-19.5f, 0.5));
+ points.insert (std::pair(-20.0f, 1.0)); // 0 VU
+ points.insert (std::pair(-20.5f, 0.5));
points.insert (std::pair(-21.0f, 1.0));
points.insert (std::pair(-22.0f, 1.0));
- points.insert (std::pair(-23.0f, 1.0));
+ points.insert (std::pair(-23.0f, 1.0)); //-3 VU
+ points.insert (std::pair(-24.0f, 0.5));
points.insert (std::pair(-25.0f, 1.0));
- points.insert (std::pair(-27.0f, 1.0));
+ points.insert (std::pair(-26.0f, 0.5));
+ points.insert (std::pair(-27.0f, 1.0)); //-7 VU
points.insert (std::pair(-30.0f, 1.0));
+ points.insert (std::pair(-35.0f, 0.5));
points.insert (std::pair(-40.0f, 1.0));
+ mtr_red_stripe(cr, box_l, box_w, height,
+ meter_deflect_vu(-17.0f), meter_deflect_vu(-20.0f));
break;
default:
@@ -433,6 +539,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ
fraction = (j->first) / 127.0;
pos = 1 + height - (gint) floor (height * fraction);
pos = min (pos, height);
+ cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
cairo_arc(cr, 1.5, pos + .5, 1.0, 0, 2 * M_PI);
cairo_fill(cr);
break;
@@ -455,6 +562,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types)
bool tickleft, tickright;
bool background;
+ int overlay_midi = 1;
gint width, height;
win->get_size (width, height);
@@ -500,8 +608,12 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types)
cairo_move_to (cr, 0, 0);
cairo_rectangle (cr, 0, 0, width, height);
- {
- Gdk::Color c = w.get_style()->get_bg (background ? Gtk::STATE_ACTIVE : Gtk::STATE_NORMAL);
+ if (background) {
+ /* meterbridge */
+ set_bg_color(w, cr, type);
+ } else {
+ /* mixer */
+ Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_NORMAL);
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
}
cairo_fill (cr);
@@ -510,56 +622,52 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types)
height = min(max_pattern_metric_size, height);
uint32_t peakcolor = ARDOUR_UI::config()->color_by_name ("meterbridge peaklabel");
+ Gdk::Color c; // default text color
for (vector::const_iterator i = types.begin(); i != types.end(); ++i) {
- Gdk::Color c;
- if (types.size() > 1) {
- /* 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;
- }
- } 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());
+ if (types.size() > 1 && (*i) == DataType::MIDI && overlay_midi == 0) {
+ continue;
}
+ if (types.size() > 1 && (*i) == DataType::MIDI) {
+ /* we're overlaying more than 1 set of marks, so use different colours */
+ 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);
+ }
- // label-pos in dBFS, label-text
- std::map points;
+ std::map points; // map: label-pos in dBFS, label-text
switch (*i) {
case DataType::AUDIO:
layout->set_attributes (audio_font_attributes);
switch (type) {
case MeterK14:
+ overlay_midi = 0;
points.insert (std::pair(-54.0f, "-40"));
points.insert (std::pair(-44.0f, "-30"));
points.insert (std::pair(-34.0f, "-20"));
points.insert (std::pair(-24.0f, "-10"));
points.insert (std::pair(-20.0f, "-6"));
points.insert (std::pair(-17.0f, "-3"));
- points.insert (std::pair(-14.0f, "0"));
+ points.insert (std::pair(-14.0f, " 0"));
points.insert (std::pair(-11.0f, "+3"));
points.insert (std::pair( -8.0f, "+6"));
points.insert (std::pair( -4.0f, "+10"));
points.insert (std::pair( 0.0f, "+14"));
break;
case MeterK20:
+ overlay_midi = 0;
points.insert (std::pair(-60.0f, "-40"));
points.insert (std::pair(-50.0f, "-30"));
points.insert (std::pair(-40.0f, "-20"));
points.insert (std::pair(-30.0f, "-10"));
points.insert (std::pair(-26.0f, "-6"));
points.insert (std::pair(-23.0f, "-3"));
- points.insert (std::pair(-20.0f, "0"));
+ points.insert (std::pair(-20.0f, " 0"));
points.insert (std::pair(-17.0f, "+3"));
points.insert (std::pair(-14.0f, "+6"));
points.insert (std::pair(-10.0f, "+10"));
@@ -590,6 +698,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types)
break;
case MeterIEC2EBU:
+ overlay_midi = 3;
points.insert (std::pair(-30.0f, "-12"));
points.insert (std::pair(-26.0f, "-8"));
points.insert (std::pair(-22.0f, "-4"));
@@ -600,6 +709,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types)
break;
case MeterIEC2BBC:
+ overlay_midi = 3;
points.insert (std::pair(-30.0f, " 1 "));
points.insert (std::pair(-26.0f, " 2 "));
points.insert (std::pair(-22.0f, " 3 "));
@@ -610,45 +720,48 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types)
break;
case MeterIEC1NOR:
+ overlay_midi = 0;
//points.insert (std::pair(-60.0f, "-42"));
points.insert (std::pair(-54.0f, "-36"));
points.insert (std::pair(-48.0f, "-30"));
points.insert (std::pair(-42.0f, "-24"));
points.insert (std::pair(-36.0f, "-18"));
- points.insert (std::pair(-33.0f, "-15"));
+ //points.insert (std::pair(-33.0f, "-15"));
points.insert (std::pair(-30.0f, "-12"));
- points.insert (std::pair(-27.0f, "-9"));
+ //points.insert (std::pair(-27.0f, "-9"));
points.insert (std::pair(-24.0f, "-6"));
- points.insert (std::pair(-21.0f, "-3"));
+ //points.insert (std::pair(-21.0f, "-3"));
points.insert (std::pair(-18.0f, "TST"));
- points.insert (std::pair(-15.0f, "+3"));
+ //points.insert (std::pair(-15.0f, "+3"));
points.insert (std::pair(-12.0f, "+6"));
points.insert (std::pair( -9.0f, "+9"));
- points.insert (std::pair( -6.0f, "+12"));
+ //points.insert (std::pair( -6.0f, "+12"));
break;
case MeterIEC1DIN:
+ overlay_midi = 2;
//points.insert (std::pair( -3.0f, "200%"));
- points.insert (std::pair( -4.0f, "+5")); // "100%"
- points.insert (std::pair( -9.0f, "0"));
+ points.insert (std::pair( -4.0f, "+5"));
+ points.insert (std::pair( -9.0f, "0")); // "100%";
points.insert (std::pair(-14.0f, "-5"));
//points.insert (std::pair(-15.0f, "50%"));
//points.insert (std::pair(-18.0f, "-9"));
points.insert (std::pair(-19.0f, "-10")); // "30%"
points.insert (std::pair(-29.0f, "-20")); // "10%"
- //points.insert (std::pair(-35.0f, "-20")); // "5%"
- points.insert (std::pair(-39.0f, "-30")); // "3%"
+ //points.insert (std::pair(-35.0f, "5%")); // "5%"
+ points.insert (std::pair(-39.0f, "-30"));
//points.insert (std::pair(-49.0f, "1%"));
points.insert (std::pair(-59.0f, "-50"));
break;
case MeterVU:
+ overlay_midi = 0;
points.insert (std::pair(-17.0f, "+3"));
points.insert (std::pair(-18.0f, "+2"));
points.insert (std::pair(-19.0f, "+1"));
- points.insert (std::pair(-20.0f, "0"));
+ points.insert (std::pair(-20.0f, " 0"));
points.insert (std::pair(-21.0f, "-1"));
points.insert (std::pair(-22.0f, "-2"));
points.insert (std::pair(-23.0f, "-3"));
@@ -661,8 +774,8 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types)
break;
case DataType::MIDI:
layout->set_attributes (midi_font_attributes);
- points.insert (std::pair( 0, "0"));
if (types.size() == 1) {
+ points.insert (std::pair( 0, "0"));
points.insert (std::pair( 16, "16"));
points.insert (std::pair( 32, "32"));
points.insert (std::pair( 48, "48"));
@@ -672,16 +785,40 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types)
points.insert (std::pair(100, "100"));
points.insert (std::pair(112, "112"));
} else {
- /* labels that don't overlay with dB */
- points.insert (std::pair( 24, "24"));
- points.insert (std::pair( 48, "48"));
- points.insert (std::pair( 72, "74"));
+ switch (overlay_midi) {
+ case 1:
+ /* labels that don't overlay with dBFS */
+ points.insert (std::pair( 0, "0"));
+ points.insert (std::pair( 24, "24"));
+ points.insert (std::pair( 48, "48"));
+ points.insert (std::pair( 72, "72"));
+ points.insert (std::pair(127, "127"));
+ break;
+ case 2:
+ /* labels that don't overlay with DIN */
+ points.insert (std::pair( 0, "0"));
+ points.insert (std::pair( 16, "16"));
+ points.insert (std::pair( 40, "40"));
+ points.insert (std::pair( 64, "64"));
+ points.insert (std::pair(112, "112"));
+ points.insert (std::pair(127, "127"));
+ break;
+ case 3:
+ /* labels that don't overlay with BBC nor EBU*/
+ points.insert (std::pair( 0, "0"));
+ points.insert (std::pair( 16, "16"));
+ points.insert (std::pair( 56, "56"));
+ points.insert (std::pair( 72, "72"));
+ points.insert (std::pair(112, "112"));
+ points.insert (std::pair(127, "127"));
+ default:
+ break;
+ }
}
- points.insert (std::pair(127, "127"));
break;
}
- gint pos;
+ gint pos = -1;
for (std::map::const_iterator j = points.begin(); j != points.end(); ++j) {
float fraction = 0;
@@ -708,6 +845,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types)
fraction = (j->first) / 127.0;
pos = 1 + height - (gint) rintf (height * fraction);
pos = min (pos, height);
+ cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
if (tickleft) {
cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI);
cairo_fill(cr);
@@ -718,6 +856,8 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types)
break;
}
+ if (pos < 0) continue;
+
layout->set_text(j->second.c_str());
int tw, th;
@@ -732,12 +872,26 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types)
} else {
cairo_move_to (cr, width-3-tw, p);
}
+
+ cairo_set_line_width(cr, 0.12);
+ cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0);
+ pango_cairo_layout_path(cr, layout->gobj());
+ cairo_stroke_preserve (cr);
+ cairo_set_line_width(cr, 1.0);
+
+ if ((*i) == DataType::AUDIO) {
+ mtr_col_and_fract(cr, &c, peakcolor, type, j->first);
+ } else {
+ cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
+ }
+
pango_cairo_show_layout (cr, layout->gobj());
+ cairo_new_path(cr);
}
}
// add legend
- if (types.size() == 1) {
+ if (types.size() == 1 || overlay_midi == 0) {
int tw, th;
layout->set_attributes (unit_font_attributes);
switch (types.at(0)) {
@@ -777,7 +931,9 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector