X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fau_pluginui.mm;h=1a80837acfa2e117703fe69051df2d182a4beb3a;hb=9f1293bfe5d22c42ee222a5fd5129d8faebd17f5;hp=90d48d54324b9f0686d462ad23880c781e4becee;hpb=35c01e552f84bc68ce07fbca109f2de04ac1e356;p=ardour.git diff --git a/gtk2_ardour/au_pluginui.mm b/gtk2_ardour/au_pluginui.mm index 90d48d5432..1a80837acf 100644 --- a/gtk2_ardour/au_pluginui.mm +++ b/gtk2_ardour/au_pluginui.mm @@ -3,6 +3,7 @@ #include #include +#include #include #include "pbd/convert.h" @@ -37,14 +38,17 @@ #import #import #import + +#ifndef __ppc__ #include +#endif #undef Marker #include "keyboard.h" #include "utils.h" #include "public_editor.h" -#include "i18n.h" +#include "pbd/i18n.h" #include "gtk2ardour-config.h" @@ -63,8 +67,7 @@ vector AUPluginUI::automation_mode_strings; int64_t AUPluginUI::last_timer = 0; bool AUPluginUI::timer_needed = true; CFRunLoopTimerRef AUPluginUI::cf_timer; -uint64_t AUPluginUI::timer_callbacks = 0; -uint64_t AUPluginUI::timer_out_of_range = 0; +sigc::connection AUPluginUI::timer_connection; static const gchar* _automation_mode_strings[] = { X_("Manual"), @@ -207,11 +210,24 @@ dump_view_tree (NSView* view, int depth, int maxdepth) * certainly be possible to make it work for Ardour. */ +static uint32_t block_plugin_redraws = 0; +static const uint32_t minimum_redraw_rate = 30; /* frames per second */ +static const uint32_t block_plugin_redraw_count = 15; /* number of combined plugin redraws to block, if blocking */ + +#ifdef __ppc__ + +/* PowerPC versions of OS X do not support libdispatch, which we use below when swizzling objective C. But they also don't have Retina + * which is the underlying reason for this code. So just skip it on those CPUs. + */ + + +static void add_plugin_view (id view) {} +static void remove_plugin_view (id view) {} + +#else + static IMP original_nsview_drawIfNeeded; static std::vector plugin_views; -static uint32_t block_plugin_redraws = 0; -static const uint32_t minimum_redraw_rate = 25; /* frames per second */ -static const uint32_t block_plugin_redraw_count = 10; /* number of combined plugin redraws to block, if blocking */ static void add_plugin_view (id view) { @@ -238,7 +254,9 @@ static void interposed_drawIfNeeded (id receiver, SEL selector, NSRect rect) { if (block_plugin_redraws && (find (plugin_views.begin(), plugin_views.end(), receiver) != plugin_views.end())) { block_plugin_redraws--; +#ifdef AU_DEBUG_PRINT std::cerr << "Plugin redraw blocked\n"; +#endif /* YOU ... SHALL .... NOT ... DRAW!!!! */ return; } @@ -263,6 +281,8 @@ static void interposed_drawIfNeeded (id receiver, SEL selector, NSRect rect) @end +#endif /* __ppc__ */ + /* END OF THE PLUGIN REDRAW HACK */ @implementation NotificationObject @@ -384,22 +404,22 @@ AUPluginUI::AUPluginUI (boost::shared_ptr insert) HBox* smaller_hbox = manage (new HBox); smaller_hbox->set_spacing (6); + smaller_hbox->pack_start (pin_management_button, false, false, 4); smaller_hbox->pack_start (preset_label, false, false, 4); smaller_hbox->pack_start (_preset_modified, false, false); smaller_hbox->pack_start (_preset_combo, false, false); smaller_hbox->pack_start (add_button, false, false); -#if 0 - /* Ardour does not currently allow to overwrite existing presets - * see save_property_list() in audio_unit.cc - */ smaller_hbox->pack_start (save_button, false, false); -#endif + smaller_hbox->pack_start (delete_button, false, false); + #if 0 /* one day these might be useful with an AU plugin, but not yet */ smaller_hbox->pack_start (automation_mode_label, false, false); smaller_hbox->pack_start (automation_mode_selector, false, false); #endif - smaller_hbox->pack_start (reset_button, false, false); + if (insert->controls().size() > 0) { + smaller_hbox->pack_start (reset_button, false, false); + } smaller_hbox->pack_start (bypass_button, false, true); VBox* v1_box = manage (new VBox); @@ -691,6 +711,15 @@ AUPluginUI::update_view_size () last_au_frame = [au_view frame]; } +bool +AUPluginUI::timer_callback () +{ + block_plugin_redraws = 0; +#ifdef AU_DEBUG_PRINT + std::cerr << "Resume redraws after idle\n"; +#endif + return false; +} void au_cf_timer_callback (CFRunLoopTimerRef timer, void* info) @@ -702,33 +731,25 @@ void AUPluginUI::cf_timer_callback () { int64_t now = ARDOUR::get_microseconds (); - timer_callbacks++; - if (!last_timer) { + if (!last_timer || block_plugin_redraws) { last_timer = now; return; } - const int64_t usecs_slop = 7500; /* 7.5 msec */ + const int64_t usecs_slop = (1400000 / minimum_redraw_rate); // 140% +#ifdef AU_DEBUG_PRINT std::cerr << "Timer elapsed : " << now - last_timer << std::endl; +#endif if ((now - last_timer) > (usecs_slop + (1000000/minimum_redraw_rate))) { - timer_out_of_range++; - } - - /* check timing roughly every second */ - - if ((timer_callbacks % minimum_redraw_rate) == 0) { - std::cerr << "OOR check: " << timer_out_of_range << std::endl; - if (timer_out_of_range > (minimum_redraw_rate / 4)) { - /* more than 25 % of the last second's worth of timers - have been late. Take action. - */ - block_plugin_redraws = block_plugin_redraw_count; - std::cerr << "Timer too slow, block plugin redraws\n"; - } - timer_out_of_range = 0; + block_plugin_redraws = block_plugin_redraw_count; + timer_connection.disconnect (); + timer_connection = Glib::signal_timeout().connect (&AUPluginUI::timer_callback, 40); +#ifdef AU_DEBUG_PRINT + std::cerr << "Timer too slow, block plugin redraws\n"; +#endif } last_timer = now; @@ -741,7 +762,7 @@ AUPluginUI::start_cf_timer () return; } - CFTimeInterval interval = 1.0/25.0; /* secs => 40msec or 25fps */ + CFTimeInterval interval = 1.0 / (float) minimum_redraw_rate; cf_timer = CFRunLoopTimerCreate (kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + interval, @@ -794,7 +815,9 @@ AUPluginUI::cocoa_view_resized () * NSView, resulting in a reentrant call to the FrameDidChange * handler (this method). Ignore this reentrant call. */ +#ifdef AU_DEBUG_PRINT std::cerr << plugin->name() << " re-entrant call to cocoa_view_resized, ignored\n"; +#endif return; }