diff options
author | Doug McLain <doug@nostar.net> | 2007-11-20 18:45:30 +0000 |
---|---|---|
committer | Doug McLain <doug@nostar.net> | 2007-11-20 18:45:30 +0000 |
commit | e9e328b4692a43b747b150f0f3801e47d8415060 (patch) | |
tree | f843cdc3a864bbf7a84b51d4c03cf67fee53dc64 /gtk2_ardour | |
parent | c60e0e6a32e1df2a3d1bdd96739d03fc683ca5ca (diff) |
Create new LevelMeter class for meter only widgets. This and some better packing options to the tracks make the meters look better
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@2703 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/SConscript | 1 | ||||
-rw-r--r-- | gtk2_ardour/editor_audiotrack.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/editor_ops.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/level_meter.cc | 203 | ||||
-rw-r--r-- | gtk2_ardour/level_meter.h | 107 | ||||
-rw-r--r-- | gtk2_ardour/route_time_axis.cc | 22 | ||||
-rw-r--r-- | gtk2_ardour/route_time_axis.h | 4 |
7 files changed, 329 insertions, 12 deletions
diff --git a/gtk2_ardour/SConscript b/gtk2_ardour/SConscript index 04ebf15f5b..d7da86949c 100644 --- a/gtk2_ardour/SConscript +++ b/gtk2_ardour/SConscript @@ -171,6 +171,7 @@ io_selector.cc keyboard.cc keyeditor.cc ladspa_pluginui.cc +level_meter.cc location_ui.cc main.cc marker.cc diff --git a/gtk2_ardour/editor_audiotrack.cc b/gtk2_ardour/editor_audiotrack.cc index 061fa324e5..ec7b22c104 100644 --- a/gtk2_ardour/editor_audiotrack.cc +++ b/gtk2_ardour/editor_audiotrack.cc @@ -125,7 +125,7 @@ Editor::stop_updating () if (is_mapped() && session) { for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { if ((atv = dynamic_cast<AudioTimeAxisView*>(*i)) != 0) { - atv->clear_meter (); + atv->hide_meter (); } } } diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index f0290c2d35..99baba28f3 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -1110,7 +1110,7 @@ Editor::edit_cursor_backward () void Editor::edit_cursor_forward () { - nframes_t pos; + //nframes_t pos; nframes_t cnt; bool was_floating; float prefix; diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc new file mode 100644 index 0000000000..dfbe0f6a3b --- /dev/null +++ b/gtk2_ardour/level_meter.cc @@ -0,0 +1,203 @@ +/* + Copyright (C) 2002 Paul Davis + + 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. + + 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 <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 <gtkmm2ext/utils.h> +#include <gtkmm2ext/fastmeter.h> +#include <gtkmm2ext/stop_signal.h> +#include <gtkmm2ext/barcontroller.h> +#include <midi++/manager.h> +#include <pbd/fastlog.h> + +#include "ardour_ui.h" +#include "level_meter.h" +#include "utils.h" +#include "logmeter.h" +#include "gui_thread.h" +#include "keyboard.h" +#include "public_editor.h" + +#include <ardour/session.h> +#include <ardour/route.h> + +#include "i18n.h" + +using namespace ARDOUR; +using namespace PBD; +using namespace Gtkmm2ext; +using namespace Gtk; +using namespace sigc; +using namespace std; + +//sigc::signal<void> LevelMeter::ResetAllPeakDisplays; +//sigc::signal<void,RouteGroup*> LevelMeter::ResetGroupPeakDisplays; + + +LevelMeter::LevelMeter (boost::shared_ptr<IO> io, Session& s) + : _io (io), + _session (s) + +{ + set_spacing (1); + Config->ParameterChanged.connect (mem_fun (*this, &LevelMeter::parameter_changed)); + UI::instance()->theme_changed.connect (mem_fun(*this, &LevelMeter::on_theme_changed)); +} + +void +LevelMeter::on_theme_changed() +{ + style_changed = true; +} + +LevelMeter::~LevelMeter () +{ + for (vector<MeterInfo>::iterator i = meters.begin(); i != meters.end(); i++) { + if ((*i).meter) { + delete (*i).meter; + } + } +} + +void +LevelMeter::update_meters () +{ + vector<MeterInfo>::iterator i; + uint32_t n; + float peak, mpeak; + + for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) { + if ((*i).packed) { + peak = _io->peak_input_power (n); + (*i).meter->set (log_meter (peak)); + mpeak = _io->max_peak_power(n); + } + } +} + +void +LevelMeter::parameter_changed(const char* parameter_name) +{ +#define PARAM_IS(x) (!strcmp (parameter_name, (x))) + + ENSURE_GUI_THREAD (bind (mem_fun(*this, &LevelMeter::parameter_changed), parameter_name)); + + if (PARAM_IS ("meter-hold")) { + + vector<MeterInfo>::iterator i; + uint32_t n; + + for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) { + + (*i).meter->set_hold_count ((uint32_t) floor(Config->get_meter_hold())); + } + } + +#undef PARAM_IS +} + +void +LevelMeter::hide_all_meters () +{ + + for (vector<MeterInfo>::iterator i = meters.begin(); i != meters.end(); ++i) { + if ((*i).packed) { + remove (*((*i).meter)); + (*i).packed = false; + } + } +} + +void +LevelMeter::setup_meters (int len) +{ + uint32_t nmeters = _io->n_outputs(); + guint16 width; + + hide_all_meters (); + + Route* r; + + if ((r = dynamic_cast<Route*> (_io.get())) != 0) { + + switch (r->meter_point()) { + case MeterPreFader: + case MeterInput: + nmeters = r->n_inputs(); + break; + case MeterPostFader: + nmeters = r->n_outputs(); + break; + } + + } else { + + nmeters = _io->n_outputs(); + + } + + if (nmeters == 0) { + return; + } + + if (nmeters <= 2) { + width = regular_meter_width; + } else { + width = thin_meter_width; + } + + while (meters.size() < nmeters) { + meters.push_back (MeterInfo()); + } + + for (int32_t n = nmeters-1; nmeters && n >= 0 ; --n) { + if (meters[n].width != width || meters[n].length != len) { + delete meters[n].meter; + meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical, len); + //cerr << "LevelMeter::setup_meters() w:l = " << width << ":" << len << endl;//DEBUG + meters[n].width = width; + meters[n].length = len; + meters[n].meter->add_events (Gdk::BUTTON_RELEASE_MASK); + } + + pack_start (*meters[n].meter, false, false); + meters[n].meter->show_all (); + meters[n].packed = true; + } + show(); +} + +void LevelMeter::clear_meters () +{ + for (vector<MeterInfo>::iterator i = meters.begin(); i < meters.end(); i++) { + (*i).meter->clear(); + } +} + +void LevelMeter::hide_meters () +{ + hide_all_meters(); +} diff --git a/gtk2_ardour/level_meter.h b/gtk2_ardour/level_meter.h new file mode 100644 index 0000000000..23ec385c26 --- /dev/null +++ b/gtk2_ardour/level_meter.h @@ -0,0 +1,107 @@ +/* + Copyright (C) 2002 Paul Davis + + 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. + + 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_gtk_track_meter_h__ +#define __ardour_gtk_track_meter_h__ + +#include <vector> +#include <map> + +#include <gtkmm/box.h> +#include <gtkmm/adjustment.h> +#include <gtkmm/frame.h> +#include <gtkmm/eventbox.h> +#include <gtkmm/button.h> +#include <gtkmm/table.h> +#include <gtkmm/drawingarea.h> + +#include <ardour/types.h> + +#include <gtkmm2ext/click_box.h> +#include <gtkmm2ext/focus_entry.h> +#include <gtkmm2ext/slider_controller.h> + +#include "enums.h" + +namespace ARDOUR { + class IO; + class Session; + class Route; + class RouteGroup; +} +namespace Gtkmm2ext { + class FastMeter; + class BarController; +} +namespace Gtk { + class Menu; +} + +class LevelMeter : public Gtk::HBox +{ + public: + LevelMeter (boost::shared_ptr<ARDOUR::IO>, ARDOUR::Session&); + ~LevelMeter (); + + void update_gain_sensitive (); + + void update_meters (); + void update_meters_falloff (); + void clear_meters (); + void hide_meters (); + void setup_meters (int len=0); + + private: + + //friend class MixerStrip; + boost::shared_ptr<ARDOUR::IO> _io; + ARDOUR::Session& _session; + + Width _width; + + struct MeterInfo { + Gtkmm2ext::FastMeter *meter; + gint16 width; + int length; + bool packed; + + MeterInfo() { + meter = 0; + width = 0; + length = 0; + packed = false; + } + }; + + static const guint16 regular_meter_width = 3; + static const guint16 thin_meter_width = 2; + vector<MeterInfo> meters; + + //Gtk::HBox meter_packer; + + void hide_all_meters (); + + void parameter_changed (const char*); + + void on_theme_changed (); + bool style_changed; +}; + +#endif /* __ardour_gtk_track_meter_h__ */ + diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index d9acf6bdc1..91f4993df5 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -93,10 +93,11 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh size_button (_("h")), // height automation_button (_("a")), visual_button (_("v")), - gpm (rt, sess) + lm (rt, sess) { - gpm.setup_atv_meter(50); + lm.set_no_show_all(); + lm.setup_meters(50); _has_state = true; playlist_menu = 0; playlist_action_menu = 0; @@ -151,7 +152,7 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh } - controls_hbox.pack_end(gpm); + controls_hbox.pack_start(lm, false, false); _route->meter_change.connect (mem_fun(*this, &RouteTimeAxisView::meter_changed)); _route->input_changed.connect (mem_fun(*this, &RouteTimeAxisView::io_changed)); _route->output_changed.connect (mem_fun(*this, &RouteTimeAxisView::io_changed)); @@ -654,7 +655,7 @@ RouteTimeAxisView::set_height (TrackHeight h) { int gmlen = (height_to_pixels (h)) - 5; bool height_changed = (height == 0) || (h != height_style); - gpm.setup_atv_meter (gmlen); + lm.setup_meters (gmlen); TimeAxisView::set_height (h); ensure_xml_node (); @@ -1790,13 +1791,14 @@ RouteTimeAxisView::update_rec_display () void RouteTimeAxisView::fast_update () { - gpm.update_meters (); + lm.update_meters (); } void RouteTimeAxisView::hide_meter () { - gpm.hide (); + clear_meter (); + lm.hide_meters (); } void @@ -1808,13 +1810,17 @@ RouteTimeAxisView::show_meter () void RouteTimeAxisView::reset_meter () { - gpm.setup_atv_meter (height-5); + if (Config->get_show_track_meters()) { + lm.setup_meters (height-5); + } else { + hide_meter (); + } } void RouteTimeAxisView::clear_meter () { - gpm.clear_meters (); + lm.clear_meters (); } void diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h index d615017ed3..672236a7e5 100644 --- a/gtk2_ardour/route_time_axis.h +++ b/gtk2_ardour/route_time_axis.h @@ -38,7 +38,7 @@ #include "enums.h" #include "time_axis_view.h" #include "canvas.h" -#include "gain_meter.h" +#include "level_meter.h" namespace ARDOUR { @@ -253,7 +253,7 @@ protected: void post_construct (); - GainMeter gpm; + LevelMeter lm; }; #endif /* __ardour_route_time_axis_h__ */ |