From f52dfd3ac36b9543fbb13c06c84c8f78e76b58aa Mon Sep 17 00:00:00 2001
From: Paul Licameli <paul.licameli@audacityteam.org>
Date: Sat, 3 Jul 2021 14:54:29 -0400
Subject: [PATCH] New library for math...

... note the swap of target_link_libraries lines in src/CMakeLists.txt,
needed to build at least on macOS, becuase FFT.h must be looked up first in
lib-math, not in lib-src/twolame

Also making a dependency cycle of SampleFormat and Dither!  But we will tolerate
that within one small library.
---
 include/audacity/Types.h                      | 27 ----------
 libraries/CMakeLists.txt                      |  1 +
 libraries/lib-math/CMakeLists.txt             | 31 +++++++++++
 {src => libraries/lib-math}/Dither.cpp        |  0
 {src => libraries/lib-math}/Dither.h          |  7 +--
 {src => libraries/lib-math}/FFT.cpp           |  1 -
 {src => libraries/lib-math}/FFT.h             | 19 +++----
 .../lib-math}/InterpolateAudio.cpp            |  0
 .../lib-math}/InterpolateAudio.h              |  3 +-
 {src => libraries/lib-math}/Matrix.cpp        |  0
 {src => libraries/lib-math}/Matrix.h          |  0
 {src => libraries/lib-math}/RealFFTf.cpp      |  3 --
 {src => libraries/lib-math}/RealFFTf.h        | 16 +++---
 {src => libraries/lib-math}/SampleCount.cpp   |  0
 {src => libraries/lib-math}/SampleCount.h     |  4 +-
 {src => libraries/lib-math}/SampleFormat.cpp  |  1 +
 {src => libraries/lib-math}/SampleFormat.h    | 54 +++++++++++--------
 {src => libraries/lib-math}/Spectrum.cpp      |  0
 {src => libraries/lib-math}/Spectrum.h        |  2 +-
 {src => libraries/lib-math}/float_cast.h      |  2 -
 src/CMakeLists.txt                            | 21 +-------
 src/FFmpeg.h                                  |  1 +
 src/FileFormats.h                             |  2 +-
 src/Mix.h                                     |  1 +
 src/RingBuffer.cpp                            |  1 +
 src/SampleBlock.h                             |  2 +-
 src/commands/Demo.h                           |  2 +-
 src/effects/ChangePitch.cpp                   |  2 +-
 src/effects/Compressor.cpp                    |  2 +-
 src/effects/Effect.h                          |  3 +-
 src/effects/Equalization.cpp                  |  4 +-
 src/effects/Equalization.h                    |  2 +-
 src/effects/NoiseReduction.cpp                |  2 +-
 src/effects/Paulstretch.cpp                   |  2 +-
 src/effects/Repair.cpp                        |  2 +-
 src/effects/VST/VSTEffect.cpp                 |  2 +-
 src/effects/VST/VSTEffect.h                   |  2 +-
 src/effects/audiounits/AudioUnitEffect.cpp    |  2 +-
 src/effects/ladspa/LadspaEffect.h             |  2 +-
 src/effects/lv2/LV2Effect.h                   |  2 +-
 src/export/Export.h                           |  2 +-
 src/export/ExportCL.cpp                       |  2 +-
 src/export/ExportFLAC.cpp                     |  2 +-
 src/export/ExportMP3.cpp                      |  2 +-
 src/export/ExportPCM.cpp                      |  1 +
 src/import/ImportPlugin.h                     |  1 +
 src/import/SpecPowerMeter.cpp                 |  2 +-
 src/import/SpecPowerMeter.h                   |  2 +-
 src/prefs/QualityPrefs.cpp                    |  2 +-
 src/prefs/QualitySettings.h                   |  1 +
 src/prefs/SpectrogramSettings.cpp             |  2 +-
 src/prefs/SpectrogramSettings.h               |  4 +-
 src/prefs/SpectrumPrefs.cpp                   |  2 +-
 .../playabletrack/wavetrack/ui/SampleHandle.h |  2 +-
 .../wavetrack/ui/WaveTrackView.h              |  2 +-
 src/widgets/Meter.h                           |  2 +-
 src/widgets/NumericTextCtrl.cpp               |  2 +-
 src/xml/XMLTagHandler.cpp                     |  1 +
 58 files changed, 131 insertions(+), 133 deletions(-)
 create mode 100644 libraries/lib-math/CMakeLists.txt
 rename {src => libraries/lib-math}/Dither.cpp (100%)
 rename {src => libraries/lib-math}/Dither.h (91%)
 rename {src => libraries/lib-math}/FFT.cpp (99%)
 rename {src => libraries/lib-math}/FFT.h (95%)
 rename {src => libraries/lib-math}/InterpolateAudio.cpp (100%)
 rename {src => libraries/lib-math}/InterpolateAudio.h (95%)
 rename {src => libraries/lib-math}/Matrix.cpp (100%)
 rename {src => libraries/lib-math}/Matrix.h (100%)
 rename {src => libraries/lib-math}/RealFFTf.cpp (99%)
 rename {src => libraries/lib-math}/RealFFTf.h (50%)
 rename {src => libraries/lib-math}/SampleCount.cpp (100%)
 rename {src => libraries/lib-math}/SampleCount.h (98%)
 rename {src => libraries/lib-math}/SampleFormat.cpp (99%)
 rename {src => libraries/lib-math}/SampleFormat.h (73%)
 rename {src => libraries/lib-math}/Spectrum.cpp (100%)
 rename {src => libraries/lib-math}/Spectrum.h (97%)
 rename {src => libraries/lib-math}/float_cast.h (99%)

diff --git a/include/audacity/Types.h b/include/audacity/Types.h
index 3a814f6ab3..04bf36a5e4 100644
--- a/include/audacity/Types.h
+++ b/include/audacity/Types.h
@@ -58,33 +58,6 @@
 //        until proper public headers are created for the stuff in here.
 // ----------------------------------------------------------------------------
 
-// ----------------------------------------------------------------------------
-// Supported sample formats
-// ----------------------------------------------------------------------------
-enum sampleFormat : unsigned
-{
-   //! The increasing sequence of these enum values must correspond to the increasing data type width
-   //! These values persist in saved project files, so must not be changed in later program versions
-   int16Sample = 0x00020001,
-   int24Sample = 0x00040001,
-   floatSample = 0x0004000F,
-
-   //! Two synonyms for previous values that might change if more values were added
-   narrowestSampleFormat = int16Sample,
-   widestSampleFormat = floatSample,
-};
-
-// ----------------------------------------------------------------------------
-// Provide the number of bytes a specific sample will take
-// ----------------------------------------------------------------------------
-#define SAMPLE_SIZE(SampleFormat) (SampleFormat >> 16)
-
-// ----------------------------------------------------------------------------
-// Generic pointer to sample data
-// ----------------------------------------------------------------------------
-typedef char *samplePtr;
-typedef const char *constSamplePtr;
-
 // ----------------------------------------------------------------------------
 // The type for plugin IDs
 // ----------------------------------------------------------------------------
diff --git a/libraries/CMakeLists.txt b/libraries/CMakeLists.txt
index 891b4d805a..1b572a4db9 100644
--- a/libraries/CMakeLists.txt
+++ b/libraries/CMakeLists.txt
@@ -11,6 +11,7 @@ set( LIBRARIES
    lib-basic-ui
    lib-exceptions
    lib-preferences
+   lib-math
 )
 
 if ( ${_OPT}has_networking )
diff --git a/libraries/lib-math/CMakeLists.txt b/libraries/lib-math/CMakeLists.txt
new file mode 100644
index 0000000000..2b87133ab5
--- /dev/null
+++ b/libraries/lib-math/CMakeLists.txt
@@ -0,0 +1,31 @@
+#[[
+A library of mathematical utilities and manipulation of samples
+]]#
+
+set( SOURCES
+   Dither.cpp
+   Dither.h
+   FFT.cpp
+   FFT.h
+   InterpolateAudio.cpp
+   InterpolateAudio.h
+   Matrix.cpp
+   Matrix.h
+   RealFFTf.cpp
+   RealFFTf.h
+   SampleCount.cpp
+   SampleCount.h
+   SampleFormat.cpp
+   SampleFormat.h
+   Spectrum.cpp
+   Spectrum.h
+   float_cast.h
+)
+set( LIBRARIES
+   lib-preferences-interface
+   PRIVATE
+   wxBase
+)
+audacity_library( lib-math "${SOURCES}" "${LIBRARIES}"
+   "" ""
+)
diff --git a/src/Dither.cpp b/libraries/lib-math/Dither.cpp
similarity index 100%
rename from src/Dither.cpp
rename to libraries/lib-math/Dither.cpp
diff --git a/src/Dither.h b/libraries/lib-math/Dither.h
similarity index 91%
rename from src/Dither.h
rename to libraries/lib-math/Dither.h
index e257243efd..369273b7f7 100644
--- a/src/Dither.h
+++ b/libraries/lib-math/Dither.h
@@ -10,7 +10,7 @@
 #ifndef __AUDACITY_DITHER_H__
 #define __AUDACITY_DITHER_H__
 
-#include "audacity/Types.h" // for samplePtr
+#include "SampleFormat.h"
 
 template< typename Enum > class EnumSetting;
 
@@ -19,13 +19,14 @@ template< typename Enum > class EnumSetting;
 enum DitherType : unsigned {
    none = 0, rectangle = 1, triangle = 2, shaped = 3 };
 
-class Dither
+class MATH_API Dither
 {
 public:
     static DitherType FastDitherChoice();
     static DitherType BestDitherChoice();
 
-    static AUDACITY_DLL_API EnumSetting< DitherType > FastSetting, BestSetting;
+    static EnumSetting< DitherType > FastSetting;
+    static EnumSetting< DitherType > BestSetting;
 
     /// Default constructor
     Dither();
diff --git a/src/FFT.cpp b/libraries/lib-math/FFT.cpp
similarity index 99%
rename from src/FFT.cpp
rename to libraries/lib-math/FFT.cpp
index 158ba2f636..3a946ac883 100644
--- a/src/FFT.cpp
+++ b/libraries/lib-math/FFT.cpp
@@ -39,7 +39,6 @@
     * 9: Gaussian(a=4.5)
 */
 
-
 #include "FFT.h"
 
 #include "Internat.h"
diff --git a/src/FFT.h b/libraries/lib-math/FFT.h
similarity index 95%
rename from src/FFT.h
rename to libraries/lib-math/FFT.h
index 20fe262b13..9ac8f0e9c7 100644
--- a/src/FFT.h
+++ b/libraries/lib-math/FFT.h
@@ -63,6 +63,7 @@ class TranslatableString;
  * input array, and that NumSamples must be a power of two.
  */
 
+MATH_API
 void PowerSpectrum(size_t NumSamples, const float *In, float *Out);
 
 /*
@@ -72,7 +73,7 @@ void PowerSpectrum(size_t NumSamples, const float *In, float *Out);
  * NumSamples must be a power of two.
  */
 
-AUDACITY_DLL_API
+MATH_API
 void RealFFT(size_t NumSamples,
              const float *RealIn, float *RealOut, float *ImagOut);
 
@@ -81,7 +82,7 @@ void RealFFT(size_t NumSamples,
  * so the output is purely real.  NumSamples must be a power of
  * two.
  */
-AUDACITY_DLL_API
+MATH_API
 void InverseRealFFT(size_t NumSamples,
 		    const float *RealIn, const float *ImagIn, float *RealOut);
 
@@ -91,7 +92,7 @@ void InverseRealFFT(size_t NumSamples,
  * inverse transform as well.
  */
 
-AUDACITY_DLL_API
+MATH_API
 void FFT(size_t NumSamples,
          bool InverseTransform,
          const float *RealIn, const float *ImagIn, float *RealOut, float *ImagOut);
@@ -120,7 +121,7 @@ enum eWindowFunctions
    eWinFuncCount
 };
 
-AUDACITY_DLL_API
+MATH_API
 void WindowFunc(int whichFunction, size_t NumSamples, float *data);
 
 /*
@@ -129,7 +130,7 @@ void WindowFunc(int whichFunction, size_t NumSamples, float *data);
  * otherwise about (NumSamples - 1) / 2
  * All functions have 0 in data[0] except Rectangular, Hamming and Gaussians
  */
-AUDACITY_DLL_API
+MATH_API
 void NewWindowFunc(int whichFunction, size_t NumSamples, bool extraSample, float *data);
 
 /*
@@ -139,21 +140,21 @@ void NewWindowFunc(int whichFunction, size_t NumSamples, bool extraSample, float
  * otherwise about (NumSamples - 1) / 2
  * All functions have 0 in data[0] except Rectangular, Hamming and Gaussians
  */
-AUDACITY_DLL_API
+MATH_API
 void DerivativeOfWindowFunc(int whichFunction, size_t NumSamples, bool extraSample, float *data);
 
 /*
  * Returns the name of the windowing function (for UI display)
  */
 
-AUDACITY_DLL_API const TranslatableString WindowFuncName(int whichFunction);
+MATH_API const TranslatableString WindowFuncName(int whichFunction);
 
 /*
  * Returns the number of windowing functions supported
  */
 
-AUDACITY_DLL_API int NumWindowFuncs();
+MATH_API int NumWindowFuncs();
 
-void DeinitFFT();
+MATH_API void DeinitFFT();
 
 #endif
diff --git a/src/InterpolateAudio.cpp b/libraries/lib-math/InterpolateAudio.cpp
similarity index 100%
rename from src/InterpolateAudio.cpp
rename to libraries/lib-math/InterpolateAudio.cpp
diff --git a/src/InterpolateAudio.h b/libraries/lib-math/InterpolateAudio.h
similarity index 95%
rename from src/InterpolateAudio.h
rename to libraries/lib-math/InterpolateAudio.h
index d19c8d58e6..4f036dc6fb 100644
--- a/src/InterpolateAudio.h
+++ b/libraries/lib-math/InterpolateAudio.h
@@ -25,7 +25,6 @@
 #ifndef __AUDACITY_INTERPOLATE_AUDIO__
 #define __AUDACITY_INTERPOLATE_AUDIO__
 
-
 #include <cstddef>
 
 // See top of file for a description of the algorithm.  Interpolates
@@ -36,7 +35,7 @@
 // side (6x the number of bad samples on either side is great).  However,
 // it will work with less data, and with the bad samples on one end or
 // the other.
-void AUDACITY_DLL_API InterpolateAudio(float *buffer, size_t len,
+void MATH_API InterpolateAudio(float *buffer, size_t len,
                                        size_t firstBad, size_t numBad);
 
 #endif // __AUDACITY_INTERPOLATE_AUDIO__
diff --git a/src/Matrix.cpp b/libraries/lib-math/Matrix.cpp
similarity index 100%
rename from src/Matrix.cpp
rename to libraries/lib-math/Matrix.cpp
diff --git a/src/Matrix.h b/libraries/lib-math/Matrix.h
similarity index 100%
rename from src/Matrix.h
rename to libraries/lib-math/Matrix.h
diff --git a/src/RealFFTf.cpp b/libraries/lib-math/RealFFTf.cpp
similarity index 99%
rename from src/RealFFTf.cpp
rename to libraries/lib-math/RealFFTf.cpp
index ed443d1aed..f26c5df0dd 100644
--- a/src/RealFFTf.cpp
+++ b/libraries/lib-math/RealFFTf.cpp
@@ -36,11 +36,8 @@
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-
 #include "RealFFTf.h"
 
-
-
 #include <vector>
 #include <stdlib.h>
 #include <stdio.h>
diff --git a/src/RealFFTf.h b/libraries/lib-math/RealFFTf.h
similarity index 50%
rename from src/RealFFTf.h
rename to libraries/lib-math/RealFFTf.h
index 02a221aab6..a4fc294ad6 100644
--- a/src/RealFFTf.h
+++ b/libraries/lib-math/RealFFTf.h
@@ -1,10 +1,6 @@
 #ifndef __realfftf_h
 #define __realfftf_h
 
-
-
-
-
 #include "MemoryX.h"
 
 using fft_type = float;
@@ -17,7 +13,7 @@ struct FFTParam {
 #endif
 };
 
-struct AUDACITY_DLL_API FFTDeleter{
+struct MATH_API FFTDeleter{
    void operator () (FFTParam *p) const;
 };
 
@@ -25,11 +21,11 @@ using HFFT = std::unique_ptr<
    FFTParam, FFTDeleter
 >;
 
-AUDACITY_DLL_API HFFT GetFFT(size_t);
-AUDACITY_DLL_API void RealFFTf(fft_type *, const FFTParam *);
-AUDACITY_DLL_API void InverseRealFFTf(fft_type *, const FFTParam *);
-AUDACITY_DLL_API void ReorderToTime(const FFTParam *hFFT, const fft_type *buffer, fft_type *TimeOut);
-AUDACITY_DLL_API void ReorderToFreq(const FFTParam *hFFT, const fft_type *buffer,
+MATH_API HFFT GetFFT(size_t);
+MATH_API void RealFFTf(fft_type *, const FFTParam *);
+MATH_API void InverseRealFFTf(fft_type *, const FFTParam *);
+MATH_API void ReorderToTime(const FFTParam *hFFT, const fft_type *buffer, fft_type *TimeOut);
+MATH_API void ReorderToFreq(const FFTParam *hFFT, const fft_type *buffer,
 		   fft_type *RealOut, fft_type *ImagOut);
 
 #endif
diff --git a/src/SampleCount.cpp b/libraries/lib-math/SampleCount.cpp
similarity index 100%
rename from src/SampleCount.cpp
rename to libraries/lib-math/SampleCount.cpp
diff --git a/src/SampleCount.h b/libraries/lib-math/SampleCount.h
similarity index 98%
rename from src/SampleCount.h
rename to libraries/lib-math/SampleCount.h
index 8b8cebfbfb..19be036250 100644
--- a/src/SampleCount.h
+++ b/libraries/lib-math/SampleCount.h
@@ -14,7 +14,7 @@
 
 //! Positions or offsets within audio files need a wide type
 /*! This type disallows implicit interconversions with narrower types */
-class AUDACITY_DLL_API sampleCount
+class MATH_API sampleCount
 {
 public:
    using type = long long;
@@ -128,7 +128,7 @@ inline sampleCount operator % (sampleCount a, sampleCount b)
 // hiding the casts
 // ----------------------------------------------------------------------------
 
-AUDACITY_DLL_API
+MATH_API
 size_t limitSampleBufferSize( size_t bufferSize, sampleCount limit );
 
 #endif
diff --git a/src/SampleFormat.cpp b/libraries/lib-math/SampleFormat.cpp
similarity index 99%
rename from src/SampleFormat.cpp
rename to libraries/lib-math/SampleFormat.cpp
index 1d4e7baee7..25f38ba1d4 100644
--- a/src/SampleFormat.cpp
+++ b/libraries/lib-math/SampleFormat.cpp
@@ -35,6 +35,7 @@
 *//*******************************************************************/
 
 #include "SampleFormat.h"
+#include "Dither.h" // CYCLE
 
 #include <wx/intl.h>
 #include <math.h>
diff --git a/src/SampleFormat.h b/libraries/lib-math/SampleFormat.h
similarity index 73%
rename from src/SampleFormat.h
rename to libraries/lib-math/SampleFormat.h
index 90e88ed1f7..d2ca09069b 100644
--- a/src/SampleFormat.h
+++ b/libraries/lib-math/SampleFormat.h
@@ -11,32 +11,43 @@
 #ifndef __AUDACITY_SAMPLE_FORMAT__
 #define __AUDACITY_SAMPLE_FORMAT__
 
-
-
 #include "MemoryX.h"
-#include <wx/defs.h>
-
-#include "audacity/Types.h"
-#include "Dither.h"
+#include <cstdlib>
 
 //
 // Definitions / Meta-Information
 //
 
+enum DitherType : unsigned;
 //! These global variables are assigned at application startup or after change of preferences.
-extern AUDACITY_DLL_API DitherType gLowQualityDither, gHighQualityDither;
+extern MATH_API DitherType gLowQualityDither, gHighQualityDither;
 
-#if 0
-// Moved to audacity/types.h
-typedef enum {
+// ----------------------------------------------------------------------------
+// Supported sample formats
+// ----------------------------------------------------------------------------
+enum sampleFormat : unsigned
+{
+   //! The increasing sequence of these enum values must correspond to the increasing data type width
+   //! These values persist in saved project files, so must not be changed in later program versions
    int16Sample = 0x00020001,
    int24Sample = 0x00040001,
-   floatSample = 0x0004000F
-} sampleFormat;
+   floatSample = 0x0004000F,
 
-/** \brief Return the size (in memory) of one sample (bytes) */
-#define SAMPLE_SIZE(SampleFormat) ( size_t{ (SampleFormat) >> 16 } )
-#endif
+   //! Two synonyms for previous values that might change if more values were added
+   narrowestSampleFormat = int16Sample,
+   widestSampleFormat = floatSample,
+};
+
+// ----------------------------------------------------------------------------
+// Provide the number of bytes a specific sample will take
+// ----------------------------------------------------------------------------
+#define SAMPLE_SIZE(SampleFormat) (SampleFormat >> 16)
+
+// ----------------------------------------------------------------------------
+// Generic pointer to sample data
+// ----------------------------------------------------------------------------
+using samplePtr = char *;
+using constSamplePtr = const char *;
 
 // Used to determine how to fill in empty areas of audio.
 typedef enum {
@@ -48,7 +59,8 @@ typedef enum {
 #define SAMPLE_SIZE_DISK(SampleFormat) (((SampleFormat) == int24Sample) ? \
    size_t{ 3 } : SAMPLE_SIZE(SampleFormat) )
 
-AUDACITY_DLL_API TranslatableString GetSampleFormatStr(sampleFormat format);
+class TranslatableString;
+MATH_API TranslatableString GetSampleFormatStr(sampleFormat format);
 
 //
 // Allocating/Freeing Samples
@@ -128,7 +140,7 @@ private:
 // Copying, Converting and Clearing Samples
 //
 
-AUDACITY_DLL_API
+MATH_API
 //! Copy samples from any format into the widest format, which is 32 bit float, with no dithering
 /*!
  @param src address of source samples
@@ -141,7 +153,7 @@ AUDACITY_DLL_API
 void SamplesToFloats(constSamplePtr src, sampleFormat srcFormat,
     float *dst, size_t len, size_t srcStride = 1, size_t dstStride = 1);
 
-AUDACITY_DLL_API
+MATH_API
 //! Copy samples from any format to any other format; apply dithering only if narrowing the format
 /*!
  @copydetails SamplesToFloats()
@@ -153,11 +165,11 @@ void CopySamples(constSamplePtr src, sampleFormat srcFormat,
    DitherType ditherType = gHighQualityDither, //!< default is loaded from a global variable
    unsigned int srcStride=1, unsigned int dstStride=1);
 
-AUDACITY_DLL_API
+MATH_API
 void      ClearSamples(samplePtr buffer, sampleFormat format,
                        size_t start, size_t len);
 
-AUDACITY_DLL_API
+MATH_API
 void      ReverseSamples(samplePtr buffer, sampleFormat format,
                          int start, int len);
 
@@ -166,7 +178,7 @@ void      ReverseSamples(samplePtr buffer, sampleFormat format,
 // are set in preferences.
 //
 
-AUDACITY_DLL_API
+MATH_API
 void      InitDitherers();
 
 // These are so commonly done for processing samples in floating point form in memory,
diff --git a/src/Spectrum.cpp b/libraries/lib-math/Spectrum.cpp
similarity index 100%
rename from src/Spectrum.cpp
rename to libraries/lib-math/Spectrum.cpp
diff --git a/src/Spectrum.h b/libraries/lib-math/Spectrum.h
similarity index 97%
rename from src/Spectrum.h
rename to libraries/lib-math/Spectrum.h
index aaaae6356a..3ff362bf64 100644
--- a/src/Spectrum.h
+++ b/libraries/lib-math/Spectrum.h
@@ -21,7 +21,7 @@
   calculates windowSize/2 frequency samples
 */
 
-AUDACITY_DLL_API
+MATH_API
 bool ComputeSpectrum(const float * data, size_t width, size_t windowSize,
                      double rate, float *out, bool autocorrelation,
                      int windowFunc = eWinFuncHann);
diff --git a/src/float_cast.h b/libraries/lib-math/float_cast.h
similarity index 99%
rename from src/float_cast.h
rename to libraries/lib-math/float_cast.h
index 6d3fc734a9..6886e3d93d 100644
--- a/src/float_cast.h
+++ b/libraries/lib-math/float_cast.h
@@ -35,8 +35,6 @@
 **		long int lrint  (double x) ;
 */
 
-
-
 /*	The presence of the required functions are detected during the configure
 **	process and the values HAVE_LRINT and HAVE_LRINTF are set accordingly in
 **	the config.h file.
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f43d2dfb9f..133f6b9836 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -129,14 +129,10 @@ list( APPEND SOURCES
       DeviceManager.h
       Diags.cpp
       Diags.h
-      Dither.cpp
-      Dither.h
       Envelope.cpp
       Envelope.h
       EnvelopeEditor.cpp
       EnvelopeEditor.h
-      FFT.cpp
-      FFT.h
       FFmpeg.cpp
       FFmpeg.h
       FileException.cpp
@@ -157,8 +153,6 @@ list( APPEND SOURCES
       HitTestResult.h
       ImageManipulation.cpp
       ImageManipulation.h
-      InterpolateAudio.cpp
-      InterpolateAudio.h
       KeyboardCapture.cpp
       KeyboardCapture.h
       LabelDialog.cpp
@@ -175,8 +169,6 @@ list( APPEND SOURCES
       LyricsWindow.cpp
       LyricsWindow.h
       MacroMagic.h
-      Matrix.cpp
-      Matrix.h
       Menus.cpp
       Menus.h
       Mix.cpp
@@ -232,10 +224,6 @@ list( APPEND SOURCES
       ProjectWindow.h
       ProjectWindowBase.cpp
       ProjectWindowBase.h
-      RealFFTf.cpp
-      RealFFTf.h
-      RealFFTf48x.cpp
-      RealFFTf48x.h
       RefreshCode.h
       Registrar.h
       Registry.cpp
@@ -246,10 +234,6 @@ list( APPEND SOURCES
       RingBuffer.h
       SampleBlock.cpp
       SampleBlock.h
-      SampleCount.cpp
-      SampleCount.h
-      SampleFormat.cpp
-      SampleFormat.h
       Screenshot.cpp
       Screenshot.h
       SelectUtilities.cpp
@@ -272,8 +256,6 @@ list( APPEND SOURCES
       Snap.h
       SoundActivatedRecord.cpp
       SoundActivatedRecord.h
-      Spectrum.cpp
-      Spectrum.h
       SpectrumAnalyst.cpp
       SpectrumAnalyst.h
       SplashDialog.cpp
@@ -334,7 +316,6 @@ list( APPEND SOURCES
       WrappedType.h
       ZoomInfo.cpp
       ZoomInfo.h
-      float_cast.h
       wxFileNameWrapper.h
 
       # Commands
@@ -1354,8 +1335,8 @@ target_compile_definitions( ${TARGET} PRIVATE ${DEFINES} )
 target_compile_options( ${TARGET} PRIVATE ${OPTIONS} )
 target_include_directories( ${TARGET} PRIVATE ${INCLUDES} )
 target_link_options( ${TARGET} PRIVATE ${LDFLAGS} )
-target_link_libraries( ${TARGET} ${LIBRARIES} )
 target_link_libraries( ${TARGET} PUBLIC ${AUDACITY_LIBRARIES} )
+target_link_libraries( ${TARGET} ${LIBRARIES} )
 
 if( CMAKE_VERSION VERSION_GREATER_EQUAL "3.16" AND NOT CCACHE_PROGRAM )
    if( ${_OPT}use_pch )
diff --git a/src/FFmpeg.h b/src/FFmpeg.h
index 1f2d1be177..53f55de343 100644
--- a/src/FFmpeg.h
+++ b/src/FFmpeg.h
@@ -153,6 +153,7 @@ extern "C" {
 #include "Prefs.h"
 
 #include "Identifier.h"
+#include "SampleFormat.h"
 
 class wxDynamicLibrary;
 
diff --git a/src/FileFormats.h b/src/FileFormats.h
index 03619f180f..14394b9aa4 100644
--- a/src/FileFormats.h
+++ b/src/FileFormats.h
@@ -13,8 +13,8 @@
 
 
 
-#include "audacity/Types.h"
 #include "Identifier.h"
+#include "SampleFormat.h"
 
 //#include <mutex>
 #include <memory>
diff --git a/src/Mix.h b/src/Mix.h
index 0cc58a115f..5eae40b883 100644
--- a/src/Mix.h
+++ b/src/Mix.h
@@ -20,6 +20,7 @@
 #ifndef __AUDACITY_MIX__
 #define __AUDACITY_MIX__
 
+#include "audacity/Types.h"
 #include "SampleFormat.h"
 #include <vector>
 
diff --git a/src/RingBuffer.cpp b/src/RingBuffer.cpp
index a5d54dac60..b62e8bb58b 100644
--- a/src/RingBuffer.cpp
+++ b/src/RingBuffer.cpp
@@ -26,6 +26,7 @@
 
 
 #include "RingBuffer.h"
+#include "Dither.h"
 
 RingBuffer::RingBuffer(sampleFormat format, size_t size)
    : mFormat{ format }
diff --git a/src/SampleBlock.h b/src/SampleBlock.h
index dbe5b119ba..8d80fa1959 100644
--- a/src/SampleBlock.h
+++ b/src/SampleBlock.h
@@ -9,7 +9,7 @@ SampleBlock.h
 #ifndef __AUDACITY_SAMPLE_BLOCK__
 #define __AUDACITY_SAMPLE_BLOCK__
 
-#include "audacity/Types.h"
+#include "SampleFormat.h"
 
 #include <functional>
 #include <memory>
diff --git a/src/commands/Demo.h b/src/commands/Demo.h
index cb76b0c84e..61f2ca970f 100644
--- a/src/commands/Demo.h
+++ b/src/commands/Demo.h
@@ -12,7 +12,7 @@
 #define __AUDACITY_DEMO_COMMAND__
 
 #include "AudacityCommand.h"
-#include "../SampleFormat.h"
+#include "SampleFormat.h"
 
 class ShuttleGui;
 
diff --git a/src/effects/ChangePitch.cpp b/src/effects/ChangePitch.cpp
index b9519b5252..1e11a44630 100644
--- a/src/effects/ChangePitch.cpp
+++ b/src/effects/ChangePitch.cpp
@@ -38,7 +38,7 @@ the pitch without changing the tempo.
 #include "../PitchName.h"
 #include "../Shuttle.h"
 #include "../ShuttleGui.h"
-#include "../Spectrum.h"
+#include "Spectrum.h"
 #include "../WaveTrack.h"
 #include "../widgets/valnum.h"
 #include "TimeWarper.h"
diff --git a/src/effects/Compressor.cpp b/src/effects/Compressor.cpp
index b7d73fc68f..ae03ece993 100644
--- a/src/effects/Compressor.cpp
+++ b/src/effects/Compressor.cpp
@@ -42,7 +42,7 @@
 #include "../Shuttle.h"
 #include "../ShuttleGui.h"
 #include "../Theme.h"
-#include "../float_cast.h"
+#include "float_cast.h"
 #include "../widgets/Ruler.h"
 
 #include "../WaveTrack.h"
diff --git a/src/effects/Effect.h b/src/effects/Effect.h
index 10777b6565..225c3e4b19 100644
--- a/src/effects/Effect.h
+++ b/src/effects/Effect.h
@@ -27,8 +27,9 @@ class wxWindow;
 
 #include "ConfigInterface.h"
 #include "EffectInterface.h"
+#include "PluginInterface.h"
 
-#include "../SampleCount.h"
+#include "SampleCount.h"
 #include "../SelectedRegion.h"
 
 #include "../Track.h"
diff --git a/src/effects/Equalization.cpp b/src/effects/Equalization.cpp
index d453eceff3..c5861666f9 100644
--- a/src/effects/Equalization.cpp
+++ b/src/effects/Equalization.cpp
@@ -94,7 +94,7 @@
 #include "../FileNames.h"
 #include "../Envelope.h"
 #include "../EnvelopeEditor.h"
-#include "../FFT.h"
+#include "FFT.h"
 #include "Prefs.h"
 #include "../Project.h"
 #include "../Theme.h"
@@ -106,7 +106,7 @@
 #include "../widgets/AudacityTextEntryDialog.h"
 #include "../xml/XMLFileReader.h"
 #include "../AllThemeResources.h"
-#include "../float_cast.h"
+#include "float_cast.h"
 
 #if wxUSE_ACCESSIBILITY
 #include "../widgets/WindowAccessible.h"
diff --git a/src/effects/Equalization.h b/src/effects/Equalization.h
index b0a9084676..67c5a38ca6 100644
--- a/src/effects/Equalization.h
+++ b/src/effects/Equalization.h
@@ -18,7 +18,7 @@
 #include <wx/setup.h> // for wxUSE_* macros
 
 #include "Effect.h"
-#include "../RealFFTf.h"
+#include "RealFFTf.h"
 
 // Flags to specialise the UI
 const int kEqOptionGraphic =1;
diff --git a/src/effects/NoiseReduction.cpp b/src/effects/NoiseReduction.cpp
index 8b05bee702..0cc6d12d6a 100644
--- a/src/effects/NoiseReduction.cpp
+++ b/src/effects/NoiseReduction.cpp
@@ -46,7 +46,7 @@
 #include "../ShuttleGui.h"
 #include "../widgets/HelpSystem.h"
 #include "Prefs.h"
-#include "../RealFFTf.h"
+#include "RealFFTf.h"
 
 #include "../WaveTrack.h"
 #include "../widgets/AudacityMessageBox.h"
diff --git a/src/effects/Paulstretch.cpp b/src/effects/Paulstretch.cpp
index 7a275d1ba1..7c2823ea17 100644
--- a/src/effects/Paulstretch.cpp
+++ b/src/effects/Paulstretch.cpp
@@ -28,7 +28,7 @@
 
 #include "../Shuttle.h"
 #include "../ShuttleGui.h"
-#include "../FFT.h"
+#include "FFT.h"
 #include "../widgets/valnum.h"
 #include "../widgets/AudacityMessageBox.h"
 #include "Prefs.h"
diff --git a/src/effects/Repair.cpp b/src/effects/Repair.cpp
index 57fff709f0..18ad678b10 100644
--- a/src/effects/Repair.cpp
+++ b/src/effects/Repair.cpp
@@ -28,7 +28,7 @@ the audio, rather than actually finding the clicks.
 
 #include <wx/intl.h>
 
-#include "../InterpolateAudio.h"
+#include "InterpolateAudio.h"
 #include "../WaveTrack.h"
 #include "../widgets/AudacityMessageBox.h"
 
diff --git a/src/effects/VST/VSTEffect.cpp b/src/effects/VST/VSTEffect.cpp
index e427def28a..3d2d59e68e 100644
--- a/src/effects/VST/VSTEffect.cpp
+++ b/src/effects/VST/VSTEffect.cpp
@@ -27,7 +27,7 @@
 
 #include "VSTEffect.h"
 #include "../../ModuleManager.h"
-#include "../../SampleCount.h"
+#include "SampleCount.h"
 
 #include "../../widgets/ProgressDialog.h"
 
diff --git a/src/effects/VST/VSTEffect.h b/src/effects/VST/VSTEffect.h
index f3ef7404ac..ef306cffc4 100644
--- a/src/effects/VST/VSTEffect.h
+++ b/src/effects/VST/VSTEffect.h
@@ -16,7 +16,7 @@
 #include "ModuleInterface.h"
 #include "PluginInterface.h"
 
-#include "../../SampleFormat.h"
+#include "SampleFormat.h"
 #include "../../xml/XMLTagHandler.h"
 
 class wxSizerItem;
diff --git a/src/effects/audiounits/AudioUnitEffect.cpp b/src/effects/audiounits/AudioUnitEffect.cpp
index 5c1f30c51c..108c5ca45c 100644
--- a/src/effects/audiounits/AudioUnitEffect.cpp
+++ b/src/effects/audiounits/AudioUnitEffect.cpp
@@ -19,7 +19,7 @@
 #if USE_AUDIO_UNITS
 #include "AudioUnitEffect.h"
 #include "../../ModuleManager.h"
-#include "../../SampleCount.h"
+#include "SampleCount.h"
 
 #include <wx/defs.h>
 #include <wx/base64.h>
diff --git a/src/effects/ladspa/LadspaEffect.h b/src/effects/ladspa/LadspaEffect.h
index ebd001e702..8c1970e8b0 100644
--- a/src/effects/ladspa/LadspaEffect.h
+++ b/src/effects/ladspa/LadspaEffect.h
@@ -23,7 +23,7 @@ class NumericTextCtrl;
 #include "PluginInterface.h"
 
 #include "ladspa.h"
-#include "../../SampleFormat.h"
+#include "SampleFormat.h"
 
 #define LADSPAEFFECTS_VERSION wxT("1.0.0.0")
 /* i18n-hint: abbreviates "Linux Audio Developer's Simple Plugin API"
diff --git a/src/effects/lv2/LV2Effect.h b/src/effects/lv2/LV2Effect.h
index be249f1913..bb5b1d9821 100755
--- a/src/effects/lv2/LV2Effect.h
+++ b/src/effects/lv2/LV2Effect.h
@@ -38,7 +38,7 @@ class wxArrayString;
 #include <suil/suil.h>
 
 #include "../../ShuttleGui.h"
-#include "../../SampleFormat.h"
+#include "SampleFormat.h"
 
 #include "LoadLV2.h"
 #include "NativeWindow.h"
diff --git a/src/export/Export.h b/src/export/Export.h
index f972e3c027..7a88e93113 100644
--- a/src/export/Export.h
+++ b/src/export/Export.h
@@ -15,7 +15,7 @@
 #include <vector>
 #include <wx/filename.h> // member variable
 #include "Identifier.h"
-#include "../SampleFormat.h"
+#include "SampleFormat.h"
 #include "../widgets/wxPanelWrapper.h" // to inherit
 #include "../FileNames.h" // for FileTypes
 
diff --git a/src/export/ExportCL.cpp b/src/export/ExportCL.cpp
index 236a1c98e1..096dfa2df0 100644
--- a/src/export/ExportCL.cpp
+++ b/src/export/ExportCL.cpp
@@ -35,7 +35,7 @@
 #include "../ShuttleGui.h"
 #include "../Tags.h"
 #include "../Track.h"
-#include "../float_cast.h"
+#include "float_cast.h"
 #include "../widgets/FileHistory.h"
 #include "../widgets/AudacityMessageBox.h"
 #include "../widgets/ProgressDialog.h"
diff --git a/src/export/ExportFLAC.cpp b/src/export/ExportFLAC.cpp
index 98efdf030a..a4f1f3cc9b 100644
--- a/src/export/ExportFLAC.cpp
+++ b/src/export/ExportFLAC.cpp
@@ -29,7 +29,7 @@ and libvorbis examples, Monty <monty@xiph.org>
 
 #include "FLAC++/encoder.h"
 
-#include "../float_cast.h"
+#include "float_cast.h"
 #include "../ProjectSettings.h"
 #include "../Mix.h"
 #include "Prefs.h"
diff --git a/src/export/ExportMP3.cpp b/src/export/ExportMP3.cpp
index 4c998e0548..46fb1db3f6 100644
--- a/src/export/ExportMP3.cpp
+++ b/src/export/ExportMP3.cpp
@@ -80,7 +80,7 @@
 #include <wx/window.h>
 
 #include "../FileNames.h"
-#include "../float_cast.h"
+#include "float_cast.h"
 #include "../Mix.h"
 #include "Prefs.h"
 #include "../ProjectSettings.h"
diff --git a/src/export/ExportPCM.cpp b/src/export/ExportPCM.cpp
index a7fffd2797..f2edfe9bee 100644
--- a/src/export/ExportPCM.cpp
+++ b/src/export/ExportPCM.cpp
@@ -24,6 +24,7 @@
 
 #include "sndfile.h"
 
+#include "Dither.h"
 #include "../FileFormats.h"
 #include "../Mix.h"
 #include "Prefs.h"
diff --git a/src/import/ImportPlugin.h b/src/import/ImportPlugin.h
index 78c9fb54d0..7a9d6f9589 100644
--- a/src/import/ImportPlugin.h
+++ b/src/import/ImportPlugin.h
@@ -51,6 +51,7 @@ but little else.
 #include "audacity/Types.h"
 #include "Identifier.h"
 #include "Internat.h"
+#include "SampleFormat.h"
 #include "wxArrayStringEx.h"
 
 class AudacityProject;
diff --git a/src/import/SpecPowerMeter.cpp b/src/import/SpecPowerMeter.cpp
index a0b2a2c21c..45020d30ee 100644
--- a/src/import/SpecPowerMeter.cpp
+++ b/src/import/SpecPowerMeter.cpp
@@ -22,7 +22,7 @@ measurements in subbands or in the entire signal band.
 #include <cstdlib>
 #include <wx/defs.h>
 
-#include "../FFT.h"
+#include "FFT.h"
 
 SpecPowerCalculation::SpecPowerCalculation(size_t sigLen)
   : mSigLen(sigLen)
diff --git a/src/import/SpecPowerMeter.h b/src/import/SpecPowerMeter.h
index 5fba4fe71a..9df7dff49f 100644
--- a/src/import/SpecPowerMeter.h
+++ b/src/import/SpecPowerMeter.h
@@ -12,7 +12,7 @@
 #define __AUDACITY_SPECPOWERMETER_H_
 
 #include <cstddef>
-#include "../SampleFormat.h"
+#include "SampleFormat.h"
 
 class SpecPowerCalculation
 {
diff --git a/src/prefs/QualityPrefs.cpp b/src/prefs/QualityPrefs.cpp
index 1357c66111..f16fc20cfb 100644
--- a/src/prefs/QualityPrefs.cpp
+++ b/src/prefs/QualityPrefs.cpp
@@ -24,7 +24,7 @@
 #include <wx/textctrl.h>
 
 #include "../AudioIOBase.h"
-#include "../Dither.h"
+#include "Dither.h"
 #include "Prefs.h"
 #include "../Resample.h"
 #include "../ShuttleGui.h"
diff --git a/src/prefs/QualitySettings.h b/src/prefs/QualitySettings.h
index fb5431160b..9bc0b430e6 100644
--- a/src/prefs/QualitySettings.h
+++ b/src/prefs/QualitySettings.h
@@ -13,6 +13,7 @@
 
 #include <audacity/Types.h>
 #include "Prefs.h" // for EnumSetting
+#include "SampleFormat.h"
 
 class IntSetting;
 
diff --git a/src/prefs/SpectrogramSettings.cpp b/src/prefs/SpectrogramSettings.cpp
index 66ecc675ef..c71b0e3bf0 100644
--- a/src/prefs/SpectrogramSettings.cpp
+++ b/src/prefs/SpectrogramSettings.cpp
@@ -21,7 +21,7 @@ Paul Licameli
 
 #include <algorithm>
 
-#include "../FFT.h"
+#include "FFT.h"
 #include "Prefs.h"
 
 #include <cmath>
diff --git a/src/prefs/SpectrogramSettings.h b/src/prefs/SpectrogramSettings.h
index b1d7e74956..fecab413e3 100644
--- a/src/prefs/SpectrogramSettings.h
+++ b/src/prefs/SpectrogramSettings.h
@@ -12,8 +12,8 @@ Paul Licameli
 #define __AUDACITY_SPECTROGRAM_SETTINGS__
 
 #include "Prefs.h"
-#include "../SampleFormat.h"
-#include "../RealFFTf.h"
+#include "SampleFormat.h"
+#include "RealFFTf.h"
 
 #undef SPECTRAL_SELECTION_GLOBAL_SWITCH
 
diff --git a/src/prefs/SpectrumPrefs.cpp b/src/prefs/SpectrumPrefs.cpp
index 1dd719079c..e9feefb943 100644
--- a/src/prefs/SpectrumPrefs.cpp
+++ b/src/prefs/SpectrumPrefs.cpp
@@ -23,7 +23,7 @@
 #include <wx/checkbox.h>
 #include <wx/textctrl.h>
 
-#include "../FFT.h"
+#include "FFT.h"
 #include "../Project.h"
 #include "../ShuttleGui.h"
 
diff --git a/src/tracks/playabletrack/wavetrack/ui/SampleHandle.h b/src/tracks/playabletrack/wavetrack/ui/SampleHandle.h
index 004e0f272d..5899fca23d 100644
--- a/src/tracks/playabletrack/wavetrack/ui/SampleHandle.h
+++ b/src/tracks/playabletrack/wavetrack/ui/SampleHandle.h
@@ -12,7 +12,7 @@ Paul Licameli
 #define __AUDACITY_SAMPLE_HANDLE__
 
 #include "../../../../UIHandle.h"
-#include "../../../../SampleCount.h"
+#include "SampleCount.h"
 
 class wxMouseEvent;
 class wxMouseState;
diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h
index 144e1de236..1c0554e18d 100644
--- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h
+++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h
@@ -13,7 +13,7 @@ Paul Licameli split from class WaveTrack
 
 #include "../../../ui/CommonTrackView.h"
 #include "../../../../ClientData.h"
-#include "../../../../SampleCount.h"
+#include "SampleCount.h"
 namespace WaveTrackViewConstants{ enum Display : int; }
 struct WaveTrackSubViewType;
 
diff --git a/src/widgets/Meter.h b/src/widgets/Meter.h
index 2c22c30205..e6060e92f0 100644
--- a/src/widgets/Meter.h
+++ b/src/widgets/Meter.h
@@ -21,7 +21,7 @@
 #include <wx/defs.h>
 #include <wx/timer.h> // member variable
 
-#include "../SampleFormat.h"
+#include "SampleFormat.h"
 #include "Prefs.h"
 #include "MeterPanelBase.h" // to inherit
 #include "Ruler.h" // member variable
diff --git a/src/widgets/NumericTextCtrl.cpp b/src/widgets/NumericTextCtrl.cpp
index edbe85d3b6..9a03407874 100644
--- a/src/widgets/NumericTextCtrl.cpp
+++ b/src/widgets/NumericTextCtrl.cpp
@@ -168,7 +168,7 @@ different formats.
 
 #include "NumericTextCtrl.h"
 
-#include "../SampleCount.h"
+#include "SampleCount.h"
 #include "../AllThemeResources.h"
 #include "../AColor.h"
 #include "../KeyboardCapture.h"
diff --git a/src/xml/XMLTagHandler.cpp b/src/xml/XMLTagHandler.cpp
index 8e32f17737..1dd6fa0327 100644
--- a/src/xml/XMLTagHandler.cpp
+++ b/src/xml/XMLTagHandler.cpp
@@ -35,6 +35,7 @@
 #include <wx/filename.h>
 
 #include "FileNames.h"
+#include "SampleFormat.h"
 
 // Length check.  Is in part about not supplying malicious strings to file functions.
 bool XMLValueChecker::IsGoodString(const wxString & str)
-- 
GitLab