Paul Licameli's Contributions

From Audacity Wiki
Jump to: navigation, search

I was granted commit privileges at the start of development of 2.1.1. To find my older contributions, scan the git repository history before the tag "Audacity-2.1.0" for my name in comments, not as committer or author. (I am not the one for whom the Paulstretch sound effect is named.)

My very first contributions were a few small bug fixes in version 2.0.6. (Commit 41c3444 is the oldest.) More serious work commenced afterward.

I group my contributions in each version as "major" or "minor," according to the effort involved, which is not always proportional perhaps to the user's perception of changes.

And thirdly, the "internal" projects. As I mentioned, these are invisible contributions to the end user but are very important too and often involve large efforts. They allude to coding technicalities that may mean much to me and the other developers, but not so much to outsiders. I try to relate them to the visible projects or quality aspects that they ultimately serve.

In each of these versions, of course, I also contributed many and various small fixes that I don't mention here.

I summarize the important things that were committed in each release cycle, but in many cases their development began long before -- even a year or more. So, many of my commits will show a big difference between authorship and commit dates.

Version 2.1.0 (2015)

  • Major
    • Basic spectral editing, including the toolbar. See also my series of four videos demonstrating the feature in development (be warned, the user interface shown there is not entirely the same as in the final product)
    • Rewritten noise reduction effect. Technical discussion of the problems addressed is here
  • Internal
    • Class SelectedRegion groups a starting with an ending time in many places, maintains important invariants, and adds frequency boundaries. (First of my "sweep" projects, as part of spectral editing. See commit f5e593c)

Version 2.1.1 (2015)

  • Major
  • Minor
  • Internal
    • Graphics rewritten to support pinned play head with scrolling waveform or spectrogram, for scrubbing. (Much work to make the caching scheme really save recalculations with small horizontal displacements, especially for spectrogram)
    • Playback can go backwards too, supporting scrubbing
    • Struct AudioIOStartStreamOptions simplifies some argument passing, supporting scrubbing
    • Class WaveTrackCache improves performance of zooming-in of spectrograms

Version 2.1.2 (2016)

  • Major
    • Spectrogram settings cleanup: more vertical scale choices (mel, bark, erb), selectable independently of the algorithm (FFT versus enhanced autocorrelation) and spectral selection enablement, and can be set per-track
    • Reassignment is the third algorithm for spectrograms. Mathematical magic that can correct the spectral leakage that makes spectrograms look blurry. Reference
  • Minor
    • Scroll wheel in vertical ruler can zoom waveform or spectrogram scale
  • Internal
    • Don't assume uniform zoom: many scattered, duplicated conversions between horizontal pixel position and time are replaced with calls to member functions of class ZoomInfo; preparing for a future magnifier (also termed "fisheye") feature, showing a detailed interval of the tracks at a different scale. But this feature still remains only a private experiment, as the best way to fit it in with other user interface code remains unsettled.
    • Some preliminaries for TrackPanel reorganization

Version 2.1.3 (2017)

  • Major
    • Improvements for scrubbing/seeking, including Esc key to stop, new user interface using the time ruler, a toolbar, a menu, and internal improvements for responsiveness
    • Reimplemented toolbar dragging so there are more possible docking points, and Esc key can cancel dragging and resizing
    • Fix many Mac user interface problems resulting from migration to wxWidgets 3 for 2.1.2 (including tab key navigation and focus rings on some controls), some of them requiring changes to wxWidgets source and custom builds of the libraries
    • Improved integration with VoiceOver (the Mac talking desktop) for accessibility for visually impaired users; this required a large wxWidgets patch, and some Objective-C
  • Minor
    • Pinned play head (a major looking feature, but most of the hard work was finished in 2.1.1; it remained to make it separate from scrubbing)
    • Undo and redo of metadata edits
    • Fix flashing display on Mac, and play indicators in tracks and timeline not aligning
    • Mac touch pad gestures as mouse wheel alternatives (two fingers horizontal, pinch and spread)
    • Spectral selection fields in Labels editor
    • Hover tooltips for toolbar buttons mention appropriate shortcut key preferences
    • Discard clipboard button in History window and improved space usage calculation
  • Internal
    • Helped upgrade language to C++11; much systematic use of new language features (override, final, etc.)
    • Began the comprehensive rewrite of naked new and delete with smart pointers (all new done, but not all new[] yet), and other RAII, in hundreds of places, fixing memory and other resource leaks
    • Reexamined all uses of sampleCount (signed 64 bit quantity for offsets into audio files), replacing with size_t where proper (when only treating a buffer), checking safeness of narrowing; preliminary for fixing naked array-new
    • wxFileNameWrapper sweep for performance, implements moves for a frequently copied structure, which caused performance problems
    • OverlayPanel and Overlay generalize the pattern for quick painting of cursor lines, play indicator, scrub speed, etc. and handle collisions properly; a part of TrackPanel cleanup, and also reused in the time ruler; part of fix for flashing display

Version 2.2.0 (2017)

My first turn as release manager!

  • Major
    • Detection and graceful recovery from failures to save projects because of disk space exhaustion (see Exception Handling below for the big challenges met)
    • Significant assistance in the MIDI playback project, which was at the initiative of contributor "pokechu22"
    • Complete Esc key handling for cancelling all drags in the track panel, including those making undoable items if completed. (This was harder than it might seem. See the TrackPanel refactor below)
    • Esc key can also disambiguate among multiple hit test candidates at the mouse position
    • Contributed mouse-over highlighting of track panel buttons and sliders to James' larger Theme project; code support for other hit test highlights too, but not enabled in any other cases besides labels
  • Minor
  • Internal (Coding standards discussions linked herein, also written by me). Several immensely satisfying big advances accomplished:
    • Naked new purge, completed!
      • So we are more confident that memory does not leak; likewise, redo some naked malloc, calloc, etc. with RAII
      • All of which is only a part of the greater initiative of...
    • Exception handling and safety!
      • Raising of exceptions (mostly for file i/o errors, such as exhaustion of available space), fixing unchecked error returns in many editing operations
      • Top-level handling of them with rollback to last good project state
      • Catches and enqueued user notifications where needed at lower levels (see the nifty function template, GuardedCall)
      • Appropriate ignoring of exceptions when only reading files for display or playback purposes; substitute zero samples
      • Reviewed all possible propagations of those file i/o exceptions
      • Implemented other RAII than smart pointers, or class exception safety guarantees, in middle levels where needed
    • The great refactor of TrackPanel event handling was merged at last!
      • This "worst code in the system" was long complained about. I did something about it, which was very long in preparation
      • A generalized framework with objects corresponding to the subdivisions of the panel area, which implement cursor and status bar changes, keystrokes, mouse wheel, and pop-up menus, and hit tests that return other objects, which handle click, drag, and release sequences
      • Thus a big tangled source file full of switch statements became thousands of lines shorter, as many smaller specialist files were created
      • Some tidying of track panel drawing code (making the details of drawing the Track Control Panel table-driven)
      • Drawing, however, remained separate from event handling. So the work wasn't finished
      • Serving what user visible advance in feature? That still didn't deliver, admittedly. I was looking forward to such things as many-to-one view-to-track associations, for which this great work is only one preliminary
      • But the Esc key handling was one consequence
      • Esc key can also be used when several hit test targets coincide, to disambiguate before the click. There are not yet many important examples, but one involves the cursor change for clicking a clip boundary; you can Esc before click to fall back on the default click and drag to select instead. Another case is escapable snapping
    • Careful rewrites of class Envelope (which implements envelopes, time tracks, and equalization curves), accommodating discontinuities; fixes difficult cut and paste cases
    • Learned more about internationalization as I accepted translators' work; fixed some omissions of translations; began experiments (not merged) with types, to help the compiler help us to detect such errors
    • Fixes in the old Note track stretch tool, but QA decided just to hide that feature
    • Some cleanup of abundant noisy warnings in the Mac build, yet hundreds remain

Version 2.2.1 (2017)

A very short release, mostly for bug fixes, in which I was release manager again.

Besides bug fixes, some more work on internationalization, adding missing strings to the catalog, and removing many that were not needed.

Version 2.2.2 (2018)

Again, I was manager of a short release.

  • Major
    • Dropout detection in case your computer fails to keep up with recording in real time
  • Minor
    • Interface preference page shows language names in their native orthography
    • Localize the default (visible) titles and (spoken) names of many utility dialogs
    • Easy change of key bindings by holding Shift when releasing menu items (see the light bulb)
  • Internal
    • Drag-and-drop for easy installation of Nyquist, LADSPA, and VST plug-ins was implemented, but we did not agree to enable this in the release
    • My experimental branches with distinct string types led me to find and fix in release many violations of the "susbstitute, don't concatenate" rule, avoiding English syntax biases
    • Uniformity of signatures of menu handler functions, preparing for later menu refactoring
    • Eliminate most old wxWidgets containers and iterator idioms in favor of C++ standard library, except for wxArrayString which must be passed to many library functions
    • Check more error returns from third party export libraries and don't leave incomplete files on disk

Version 2.3.0 (2018)

  • Major
    • Punch and roll recording, at last! Much requested by voice artists for easy editing-out of mistakes while still in the booth. The lack of it was often mentioned as a demerit of Audacity for narration work. Something I regret not doing much earlier!
    • Internationalization of strings in the Nyquist plug-ins that ship with each release
    • Contributed correctness of internationalizations to James' macros project
    • Careful use of std::atomic for inter-thread communications involving RingBuffer may have fixed cause of sometimes-reported intermittent clicky playbacks, though that's hard to prove
    • The pinned play/record head is draggable and can be re-centered with double-click
    • Fix the interaction of recording and undo. Used to be that if you make an undo-able change during recording (such as dropping a label), undo/redo history's last item would revert only the part of the recording after that change, and the earlier parts would revert along with the other earlier edits. Now, all of the recording is kept in one undo item that is sequenced after all other changes
  • Minor
    • Esc key handling is complete, at last, cancelling all kinds drags in the Timeline too
  • Internal
    • Continued migration to standard library container idioms, except with strings
    • Class NormalizedKeyString realizes the idea of distinct classes of strings used for distinct purposes, in one case at least
    • Be careful not to store locale-dependent strings improperly in configuration files
    • Upping Mac minimum SDK to 10.7 allows fuller use of C++11 standard library (used to have only the language but still the old std:: and std::tr1::), so I do so in several places (most happily, I use std::exception_ptr)
    • Class CellularPanel abstracted from TrackPanel and reused with AdornedRulerPanel, cleaning up another (though not as great) mess of event handling code for clicks and drags; used to implement the draggable pin, the hard (but better) way, and making Esc key behavior fall out easily
    • Some changes of the communications among three threads during recording and playback, to simplify scrubbing code and the updating of the play/record head position. Much still remains to be simplified

Version 2.3.1 (2019)

  • Major
    • First-time saving of projects is fast again (if to the same device as holds the temporary folder), especially on Windows, while not sacrificing the exception safety
  • Internal -- again a few big ones:
    • Rewrite track and channel iterations!
      • Removing an obstacle to future multi-channel possibilities: places that did something to left channel, then the same to right channel if present, instead loop over all channels, however many
      • Identified and commented all places where the assumption of at most two channels was inherent
      • Much code gets shorter and more elegant, obscuring intent less and reading more pleasantly
      • Removed much testing of a track's type, followed by pointer casting (often C-style, which should be avoided). Instead, a track iterator with template parameter filters just the tracks of desired type, and with const-correctness
      • Can also filter the range with a predicate, simplifying tests out of loop bodies
      • Use range-for or even eliminate loops with brief STL algorithm calls or higher-order member functions of IteratorRange
    • Menu refactor!
      • Another multi-thousand line source file broken up into pieces, that correspond better to the individual menus
      • class AudacityProject is less bloated, as handler functions are no longer members
      • Specification of menu contents becomes more declarative, not procedural
    • More decoupling of History, Lyrics and MixerBoard window code!
      • Those and other non-modal windows should be easily subtractible from the product as plug-ins; this is an advance toward that
      • Use more event handling, so these windows can subscribe and update themselves for changes of selection or undo history state; eliminating too much code pollution that explicitly pushed information to them (especially in the case of MixerBoard) and was hard to verify for completeness
    • CellularPanel subdivisions!
      • Serves the distant goals of more radical Track Panel redesigns, such as many-to-one view-to-track associations
      • Single virtual function, defining subdivision of area, is enough to deduce cell from point or rectangle for cell; replacing two functions
      • That function works by returning a tree of TrackPanelNodes
      • And that new class reifies groupings of cells as well as the individual ones; which will get their own drawing virtual methods in future
    • Mac compiler warnings to zero with our present build settings; now treat warnings as errors
      • Would have prevented a major 2.3.0 bug for Linux (caused by returning reference to temporary)
    • Some shrinking of class AudacityProject
    • Some Track Panel drawing code refactoring
    • Contributed to making a 64 bit build work for Mac, of wxWidgets and Audacity proper (others figured out the LAME and FFmpeg libraries)
    • Use of hard links rather than file copies in implementation of the fast save mentioned above

Version 2.3.2 (2019)

  • Minor
  • Internal
    • Modern idiom for string arrays: many uses of std::-idiom alternative member functions of the remaining wxWidgets container in use (wxArrayString); so in future, changing types to std::vector will require less change
    • Replace many wxArrayString with extension class wxArrayStringEx which adds moves and constructions from std::initializer_list; use that to simplify some constructions
    • Use type aliases for different uses of wxString, such as CommandID, RegistryPath, FileExtension, etc.; making code more self-documenting; in future, may make real type distinctions so that these do not implicitly interconvert, so we can catch mistakes at compile time; also aliases for different uses of ComponentInterfaceSymbol
    • Duplicate definitions of track panel subdivision, other than those remaining in drawing, removed in favor of the tree of TrackPanelNodes
    • Some simplification of ShuttleGuiBase, removing some unused functions, and passing string arrays by const reference (allowing simpler in-line constructions of such arguments at call sites)
    • Remove many unnecessary nested #include directives, especially all of those for wxWidgets headers and most headers in our src/widgets directory; or comment why removals were impossible
    • Some more breaking of dependency on Lyrics.h, MixerBoard.h
    • Some shrinking of class AudacityProject, removing some member functions