From a505e1469d362cc32acb01252d192c73729fbc43 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sun, 12 Mar 2006 18:21:48 +0000 Subject: [PATCH] remove varispeed control; shuttle controller now has a context menu with max speed options; rearrange and optimize meter metric displays git-svn-id: svn://localhost/trunk/ardour2@382 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour2_ui.rc | 11 ++-- gtk2_ardour/ardour_ui.cc | 1 + gtk2_ardour/ardour_ui.h | 5 ++ gtk2_ardour/ardour_ui2.cc | 89 +++++++++++++++++++++++----- gtk2_ardour/gain_meter.cc | 115 ++++++++++++++++++++++++------------- gtk2_ardour/gain_meter.h | 4 ++ gtk2_ardour/mixer_strip.cc | 12 +++- libs/ardour/tempo.cc | 2 - 8 files changed, 174 insertions(+), 65 deletions(-) diff --git a/gtk2_ardour/ardour2_ui.rc b/gtk2_ardour/ardour2_ui.rc index 27431a8427..929a1b5a06 100644 --- a/gtk2_ardour/ardour2_ui.rc +++ b/gtk2_ardour/ardour2_ui.rc @@ -480,8 +480,8 @@ style "editor_time_ruler" = "small_text" style "audio_track_base" = "default_base" { - font_name = "sans medium 8" - fg[NORMAL] = { 0.80, 0.80, 0.80 } + font_name = "sans 6" + fg[NORMAL] = { 0.77, 0.77, 0.72 } bg[NORMAL] = { 0.18, 0.18, 0.22 } bg[ACTIVE] = { 0.20, 0.20, 0.20 } bg[PRELIGHT] = { 0.20, 0.20, 0.20 } @@ -491,7 +491,8 @@ style "audio_track_base" = "default_base" style "audio_bus_base" { - font_name = "sans medium 8" + font_name = "sans 6" + fg[NORMAL] = { 0.77, 0.77, 0.72 } fg[NORMAL] = { 0.7, 0.8, 0.2 } bg[NORMAL] = {0, 0.36, 0.40 } } @@ -778,8 +779,8 @@ style "tearoff_arrow" = "medium_bold_entry" style "meter_metrics_strip" = "default_base" { - font = "sans medium 10" - fg[NORMAL] = { 0.7, 0.8, 0.2 } + font_name = "sans 4" + fg[NORMAL] = { 1.0, 0.8, 0.2 } } style "location_row_button" = "default_buttons_menus" diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index f99d199681..78fad232fb 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -177,6 +177,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) shuttle_grabbed = false; shuttle_fract = 0.0; + shuttle_max_speed = 8.0f; set_shuttle_units (Percentage); set_shuttle_behaviour (Sprung); diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index ab505480cb..b676faed11 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -388,11 +388,16 @@ class ARDOUR_UI : public Gtkmm2ext::UI Gtk::Menu* shuttle_style_menu; ShuttleBehaviour shuttle_behaviour; ShuttleUnits shuttle_units; + float shuttle_max_speed; + Gtk::Menu* shuttle_context_menu; + void build_shuttle_context_menu (); + void show_shuttle_context_menu (); void shuttle_style_changed(); void shuttle_unit_clicked (); void set_shuttle_behaviour (ShuttleBehaviour); void set_shuttle_units (ShuttleUnits); + void set_shuttle_max_speed (float); void update_speed_display (); float last_speed_displayed; diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index cc2a990326..7655931904 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -56,8 +56,6 @@ using namespace sigc; int ARDOUR_UI::setup_windows () { - using namespace Menu_Helpers; - if (create_editor ()) { error << _("UI: cannot setup editor") << endmsg; return -1; @@ -556,12 +554,73 @@ ARDOUR_UI::audition_blink (bool onoff) } } +void +ARDOUR_UI::build_shuttle_context_menu () +{ + using namespace Menu_Helpers; + + shuttle_context_menu = new Menu(); + MenuList& items = shuttle_context_menu->items(); + + Menu* speed_menu = manage (new Menu()); + MenuList& speed_items = speed_menu->items(); + + RadioMenuItem::Group group; + + speed_items.push_back (RadioMenuElem (group, "8", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 8.0f))); + if (shuttle_max_speed == 8.0) { + static_cast(&speed_items.back())->set_active (); + } + speed_items.push_back (RadioMenuElem (group, "6", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 6.0f))); + if (shuttle_max_speed == 6.0) { + static_cast(&speed_items.back())->set_active (); + } + speed_items.push_back (RadioMenuElem (group, "4", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 4.0f))); + if (shuttle_max_speed == 4.0) { + static_cast(&speed_items.back())->set_active (); + } + speed_items.push_back (RadioMenuElem (group, "3", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 3.0f))); + if (shuttle_max_speed == 3.0) { + static_cast(&speed_items.back())->set_active (); + } + speed_items.push_back (RadioMenuElem (group, "2", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 2.0f))); + if (shuttle_max_speed == 2.0) { + static_cast(&speed_items.back())->set_active (); + } + speed_items.push_back (RadioMenuElem (group, "1.5", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 1.5f))); + if (shuttle_max_speed == 1.5) { + static_cast(&speed_items.back())->set_active (); + } + + items.push_back (MenuElem (_("Maximum speed"), *speed_menu)); +} + +void +ARDOUR_UI::show_shuttle_context_menu () +{ + if (shuttle_context_menu == 0) { + build_shuttle_context_menu (); + } + + shuttle_context_menu->popup (1, 0); +} + +void +ARDOUR_UI::set_shuttle_max_speed (float speed) +{ + shuttle_max_speed = speed; +} gint ARDOUR_UI::shuttle_box_button_press (GdkEventButton* ev) { if (!session) { - return TRUE; + return true; + } + + if (Keyboard::is_context_menu_event (ev)) { + show_shuttle_context_menu (); + return true; } switch (ev->button) { @@ -573,20 +632,20 @@ ARDOUR_UI::shuttle_box_button_press (GdkEventButton* ev) case 2: case 3: - return TRUE; + return true; break; } - return TRUE; + return true; } gint ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev) { if (!session) { - return TRUE; + return true; } - + switch (ev->button) { case 1: mouse_shuttle (ev->x, true); @@ -597,7 +656,7 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev) session->request_transport_speed (1.0); shuttle_box.queue_draw (); } - return TRUE; + return true; case 2: if (session->transport_rolling()) { @@ -607,10 +666,10 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev) shuttle_fract = 0; } shuttle_box.queue_draw (); - return TRUE; + return true; case 3: - return TRUE; + return true; case 4: shuttle_fract += 0.005; @@ -622,14 +681,14 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev) use_shuttle_fract (true); - return TRUE; + return true; } gint ARDOUR_UI::shuttle_box_motion (GdkEventMotion* ev) { if (!session || !shuttle_grabbed) { - return TRUE; + return true; } return mouse_shuttle (ev->x, false); @@ -649,7 +708,7 @@ ARDOUR_UI::mouse_shuttle (double x, bool force) shuttle_fract = distance / half_width; use_shuttle_fract (force); - return TRUE; + return true; } void @@ -679,7 +738,7 @@ ARDOUR_UI::use_shuttle_fract (bool force) fract = -fract; } - session->request_transport_speed (8.0 * fract); // Formula A2 + session->request_transport_speed (shuttle_max_speed * fract); // Formula A2 shuttle_box.queue_draw (); } @@ -706,7 +765,7 @@ ARDOUR_UI::shuttle_box_expose (GdkEventExpose* event) 0, x, shuttle_box.get_height()); - return TRUE; + return true; } void diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index df219d3e7e..07b7751b29 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -52,10 +52,12 @@ using namespace ARDOUR; using namespace Gtkmm2ext; using namespace Gtk; using namespace sigc; +using namespace std; sigc::signal GainMeter::ResetAllPeakDisplays; sigc::signal GainMeter::ResetGroupPeakDisplays; Pix* GainMeter::slider_pix = 0; +map > GainMeter::metric_pixmaps; int GainMeter::setup_slider_pix () @@ -74,6 +76,12 @@ GainMeter::setup_slider_pix () return 0; } +void +was_pressed () +{ + cerr << "was pressed\n"; +} + GainMeter::GainMeter (IO& io, Session& s) : _io (io), _session (s), @@ -113,6 +121,8 @@ GainMeter::GainMeter (IO& io, Session& s) gain_unit_button.set_name ("MixerStripGainUnitButton"); gain_unit_label.set_name ("MixerStripGainUnitButton"); + gain_unit_button.signal_clicked().connect (ptr_fun (was_pressed)); + top_table.set_col_spacings (2); top_table.set_homogeneous (true); top_table.attach (gain_unit_button, 0, 1, 0, 1); @@ -120,6 +130,7 @@ GainMeter::GainMeter (IO& io, Session& s) Route* r; if ((r = dynamic_cast (&_io)) != 0) { + r->meter_change.connect (mem_fun(*this, &GainMeter::meter_changed)); meter_point_button.add (meter_point_label); meter_point_button.set_name ("MixerStripMeterPreButton"); @@ -168,17 +179,14 @@ GainMeter::GainMeter (IO& io, Session& s) gain_display_box.pack_end (peak_display_frame, Gtk::PACK_SHRINK); - meter_metric_area.set_size_request (18, -1); + meter_metric_area.set_size_request (25, -1); meter_metric_area.set_name ("MeterMetricsStrip"); meter_packer.set_spacing (2); - fader_box.set_spacing (2); - - fader_box.pack_start (*gain_slider, Gtk::PACK_SHRINK); hbox.set_spacing (4); - hbox.pack_start (fader_box, Gtk::PACK_SHRINK); - hbox.pack_start (meter_packer, Gtk::PACK_SHRINK); + hbox.pack_start (*gain_slider, false, false, 2); + hbox.pack_start (meter_packer, true, false); set_spacing (4); @@ -217,56 +225,80 @@ GainMeter::set_width (Width w) setup_meters (); } -gint -GainMeter::meter_metrics_expose (GdkEventExpose *ev) +Glib::RefPtr +GainMeter::render_metrics (Gtk::Widget& w) { - /* XXX optimize this so that it doesn't do it all everytime */ - - double fraction; - Glib::RefPtr win (meter_metric_area.get_window()); - Glib::RefPtr fg_gc (meter_metric_area.get_style()->get_fg_gc (Gtk::STATE_NORMAL)); - Glib::RefPtr bg_gc (meter_metric_area.get_style()->get_bg_gc (Gtk::STATE_NORMAL)); + Glib::RefPtr win (w.get_window()); + Glib::RefPtr fg_gc (w.get_style()->get_fg_gc (Gtk::STATE_NORMAL)); + Glib::RefPtr bg_gc (w.get_style()->get_bg_gc (Gtk::STATE_NORMAL)); gint x, y, width, height, depth; - gint pos; - int db_points[] = { -50, -10, -3, 0, 6 }; - uint32_t i; + int db_points[] = { -50, -40, -20, -30, -10, -3, 0, 4 }; char buf[32]; - GdkRectangle base_rect; - GdkRectangle draw_rect; int theight; int twidth; win->get_geometry (x, y, width, height, depth); - base_rect.width = width; - base_rect.height = height; - base_rect.x = 0; - base_rect.y = 0; + Glib::RefPtr pixmap = Gdk::Pixmap::create (win, width, height); - gdk_rectangle_intersect (&ev->area, &base_rect, &draw_rect); - win->draw_rectangle (bg_gc, true, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height); + metric_pixmaps[w.get_name()] = pixmap; + + pixmap->draw_rectangle (bg_gc, true, 0, 0, width, height); - Glib::RefPtr layout = meter_metric_area.create_pango_layout(""); + Glib::RefPtr layout = w.create_pango_layout(""); - for (i = 0; i < sizeof (db_points)/sizeof (db_points[0]); ++i) { + for (uint32_t i = 0; i < sizeof (db_points)/sizeof (db_points[0]); ++i) { - fraction = log_meter (db_points[i]); - pos = height - (gint) floor (height * fraction); + float fraction = log_meter (db_points[i]); + gint pos = height - (gint) floor (height * fraction); - snprintf (buf, sizeof (buf), "%d", db_points[i]); + snprintf (buf, sizeof (buf), "%d", abs (db_points[i])); layout->set_text (buf); layout->get_pixel_size (twidth, theight); - win->draw_layout (fg_gc, width - twidth, pos + theight, layout); + pixmap->draw_line (fg_gc, 0, pos, 4, pos); + pixmap->draw_layout (fg_gc, 6, pos - (theight/2), layout); + } + + return pixmap; +} + +gint +GainMeter::meter_metrics_expose (GdkEventExpose *ev) +{ + Glib::RefPtr win (meter_metric_area.get_window()); + Glib::RefPtr fg_gc (meter_metric_area.get_style()->get_fg_gc (Gtk::STATE_NORMAL)); + Glib::RefPtr bg_gc (meter_metric_area.get_style()->get_bg_gc (Gtk::STATE_NORMAL)); + GdkRectangle base_rect; + GdkRectangle draw_rect; + gint x, y, width, height, depth; + + win->get_geometry (x, y, width, height, depth); + + base_rect.width = width; + base_rect.height = height; + base_rect.x = 0; + base_rect.y = 0; + + Glib::RefPtr pixmap; + std::map >::iterator i = metric_pixmaps.find (meter_metric_area.get_name()); + + if (i == metric_pixmaps.end()) { + pixmap = render_metrics (meter_metric_area); + } else { + pixmap = i->second; } + gdk_rectangle_intersect (&ev->area, &base_rect, &draw_rect); + win->draw_rectangle (bg_gc, true, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height); + win->draw_drawable (bg_gc, pixmap, draw_rect.x, draw_rect.y, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height); + return true; } GainMeter::~GainMeter () { - if (meter_menu) { delete meter_menu; } @@ -398,11 +430,6 @@ GainMeter::setup_meters () return; } - if (_width == Wide) { - meter_packer.pack_start (meter_metric_area, Gtk::PACK_SHRINK); - meter_metric_area.show_all (); - } - if (nmeters <= 2) { width = regular_meter_width; } else { @@ -427,6 +454,11 @@ GainMeter::setup_meters () meters[n].meter->show_all (); meters[n].packed = true; } + + if (_width == Wide) { + meter_packer.pack_start (meter_metric_area, Gtk::PACK_SHRINK); + meter_metric_area.show_all (); + } } gint @@ -596,6 +628,8 @@ GainMeter::meter_press(GdkEventButton* ev) wait_for_release = false; + cerr << "meter point button press\n"; + if ((_route = dynamic_cast(&_io)) == 0) { return FALSE; } @@ -647,21 +681,22 @@ GainMeter::meter_press(GdkEventButton* ev) } } - return stop_signal (meter_point_button, "button-press-event"); + return true; } gint GainMeter::meter_release(GdkEventButton* ev) { + cerr << "meter point button release\n"; + if(!ignore_toggle){ if (wait_for_release){ wait_for_release = false; set_meter_point (*(dynamic_cast(&_io)), old_meter_point); - stop_signal (meter_point_button, "button-release-event"); } } - return TRUE; + return true; } void diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h index 597cb06cb3..a1a91ced08 100644 --- a/gtk2_ardour/gain_meter.h +++ b/gtk2_ardour/gain_meter.h @@ -22,6 +22,7 @@ #define __ardour_gtk_gain_meter_h__ #include +#include #include #include @@ -96,6 +97,9 @@ class GainMeter : public Gtk::VBox Gtk::Table top_table; Width _width; + static std::map > metric_pixmaps; + static Glib::RefPtr render_metrics (Gtk::Widget&); + gint meter_metrics_expose (GdkEventExpose *); static void _gain_printer (char buf[32], Gtk::Adjustment&, void *); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 2ca903ea73..a82baa2dae 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -65,6 +65,7 @@ using namespace ARDOUR; using namespace Gtk; using namespace Gtkmm2ext; +#ifdef VARISPEED_IN_MIXER_STRIP static void speed_printer (char buf[32], Gtk::Adjustment& adj, void* arg) { @@ -76,6 +77,7 @@ speed_printer (char buf[32], Gtk::Adjustment& adj, void* arg) snprintf (buf, 32, "%.3f", val); } } +#endif MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer) : AxisView(sess), @@ -85,7 +87,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer) post_redirect_box (PostFader, sess, rt, mx.plugin_selector(), mx.selection(), in_mixer), gpm (_route, sess), panners (_route, sess), - button_table (8, 2), + button_table (7, 2), gain_automation_style_button (""), gain_automation_state_button (""), pan_automation_style_button (""), @@ -157,6 +159,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer) polarity_button.unset_flags (Gtk::CAN_FOCUS); button_table.set_homogeneous (true); + button_table.set_spacings (0); button_table.attach (name_button, 0, 2, 0, 1); button_table.attach (group_button, 0, 2, 1, 2); @@ -214,6 +217,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer) at->FreezeChange.connect (mem_fun(*this, &MixerStrip::map_frozen)); +#ifdef VARISPEED_IN_MIXER_STRIP speed_adjustment.signal_value_changed().connect (mem_fun(*this, &MixerStrip::speed_adjustment_changed)); speed_frame.set_name ("BaseFrame"); @@ -225,7 +229,9 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer) ARDOUR_UI::instance()->tooltips().set_tip (speed_spinner, _("varispeed")); button_table.attach (speed_frame, 0, 2, 6, 7); - button_table.attach (*rec_enable_button, 0, 2, 7, 8); +#endif /* VARISPEED_IN_MIXER_STRIP */ + + button_table.attach (*rec_enable_button, 0, 2, 6, 7); } name_button.add (name_label); @@ -264,7 +270,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer) global_vpacker.pack_start (*whvbox, Gtk::PACK_SHRINK); global_vpacker.pack_start (button_table,Gtk::PACK_SHRINK); global_vpacker.pack_start (pre_redirect_box, true, true); - global_vpacker.pack_start (gpm, Gtk::PACK_SHRINK); + global_vpacker.pack_start (gpm, Gtk::PACK_SHRINK, 4); global_vpacker.pack_start (post_redirect_box, true, true); global_vpacker.pack_start (panners, Gtk::PACK_SHRINK); global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK); diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index e54231d6d1..24c234552c 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -894,7 +894,6 @@ TempoMap::bbt_duration_at_unlocked (const BBT_Time& when, const BBT_Time& bbt, i jack_nframes_t - TempoMap::round_to_bar (jack_nframes_t fr, int dir) { LockMonitor lm (lock, __LINE__, __FILE__); @@ -903,7 +902,6 @@ TempoMap::round_to_bar (jack_nframes_t fr, int dir) jack_nframes_t - TempoMap::round_to_beat (jack_nframes_t fr, int dir) { LockMonitor lm (lock, __LINE__, __FILE__); -- 2.30.2