Add a meter to Foldback bus

Spaces got replaced by tabs as well.
This commit is contained in:
Len Ovens 2020-05-07 17:12:36 -07:00
parent 21bb10238e
commit 8e1e271eba
3 changed files with 117 additions and 49 deletions

View File

@ -1,19 +1,19 @@
/*
Copyright (C) 2018-2019 Len Ovens
Copyright (C) 2018-2019 Len Ovens
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "ardour/audioengine.h"
@ -26,11 +26,14 @@
#include "ardour/session.h"
#include "ardour/user_bundle.h"
#include "ardour/value_as_string.h"
#include "ardour/meter.h"
#include "ardour/logmeter.h"
#include "gtkmm2ext/gtk_ui.h"
#include "gtkmm2ext/menu_elems.h"
#include "gtkmm2ext/utils.h"
#include "gtkmm2ext/doi.h"
#include "pbd/fastlog.h"
#include "widgets/tooltips.h"
@ -298,11 +301,13 @@ FoldbackStrip::FoldbackStrip (Mixer_UI& mx, Session* sess, boost::shared_ptr<Rou
, _mixer_owned (true)
, _showing_sends (false)
, _width (80)
, _peak_meter (0)
, _pr_selection ()
, panners (sess)
, _plugin_insert_cnt (0)
, _comment_button (_("Comments"))
, fb_level_control (0)
, _meter (0)
{
_session = sess;
init ();
@ -365,6 +370,27 @@ FoldbackStrip::init ()
insert_box->set_width (Wide);
insert_box->set_size_request (PX_SCALE(_width + 34), PX_SCALE(160));
_meter = new FastMeter ((uint32_t) floor (UIConfiguration::instance().get_meter_hold()),
8, FastMeter::Horizontal, PX_SCALE(100),
UIConfiguration::instance().color ("meter color0"),
UIConfiguration::instance().color ("meter color1"),
UIConfiguration::instance().color ("meter color2"),
UIConfiguration::instance().color ("meter color3"),
UIConfiguration::instance().color ("meter color4"),
UIConfiguration::instance().color ("meter color5"),
UIConfiguration::instance().color ("meter color6"),
UIConfiguration::instance().color ("meter color7"),
UIConfiguration::instance().color ("meter color8"),
UIConfiguration::instance().color ("meter color9"),
UIConfiguration::instance().color ("meter background bottom"),
UIConfiguration::instance().color ("meter background top"),
0x991122ff, 0x551111ff,
(115.0 * log_meter0dB(-15)),
89.125,
106.375,
115.0,
(UIConfiguration::instance().get_meter_style_led() ? 3 : 1));
fb_level_control = new ArdourKnob (ArdourKnob::default_elements, ArdourKnob::Detent);
fb_level_control->set_size_request (PX_SCALE(50), PX_SCALE(50));
fb_level_control->set_tooltip_prefix (_("Level: "));
@ -421,6 +447,7 @@ FoldbackStrip::init ()
global_vpacker.pack_end (_comment_button, Gtk::PACK_SHRINK);
global_vpacker.pack_end (output_button, Gtk::PACK_SHRINK);
global_vpacker.pack_end (master_box, Gtk::PACK_SHRINK);
global_vpacker.pack_end (*_meter, false, false);
global_vpacker.pack_end (*insert_box, Gtk::PACK_SHRINK);
global_vpacker.pack_end (panners, Gtk::PACK_SHRINK);
@ -452,10 +479,10 @@ FoldbackStrip::init ()
_comment_button.signal_clicked.connect (sigc::mem_fun (*this, &RouteUI::toggle_comment_editor));
add_events (Gdk::BUTTON_RELEASE_MASK|
Gdk::ENTER_NOTIFY_MASK|
Gdk::LEAVE_NOTIFY_MASK|
Gdk::KEY_PRESS_MASK|
Gdk::KEY_RELEASE_MASK);
Gdk::ENTER_NOTIFY_MASK|
Gdk::LEAVE_NOTIFY_MASK|
Gdk::KEY_PRESS_MASK|
Gdk::KEY_RELEASE_MASK);
set_flags (get_flags() | Gtk::CAN_FOCUS);
@ -543,6 +570,7 @@ FoldbackStrip::set_route (boost::shared_ptr<Route> rt)
return;
}
if (_route) {
// just in case
_route->solo_control()->set_value (0.0, Controllable::NoGroup);
}
@ -562,6 +590,12 @@ FoldbackStrip::set_route (boost::shared_ptr<Route> rt)
_route->panner_shell()->Changed.connect (route_connections, invalidator (*this), boost::bind (&FoldbackStrip::connect_to_pan, this), gui_context());
}
// set up metering
_peak_meter = _route->shared_peak_meter().get();
_route->set_meter_point (MeterPostFader);
// _route->set_meter_point (MeterPreFader);
_route->set_meter_type (MeterPeak0dB);
_route->output()->changed.connect (*this, invalidator (*this), boost::bind (&FoldbackStrip::update_output_display, this), gui_context());
_route->io_changed.connect (route_connections, invalidator (*this), boost::bind (&FoldbackStrip::io_changed_proxy, this), gui_context ());
@ -589,6 +623,7 @@ FoldbackStrip::set_route (boost::shared_ptr<Route> rt)
send_scroller.show ();
_show_sends_button.show();
insert_box->show ();
_meter->show ();
master_box.show();
output_button.show();
_comment_button.show();
@ -743,7 +778,7 @@ FoldbackStrip::output_press (GdkEventButton *ev)
citems.push_back (MenuElem (_("Routing Grid"), sigc::mem_fun (*(static_cast<RouteUI*>(this)), &RouteUI::edit_output_configuration)));
Gtkmm2ext::anchored_menu_popup(&output_menu, &output_button, "",
1, ev->time);
1, ev->time);
break;
}
@ -766,7 +801,7 @@ FoldbackStrip::bundle_output_chosen (boost::shared_ptr<ARDOUR::Bundle> c)
void
FoldbackStrip::maybe_add_bundle_to_output_menu (boost::shared_ptr<Bundle> b, ARDOUR::BundleList const& /*current*/,
DataType type)
DataType type)
{
using namespace Menu_Helpers;
@ -895,16 +930,16 @@ FoldbackStrip::update_io_button ()
string arrow = Gtkmm2ext::markup_escape_text(" -> ");
vector<string> port_connections;
for (PortSet::iterator port = io->ports().begin();
port != io->ports().end();
++port) {
port != io->ports().end();
++port) {
port_connections.clear();
port->get_connections(port_connections);
uint32_t port_connection_count = 0;
for (vector<string>::iterator i = port_connections.begin();
i != port_connections.end();
++i) {
i != port_connections.end();
++i) {
++port_connection_count;
if (port_connection_count == 1) {
@ -939,12 +974,12 @@ FoldbackStrip::update_io_button ()
if (!have_label) {
boost::shared_ptr<ARDOUR::RouteList> routes = _session->get_routes ();
for (ARDOUR::RouteList::const_iterator route = routes->begin();
route != routes->end();
++route) {
route != routes->end();
++route) {
boost::shared_ptr<IO> dest_io = (*route)->output();
if (io->bundle()->connected_to(dest_io->bundle(),
_session->engine(),
dt, true)) {
_session->engine(),
dt, true)) {
label << Gtkmm2ext::markup_escape_text ((*route)->name());
have_label = true;
break;
@ -956,12 +991,12 @@ FoldbackStrip::update_io_button ()
if (!have_label) {
boost::shared_ptr<ARDOUR::BundleList> bundles = _session->bundles ();
for (ARDOUR::BundleList::iterator bundle = bundles->begin();
bundle != bundles->end();
++bundle) {
bundle != bundles->end();
++bundle) {
if (boost::dynamic_pointer_cast<UserBundle> (*bundle) == 0)
continue;
if (io->bundle()->connected_to(*bundle, _session->engine(),
dt, true)) {
dt, true)) {
label << Gtkmm2ext::markup_escape_text ((*bundle)->name());
have_label = true;
break;
@ -978,12 +1013,12 @@ FoldbackStrip::update_io_button ()
_session->engine().get_physical_outputs(dt, phys);
playorcapture = "playback_";
for (PortSet::iterator port = io->ports().begin(dt);
port != io->ports().end(dt);
++port) {
port != io->ports().end(dt);
++port) {
string pn = "";
for (vector<string>::iterator s = phys.begin();
s != phys.end();
++s) {
s != phys.end();
++s) {
if (!port->connected_to(*s))
continue;
pn = AudioEngine::instance()->get_pretty_name_by_name(*s);
@ -1016,8 +1051,8 @@ FoldbackStrip::update_io_button ()
string maybe_client = "";
vector<string> connections;
for (PortSet::iterator port = io->ports().begin(dt);
port != io->ports().end(dt);
++port) {
port != io->ports().end(dt);
++port) {
port_connections.clear();
port->get_connections(port_connections);
string connection = port_connections.front();
@ -1206,7 +1241,7 @@ FoldbackStrip::name_button_button_press (GdkEventButton* ev)
Menu* menu = build_route_select_menu ();
Gtkmm2ext::anchored_menu_popup(menu, &name_button, "",
1, ev->time);
1, ev->time);
}
return true;
} else if (ev->button == 3) {
@ -1316,6 +1351,29 @@ FoldbackStrip::show_sends_clicked ()
}
}
void
FoldbackStrip::fast_update ()
{
/*
* As this is the output level to a DAC, peak level is what is important
* So, much like the mackie control, we just want the highest peak from
* all channels in the route.
*/
float meter_level = -199.0;
uint32_t mn = _peak_meter->input_streams().n_audio();
for (uint32_t n = 0; n != mn; ++n) {
const float peak = _peak_meter->meter_level(n, MeterPeak0dB);
if (peak > meter_level) {
meter_level = peak;
}
}
_meter->set (log_meter0dB (meter_level));
}
void
FoldbackStrip::send_blink (bool onoff)
{

View File

@ -1,19 +1,19 @@
/*
Copyright (C) 2018-2019 Len Ovens
Copyright (C) 2018-2019 Len Ovens
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __ardour_foldback_strip__
@ -40,11 +40,13 @@
#include "ardour/types.h"
#include "ardour/ardour.h"
#include "ardour/processor.h"
#include "ardour/meter.h"
#include "pbd/fastlog.h"
#include "widgets/ardour_button.h"
#include "widgets/ardour_knob.h"
#include "widgets/fastmeter.h"
#include "route_ui.h"
#include "panner_ui.h"
@ -60,6 +62,7 @@ namespace ARDOUR {
class PortInsert;
class Bundle;
class Plugin;
class PeakMeter;
}
namespace Gtk {
class Window;
@ -126,6 +129,8 @@ public:
void set_embedded (bool);
void fast_update ();
void set_route (boost::shared_ptr<ARDOUR::Route>);
void set_button_names ();
void revert_to_default_display ();
@ -176,6 +181,7 @@ private:
ARDOUR::Session* _session;
bool _showing_sends;
uint32_t _width;
ARDOUR::PeakMeter* _peak_meter;
Gtk::EventBox spacer;
Gtk::VBox send_display;
@ -204,6 +210,7 @@ private:
ArdourWidgets::ArdourButton _hide_button;
ArdourWidgets::ArdourButton _comment_button;
ArdourWidgets::ArdourKnob* fb_level_control;
ArdourWidgets::FastMeter* _meter;
void setup_comment_button ();
void hide_clicked();
@ -214,7 +221,7 @@ private:
Gtk::Menu output_menu;
std::list<boost::shared_ptr<ARDOUR::Bundle> > output_menu_bundles;
void maybe_add_bundle_to_output_menu (boost::shared_ptr<ARDOUR::Bundle>, ARDOUR::BundleList const &,
ARDOUR::DataType type = ARDOUR::DataType::NIL);
ARDOUR::DataType type = ARDOUR::DataType::NIL);
void bundle_output_chosen (boost::shared_ptr<ARDOUR::Bundle>);

View File

@ -1388,6 +1388,9 @@ Mixer_UI::fast_update_strips ()
for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
(*i)->fast_update ();
}
if (foldback_strip) {
foldback_strip->fast_update ();
}
}
}