This enhancement allows the User to set 'Ratio' to a between 1.1 and 10, with 0.1 precision.
Formerly, the minimum was 1.5, and the smallest increment was 0.5.
... many details will need further work, but basic navigation among
pushbuttons with control-alt-arrows and presses with control-alt-space will
work.
Shift-ctrl-alt-down on track panel works to navigate among individual tracks,
and shift-ctrl-alt-up to escape back to the higher level.
... Busy-waiting will happen on Mac when modal dialogs are open, and a LADSPA,
VST, or AudioUnits effect is also open with "fancy" interface.
Busy-waiting will not happen for modal dialogs at other times.
Before this change, an idle Audacity on a recent Linux laptop uses 6%
of CPU. This is because DrawOverlays() is called every 50ms through a
timer in TrackPanel, which instanciates a wxClientDC. This is quite
expensive and dominates the profiles: creating wxClientDCs is 84% of
the CPU audacity spends while idle, according to callgrind. With this
change, we avoid creating wxClientDCs when it's not necessary.
After this change, and idle Audacity consumes 1.6% of CPU, and most of
the time is spend in gtk/wxwidgets processing events.
Here are the perf stats of an idle Audacity before the change:
524.425485 task-clock (msec) # 0.060 CPUs utilized
825 context-switches # 0.002 M/sec
36 cpu-migrations # 0.069 K/sec
0 page-faults # 0.000 K/sec
1,198,433,346 cycles # 2.285 GHz
1,243,329,771 instructions # 1.04 insn per cycle
308,073,049 branches # 587.449 M/sec
5,801,494 branch-misses # 1.88% of all branches
8.808129958 seconds time elapsed
and after:
149.110455 task-clock (msec) # 0.016 CPUs utilized
908 context-switches # 0.006 M/sec
32 cpu-migrations # 0.215 K/sec
0 page-faults # 0.000 K/sec
313,372,582 cycles # 2.102 GHz
167,401,770 instructions # 0.53 insn per cycle
41,857,947 branches # 280.718 M/sec
1,189,566 branch-misses # 2.84% of all branches
9.076940003 seconds time elapsed
This is using the same idiom of only capturing if not capturing already. These cases in AutoDuck, Resizing, Grabber and TQP might have been latent ASSERTs. This based on precedent rather than actual elicited buggy behaviour.