#include <limits.h>
-#include <ardour/io.h>
-#include <ardour/route.h>
-#include <ardour/route_group.h>
-#include <ardour/session.h>
-#include <ardour/session_route.h>
-#include <ardour/dB.h>
+#include "ardour/io.h"
+#include "ardour/route.h"
+#include "ardour/route_group.h"
+#include "ardour/session.h"
+#include "ardour/session_route.h"
+#include "ardour/dB.h"
#include <gtkmm/style.h>
#include <gdkmm/color.h>
#include <gtkmm2ext/stop_signal.h>
#include <gtkmm2ext/barcontroller.h>
#include <gtkmm2ext/gtk_ui.h>
-#include <midi++/manager.h>
-#include <pbd/fastlog.h>
+#include "midi++/manager.h"
+#include "pbd/fastlog.h"
+#include "pbd/stacktrace.h"
#include "ardour_ui.h"
#include "gain_meter.h"
#include "keyboard.h"
#include "public_editor.h"
-#include <ardour/session.h>
-#include <ardour/route.h>
-#include <ardour/meter.h>
+#include "ardour/session.h"
+#include "ardour/route.h"
+#include "ardour/meter.h"
#include "i18n.h"
}
}
-GainMeterBase::GainMeterBase (boost::shared_ptr<IO> io, Session& s,
+GainMeterBase::GainMeterBase (Session& s,
const Glib::RefPtr<Gdk::Pixbuf>& pix,
bool horizontal)
- : _io (io),
- _session (s),
+ : _session (s),
// 0.781787 is the value needed for gain to be set to 0.
gain_adjustment (0.781787, 0.0, 1.0, 0.01, 0.1),
gain_automation_style_button (""),
gain_automation_state_button ("")
{
+ using namespace Menu_Helpers;
+
ignore_toggle = false;
meter_menu = 0;
next_release_selects = false;
if (horizontal) {
gain_slider = manage (new HSliderController (pix,
&gain_adjustment,
- _io->gain_control(),
false));
} else {
gain_slider = manage (new VSliderController (pix,
&gain_adjustment,
- _io->gain_control(),
false));
}
- level_meter = new LevelMeter(_io, _session);
+ level_meter = new LevelMeter(_session);
gain_slider->signal_button_press_event().connect (mem_fun(*this, &GainMeter::start_gain_touch));
gain_slider->signal_button_release_event().connect (mem_fun(*this, &GainMeter::end_gain_touch));
gain_automation_state_button.set_size_request(15, 15);
gain_automation_style_button.set_size_request(15, 15);
+
+ gain_astyle_menu.items().push_back (MenuElem (_("Trim")));
+ gain_astyle_menu.items().push_back (MenuElem (_("Abs")));
+
+ gain_astate_menu.set_name ("ArdourContextMenu");
+ gain_astyle_menu.set_name ("ArdourContextMenu");
+ gain_adjustment.signal_value_changed().connect (mem_fun(*this, &GainMeterBase::gain_adjusted));
+ peak_display.signal_button_release_event().connect (mem_fun(*this, &GainMeterBase::peak_button_release), false);
+ gain_display.signal_key_press_event().connect (mem_fun(*this, &GainMeterBase::gain_key_press), false);
+
+ ResetAllPeakDisplays.connect (mem_fun(*this, &GainMeterBase::reset_peak_display));
+ ResetGroupPeakDisplays.connect (mem_fun(*this, &GainMeterBase::reset_group_peak_display));
+ UI::instance()->theme_changed.connect (mem_fun(*this, &GainMeterBase::on_theme_changed));
+ ColorsChanged.connect (bind(mem_fun (*this, &GainMeterBase::color_handler), false));
+ DPIReset.connect (bind(mem_fun (*this, &GainMeterBase::color_handler), true));
+}
+GainMeterBase::~GainMeterBase ()
+{
+ delete meter_menu;
+ delete level_meter;
+}
+void
+GainMeterBase::set_io (boost::shared_ptr<IO> io)
+{
+ connections.clear ();
+
+ _io = io;
+
+ level_meter->set_io (_io);
+ gain_slider->set_controllable (_io->gain_control());
boost::shared_ptr<Route> r;
using namespace Menu_Helpers;
+ gain_astate_menu.items().clear ();
+
gain_astate_menu.items().push_back (MenuElem (_("Manual"),
bind (mem_fun (*_io, &IO::set_parameter_automation_state),
Evoral::Parameter(GainAutomation), (AutoState) Off)));
bind (mem_fun (*_io, &IO::set_parameter_automation_state),
Evoral::Parameter(GainAutomation), (AutoState) Touch)));
- gain_astyle_menu.items().push_back (MenuElem (_("Trim")));
- gain_astyle_menu.items().push_back (MenuElem (_("Abs")));
-
- gain_astate_menu.set_name ("ArdourContextMenu");
- gain_astyle_menu.set_name ("ArdourContextMenu");
-
- gain_automation_style_button.signal_button_press_event().connect (mem_fun(*this, &GainMeterBase::gain_automation_style_button_event), false);
- gain_automation_state_button.signal_button_press_event().connect (mem_fun(*this, &GainMeterBase::gain_automation_state_button_event), false);
+ connections.push_back (gain_automation_style_button.signal_button_press_event().connect (mem_fun(*this, &GainMeterBase::gain_automation_style_button_event), false));
+ connections.push_back (gain_automation_state_button.signal_button_press_event().connect (mem_fun(*this, &GainMeterBase::gain_automation_state_button_event), false));
- r->gain_control()->alist()->automation_state_changed.connect (mem_fun(*this, &GainMeter::gain_automation_state_changed));
- r->gain_control()->alist()->automation_style_changed.connect (mem_fun(*this, &GainMeter::gain_automation_style_changed));
+ connections.push_back (r->gain_control()->alist()->automation_state_changed.connect (mem_fun(*this, &GainMeter::gain_automation_state_changed)));
+ connections.push_back (r->gain_control()->alist()->automation_style_changed.connect (mem_fun(*this, &GainMeter::gain_automation_style_changed)));
gain_automation_state_changed ();
}
}
- _io->gain_control()->Changed.connect (mem_fun(*this, &GainMeterBase::gain_changed));
+ //cerr << "Connect " << this << " to gain change for " << _io->name() << endl;
- gain_adjustment.signal_value_changed().connect (mem_fun(*this, &GainMeterBase::gain_adjusted));
- peak_display.signal_button_release_event().connect (mem_fun(*this, &GainMeterBase::peak_button_release), false);
- gain_display.signal_key_press_event().connect (mem_fun(*this, &GainMeterBase::gain_key_press), false);
+ connections.push_back (_io->gain_control()->Changed.connect (mem_fun(*this, &GainMeterBase::gain_changed)));
gain_changed ();
show_gain ();
-
update_gain_sensitive ();
-
- ResetAllPeakDisplays.connect (mem_fun(*this, &GainMeterBase::reset_peak_display));
- ResetGroupPeakDisplays.connect (mem_fun(*this, &GainMeterBase::reset_group_peak_display));
-
- UI::instance()->theme_changed.connect (mem_fun(*this, &GainMeterBase::on_theme_changed));
- ColorsChanged.connect (bind(mem_fun (*this, &GainMeterBase::color_handler), false));
- DPIReset.connect (bind(mem_fun (*this, &GainMeterBase::color_handler), true));
-}
-
-GainMeterBase::~GainMeterBase ()
-{
- if (meter_menu) {
- delete meter_menu;
- }
-
- if (level_meter) {
- delete level_meter;
- }
}
void
void
GainMeterBase::gain_adjusted ()
{
+ //cerr << this << " for " << _io->name() << " GAIN ADJUSTED\n";
if (!ignore_toggle) {
+ //cerr << "Set GC\n";
_io->gain_control()->set_value (slider_position_to_gain (gain_adjustment.get_value()));
+ //cerr << "Set GC OUT\n";
}
show_gain ();
}
{
gfloat value = gain_to_slider_position (_io->effective_gain());
+ //cerr << this << " for " << _io->name() << " EGAIN = " << value
+ // << " AGAIN = " << gain_adjustment.get_value () << endl;
+ // stacktrace (cerr, 20);
+
if (gain_adjustment.get_value() != value) {
ignore_toggle = true;
gain_adjustment.set_value (value);
} else {
- if (ev->button == 2) {
+ if (Keyboard::is_button2_event(ev)) {
// Primary-button2 click is the midi binding click
// button2-click is "momentary"
}
}
- if (ev->button == 1 || ev->button == 2) {
+ if (ev->button == 1 || Keyboard::is_button2_event (ev)) {
if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
gint
GainMeterBase::start_gain_touch (GdkEventButton* ev)
{
- _io->gain_control()->alist()->start_touch ();
+ _io->gain_control()->start_touch ();
return FALSE;
}
gint
GainMeterBase::end_gain_touch (GdkEventButton* ev)
{
- _io->gain_control()->alist()->stop_touch ();
+ _io->gain_control()->stop_touch ();
return FALSE;
}
style_changed = true;
}
-GainMeter::GainMeter (boost::shared_ptr<IO> io, Session& s)
- : GainMeterBase (io, s, slider, false)
+GainMeter::GainMeter (Session& s)
+ : GainMeterBase (s, slider, false)
{
-
gain_display_box.set_homogeneous (true);
gain_display_box.set_spacing (2);
gain_display_box.pack_start (gain_display, true, true);
hbox.set_spacing (2);
hbox.pack_start (*fader_vbox, true, true);
+ set_spacing (2);
+
+ pack_start (gain_display_box, Gtk::PACK_SHRINK);
+ pack_start (hbox, Gtk::PACK_SHRINK);
+
+ meter_metric_area.signal_expose_event().connect (mem_fun(*this, &GainMeter::meter_metrics_expose));
+}
+
+void
+GainMeter::set_io (boost::shared_ptr<IO> io)
+{
+ if (level_meter->get_parent()) {
+ hbox.remove (*level_meter);
+ }
+
+ if (peak_display.get_parent()) {
+ gain_display_box.remove (peak_display);
+ }
+
+ if (gain_automation_state_button.get_parent()) {
+ fader_vbox->remove (gain_automation_state_button);
+ }
+
+ GainMeterBase::set_io (io);
+
boost::shared_ptr<Route> r;
if ((r = boost::dynamic_pointer_cast<Route> (_io)) != 0) {
fader_vbox->pack_start (gain_automation_state_button, false, false, 0);
}
}
-
- set_spacing (2);
-
- pack_start (gain_display_box, Gtk::PACK_SHRINK);
- pack_start (hbox, Gtk::PACK_SHRINK);
-
- meter_metric_area.signal_expose_event().connect (mem_fun(*this, &GainMeter::meter_metrics_expose));
}
-
int
GainMeter::get_gm_width ()
{
return true;
}
+boost::shared_ptr<PBD::Controllable>
+GainMeterBase::get_controllable()
+{
+ return _io->gain_control();
+}
+
+