2 Copyright (C) 1999 Paul Davis
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.
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.
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.
25 #include <pbd/pathscanner.h>
26 #include <pbd/fastlog.h>
27 #include <gtkmm2ext/utils.h>
28 #include <gtkmm2ext/selector.h>
30 #include <ardour/audioengine.h>
31 #include <ardour/route.h>
32 #include <ardour/port.h>
33 #include <ardour/utils.h>
35 #include "meter_bridge_strip.h"
36 #include "ardour_ui.h"
42 using namespace ARDOUR;
45 using namespace Gtkmm2ext;
47 MeterBridgeStrip::MeterBridgeStrip (AudioEngine &eng,
57 meter (meter_hold, 5, FastMeter::Vertical)
61 label.set_text (name);
62 label.set_name ("ChannelMeterLabel");
64 label_ebox.set_name ("MeterBridgeWindow");
65 label_ebox.set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK);
66 label_ebox.add (label);
68 label_ebox.signal_button_release_event().connect (mem_fun(*this, &MeterBridgeStrip::label_button_press_release));
69 ARDOUR_UI::instance()->tooltips().set_tip (label_ebox, _route.name());
71 over_long_label.set_text ("0");
72 over_long_label.set_name ("OverMeterLabel");
73 over_long_button.add (over_long_label);
74 over_long_button.set_name ("OverMeter");
75 over_long_frame.add (over_long_button);
76 over_long_frame.set_shadow_type (Gtk::SHADOW_IN);
77 over_long_frame.set_name ("BaseFrame");
78 over_long_hbox.pack_start (over_long_frame, false, false);
80 snprintf(buf, sizeof(buf)-1, _("# of %u-sample overs"), long_over);
81 ARDOUR_UI::instance()->tooltips().set_tip (over_long_button, buf);
83 set_size_request_to_display_given_text (over_long_button, "88g", 2, 2);
85 over_short_label.set_text ("0");
86 over_short_label.set_name ("OverMeterLabel");
87 over_short_button.add (over_short_label);
88 over_short_button.set_name ("OverMeter");
89 over_short_frame.add (over_short_button);
90 over_short_frame.set_shadow_type (Gtk::SHADOW_IN);
91 over_short_frame.set_name ("BaseFrame");
92 over_short_hbox.pack_start (over_short_frame, false, false);
94 snprintf(buf, sizeof(buf)-1, _("# of %u-sample overs"), short_over);
95 ARDOUR_UI::instance()->tooltips().set_tip (over_short_button, buf);
97 set_size_request_to_display_given_text (over_short_button, "88g", 2, 2);
98 above_meter_vbox.set_spacing (5);
99 below_meter_vbox.set_spacing (5);
101 above_meter_vbox.pack_start (over_long_hbox, false, false);
102 above_meter_vbox.pack_start (over_short_hbox, false, false);
104 below_meter_vbox.pack_start (label_ebox);
106 over_short_button.signal_button_release_event().connect (mem_fun(*this,&MeterBridgeStrip::gui_clear_overs));
107 over_long_button.signal_button_release_event().connect (mem_fun(*this,&MeterBridgeStrip::gui_clear_overs));
112 meter_clear_pending = false;
113 over_clear_pending = false;
119 MeterBridgeStrip::update ()
123 guint32 over_short = 0;
124 guint32 over_long = 0;
126 if ((port = _route.input (0)) == 0) {
130 over_short = port->short_overs ();
131 over_long = port->long_overs ();
135 float power = minus_infinity();
137 if ((power = _route.peak_input_power (0)) != minus_infinity()) {
138 meter.set (log_meter (power));
140 if (over_short != last_over_short) {
141 buf = string_compose("%1", over_short);
142 over_short_label.set_text (buf);
143 last_over_short = over_short;
146 if (over_long != last_over_long) {
147 buf = string_compose("%1", over_long);
148 over_long_label.set_text (buf);
149 last_over_long = over_long;
158 if (meter_clear_pending) {
159 meter_clear_pending = false;
163 if (over_clear_pending) {
164 over_clear_pending = false;
165 port->reset_overs ();
166 over_long_label.set_text ("0");
167 over_short_label.set_text ("0");
174 MeterBridgeStrip::gui_clear_overs (GdkEventButton *ev)
181 MeterBridgeStrip::clear_meter ()
184 meter_clear_pending = true;
188 MeterBridgeStrip::clear_overs ()
191 over_clear_pending = true;
195 MeterBridgeStrip::set_meter_on (bool yn)
201 meter_clear_pending = true;
202 over_clear_pending = true;
205 if (meter.is_visible()) {
206 if ((port = _route.input (0)) != 0) {
208 port->enable_metering ();
210 port->disable_metering ();
217 MeterBridgeStrip::label_button_press_release (GdkEventButton *ev)
220 ArdourPrompter prompter (true);
222 prompter.set_prompt (_("New Name for Meter:"));
223 prompter.set_initial_text (label.get_text());
224 prompter.add_button (_("Rename"), Gtk::RESPONSE_ACCEPT);
225 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
228 switch (prompter.run ()) {
229 case Gtk::RESPONSE_ACCEPT:
231 prompter.get_result (name);
234 label.set_text(name);