ardour
level_meter.cc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002 Paul Davis
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 
18 */
19 
20 #include <limits.h>
21 
22 #include "ardour/meter.h"
23 
24 #include <gtkmm2ext/utils.h>
25 #include "pbd/fastlog.h"
26 
27 #include "ardour_ui.h"
28 #include "global_signals.h"
29 #include "level_meter.h"
30 #include "utils.h"
31 #include "logmeter.h"
32 #include "gui_thread.h"
33 #include "keyboard.h"
34 #include "public_editor.h"
35 
36 #include "i18n.h"
37 
38 using namespace ARDOUR;
39 using namespace ARDOUR_UI_UTILS;
40 using namespace PBD;
41 using namespace Gtkmm2ext;
42 using namespace Gtk;
43 using namespace std;
44 
46  : parent_invalidator(ir)
47  , _meter (0)
48  , _meter_orientation(o)
49  , regular_meter_width (6)
50  , meter_length (0)
51  , thin_meter_width(2)
52  , max_peak (minus_infinity())
53  , meter_type (MeterPeak)
54  , visible_meter_type (MeterType(0))
55  , visible_meter_count (0)
56  , color_changed (false)
57 {
58  set_session (s);
59 
61  ARDOUR_UI::config()->ParameterChanged.connect (sigc::mem_fun(*this, &LevelMeterBase::parameter_changed));
62  ColorsChanged.connect (sigc::mem_fun (*this, &LevelMeterBase::color_handler));
63 }
64 
66 {
70  for (vector<MeterInfo>::iterator i = meters.begin(); i != meters.end(); i++) {
71  delete (*i).meter;
72  }
73  meters.clear();
74 }
75 
76 void
78 {
81 
82  _meter = meter;
83  color_changed = true; // force update
84 
85  if (_meter) {
88  }
89 }
90 
91 static float meter_lineup_cfg(MeterLineUp lul, float offset) {
92  switch (lul) {
93  case MeteringLineUp24:
94  return offset + 6.0;
95  case MeteringLineUp20:
96  return offset + 2.0;
97  case MeteringLineUp18:
98  return offset;
99  case MeteringLineUp15:
100  return offset - 3.0;
101  default:
102  break;
103  }
104  return offset;
105 }
106 
107 static float meter_lineup(float offset) {
108  return meter_lineup_cfg (ARDOUR_UI::config()->get_meter_line_up_level(), offset);
109 }
110 
111 static float vu_standard() {
112  // note - default meter config is +2dB (france)
113  switch (ARDOUR_UI::config()->get_meter_vu_standard()) {
114  default:
115  case MeteringVUfrench: // 0VU = -2dBu
116  return 0;
117  case MeteringVUamerican: // 0VU = 0dBu
118  return -2;
119  case MeteringVUstandard: // 0VU = +4dBu
120  return -6;
121  case MeteringVUeight: // 0VU = +8dBu
122  return -10;
123  }
124 }
125 
126 float
128 {
129  vector<MeterInfo>::iterator i;
130  uint32_t n;
131 
132  if (!_meter) {
133  return 0.0f;
134  }
135 
136  uint32_t nmidi = _meter->input_streams().n_midi();
137 
138  for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) {
139  if ((*i).packed) {
140  const float mpeak = _meter->meter_level(n, MeterMaxPeak);
141  if (mpeak > (*i).max_peak) {
142  (*i).max_peak = mpeak;
143  (*i).meter->set_highlight(mpeak >= ARDOUR_UI::config()->get_meter_peak());
144  }
145  if (mpeak > max_peak) {
146  max_peak = mpeak;
147  }
148 
149  if (n < nmidi) {
150  (*i).meter->set (_meter->meter_level (n, MeterPeak));
151  } else {
152  const float peak = _meter->meter_level (n, meter_type);
153  if (meter_type == MeterPeak) {
154  (*i).meter->set (log_meter (peak));
155  } else if (meter_type == MeterPeak0dB) {
156  (*i).meter->set (log_meter0dB (peak));
157  } else if (meter_type == MeterIEC1NOR) {
158  (*i).meter->set (meter_deflect_nordic (peak + meter_lineup(0)));
159  } else if (meter_type == MeterIEC1DIN) {
160  (*i).meter->set (meter_deflect_din (peak + meter_lineup_cfg(ARDOUR_UI::config()->get_meter_line_up_din(), 3.0)));
161  } else if (meter_type == MeterIEC2BBC || meter_type == MeterIEC2EBU) {
162  (*i).meter->set (meter_deflect_ppm (peak + meter_lineup(0)));
163  } else if (meter_type == MeterVU) {
164  (*i).meter->set (meter_deflect_vu (peak + vu_standard() + meter_lineup(0)));
165  } else if (meter_type == MeterK12) {
166  (*i).meter->set (meter_deflect_k (peak, 12), meter_deflect_k(_meter->meter_level(n, MeterPeak), 12));
167  } else if (meter_type == MeterK14) {
168  (*i).meter->set (meter_deflect_k (peak, 14), meter_deflect_k(_meter->meter_level(n, MeterPeak), 14));
169  } else if (meter_type == MeterK20) {
170  (*i).meter->set (meter_deflect_k (peak, 20), meter_deflect_k(_meter->meter_level(n, MeterPeak), 20));
171  } else { // RMS
172  (*i).meter->set (log_meter (peak), log_meter(_meter->meter_level(n, MeterPeak)));
173  }
174  }
175  }
176  }
177  return max_peak;
178 }
179 
180 void
182 {
184 
185  if (p == "meter-hold") {
186  vector<MeterInfo>::iterator i;
187  uint32_t n;
188 
189  for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) {
190  (*i).meter->set_hold_count ((uint32_t) floor(ARDOUR_UI::config()->get_meter_hold()));
191  }
192  }
193  else if (p == "meter-line-up-level") {
194  color_changed = true;
196  }
197  else if (p == "meter-style-led") {
198  color_changed = true;
200  }
201  else if (p == "meter-peak") {
202  vector<MeterInfo>::iterator i;
203  uint32_t n;
204 
205  for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) {
206  (*i).max_peak = minus_infinity();
207  }
208  }
209 }
210 
211 void
213 {
215 }
216 
217 void
219 {
220  meter_type = t;
222  MeterTypeChanged(t);
223 }
224 
225 void
227 {
228  for (vector<MeterInfo>::iterator i = meters.begin(); i != meters.end(); ++i) {
229  if ((*i).packed) {
230  mtr_remove (*((*i).meter));
231  (*i).packed = false;
232  }
233  }
234 }
235 
236 void
237 LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
238 {
239 
240  if (!_meter) {
241  hide_all_meters ();
242  return; /* do it later or never */
243  }
244 
245  int32_t nmidi = _meter->input_streams().n_midi();
246  uint32_t nmeters = _meter->input_streams().n_total();
247  regular_meter_width = initial_width;
248  thin_meter_width = thin_width;
249  meter_length = len;
250 
251  guint16 width;
252 
253  if (nmeters == 0) {
254  hide_all_meters ();
255  return;
256  }
257 
258  if (nmeters <= 2) {
259  width = regular_meter_width;
260  } else {
261  width = thin_meter_width;
262  }
263 
264  width = rint (width * ARDOUR_UI::ui_scale);
265 
266  if ( meters.size() > 0
267  && nmeters == visible_meter_count
268  && meters[0].width == width
269  && meters[0].length == len
270  && !color_changed
272  return;
273  }
274 
275 #if 0
276  printf("Meter redraw: %s %s %s %s %s %s\n",
277  (meters.size() > 0) ? "yes" : "no",
278  (meters.size() > 0 && meters[0].width == width) ? "yes" : "no",
279  (meters.size() > 0 && meters[0].length == len) ? "yes" : "no",
280  (nmeters == visible_meter_count) ? "yes" : "no",
281  (meter_type == visible_meter_type) ? "yes" : "no",
282  !color_changed ? "yes" : "no"
283  );
284 #endif
285 
286  hide_all_meters ();
287  while (meters.size() < nmeters) {
288  meters.push_back (MeterInfo());
289  }
290 
291  //cerr << "LevelMeterBase::setup_meters() called color_changed = " << color_changed << " colors: " << endl;//DEBUG
292 
293  for (int32_t n = nmeters-1; nmeters && n >= 0 ; --n) {
294  uint32_t c[10];
295  uint32_t b[4];
296  float stp[4];
297  int styleflags = ARDOUR_UI::config()->get_meter_style_led() ? 3 : 1;
298  b[0] = ARDOUR_UI::config()->color ("meter background bottom");
299  b[1] = ARDOUR_UI::config()->color ("meter background top");
300  b[2] = 0x991122ff; // red highlight gradient Bot
301  b[3] = 0x551111ff; // red highlight gradient Top
302  if (n < nmidi) {
303  c[0] = ARDOUR_UI::config()->color ("midi meter color0");
304  c[1] = ARDOUR_UI::config()->color ("midi meter color1");
305  c[2] = ARDOUR_UI::config()->color ("midi meter color2");
306  c[3] = ARDOUR_UI::config()->color ("midi meter color3");
307  c[4] = ARDOUR_UI::config()->color ("midi meter color4");
308  c[5] = ARDOUR_UI::config()->color ("midi meter color5");
309  c[6] = ARDOUR_UI::config()->color ("midi meter color6");
310  c[7] = ARDOUR_UI::config()->color ("midi meter color7");
311  c[8] = ARDOUR_UI::config()->color ("midi meter color8");
312  c[9] = ARDOUR_UI::config()->color ("midi meter color9");
313  stp[0] = 115.0 * 32.0 / 128.0;
314  stp[1] = 115.0 * 64.0 / 128.0;
315  stp[2] = 115.0 * 100.0 / 128.0;
316  stp[3] = 115.0 * 112.0 / 128.0;
317  } else {
318  c[0] = ARDOUR_UI::config()->color ("meter color0");
319  c[1] = ARDOUR_UI::config()->color ("meter color1");
320  c[2] = ARDOUR_UI::config()->color ("meter color2");
321  c[3] = ARDOUR_UI::config()->color ("meter color3");
322  c[4] = ARDOUR_UI::config()->color ("meter color4");
323  c[5] = ARDOUR_UI::config()->color ("meter color5");
324  c[6] = ARDOUR_UI::config()->color ("meter color6");
325  c[7] = ARDOUR_UI::config()->color ("meter color7");
326  c[8] = ARDOUR_UI::config()->color ("meter color8");
327  c[9] = ARDOUR_UI::config()->color ("meter color9");
328 
329  switch (meter_type) {
330  case MeterK20:
331  stp[0] = 115.0 * meter_deflect_k(-40, 20); //-20
332  stp[1] = 115.0 * meter_deflect_k(-20, 20); // 0
333  stp[2] = 115.0 * meter_deflect_k(-18, 20); // +2
334  stp[3] = 115.0 * meter_deflect_k(-16, 20); // +4
335  c[0] = c[1] = 0x008800ff;
336  c[2] = c[3] = 0x00ff00ff;
337  c[4] = c[5] = 0xffff00ff;
338  c[6] = c[7] = 0xffff00ff;
339  c[8] = c[9] = 0xff0000ff;
340  break;
341  case MeterK14:
342  stp[0] = 115.0 * meter_deflect_k(-34, 14); //-20
343  stp[1] = 115.0 * meter_deflect_k(-14, 14); // 0
344  stp[2] = 115.0 * meter_deflect_k(-12, 14); // +2
345  stp[3] = 115.0 * meter_deflect_k(-10, 14); // +4
346  c[0] = c[1] = 0x008800ff;
347  c[2] = c[3] = 0x00ff00ff;
348  c[4] = c[5] = 0xffff00ff;
349  c[6] = c[7] = 0xffff00ff;
350  c[8] = c[9] = 0xff0000ff;
351  break;
352  case MeterK12:
353  stp[0] = 115.0 * meter_deflect_k(-32, 12); //-20
354  stp[1] = 115.0 * meter_deflect_k(-12, 12); // 0
355  stp[2] = 115.0 * meter_deflect_k(-10, 12); // +2
356  stp[3] = 115.0 * meter_deflect_k( -8, 12); // +4
357  c[0] = c[1] = 0x008800ff;
358  c[2] = c[3] = 0x00ff00ff;
359  c[4] = c[5] = 0xffff00ff;
360  c[6] = c[7] = 0xffff00ff;
361  c[8] = c[9] = 0xff0000ff;
362  break;
363  case MeterIEC2BBC:
364  c[0] = c[1] = c[2] = c[3] = c[4] = c[5] = c[6] = c[7] = c[8] = c[9] =
365  ARDOUR_UI::config()->color ("meter color BBC");
366  stp[0] = stp[1] = stp[2] = stp[3] = 115.0;
367  break;
368  case MeterIEC2EBU:
369  stp[0] = 115.0 * meter_deflect_ppm(-24); // ignored
370  stp[1] = 115.0 * meter_deflect_ppm(-18);
371  stp[2] = 115.0 * meter_deflect_ppm( -9);
372  stp[3] = 115.0 * meter_deflect_ppm( 0); // ignored
373  c[3] = c[2] = c[1];
374  c[6] = c[7] = c[8] = c[9];
375  break;
376  case MeterIEC1NOR:
377  stp[0] = 115.0 * meter_deflect_nordic(-30); // ignored
378  stp[1] = 115.0 * meter_deflect_nordic(-18);
379  stp[2] = 115.0 * meter_deflect_nordic(-12);
380  stp[3] = 115.0 * meter_deflect_nordic( -9); // ignored
381  c[0] = c[1] = c[2]; // bright-green
382  c[6] = c[7] = c[8] = c[9];
383  break;
384  case MeterIEC1DIN:
385  stp[0] = 115.0 * meter_deflect_din(-29); // ignored
386  stp[1] = 115.0 * meter_deflect_din(-18);
387  stp[2] = 115.0 * meter_deflect_din(-15); // ignored
388  stp[3] = 115.0 * meter_deflect_din( -9);
389  c[0] = c[2] = c[3] = c[1];
390  c[4] = c[6];
391  c[5] = c[7];
392  break;
393  case MeterVU:
394  stp[0] = 115.0 * meter_deflect_vu(-26); // -6
395  stp[1] = 115.0 * meter_deflect_vu(-23); // -3
396  stp[2] = 115.0 * meter_deflect_vu(-20); // 0
397  stp[3] = 115.0 * meter_deflect_vu(-18); // +2
398  c[0] = c[2] = c[3] = c[4] = c[5] = c[1];
399  c[7] = c[8] = c[9] = c[6];
400  break;
401  case MeterPeak0dB:
402  stp[1] = 89.125; // 115.0 * log_meter0dB(-9);
403  stp[2] = 106.375; // 115.0 * log_meter0dB(-3);
404  stp[3] = 115.0; // 115.0 * log_meter0dB(0);
405  switch (ARDOUR_UI::config()->get_meter_line_up_level()) {
406  case MeteringLineUp24:
407  stp[0] = 115.0 * log_meter0dB(-24);
408  break;
409  case MeteringLineUp20:
410  stp[0] = 115.0 * log_meter0dB(-20);
411  break;
412  default:
413  case MeteringLineUp18:
414  stp[0] = 115.0 * log_meter0dB(-18);
415  break;
416  case MeteringLineUp15:
417  stp[0] = 115.0 * log_meter0dB(-15);
418  }
419  break;
420  default: // PEAK, RMS
421  stp[1] = 77.5; // 115 * log_meter(-9)
422  stp[2] = 92.5; // 115 * log_meter(-3)
423  stp[3] = 100.0; // 115 * log_meter(0)
424  switch (ARDOUR_UI::config()->get_meter_line_up_level()) {
425  case MeteringLineUp24:
426  stp[0] = 42.0;
427  break;
428  case MeteringLineUp20:
429  stp[0] = 50.0;
430  break;
431  default:
432  case MeteringLineUp18:
433  stp[0] = 55.0;
434  break;
435  case MeteringLineUp15:
436  stp[0] = 62.5;
437  break;
438  }
439  }
440  }
441  if (meters[n].width != width || meters[n].length != len || color_changed || meter_type != visible_meter_type) {
442  bool hl = meters[n].meter ? meters[n].meter->get_highlight() : false;
443  meters[n].packed = false;
444  delete meters[n].meter;
445  meters[n].meter = new FastMeter ((uint32_t) floor (ARDOUR_UI::config()->get_meter_hold()), width, _meter_orientation, len,
446  c[0], c[1], c[2], c[3], c[4],
447  c[5], c[6], c[7], c[8], c[9],
448  b[0], b[1], b[2], b[3],
449  stp[0], stp[1], stp[2], stp[3],
450  styleflags
451  );
452  meters[n].meter->set_highlight(hl);
453  meters[n].width = width;
454  meters[n].length = len;
455  meters[n].meter->add_events (Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);
456  meters[n].meter->signal_button_press_event().connect (sigc::mem_fun (*this, &LevelMeterBase::meter_button_press), false);
457  meters[n].meter->signal_button_release_event().connect (sigc::mem_fun (*this, &LevelMeterBase::meter_button_release), false);
458  }
459 
460  //pack_end (*meters[n].meter, false, false);
461  mtr_pack (*meters[n].meter);
462  meters[n].meter->show_all ();
463  meters[n].packed = true;
464  }
465  //show();
466  color_changed = false;
468  visible_meter_count = nmeters;
469 }
470 
471 void
473 {
474  meter_type = t;
475  _meter->set_type(t);
476 }
477 
478 bool
480 {
481  return static_cast<bool>(ButtonPress (ev)); /* EMIT SIGNAL */
482 }
483 
484 bool
486 {
487  if (ev->button == 1) {
488  clear_meters (false);
489  }
490  ButtonRelease(ev);
491 
492  return true;
493 }
494 
495 
496 void LevelMeterBase::clear_meters (bool reset_highlight)
497 {
498  for (vector<MeterInfo>::iterator i = meters.begin(); i < meters.end(); i++) {
499  (*i).meter->clear();
500  (*i).max_peak = minus_infinity();
501  if (reset_highlight)
502  (*i).meter->set_highlight(false);
503  }
505 }
506 
508 {
509  hide_all_meters();
510 }
511 
512 void
514 {
515  color_changed = true;
517 }
518 
520  : LevelMeterBase(s, invalidator(*this))
521 {
522  set_spacing(1);
523  show();
524 }
525 
526 
528 
529 void
530 LevelMeterHBox::mtr_pack(Gtk::Widget &w) {
531  pack_end (w, false, false);
532 }
533 
534 void
535 LevelMeterHBox::mtr_remove(Gtk::Widget &w) {
536  remove (w);
537 }
538 
539 
541  : LevelMeterBase(s, invalidator(*this), FastMeter::Horizontal)
542 {
543  set_spacing(1);
544  show();
545 }
547 
548 void
549 LevelMeterVBox::mtr_pack(Gtk::Widget &w) {
550  pack_end (w, false, false);
551 }
552 
553 void
554 LevelMeterVBox::mtr_remove(Gtk::Widget &w) {
555  remove (w);
556 }
static float vu_standard()
Definition: level_meter.cc:111
ArdourCanvas::Color color(const std::string &, bool *failed=0) const
Definition: ui_config.cc:567
void configuration_changed(ARDOUR::ChanCount in, ARDOUR::ChanCount out)
Definition: level_meter.cc:212
virtual void set_meter(ARDOUR::PeakMeter *meter)
Definition: level_meter.cc:77
static float meter_deflect_ppm(float)
Definition: logmeter.h:104
virtual ~LevelMeterBase()
Definition: level_meter.cc:65
static float meter_lineup_cfg(MeterLineUp lul, float offset)
Definition: level_meter.cc:91
void clear_meters(bool reset_highlight=true)
Definition: level_meter.cc:496
guint16 thin_meter_width
Definition: level_meter.h:106
LevelMeterHBox(ARDOUR::Session *)
Definition: level_meter.cc:519
Definition: ardour_ui.h:130
static float meter_deflect_din(float)
Definition: logmeter.h:120
void set_type(ARDOUR::MeterType)
Definition: level_meter.cc:472
Gtkmm2ext::FastMeter::Orientation _meter_orientation
Definition: level_meter.h:84
static float log_meter0dB(float db)
Definition: logmeter.h:79
void parameter_changed(std::string)
Definition: level_meter.cc:181
void mtr_pack(Gtk::Widget &w)
Definition: level_meter.cc:549
Definition: Beats.hpp:239
PBD::Signal2< void, ChanCount, ChanCount > ConfigurationChanged
Definition: processor.h:113
bool meter_button_press(GdkEventButton *)
Definition: level_meter.cc:479
void mtr_remove(Gtk::Widget &w)
Definition: level_meter.cc:535
LevelMeterBase(ARDOUR::Session *, PBD::EventLoop::InvalidationRecord *ir, Gtkmm2ext::FastMeter::Orientation o=Gtkmm2ext::FastMeter::Vertical)
Definition: level_meter.cc:45
float update_meters()
Definition: level_meter.cc:127
#define ENSURE_GUI_THREAD(obj, method,...)
Definition: gui_thread.h:34
#define invalidator(x)
Definition: gui_thread.h:40
ARDOUR::PeakMeter * _meter
Definition: level_meter.h:83
static float meter_deflect_nordic(float)
Definition: logmeter.h:132
uint32_t n_midi() const
Definition: chan_count.h:66
uint32_t n_total() const
Definition: chan_count.h:69
void setup_meters(int len=0, int width=3, int thin=2)
Definition: level_meter.cc:237
uint32_t visible_meter_count
Definition: level_meter.h:111
std::vector< MeterInfo > meters
Definition: level_meter.h:107
PBD::Signal1< bool, GdkEventButton * > ButtonRelease
Definition: level_meter.h:74
void mtr_pack(Gtk::Widget &w)
Definition: level_meter.cc:530
PBD::Signal1< bool, GdkEventButton * > ButtonPress
Definition: level_meter.h:73
LIBARDOUR_API RCConfiguration * Config
Definition: globals.cc:119
static float minus_infinity(void)
Definition: fastlog.h:44
void set_type(MeterType t)
Definition: meter.cc:370
MeterType
Definition: types.h:182
Definition: amp.h:29
#define gui_context()
Definition: gui_thread.h:36
ARDOUR::MeterType meter_type
Definition: level_meter.h:109
void hide_all_meters()
Definition: level_meter.cc:226
MeterLineUp
Definition: types.h:411
PBD::ScopedConnection _configuration_connection
Definition: level_meter.h:113
PBD::Signal1< void, std::string > ParameterChanged
Definition: configuration.h:44
static float meter_lineup(float offset)
Definition: level_meter.cc:107
ChanCount input_streams() const
Definition: meter.h:72
static float log_meter(float db)
Definition: logmeter.h:48
guint16 regular_meter_width
Definition: level_meter.h:104
virtual void mtr_remove(Gtk::Widget &w)=0
static UIConfiguration * config()
Definition: ardour_ui.h:188
PBD::ScopedConnection _parameter_connection
Definition: level_meter.h:115
sigc::signal< void > ColorsChanged
Definition: debug.h:30
sigc::signal< void, std::string > ParameterChanged
Definition: ui_config.h:78
PBD::EventLoop::InvalidationRecord * parent_invalidator
Definition: level_meter.h:82
void meter_type_changed(ARDOUR::MeterType)
Definition: level_meter.cc:218
float meter_level(uint32_t n, MeterType type)
Definition: meter.cc:311
bool meter_button_release(GdkEventButton *)
Definition: level_meter.cc:485
virtual void set_session(ARDOUR::Session *)
PBD::Signal1< void, MeterType > TypeChanged
Definition: meter.h:82
static float ui_scale
Definition: ardour_ui.h:189
void color_handler()
Definition: level_meter.cc:513
static float meter_deflect_vu(float)
Definition: logmeter.h:147
LevelMeterVBox(ARDOUR::Session *)
Definition: level_meter.cc:540
void hide_meters()
Definition: level_meter.cc:507
ARDOUR::MeterType visible_meter_type
Definition: level_meter.h:110
PBD::ScopedConnection _meter_type_connection
Definition: level_meter.h:114
void mtr_remove(Gtk::Widget &w)
Definition: level_meter.cc:554
PBD::Signal1< void, ARDOUR::MeterType > MeterTypeChanged
Definition: level_meter.h:75
static float meter_deflect_k(float, float)
Definition: logmeter.h:155
virtual void mtr_pack(Gtk::Widget &w)=0
LIBARDOUR_API PBD::PropertyDescriptor< framecnt_t > length
Definition: region.cc:64