mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-17 12:16:30 +01:00
dynamically change metebridge metrics (midi|audio)
This commit is contained in:
parent
6e661e734b
commit
40493e06ee
5 changed files with 86 additions and 33 deletions
|
|
@ -169,6 +169,9 @@ widget "*FaderMetricsStrip" style:highest "audio_track_metrics"
|
||||||
widget "*AudioTrackMetrics" style:highest "audio_track_metrics"
|
widget "*AudioTrackMetrics" style:highest "audio_track_metrics"
|
||||||
widget "*MidiTrackMetrics" style:highest "midi_track_metrics"
|
widget "*MidiTrackMetrics" style:highest "midi_track_metrics"
|
||||||
widget "*AudioBusMetrics" style:highest "audio_bus_metrics"
|
widget "*AudioBusMetrics" style:highest "audio_bus_metrics"
|
||||||
|
widget "*AudioTrackMetricsLeft" style:highest "audio_track_metrics"
|
||||||
|
widget "*MidiTrackMetricsLeft" style:highest "midi_track_metrics"
|
||||||
|
widget "*AudioBusMetricsLeft" style:highest "audio_bus_metrics"
|
||||||
widget "*AudioTrackMetricsInactive" style:highest "audio_track_metrics_inactive"
|
widget "*AudioTrackMetricsInactive" style:highest "audio_track_metrics_inactive"
|
||||||
widget "*MidiTrackMetricsInactive" style:highest "midi_track_metrics_inactive"
|
widget "*MidiTrackMetricsInactive" style:highest "midi_track_metrics_inactive"
|
||||||
widget "*AudioBusMetricsInactive" style:highest "audio_bus_metrics_inactive"
|
widget "*AudioBusMetricsInactive" style:highest "audio_bus_metrics_inactive"
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,7 @@ using namespace std;
|
||||||
PBD::Signal1<void,MeterStrip*> MeterStrip::CatchDeletion;
|
PBD::Signal1<void,MeterStrip*> MeterStrip::CatchDeletion;
|
||||||
PBD::Signal0<void> MeterStrip::ResetAllPeakDisplays;
|
PBD::Signal0<void> MeterStrip::ResetAllPeakDisplays;
|
||||||
PBD::Signal1<void,RouteGroup*> MeterStrip::ResetGroupPeakDisplays;
|
PBD::Signal1<void,RouteGroup*> MeterStrip::ResetGroupPeakDisplays;
|
||||||
|
PBD::Signal0<void> MeterStrip::MetricChanged;
|
||||||
|
|
||||||
|
|
||||||
MeterStrip::MetricPatterns MeterStrip::metric_patterns;
|
MeterStrip::MetricPatterns MeterStrip::metric_patterns;
|
||||||
|
|
@ -71,27 +72,7 @@ MeterStrip::MeterStrip (int metricmode)
|
||||||
btnbox.set_size_request(-1, 16);
|
btnbox.set_size_request(-1, 16);
|
||||||
namebx.set_size_request(18, 52);
|
namebx.set_size_request(18, 52);
|
||||||
|
|
||||||
_types.clear ();
|
set_metric_mode(metricmode);
|
||||||
switch(metricmode) {
|
|
||||||
case 1:
|
|
||||||
meter_metric_area.set_name ("AudioBusMetrics");
|
|
||||||
_types.push_back (DataType::AUDIO);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
meter_metric_area.set_name ("AudioTrackMetrics");
|
|
||||||
_types.push_back (DataType::AUDIO);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
meter_metric_area.set_name ("MidiTrackMetrics");
|
|
||||||
_types.push_back (DataType::MIDI);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
meter_metric_area.set_name ("AudioMidiTrackMetrics");
|
|
||||||
_types.push_back (DataType::AUDIO);
|
|
||||||
_types.push_back (DataType::MIDI);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
//meter_metric_area.queue_draw ();
|
|
||||||
|
|
||||||
set_size_request_to_display_given_text (meter_metric_area, "-8888", 1, 0);
|
set_size_request_to_display_given_text (meter_metric_area, "-8888", 1, 0);
|
||||||
meter_metric_area.signal_expose_event().connect (
|
meter_metric_area.signal_expose_event().connect (
|
||||||
|
|
@ -124,6 +105,8 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
|
||||||
set_spacing(2);
|
set_spacing(2);
|
||||||
RouteUI::set_route (rt);
|
RouteUI::set_route (rt);
|
||||||
|
|
||||||
|
_has_midi = false;
|
||||||
|
|
||||||
int meter_width = 6;
|
int meter_width = 6;
|
||||||
if (_route->shared_peak_meter()->input_streams().n_total() == 1) {
|
if (_route->shared_peak_meter()->input_streams().n_total() == 1) {
|
||||||
meter_width = 12;
|
meter_width = 12;
|
||||||
|
|
@ -287,6 +270,7 @@ MeterStrip::meter_configuration_changed (ChanCount c)
|
||||||
{
|
{
|
||||||
int type = 0;
|
int type = 0;
|
||||||
_types.clear ();
|
_types.clear ();
|
||||||
|
bool old_has_midi = _has_midi;
|
||||||
|
|
||||||
for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
|
for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
|
||||||
if (c.get (*i) > 0) {
|
if (c.get (*i) > 0) {
|
||||||
|
|
@ -301,19 +285,24 @@ MeterStrip::meter_configuration_changed (ChanCount c)
|
||||||
) {
|
) {
|
||||||
meter_ticks1_area.set_name ("AudioBusMetrics");
|
meter_ticks1_area.set_name ("AudioBusMetrics");
|
||||||
meter_ticks2_area.set_name ("AudioBusMetrics");
|
meter_ticks2_area.set_name ("AudioBusMetrics");
|
||||||
|
_has_midi = false;
|
||||||
}
|
}
|
||||||
else if (type == (1 << DataType::AUDIO)) {
|
else if (type == (1 << DataType::AUDIO)) {
|
||||||
meter_ticks1_area.set_name ("AudioTrackMetrics");
|
meter_ticks1_area.set_name ("AudioTrackMetrics");
|
||||||
meter_ticks2_area.set_name ("AudioTrackMetrics");
|
meter_ticks2_area.set_name ("AudioTrackMetrics");
|
||||||
|
_has_midi = false;
|
||||||
}
|
}
|
||||||
else if (type == (1 << DataType::MIDI)) {
|
else if (type == (1 << DataType::MIDI)) {
|
||||||
meter_ticks1_area.set_name ("MidiTrackMetrics");
|
meter_ticks1_area.set_name ("MidiTrackMetrics");
|
||||||
meter_ticks2_area.set_name ("MidiTrackMetrics");
|
meter_ticks2_area.set_name ("MidiTrackMetrics");
|
||||||
|
_has_midi = true;
|
||||||
} else {
|
} else {
|
||||||
meter_ticks1_area.set_name ("AudioMidiTrackMetrics");
|
meter_ticks1_area.set_name ("AudioMidiTrackMetrics");
|
||||||
meter_ticks2_area.set_name ("AudioMidiTrackMetrics");
|
meter_ticks2_area.set_name ("AudioMidiTrackMetrics");
|
||||||
|
_has_midi = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (old_has_midi != _has_midi) MetricChanged();
|
||||||
on_theme_changed();
|
on_theme_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -342,22 +331,17 @@ MeterStrip::on_size_allocate (Gtk::Allocation& a)
|
||||||
VBox::on_size_allocate(a);
|
VBox::on_size_allocate(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX code-copy from gain_meter.cc -- TODO consolidate
|
|
||||||
*
|
|
||||||
* slightly different:
|
|
||||||
* - ticks & label positions are swapped
|
|
||||||
* - more ticks for audio (longer meter by default)
|
|
||||||
* - right-aligned lables, unit-legend
|
|
||||||
* - height limitation of FastMeter::max_pattern_metric_size is included here
|
|
||||||
*/
|
|
||||||
cairo_pattern_t*
|
cairo_pattern_t*
|
||||||
MeterStrip::render_metrics (Gtk::Widget& w, vector<DataType> types)
|
MeterStrip::render_metrics (Gtk::Widget& w, vector<DataType> types)
|
||||||
{
|
{
|
||||||
Glib::RefPtr<Gdk::Window> win (w.get_window());
|
Glib::RefPtr<Gdk::Window> win (w.get_window());
|
||||||
|
|
||||||
|
bool tickleft = true;
|
||||||
gint width, height;
|
gint width, height;
|
||||||
win->get_size (width, height);
|
win->get_size (width, height);
|
||||||
|
|
||||||
|
tickleft = w.get_name().substr(w.get_name().length() - 4) == "Left";
|
||||||
|
|
||||||
cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
|
cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
|
||||||
cairo_t* cr = cairo_create (surface);
|
cairo_t* cr = cairo_create (surface);
|
||||||
Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create(w.get_pango_context());
|
Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create(w.get_pango_context());
|
||||||
|
|
@ -491,8 +475,13 @@ MeterStrip::render_metrics (Gtk::Widget& w, vector<DataType> types)
|
||||||
fraction = log_meter (j->first);
|
fraction = log_meter (j->first);
|
||||||
snprintf (buf, sizeof (buf), "%+2d", j->first);
|
snprintf (buf, sizeof (buf), "%+2d", j->first);
|
||||||
pos = height - (gint) floor (height * fraction);
|
pos = height - (gint) floor (height * fraction);
|
||||||
|
if (tickleft) {
|
||||||
cairo_move_to(cr, width-2.5, pos + .5);
|
cairo_move_to(cr, width-2.5, pos + .5);
|
||||||
cairo_line_to(cr, width, pos + .5);
|
cairo_line_to(cr, width, pos + .5);
|
||||||
|
} else {
|
||||||
|
cairo_move_to(cr, 0, pos + .5);
|
||||||
|
cairo_line_to(cr, 2.5, pos + .5);
|
||||||
|
}
|
||||||
cairo_stroke (cr);
|
cairo_stroke (cr);
|
||||||
break;
|
break;
|
||||||
case DataType::MIDI:
|
case DataType::MIDI:
|
||||||
|
|
@ -501,7 +490,11 @@ MeterStrip::render_metrics (Gtk::Widget& w, vector<DataType> types)
|
||||||
snprintf (buf, sizeof (buf), "%3d", j->first);
|
snprintf (buf, sizeof (buf), "%3d", j->first);
|
||||||
pos = 1 + height - (gint) rintf (height * fraction);
|
pos = 1 + height - (gint) rintf (height * fraction);
|
||||||
pos = min (pos, height);
|
pos = min (pos, height);
|
||||||
|
if (tickleft) {
|
||||||
|
cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI);
|
||||||
|
} else {
|
||||||
cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI);
|
cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI);
|
||||||
|
}
|
||||||
cairo_fill(cr);
|
cairo_fill(cr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -556,7 +549,6 @@ MeterStrip::render_metrics (Gtk::Widget& w, vector<DataType> types)
|
||||||
return pattern;
|
return pattern;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX code-copy from gain_meter.cc -- TODO consolidate */
|
|
||||||
gint
|
gint
|
||||||
MeterStrip::meter_metrics_expose (GdkEventExpose *ev)
|
MeterStrip::meter_metrics_expose (GdkEventExpose *ev)
|
||||||
{
|
{
|
||||||
|
|
@ -593,6 +585,37 @@ MeterStrip::meter_metrics_expose (GdkEventExpose *ev)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MeterStrip::set_metric_mode (int metricmode)
|
||||||
|
{
|
||||||
|
_types.clear ();
|
||||||
|
switch(metricmode) {
|
||||||
|
case 1:
|
||||||
|
meter_metric_area.set_name ("AudioBusMetrics");
|
||||||
|
_types.push_back (DataType::AUDIO);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
meter_metric_area.set_name ("AudioTrackMetricsLeft");
|
||||||
|
_types.push_back (DataType::AUDIO);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
meter_metric_area.set_name ("MidiTrackMetrics");
|
||||||
|
_types.push_back (DataType::MIDI);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
meter_metric_area.set_name ("AudioTrackMetrics");
|
||||||
|
_types.push_back (DataType::AUDIO);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
meter_metric_area.set_name ("AudioMidiTrackMetrics");
|
||||||
|
_types.push_back (DataType::AUDIO);
|
||||||
|
_types.push_back (DataType::MIDI);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
meter_metric_area.queue_draw ();
|
||||||
|
}
|
||||||
|
|
||||||
cairo_pattern_t*
|
cairo_pattern_t*
|
||||||
MeterStrip::render_ticks (Gtk::Widget& w, vector<DataType> types)
|
MeterStrip::render_ticks (Gtk::Widget& w, vector<DataType> types)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -56,10 +56,14 @@ class MeterStrip : public Gtk::VBox, public RouteUI
|
||||||
static PBD::Signal1<void,MeterStrip*> CatchDeletion;
|
static PBD::Signal1<void,MeterStrip*> CatchDeletion;
|
||||||
static PBD::Signal0<void> ResetAllPeakDisplays;
|
static PBD::Signal0<void> ResetAllPeakDisplays;
|
||||||
static PBD::Signal1<void,ARDOUR::RouteGroup*> ResetGroupPeakDisplays;
|
static PBD::Signal1<void,ARDOUR::RouteGroup*> ResetGroupPeakDisplays;
|
||||||
|
static PBD::Signal0<void> MetricChanged;
|
||||||
|
|
||||||
void reset_peak_display ();
|
void reset_peak_display ();
|
||||||
void reset_group_peak_display (ARDOUR::RouteGroup*);
|
void reset_group_peak_display (ARDOUR::RouteGroup*);
|
||||||
|
|
||||||
|
void set_metric_mode (int);
|
||||||
|
bool has_midi() { return _has_midi; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
boost::shared_ptr<ARDOUR::Route> _route;
|
boost::shared_ptr<ARDOUR::Route> _route;
|
||||||
PBD::ScopedConnectionList route_connections;
|
PBD::ScopedConnectionList route_connections;
|
||||||
|
|
@ -106,6 +110,8 @@ class MeterStrip : public Gtk::VBox, public RouteUI
|
||||||
std::vector<ARDOUR::DataType> _types;
|
std::vector<ARDOUR::DataType> _types;
|
||||||
|
|
||||||
float max_peak;
|
float max_peak;
|
||||||
|
bool _has_midi;
|
||||||
|
|
||||||
LevelMeter *level_meter;
|
LevelMeter *level_meter;
|
||||||
void meter_changed ();
|
void meter_changed ();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -147,6 +147,7 @@ Meterbridge::Meterbridge ()
|
||||||
MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context());
|
MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context());
|
||||||
MeterStrip::ResetAllPeakDisplays.connect_same_thread (*this, boost::bind(&Meterbridge::reset_all_peaks, this));
|
MeterStrip::ResetAllPeakDisplays.connect_same_thread (*this, boost::bind(&Meterbridge::reset_all_peaks, this));
|
||||||
MeterStrip::ResetGroupPeakDisplays.connect_same_thread (*this, boost::bind (&Meterbridge::reset_group_peaks, this, _1));
|
MeterStrip::ResetGroupPeakDisplays.connect_same_thread (*this, boost::bind (&Meterbridge::reset_group_peaks, this, _1));
|
||||||
|
MeterStrip::MetricChanged.connect_same_thread (*this, boost::bind(&Meterbridge::update_metrics, this));
|
||||||
|
|
||||||
global_hpacker.set_spacing(0);
|
global_hpacker.set_spacing(0);
|
||||||
scroller.add (global_hpacker);
|
scroller.add (global_hpacker);
|
||||||
|
|
@ -426,6 +427,7 @@ Meterbridge::add_strips (RouteList& routes)
|
||||||
}
|
}
|
||||||
|
|
||||||
sync_order_keys(MixerSort);
|
sync_order_keys(MixerSort);
|
||||||
|
update_metrics();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -439,6 +441,24 @@ Meterbridge::remove_strip (MeterStrip* strip)
|
||||||
if ((i = find (strips.begin(), strips.end(), strip)) != strips.end()) {
|
if ((i = find (strips.begin(), strips.end(), strip)) != strips.end()) {
|
||||||
strips.erase (i);
|
strips.erase (i);
|
||||||
}
|
}
|
||||||
|
update_metrics();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Meterbridge::update_metrics ()
|
||||||
|
{
|
||||||
|
bool have_midi = false;
|
||||||
|
for (list<MeterStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
|
||||||
|
if ( (*i)->has_midi ()) {
|
||||||
|
have_midi = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (have_midi) {
|
||||||
|
metrics_right->set_metric_mode(3);
|
||||||
|
} else {
|
||||||
|
metrics_right->set_metric_mode(4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -73,6 +73,7 @@ class Meterbridge :
|
||||||
|
|
||||||
void add_strips (ARDOUR::RouteList&);
|
void add_strips (ARDOUR::RouteList&);
|
||||||
void remove_strip (MeterStrip *);
|
void remove_strip (MeterStrip *);
|
||||||
|
void update_metrics ();
|
||||||
|
|
||||||
void reset_all_peaks ();
|
void reset_all_peaks ();
|
||||||
void reset_group_peaks (ARDOUR::RouteGroup*);
|
void reset_group_peaks (ARDOUR::RouteGroup*);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue