diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2013-12-23 15:35:49 -0500 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2013-12-23 15:35:49 -0500 |
commit | 84f55440a3c6317dd2ab5d7e3d638016609e4d03 (patch) | |
tree | 2329f57523432a698f99927a2f070555fd31fe20 /gtk2_ardour | |
parent | e1bca03857070ba390bba729933c2d72ad5169fd (diff) | |
parent | dc7878760da040ad74b077318d2e9868d427199a (diff) |
fix redrawing of canvas with an optimized build
Best guess right now is that optimization does something bad when ceil() is called twice on a very large dbl-precision number,
which results in a zero (empty) redraw area. Without the removal of the redundant ceil & floor functions, no expose events
would be delivered to the canvas in an optimized build during drags (and maybe more).
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/ardour_ui.cc | 3 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui_dialogs.cc | 14 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui_options.cc | 21 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 2 | ||||
-rw-r--r-- | gtk2_ardour/editor_videotimeline.cc | 12 | ||||
-rw-r--r-- | gtk2_ardour/level_meter.cc | 13 | ||||
-rw-r--r-- | gtk2_ardour/meter_patterns.cc | 45 | ||||
-rw-r--r-- | gtk2_ardour/meter_strip.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/mixer_strip.cc | 1 | ||||
-rw-r--r-- | gtk2_ardour/port_group.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/public_editor.h | 2 | ||||
-rw-r--r-- | gtk2_ardour/rc_option_editor.cc | 20 | ||||
-rw-r--r-- | gtk2_ardour/wscript | 44 |
13 files changed, 131 insertions, 50 deletions
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 6afc359eb8..6337b1919f 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -3569,7 +3569,8 @@ ARDOUR_UI::add_video (Gtk::Window* float_window) if (!transcode_video_dialog->get_audiofile().empty()) { editor->embed_audio_from_video( transcode_video_dialog->get_audiofile(), - video_timeline->get_offset() + video_timeline->get_offset(), + (transcode_video_dialog->import_option() != VTL_IMPORT_NO_VIDEO) ); } switch (transcode_video_dialog->import_option()) { diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index 0dd61778ae..b0ac528b79 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -186,6 +186,11 @@ ARDOUR_UI::set_session (Session *s) update_format (); + if (meter_box.get_parent()) { + transport_tearoff_hbox.remove (meter_box); + transport_tearoff_hbox.remove (editor_meter_peak_display); + } + if (editor_meter) { meter_box.remove(*editor_meter); delete editor_meter; @@ -222,15 +227,8 @@ ARDOUR_UI::set_session (Session *s) transport_tearoff_hbox.pack_start (editor_meter_peak_display, false, false); meter_box.show(); editor_meter_peak_display.show(); - } else if (meter_box.get_parent()) { - transport_tearoff_hbox.remove (meter_box); - transport_tearoff_hbox.remove (editor_meter_peak_display); } - } else if (meter_box.get_parent()) { - transport_tearoff_hbox.remove (meter_box); - transport_tearoff_hbox.remove (editor_meter_peak_display); - } - + } } int diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index 22f88114d9..e1435f7a8d 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -403,14 +403,19 @@ ARDOUR_UI::parameter_changed (std::string p) ArdourCanvas::WaveView::set_global_gradient_depth (config()->get_waveform_gradient_depth()); } else if (p == "show-editor-meter") { bool show = Config->get_show_editor_meter(); - if (editor_meter && show) { - transport_tearoff_hbox.pack_start (meter_box, false, false); - transport_tearoff_hbox.pack_start (editor_meter_peak_display, false, false); - meter_box.show(); - editor_meter_peak_display.show(); - } else if (editor_meter && !show && meter_box.get_parent()) { - transport_tearoff_hbox.remove (meter_box); - transport_tearoff_hbox.remove (editor_meter_peak_display); + + if (editor_meter) { + if (meter_box.get_parent()) { + transport_tearoff_hbox.remove (meter_box); + transport_tearoff_hbox.remove (editor_meter_peak_display); + } + + if (show) { + transport_tearoff_hbox.pack_start (meter_box, false, false); + transport_tearoff_hbox.pack_start (editor_meter_peak_display, false, false); + meter_box.show(); + editor_meter_peak_display.show(); + } } } } diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 233816295b..7366c601d2 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1415,7 +1415,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void toggle_video_timeline_locked (); void set_video_timeline_locked (const bool); void queue_visual_videotimeline_update (); - void embed_audio_from_video (std::string, framepos_t n = 0); + void embed_audio_from_video (std::string, framepos_t n = 0, bool lock_position_to_video = true); PBD::Signal0<void> EditorFreeze; PBD::Signal0<void> EditorThaw; diff --git a/gtk2_ardour/editor_videotimeline.cc b/gtk2_ardour/editor_videotimeline.cc index 83a9745b89..458393708a 100644 --- a/gtk2_ardour/editor_videotimeline.cc +++ b/gtk2_ardour/editor_videotimeline.cc @@ -80,13 +80,10 @@ Editor::toggle_video_timeline_locked () } void -Editor::embed_audio_from_video (std::string path, framepos_t n) +Editor::embed_audio_from_video (std::string path, framepos_t n, bool lock_position_to_video) { vector<std::string> paths; paths.push_back(path); -#if 0 - do_import (paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, ARDOUR::SrcBest, n); -#else current_interthread_info = &import_status; import_status.current = 1; import_status.total = paths.size (); @@ -98,13 +95,14 @@ Editor::embed_audio_from_video (std::string path, framepos_t n) boost::shared_ptr<ARDOUR::Track> track; bool ok = (import_sndfiles (paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, ARDOUR::SrcBest, n, 1, 1, track, false) == 0); if (ok && track) { - boost::shared_ptr<ARDOUR::Playlist> pl = track->playlist(); - pl->find_next_region(n, ARDOUR::End, 0)->set_video_locked(true); + if (lock_position_to_video) { + boost::shared_ptr<ARDOUR::Playlist> pl = track->playlist(); + pl->find_next_region(n, ARDOUR::End, 0)->set_video_locked(true); + } _session->save_state (""); } import_status.all_done = true; -#endif unlink(path.c_str()); } diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 194e446115..e428958343 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -157,6 +157,8 @@ LevelMeterBase::update_meters () (*i).meter->set (meter_deflect_ppm (peak + meter_lineup(0))); } else if (meter_type == MeterVU) { (*i).meter->set (meter_deflect_vu (peak + vu_standard() + meter_lineup(0))); + } else if (meter_type == MeterK12) { + (*i).meter->set (meter_deflect_k (peak, 12), meter_deflect_k(_meter->meter_level(n, MeterPeak), 12)); } else if (meter_type == MeterK14) { (*i).meter->set (meter_deflect_k (peak, 14), meter_deflect_k(_meter->meter_level(n, MeterPeak), 14)); } else if (meter_type == MeterK20) { @@ -320,6 +322,17 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width) c[6] = c[7] = 0xffff00ff; c[8] = c[9] = 0xff0000ff; break; + case MeterK12: + stp[0] = 115.0 * meter_deflect_k(-32, 12); //-20 + stp[1] = 115.0 * meter_deflect_k(-12, 12); // 0 + stp[2] = 115.0 * meter_deflect_k(-10, 12); // +2 + stp[3] = 115.0 * meter_deflect_k( -8, 12); // +4 + c[0] = c[1] = 0x008800ff; + c[2] = c[3] = 0x00ff00ff; + c[4] = c[5] = 0xffff00ff; + c[6] = c[7] = 0xffff00ff; + c[8] = c[9] = 0xff0000ff; + break; case MeterIEC2BBC: c[0] = c[1] = c[2] = c[3] = c[4] = c[5] = c[6] = c[7] = c[8] = c[9] = ARDOUR_UI::config()->color_by_name ("meter color BBC"); diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index f392dc0872..7db2924697 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -101,6 +101,9 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) case MeterK14: return _("K14"); break; + case MeterK12: + return _("K12"); + break; case MeterVU: return _("VU"); break; @@ -199,6 +202,16 @@ static inline float mtr_col_and_fract( } fraction = meter_deflect_k (val, 14); break; + case MeterK12: + if (val >= -8.0) { + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); // red + } else if (val >= -12.0) { + cairo_set_source_rgb (cr, 0.8, 0.8, 0.0); // yellow + } else { + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); // green + } + fraction = meter_deflect_k (val, 12); + break; } return fraction; } @@ -226,6 +239,7 @@ static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { case MeterIEC1NOR: case MeterIEC2BBC: case MeterIEC2EBU: + case MeterK12: case MeterK14: case MeterK20: if (rgba_p_from_style("meterstripPPM", &r, &g, &b, "bg")) { @@ -334,6 +348,20 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ case DataType::AUDIO: switch (type) { + case MeterK12: + points.insert (std::pair<float,float>(-52.0f, 1.0)); + points.insert (std::pair<float,float>(-42.0f, 1.0)); + points.insert (std::pair<float,float>(-32.0f, 1.0)); + points.insert (std::pair<float,float>(-22.0f, 1.0)); + points.insert (std::pair<float,float>(-18.0f, 1.0)); + points.insert (std::pair<float,float>(-15.0f, 1.0)); + points.insert (std::pair<float,float>(-12.0f, 1.0)); + points.insert (std::pair<float,float>( -9.0f, 1.0)); + points.insert (std::pair<float,float>( -8.0f, 0.8)); + points.insert (std::pair<float,float>( -6.0f, 1.0)); + points.insert (std::pair<float,float>( -3.0f, 1.0)); + points.insert (std::pair<float,float>( 0.0f, 1.0)); + break; case MeterK14: points.insert (std::pair<float,float>(-54.0f, 1.0)); points.insert (std::pair<float,float>(-44.0f, 1.0)); @@ -645,6 +673,20 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) case DataType::AUDIO: layout->set_attributes (audio_font_attributes); switch (type) { + case MeterK12: + overlay_midi = 0; + points.insert (std::pair<float,string>(-52.0f, "-40")); + points.insert (std::pair<float,string>(-42.0f, "-30")); + points.insert (std::pair<float,string>(-32.0f, "-20")); + points.insert (std::pair<float,string>(-22.0f, "-10")); + points.insert (std::pair<float,string>(-18.0f, "-6")); + points.insert (std::pair<float,string>(-15.0f, "-3")); + points.insert (std::pair<float,string>(-12.0f, " 0")); + points.insert (std::pair<float,string>( -9.0f, "+3")); + points.insert (std::pair<float,string>( -6.0f, "+6")); + points.insert (std::pair<float,string>( -3.0f, "+9")); + points.insert (std::pair<float,string>( 0.0f, "+12")); + break; case MeterK14: overlay_midi = 0; points.insert (std::pair<float,string>(-54.0f, "-40")); @@ -903,6 +945,9 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) case MeterK14: layout->set_text("K14"); break; + case MeterK12: + layout->set_text("K12"); + break; default: case MeterPeak: case MeterKrms: diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 886374c61a..632c6ef82c 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -562,6 +562,7 @@ MeterStrip::update_background(MeterType type) case MeterIEC1NOR: case MeterIEC2BBC: case MeterIEC2EBU: + case MeterK12: case MeterK14: case MeterK20: mtr_container.set_name ("meterstripPPM"); @@ -747,6 +748,7 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev) add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK20), MeterK20); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK14), MeterK14); + add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK12), MeterK12); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU); MeterType cmt = _route->meter_type(); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 50594378de..aa49e20d0c 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -2141,6 +2141,7 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev) add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU); add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK20), MeterK20); add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK14), MeterK14); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK12), MeterK12); add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterVU), MeterVU); int _strip_type; diff --git a/gtk2_ardour/port_group.cc b/gtk2_ardour/port_group.cc index 213c818b0b..cafcaad51f 100644 --- a/gtk2_ardour/port_group.cc +++ b/gtk2_ardour/port_group.cc @@ -438,7 +438,7 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp ardour->add_bundle (ltc); } - /* Ardour's surfaces */ + /* Ardour's control surfaces */ ControlProtocolManager& m = ControlProtocolManager::instance (); for (list<ControlProtocolInfo*>::iterator i = m.control_protocol_info.begin(); i != m.control_protocol_info.end(); ++i) { diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index a99dcdd253..8e673a7824 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -295,7 +295,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi virtual void set_xjadeo_sensitive (bool onoff) = 0; virtual int get_videotl_bar_height () const = 0; virtual void set_video_timeline_height (const int h) = 0; - virtual void embed_audio_from_video (std::string, framepos_t n = 0) = 0; + virtual void embed_audio_from_video (std::string, framepos_t n = 0, bool lock_position_to_video = true) = 0; virtual void export_video (bool range = false) = 0; virtual RouteTimeAxisView* get_route_view_by_route_id (const PBD::ID& id) const = 0; diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index da6d2344c2..3a5cab0289 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -648,6 +648,7 @@ class ControlSurfacesOptions : public OptionEditorBox public: ControlSurfacesOptions (Gtk::Window& parent) : _parent (parent) + , _ignore_view_change (0) { _store = ListStore::create (_model); _view.set_model (_store); @@ -700,9 +701,14 @@ private: void protocol_status_changed (ControlProtocolInfo* cpi) { /* find the row */ TreeModel::Children rows = _store->children(); + for (TreeModel::Children::iterator x = rows.begin(); x != rows.end(); ++x) { + string n = ((*x)[_model.name]); + if ((*x)[_model.protocol_info] == cpi) { + _ignore_view_change++; (*x)[_model.enabled] = (cpi->protocol || cpi->requested); + _ignore_view_change--; break; } } @@ -712,6 +718,10 @@ private: { TreeModel::Row r = *i; + if (_ignore_view_change) { + return; + } + ControlProtocolInfo* cpi = r[_model.protocol_info]; if (!cpi) { return; @@ -720,22 +730,23 @@ private: bool const was_enabled = (cpi->protocol != 0); bool const is_enabled = r[_model.enabled]; + if (was_enabled != is_enabled) { + if (!was_enabled) { - ControlProtocolManager::instance().instantiate (*cpi); + ControlProtocolManager::instance().activate (*cpi); } else { Gtk::Window* win = r[_model.editor]; if (win) { win->hide (); } - ControlProtocolManager::instance().teardown (*cpi); + ControlProtocolManager::instance().deactivate (*cpi); if (win) { delete win; + r[_model.editor] = 0; } - r[_model.editor] = 0; - cpi->requested = false; } } @@ -805,6 +816,7 @@ private: TreeView _view; Gtk::Window& _parent; PBD::ScopedConnection protocol_status_connection; + uint32_t _ignore_view_change; }; class VideoTimelineOptions : public OptionEditorBox diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript index db6116c3c3..28a8ad5b5a 100644 --- a/gtk2_ardour/wscript +++ b/gtk2_ardour/wscript @@ -357,14 +357,17 @@ def build(bld): if bld.is_defined('WINDOWS_VST_SUPPORT'): # If we require VST support we build a stub main() and the FST library # here using winegcc, and link it to the GTK front-end library - obj = bld(features = 'cxx c cxxprogram wine') - obj.source = ''' - ../libs/fst/fst.c - ../libs/fst/fstinfofile.c - ../libs/fst/vsti.c - ../libs/fst/vstwin.c - ../vst/winmain.c - ''' + obj = bld (features = 'cxx c cxxprogram wine') + obj.source = ( + '../libs/fst/fst.c', + '../libs/fst/fstinfofile.c', + '../libs/fst/vsti.c', + '../libs/fst/vstwin.c', + '../vst/winmain.c', + ) + # + # XXX do we really need to explicitly link to all of these for the wine executable? + # obj.use = [ 'libpbd', 'libmidipp', 'libardour', @@ -390,19 +393,22 @@ def build(bld): obj.target = 'gtk2_ardour' else: # just the normal executable version of the GTK GUI - obj = bld(features = 'cxx c cxxprogram') + obj = bld (features = 'cxx c cxxprogram') obj.source = gtk2_ardour_sources obj.target = 'ardour-' + bld.env['VERSION'] obj.includes = ['.'] - obj.use = [ 'libpbd', - 'libardour', - 'libardour_cp', - 'libtimecode', - 'libmidipp', - 'libgtk2_ardour', - 'libgtkmm2ext', - 'libcanvas', - ] + + # at this point, "obj" refers to either the normal native executable + # OR the shared library built for use with wine on linux. + + obj.use = [ 'libpbd', + 'libardour', + 'libardour_cp', + 'libtimecode', + 'libmidipp', + 'libgtkmm2ext', + 'libcanvas', + ] # continue with setup of obj, which could be a shared library # or an executable. @@ -415,7 +421,7 @@ def build(bld): if bld.is_defined('USE_EXTERNAL_LIBS'): obj.uselib += ' TAGLIB' else: - obj.use.append('libtaglib') + obj.use += ('libtaglib') if sys.platform == 'darwin': obj.uselib += ' AUDIOUNITS OSX GTKOSX' obj.use += ' libappleutility' |