summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--3rdparty/README.md12
-rw-r--r--3rdparty/wdlfft/fft.c1199
-rw-r--r--3rdparty/wdlfft/fft.h77
-rw-r--r--COPYING249
-rw-r--r--dist.mak4
-rw-r--r--docs/legal/BSD-2-Clause24
-rw-r--r--docs/legal/BSD-3-Clause28
-rw-r--r--docs/legal/BSL-1.023
-rw-r--r--docs/legal/CC0114
-rw-r--r--docs/legal/GPL-2.0341
-rw-r--r--docs/legal/LGPL-2.1499
-rw-r--r--docs/legal/MIT20
-rw-r--r--docs/legal/Zlib20
-rw-r--r--scripts/src/3rdparty.lua45
-rw-r--r--scripts/src/main.lua1
-rw-r--r--scripts/src/sound.lua2
-rw-r--r--src/devices/sound/fft.cpp1206
-rw-r--r--src/devices/sound/fft.h82
-rw-r--r--src/devices/sound/vgm_visualizer.cpp6
19 files changed, 2650 insertions, 1302 deletions
diff --git a/3rdparty/README.md b/3rdparty/README.md
index f60fb7c168b..00616b7773d 100644
--- a/3rdparty/README.md
+++ b/3rdparty/README.md
@@ -24,11 +24,11 @@ genie - [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause)
glm - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
-libflac - [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause)
+libflac - [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause) (codecs), [The GNU General Public License, version 2](https://opensource.org/licenses/GPL-2.0)
libjpeg - [Custom BSD-like](https://github.com/numenta/nupic/blob/master/external/licenses/LICENSE.libjpeg-6b.txt)
-linenoise-ng - [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause)
+linenoise - [The BSD 2-Clause License](http://opensource.org/licenses/BSD-2-Clause)
lsqlite3 - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
@@ -40,7 +40,7 @@ lua-zlib - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
luafilesystem - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
-lzma - [The GNU Lesser General Public License](http://opensource.org/licenses/LGPL-2.1)
+lzma - Custom public domain license
minimp3 - [Creative Commons Zero v1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/)
@@ -52,7 +52,7 @@ portmidi - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
pugixml - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
-rapidjson - [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause)
+rapidjson - [The MIT License (MIT)](http://opensource.org/licenses/MIT), [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause) (msinttypes), JSON license (JSON_checker)
sdl2 - [zlib license](http://opensource.org/licenses/Zlib)
@@ -62,12 +62,14 @@ softfloat3 - [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Cla
sol2 - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
-sqlite3 - Public Domain
+sqlite3 - Custom public domain license
tap-windows6.h - Dual-licensed [The GNU General Public License, version 2](https://opensource.org/licenses/GPL-2.0) and [The MIT License (MIT)](http://opensource.org/licenses/MIT)
utf8proc - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+wdlfft - [zlib license](http://opensource.org/licenses/Zlib)
+
winpcap - [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause)
zlib - [zlib license](http://opensource.org/licenses/Zlib)
diff --git a/3rdparty/wdlfft/fft.c b/3rdparty/wdlfft/fft.c
new file mode 100644
index 00000000000..8b15d6ca35b
--- /dev/null
+++ b/3rdparty/wdlfft/fft.c
@@ -0,0 +1,1199 @@
+/*
+ WDL - fft.cpp
+ Copyright (C) 2006 and later Cockos Incorporated
+ Copyright 1999 D. J. Bernstein
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+
+
+ This file implements the WDL FFT library. These routines are based on the
+ DJBFFT library, which are Copyright 1999 D. J. Bernstein, djb@pobox.com
+
+ The DJB FFT web page is: http://cr.yp.to/djbfft.html
+
+*/
+
+
+// this is based on djbfft
+
+#include <math.h>
+#include "fft.h"
+
+
+#define FFT_MAXBITLEN 15
+
+#ifdef _MSC_VER
+#define inline __inline
+#endif
+
+#define PI 3.1415926535897932384626433832795
+
+static WDL_FFT_COMPLEX d16[3];
+static WDL_FFT_COMPLEX d32[7];
+static WDL_FFT_COMPLEX d64[15];
+static WDL_FFT_COMPLEX d128[31];
+static WDL_FFT_COMPLEX d256[63];
+static WDL_FFT_COMPLEX d512[127];
+static WDL_FFT_COMPLEX d1024[127];
+static WDL_FFT_COMPLEX d2048[255];
+static WDL_FFT_COMPLEX d4096[511];
+static WDL_FFT_COMPLEX d8192[1023];
+static WDL_FFT_COMPLEX d16384[2047];
+static WDL_FFT_COMPLEX d32768[4095];
+
+
+#define sqrthalf (d16[1].re)
+
+#define VOL *(volatile WDL_FFT_REAL *)&
+
+#define TRANSFORM(a0,a1,a2,a3,wre,wim) { \
+ t6 = a2.re; \
+ t1 = a0.re - t6; \
+ t6 += a0.re; \
+ a0.re = t6; \
+ t3 = a3.im; \
+ t4 = a1.im - t3; \
+ t8 = t1 - t4; \
+ t1 += t4; \
+ t3 += a1.im; \
+ a1.im = t3; \
+ t5 = wre; \
+ t7 = t8 * t5; \
+ t4 = t1 * t5; \
+ t8 *= wim; \
+ t2 = a3.re; \
+ t3 = a1.re - t2; \
+ t2 += a1.re; \
+ a1.re = t2; \
+ t1 *= wim; \
+ t6 = a2.im; \
+ t2 = a0.im - t6; \
+ t6 += a0.im; \
+ a0.im = t6; \
+ t6 = t2 + t3; \
+ t2 -= t3; \
+ t3 = t6 * wim; \
+ t7 -= t3; \
+ a2.re = t7; \
+ t6 *= t5; \
+ t6 += t8; \
+ a2.im = t6; \
+ t5 *= t2; \
+ t5 -= t1; \
+ a3.im = t5; \
+ t2 *= wim; \
+ t4 += t2; \
+ a3.re = t4; \
+ }
+
+#define TRANSFORMHALF(a0,a1,a2,a3) { \
+ t1 = a2.re; \
+ t5 = a0.re - t1; \
+ t1 += a0.re; \
+ a0.re = t1; \
+ t4 = a3.im; \
+ t8 = a1.im - t4; \
+ t1 = t5 - t8; \
+ t5 += t8; \
+ t4 += a1.im; \
+ a1.im = t4; \
+ t3 = a3.re; \
+ t7 = a1.re - t3; \
+ t3 += a1.re; \
+ a1.re = t3; \
+ t8 = a2.im; \
+ t6 = a0.im - t8; \
+ t2 = t6 + t7; \
+ t6 -= t7; \
+ t8 += a0.im; \
+ a0.im = t8; \
+ t4 = t6 + t5; \
+ t3 = sqrthalf; \
+ t4 *= t3; \
+ a3.re = t4; \
+ t6 -= t5; \
+ t6 *= t3; \
+ a3.im = t6; \
+ t7 = t1 - t2; \
+ t7 *= t3; \
+ a2.re = t7; \
+ t2 += t1; \
+ t2 *= t3; \
+ a2.im = t2; \
+ }
+
+#define TRANSFORMZERO(a0,a1,a2,a3) { \
+ t5 = a2.re; \
+ t1 = a0.re - t5; \
+ t5 += a0.re; \
+ a0.re = t5; \
+ t8 = a3.im; \
+ t4 = a1.im - t8; \
+ t7 = a3.re; \
+ t6 = t1 - t4; \
+ a2.re = t6; \
+ t1 += t4; \
+ a3.re = t1; \
+ t8 += a1.im; \
+ a1.im = t8; \
+ t3 = a1.re - t7; \
+ t7 += a1.re; \
+ a1.re = t7; \
+ t6 = a2.im; \
+ t2 = a0.im - t6; \
+ t7 = t2 + t3; \
+ a2.im = t7; \
+ t2 -= t3; \
+ a3.im = t2; \
+ t6 += a0.im; \
+ a0.im = t6; \
+ }
+
+#define UNTRANSFORM(a0,a1,a2,a3,wre,wim) { \
+ t6 = VOL wre; \
+ t1 = VOL a2.re; \
+ t1 *= t6; \
+ t8 = VOL wim; \
+ t3 = VOL a2.im; \
+ t3 *= t8; \
+ t2 = VOL a2.im; \
+ t4 = VOL a2.re; \
+ t5 = VOL a3.re; \
+ t5 *= t6; \
+ t7 = VOL a3.im; \
+ t1 += t3; \
+ t7 *= t8; \
+ t5 -= t7; \
+ t3 = t5 + t1; \
+ t5 -= t1; \
+ t2 *= t6; \
+ t6 *= a3.im; \
+ t4 *= t8; \
+ t2 -= t4; \
+ t8 *= a3.re; \
+ t6 += t8; \
+ t1 = a0.re - t3; \
+ t3 += a0.re; \
+ a0.re = t3; \
+ t7 = a1.im - t5; \
+ t5 += a1.im; \
+ a1.im = t5; \
+ t4 = t2 - t6; \
+ t6 += t2; \
+ t8 = a1.re - t4; \
+ t4 += a1.re; \
+ a1.re = t4; \
+ t2 = a0.im - t6; \
+ t6 += a0.im; \
+ a0.im = t6; \
+ a2.re = t1; \
+ a3.im = t7; \
+ a3.re = t8; \
+ a2.im = t2; \
+ }
+
+
+#define UNTRANSFORMHALF(a0,a1,a2,a3) { \
+ t6 = sqrthalf; \
+ t1 = a2.re; \
+ t2 = a2.im - t1; \
+ t2 *= t6; \
+ t1 += a2.im; \
+ t1 *= t6; \
+ t4 = a3.im; \
+ t3 = a3.re - t4; \
+ t3 *= t6; \
+ t4 += a3.re; \
+ t4 *= t6; \
+ t8 = t3 - t1; \
+ t7 = t2 - t4; \
+ t1 += t3; \
+ t2 += t4; \
+ t4 = a1.im - t8; \
+ a3.im = t4; \
+ t8 += a1.im; \
+ a1.im = t8; \
+ t3 = a1.re - t7; \
+ a3.re = t3; \
+ t7 += a1.re; \
+ a1.re = t7; \
+ t5 = a0.re - t1; \
+ a2.re = t5; \
+ t1 += a0.re; \
+ a0.re = t1; \
+ t6 = a0.im - t2; \
+ a2.im = t6; \
+ t2 += a0.im; \
+ a0.im = t2; \
+ }
+
+#define UNTRANSFORMZERO(a0,a1,a2,a3) { \
+ t2 = a3.im; \
+ t3 = a2.im - t2; \
+ t2 += a2.im; \
+ t1 = a2.re; \
+ t4 = a3.re - t1; \
+ t1 += a3.re; \
+ t5 = a0.re - t1; \
+ a2.re = t5; \
+ t6 = a0.im - t2; \
+ a2.im = t6; \
+ t7 = a1.re - t3; \
+ a3.re = t7; \
+ t8 = a1.im - t4; \
+ a3.im = t8; \
+ t1 += a0.re; \
+ a0.re = t1; \
+ t2 += a0.im; \
+ a0.im = t2; \
+ t3 += a1.re; \
+ a1.re = t3; \
+ t4 += a1.im; \
+ a1.im = t4; \
+ }
+
+static void c2(register WDL_FFT_COMPLEX *a)
+{
+ register WDL_FFT_REAL t1;
+
+ t1 = a[1].re;
+ a[1].re = a[0].re - t1;
+ a[0].re += t1;
+
+ t1 = a[1].im;
+ a[1].im = a[0].im - t1;
+ a[0].im += t1;
+}
+
+static inline void c4(register WDL_FFT_COMPLEX *a)
+{
+ register WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
+
+ t5 = a[2].re;
+ t1 = a[0].re - t5;
+ t7 = a[3].re;
+ t5 += a[0].re;
+ t3 = a[1].re - t7;
+ t7 += a[1].re;
+ t8 = t5 + t7;
+ a[0].re = t8;
+ t5 -= t7;
+ a[1].re = t5;
+ t6 = a[2].im;
+ t2 = a[0].im - t6;
+ t6 += a[0].im;
+ t5 = a[3].im;
+ a[2].im = t2 + t3;
+ t2 -= t3;
+ a[3].im = t2;
+ t4 = a[1].im - t5;
+ a[3].re = t1 + t4;
+ t1 -= t4;
+ a[2].re = t1;
+ t5 += a[1].im;
+ a[0].im = t6 + t5;
+ t6 -= t5;
+ a[1].im = t6;
+}
+
+static void c8(register WDL_FFT_COMPLEX *a)
+{
+ register WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
+
+ t7 = a[4].im;
+ t4 = a[0].im - t7;
+ t7 += a[0].im;
+ a[0].im = t7;
+
+ t8 = a[6].re;
+ t5 = a[2].re - t8;
+ t8 += a[2].re;
+ a[2].re = t8;
+
+ t7 = a[6].im;
+ a[6].im = t4 - t5;
+ t4 += t5;
+ a[4].im = t4;
+
+ t6 = a[2].im - t7;
+ t7 += a[2].im;
+ a[2].im = t7;
+
+ t8 = a[4].re;
+ t3 = a[0].re - t8;
+ t8 += a[0].re;
+ a[0].re = t8;
+
+ a[4].re = t3 - t6;
+ t3 += t6;
+ a[6].re = t3;
+
+ t7 = a[5].re;
+ t3 = a[1].re - t7;
+ t7 += a[1].re;
+ a[1].re = t7;
+
+ t8 = a[7].im;
+ t6 = a[3].im - t8;
+ t8 += a[3].im;
+ a[3].im = t8;
+ t1 = t3 - t6;
+ t3 += t6;
+
+ t7 = a[5].im;
+ t4 = a[1].im - t7;
+ t7 += a[1].im;
+ a[1].im = t7;
+
+ t8 = a[7].re;
+ t5 = a[3].re - t8;
+ t8 += a[3].re;
+ a[3].re = t8;
+
+ t2 = t4 - t5;
+ t4 += t5;
+
+ t6 = t1 - t4;
+ t8 = sqrthalf;
+ t6 *= t8;
+ a[5].re = a[4].re - t6;
+ t1 += t4;
+ t1 *= t8;
+ a[5].im = a[4].im - t1;
+ t6 += a[4].re;
+ a[4].re = t6;
+ t1 += a[4].im;
+ a[4].im = t1;
+
+ t5 = t2 - t3;
+ t5 *= t8;
+ a[7].im = a[6].im - t5;
+ t2 += t3;
+ t2 *= t8;
+ a[7].re = a[6].re - t2;
+ t2 += a[6].re;
+ a[6].re = t2;
+ t5 += a[6].im;
+ a[6].im = t5;
+
+ c4(a);
+}
+
+static void c16(register WDL_FFT_COMPLEX *a)
+{
+ register WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
+
+ TRANSFORMZERO(a[0],a[4],a[8],a[12]);
+ TRANSFORM(a[1],a[5],a[9],a[13],d16[0].re,d16[0].im);
+ TRANSFORMHALF(a[2],a[6],a[10],a[14]);
+ TRANSFORM(a[3],a[7],a[11],a[15],d16[0].im,d16[0].re);
+ c4(a + 8);
+ c4(a + 12);
+
+ c8(a);
+}
+
+/* a[0...8n-1], w[0...2n-2]; n >= 2 */
+static void cpass(register WDL_FFT_COMPLEX *a,register const WDL_FFT_COMPLEX *w,register unsigned int n)
+{
+ register WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
+ register WDL_FFT_COMPLEX *a1;
+ register WDL_FFT_COMPLEX *a2;
+ register WDL_FFT_COMPLEX *a3;
+
+ a2 = a + 4 * n;
+ a1 = a + 2 * n;
+ a3 = a2 + 2 * n;
+ --n;
+
+ TRANSFORMZERO(a[0],a1[0],a2[0],a3[0]);
+ TRANSFORM(a[1],a1[1],a2[1],a3[1],w[0].re,w[0].im);
+
+ for (;;) {
+ TRANSFORM(a[2],a1[2],a2[2],a3[2],w[1].re,w[1].im);
+ TRANSFORM(a[3],a1[3],a2[3],a3[3],w[2].re,w[2].im);
+ if (!--n) break;
+ a += 2;
+ a1 += 2;
+ a2 += 2;
+ a3 += 2;
+ w += 2;
+ }
+}
+
+static void c32(register WDL_FFT_COMPLEX *a)
+{
+ cpass(a,d32,4);
+ c8(a + 16);
+ c8(a + 24);
+ c16(a);
+}
+
+static void c64(register WDL_FFT_COMPLEX *a)
+{
+ cpass(a,d64,8);
+ c16(a + 32);
+ c16(a + 48);
+ c32(a);
+}
+
+static void c128(register WDL_FFT_COMPLEX *a)
+{
+ cpass(a,d128,16);
+ c32(a + 64);
+ c32(a + 96);
+ c64(a);
+}
+
+static void c256(register WDL_FFT_COMPLEX *a)
+{
+ cpass(a,d256,32);
+ c64(a + 128);
+ c64(a + 192);
+ c128(a);
+}
+
+static void c512(register WDL_FFT_COMPLEX *a)
+{
+ cpass(a,d512,64);
+ c128(a + 384);
+ c128(a + 256);
+ c256(a);
+}
+
+/* a[0...8n-1], w[0...n-2]; n even, n >= 4 */
+static void cpassbig(register WDL_FFT_COMPLEX *a,register const WDL_FFT_COMPLEX *w,register unsigned int n)
+{
+ register WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
+ register WDL_FFT_COMPLEX *a1;
+ register WDL_FFT_COMPLEX *a2;
+ register WDL_FFT_COMPLEX *a3;
+ register unsigned int k;
+
+ a2 = a + 4 * n;
+ a1 = a + 2 * n;
+ a3 = a2 + 2 * n;
+ k = n - 2;
+
+ TRANSFORMZERO(a[0],a1[0],a2[0],a3[0]);
+ TRANSFORM(a[1],a1[1],a2[1],a3[1],w[0].re,w[0].im);
+ a += 2;
+ a1 += 2;
+ a2 += 2;
+ a3 += 2;
+
+ do {
+ TRANSFORM(a[0],a1[0],a2[0],a3[0],w[1].re,w[1].im);
+ TRANSFORM(a[1],a1[1],a2[1],a3[1],w[2].re,w[2].im);
+ a += 2;
+ a1 += 2;
+ a2 += 2;
+ a3 += 2;
+ w += 2;
+ } while (k -= 2);
+
+ TRANSFORMHALF(a[0],a1[0],a2[0],a3[0]);
+ TRANSFORM(a[1],a1[1],a2[1],a3[1],w[0].im,w[0].re);
+ a += 2;
+ a1 += 2;
+ a2 += 2;
+ a3 += 2;
+
+ k = n - 2;
+ do {
+ TRANSFORM(a[0],a1[0],a2[0],a3[0],w[-1].im,w[-1].re);
+ TRANSFORM(a[1],a1[1],a2[1],a3[1],w[-2].im,w[-2].re);
+ a += 2;
+ a1 += 2;
+ a2 += 2;
+ a3 += 2;
+ w -= 2;
+ } while (k -= 2);
+}
+
+
+static void c1024(register WDL_FFT_COMPLEX *a)
+{
+ cpassbig(a,d1024,128);
+ c256(a + 768);
+ c256(a + 512);
+ c512(a);
+}
+
+static void c2048(register WDL_FFT_COMPLEX *a)
+{
+ cpassbig(a,d2048,256);
+ c512(a + 1536);
+ c512(a + 1024);
+ c1024(a);
+}
+
+static void c4096(register WDL_FFT_COMPLEX *a)
+{
+ cpassbig(a,d4096,512);
+ c1024(a + 3072);
+ c1024(a + 2048);
+ c2048(a);
+}
+
+static void c8192(register WDL_FFT_COMPLEX *a)
+{
+ cpassbig(a,d8192,1024);
+ c2048(a + 6144);
+ c2048(a + 4096);
+ c4096(a);
+}
+
+static void c16384(register WDL_FFT_COMPLEX *a)
+{
+ cpassbig(a,d16384,2048);
+ c4096(a + 8192 + 4096);
+ c4096(a + 8192);
+ c8192(a);
+}
+
+static void c32768(register WDL_FFT_COMPLEX *a)
+{
+ cpassbig(a,d32768,4096);
+ c8192(a + 16384 + 8192);
+ c8192(a + 16384);
+ c16384(a);
+}
+
+
+/* n even, n > 0 */
+void WDL_fft_complexmul(WDL_FFT_COMPLEX *a,WDL_FFT_COMPLEX *b,int n)
+{
+ register WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
+ if (n<2 || (n&1)) return;
+
+ do {
+ t1 = a[0].re * b[0].re;
+ t2 = a[0].im * b[0].im;
+ t3 = a[0].im * b[0].re;
+ t4 = a[0].re * b[0].im;
+ t5 = a[1].re * b[1].re;
+ t6 = a[1].im * b[1].im;
+ t7 = a[1].im * b[1].re;
+ t8 = a[1].re * b[1].im;
+ t1 -= t2;
+ t3 += t4;
+ t5 -= t6;
+ t7 += t8;
+ a[0].re = t1;
+ a[1].re = t5;
+ a[0].im = t3;
+ a[1].im = t7;
+ a += 2;
+ b += 2;
+ } while (n -= 2);
+}
+
+void WDL_fft_complexmul2(WDL_FFT_COMPLEX *c, WDL_FFT_COMPLEX *a, WDL_FFT_COMPLEX *b, int n)
+{
+ register WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
+ if (n<2 || (n&1)) return;
+
+ do {
+ t1 = a[0].re * b[0].re;
+ t2 = a[0].im * b[0].im;
+ t3 = a[0].im * b[0].re;
+ t4 = a[0].re * b[0].im;
+ t5 = a[1].re * b[1].re;
+ t6 = a[1].im * b[1].im;
+ t7 = a[1].im * b[1].re;
+ t8 = a[1].re * b[1].im;
+ t1 -= t2;
+ t3 += t4;
+ t5 -= t6;
+ t7 += t8;
+ c[0].re = t1;
+ c[1].re = t5;
+ c[0].im = t3;
+ c[1].im = t7;
+ a += 2;
+ b += 2;
+ c += 2;
+ } while (n -= 2);
+}
+void WDL_fft_complexmul3(WDL_FFT_COMPLEX *c, WDL_FFT_COMPLEX *a, WDL_FFT_COMPLEX *b, int n)
+{
+ register WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
+ if (n<2 || (n&1)) return;
+
+ do {
+ t1 = a[0].re * b[0].re;
+ t2 = a[0].im * b[0].im;
+ t3 = a[0].im * b[0].re;
+ t4 = a[0].re * b[0].im;
+ t5 = a[1].re * b[1].re;
+ t6 = a[1].im * b[1].im;
+ t7 = a[1].im * b[1].re;
+ t8 = a[1].re * b[1].im;
+ t1 -= t2;
+ t3 += t4;
+ t5 -= t6;
+ t7 += t8;
+ c[0].re += t1;
+ c[1].re += t5;
+ c[0].im += t3;
+ c[1].im += t7;
+ a += 2;
+ b += 2;
+ c += 2;
+ } while (n -= 2);
+}
+
+
+static inline void u4(register WDL_FFT_COMPLEX *a)
+{
+ register WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
+
+ t1 = VOL a[1].re;
+ t3 = a[0].re - t1;
+ t6 = VOL a[2].re;
+ t1 += a[0].re;
+ t8 = a[3].re - t6;
+ t6 += a[3].re;
+ a[0].re = t1 + t6;
+ t1 -= t6;
+ a[2].re = t1;
+
+ t2 = VOL a[1].im;
+ t4 = a[0].im - t2;
+ t2 += a[0].im;
+ t5 = VOL a[3].im;
+ a[1].im = t4 + t8;
+ t4 -= t8;
+ a[3].im = t4;
+
+ t7 = a[2].im - t5;
+ t5 += a[2].im;
+ a[1].re = t3 + t7;
+ t3 -= t7;
+ a[3].re = t3;
+ a[0].im = t2 + t5;
+ t2 -= t5;
+ a[2].im = t2;
+}
+
+static void u8(register WDL_FFT_COMPLEX *a)
+{
+ register WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
+
+ u4(a);
+
+ t1 = a[5].re;
+ a[5].re = a[4].re - t1;
+ t1 += a[4].re;
+
+ t3 = a[7].re;
+ a[7].re = a[6].re - t3;
+ t3 += a[6].re;
+
+ t8 = t3 - t1;
+ t1 += t3;
+
+ t6 = a[2].im - t8;
+ t8 += a[2].im;
+ a[2].im = t8;
+
+ t5 = a[0].re - t1;
+ a[4].re = t5;
+ t1 += a[0].re;
+ a[0].re = t1;
+
+ t2 = a[5].im;
+ a[5].im = a[4].im - t2;
+ t2 += a[4].im;
+
+ t4 = a[7].im;
+ a[7].im = a[6].im - t4;
+ t4 += a[6].im;
+
+ a[6].im = t6;
+
+ t7 = t2 - t4;
+ t2 += t4;
+
+ t3 = a[2].re - t7;
+ a[6].re = t3;
+ t7 += a[2].re;
+ a[2].re = t7;
+
+ t6 = a[0].im - t2;
+ a[4].im = t6;
+ t2 += a[0].im;
+ a[0].im = t2;
+
+ t6 = sqrthalf;
+
+ t1 = a[5].re;
+ t2 = a[5].im - t1;
+ t2 *= t6;
+ t1 += a[5].im;
+ t1 *= t6;
+ t4 = a[7].im;
+ t3 = a[7].re - t4;
+ t3 *= t6;
+ t4 += a[7].re;
+ t4 *= t6;
+
+ t8 = t3 - t1;
+ t1 += t3;
+ t7 = t2 - t4;
+ t2 += t4;
+
+ t4 = a[3].im - t8;
+ a[7].im = t4;
+ t5 = a[1].re - t1;
+ a[5].re = t5;
+ t3 = a[3].re - t7;
+ a[7].re = t3;
+ t6 = a[1].im - t2;
+ a[5].im = t6;
+
+ t8 += a[3].im;
+ a[3].im = t8;
+ t1 += a[1].re;
+ a[1].re = t1;
+ t7 += a[3].re;
+ a[3].re = t7;
+ t2 += a[1].im;
+ a[1].im = t2;
+}
+
+static void u16(register WDL_FFT_COMPLEX *a)
+{
+ register WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
+
+ u8(a);
+ u4(a + 8);
+ u4(a + 12);
+
+ UNTRANSFORMZERO(a[0],a[4],a[8],a[12]);
+ UNTRANSFORMHALF(a[2],a[6],a[10],a[14]);
+ UNTRANSFORM(a[1],a[5],a[9],a[13],d16[0].re,d16[0].im);
+ UNTRANSFORM(a[3],a[7],a[11],a[15],d16[0].im,d16[0].re);
+}
+
+/* a[0...8n-1], w[0...2n-2] */
+static void upass(register WDL_FFT_COMPLEX *a,register const WDL_FFT_COMPLEX *w,register unsigned int n)
+{
+ register WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
+ register WDL_FFT_COMPLEX *a1;
+ register WDL_FFT_COMPLEX *a2;
+ register WDL_FFT_COMPLEX *a3;
+
+ a2 = a + 4 * n;
+ a1 = a + 2 * n;
+ a3 = a2 + 2 * n;
+ n -= 1;
+
+ UNTRANSFORMZERO(a[0],a1[0],a2[0],a3[0]);
+ UNTRANSFORM(a[1],a1[1],a2[1],a3[1],w[0].re,w[0].im);
+
+ for (;;) {
+ UNTRANSFORM(a[2],a1[2],a2[2],a3[2],w[1].re,w[1].im);
+ UNTRANSFORM(a[3],a1[3],a2[3],a3[3],w[2].re,w[2].im);
+ if (!--n) break;
+ a += 2;
+ a1 += 2;
+ a2 += 2;
+ a3 += 2;
+ w += 2;
+ }
+}
+
+static void u32(register WDL_FFT_COMPLEX *a)
+{
+ u16(a);
+ u8(a + 16);
+ u8(a + 24);
+ upass(a,d32,4);
+}
+
+static void u64(register WDL_FFT_COMPLEX *a)
+{
+ u32(a);
+ u16(a + 32);
+ u16(a + 48);
+ upass(a,d64,8);
+}
+
+static void u128(register WDL_FFT_COMPLEX *a)
+{
+ u64(a);
+ u32(a + 64);
+ u32(a + 96);
+ upass(a,d128,16);
+}
+
+static void u256(register WDL_FFT_COMPLEX *a)
+{
+ u128(a);
+ u64(a + 128);
+ u64(a + 192);
+ upass(a,d256,32);
+}
+
+static void u512(register WDL_FFT_COMPLEX *a)
+{
+ u256(a);
+ u128(a + 256);
+ u128(a + 384);
+ upass(a,d512,64);
+}
+
+
+/* a[0...8n-1], w[0...n-2]; n even, n >= 4 */
+static void upassbig(register WDL_FFT_COMPLEX *a,register const WDL_FFT_COMPLEX *w,register unsigned int n)
+{
+ register WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
+ register WDL_FFT_COMPLEX *a1;
+ register WDL_FFT_COMPLEX *a2;
+ register WDL_FFT_COMPLEX *a3;
+ register unsigned int k;
+
+ a2 = a + 4 * n;
+ a1 = a + 2 * n;
+ a3 = a2 + 2 * n;
+ k = n - 2;
+
+ UNTRANSFORMZERO(a[0],a1[0],a2[0],a3[0]);
+ UNTRANSFORM(a[1],a1[1],a2[1],a3[1],w[0].re,w[0].im);
+ a += 2;
+ a1 += 2;
+ a2 += 2;
+ a3 += 2;
+
+ do {
+ UNTRANSFORM(a[0],a1[0],a2[0],a3[0],w[1].re,w[1].im);
+ UNTRANSFORM(a[1],a1[1],a2[1],a3[1],w[2].re,w[2].im);
+ a += 2;
+ a1 += 2;
+ a2 += 2;
+ a3 += 2;
+ w += 2;
+ } while (k -= 2);
+
+ UNTRANSFORMHALF(a[0],a1[0],a2[0],a3[0]);
+ UNTRANSFORM(a[1],a1[1],a2[1],a3[1],w[0].im,w[0].re);
+ a += 2;
+ a1 += 2;
+ a2 += 2;
+ a3 += 2;
+
+ k = n - 2;
+ do {
+ UNTRANSFORM(a[0],a1[0],a2[0],a3[0],w[-1].im,w[-1].re);
+ UNTRANSFORM(a[1],a1[1],a2[1],a3[1],w[-2].im,w[-2].re);
+ a += 2;
+ a1 += 2;
+ a2 += 2;
+ a3 += 2;
+ w -= 2;
+ } while (k -= 2);
+}
+
+
+
+static void u1024(register WDL_FFT_COMPLEX *a)
+{
+ u512(a);
+ u256(a + 512);
+ u256(a + 768);
+ upassbig(a,d1024,128);
+}
+
+static void u2048(register WDL_FFT_COMPLEX *a)
+{
+ u1024(a);
+ u512(a + 1024);
+ u512(a + 1536);
+ upassbig(a,d2048,256);
+}
+
+
+static void u4096(register WDL_FFT_COMPLEX *a)
+{
+ u2048(a);
+ u1024(a + 2048);
+ u1024(a + 3072);
+ upassbig(a,d4096,512);
+}
+
+static void u8192(register WDL_FFT_COMPLEX *a)
+{
+ u4096(a);
+ u2048(a + 4096);
+ u2048(a + 6144);
+ upassbig(a,d8192,1024);
+}
+
+static void u16384(register WDL_FFT_COMPLEX *a)
+{
+ u8192(a);
+ u4096(a + 8192);
+ u4096(a + 8192 + 4096);
+ upassbig(a,d16384,2048);
+}
+
+static void u32768(register WDL_FFT_COMPLEX *a)
+{
+ u16384(a);
+ u8192(a + 16384);
+ u8192(a + 16384 + 8192 );
+ upassbig(a,d32768,4096);
+}
+
+
+static void __fft_gen(WDL_FFT_COMPLEX *buf, const WDL_FFT_COMPLEX *buf2, int sz, int isfull)
+{
+ int x;
+ double div=PI*0.25/(sz+1);
+
+ if (isfull) div*=2.0;
+
+ for (x = 0; x < sz; x ++)
+ {
+ if (!(x & 1) || !buf2)
+ {
+ buf[x].re = (WDL_FFT_REAL) cos((x+1)*div);
+ buf[x].im = (WDL_FFT_REAL) sin((x+1)*div);
+ }
+ else
+ {
+ buf[x].re = buf2[x >> 1].re;
+ buf[x].im = buf2[x >> 1].im;
+ }
+ }
+}
+
+#ifndef WDL_FFT_NO_PERMUTE
+
+static unsigned int fftfreq_c(unsigned int i,unsigned int n)
+{
+ unsigned int m;
+
+ if (n <= 2) return i;
+
+ m = n >> 1;
+ if (i < m) return fftfreq_c(i,m) << 1;
+
+ i -= m;
+ m >>= 1;
+ if (i < m) return (fftfreq_c(i,m) << 2) + 1;
+ i -= m;
+ return ((fftfreq_c(i,m) << 2) - 1) & (n - 1);
+}
+
+static int _idxperm[2<<FFT_MAXBITLEN];
+
+static void idx_perm_calc(int offs, int n)
+{
+ int i, j;
+ _idxperm[offs] = 0;
+ for (i = 1; i < n; ++i) {
+ j = fftfreq_c(i, n);
+ _idxperm[offs+n-j] = i;
+ }
+}
+
+int WDL_fft_permute(int fftsize, int idx)
+{
+ return _idxperm[fftsize+idx-2];
+}
+int *WDL_fft_permute_tab(int fftsize)
+{
+ return _idxperm + fftsize - 2;
+}
+
+
+#endif
+
+void WDL_fft_init()
+{
+ static int ffttabinit;
+ if (!ffttabinit)
+ {
+ int i, offs;
+ ffttabinit=1;
+
+#define fft_gen(x,y,z) __fft_gen(x,y,sizeof(x)/sizeof(x[0]),z)
+ fft_gen(d16,0,1);
+ fft_gen(d32,d16,1);
+ fft_gen(d64,d32,1);
+ fft_gen(d128,d64,1);
+ fft_gen(d256,d128,1);
+ fft_gen(d512,d256,1);
+ fft_gen(d1024,d512,0);
+ fft_gen(d2048,d1024,0);
+ fft_gen(d4096,d2048,0);
+ fft_gen(d8192,d4096,0);
+ fft_gen(d16384,d8192,0);
+ fft_gen(d32768,d16384,0);
+#undef fft_gen
+
+#ifndef WDL_FFT_NO_PERMUTE
+ offs = 0;
+ for (i = 2; i <= 32768; i *= 2)
+ {
+ idx_perm_calc(offs, i);
+ offs += i;
+ }
+#endif
+
+ }
+}
+
+void WDL_fft(WDL_FFT_COMPLEX *buf, int len, int isInverse)
+{
+ switch (len)
+ {
+ case 2: c2(buf); break;
+#define TMP(x) case x: if (!isInverse) c##x(buf); else u##x(buf); break;
+ TMP(4)
+ TMP(8)
+ TMP(16)
+ TMP(32)
+ TMP(64)
+ TMP(128)
+ TMP(256)
+ TMP(512)
+ TMP(1024)
+ TMP(2048)
+ TMP(4096)
+ TMP(8192)
+ TMP(16384)
+ TMP(32768)
+#undef TMP
+ }
+}
+
+static inline void r2(register WDL_FFT_REAL *a)
+{
+ register WDL_FFT_REAL t1, t2;
+
+ t1 = a[0] + a[1];
+ t2 = a[0] - a[1];
+ a[0] = t1 * 2;
+ a[1] = t2 * 2;
+}
+
+static inline void v2(register WDL_FFT_REAL *a)
+{
+ register WDL_FFT_REAL t1, t2;
+
+ t1 = a[0] + a[1];
+ t2 = a[0] - a[1];
+ a[0] = t1;
+ a[1] = t2;
+}
+
+static void two_for_one(WDL_FFT_REAL* buf, const WDL_FFT_COMPLEX *d, int len, int isInverse)
+{
+ const unsigned int half = (unsigned)len >> 1, quart = half >> 1, eighth = quart >> 1;
+ const int *permute = WDL_fft_permute_tab(half);
+ unsigned int i, j;
+
+ WDL_FFT_COMPLEX *p, *q, tw, sum, diff;
+ WDL_FFT_REAL tw1, tw2;
+
+ if (!isInverse)
+ {
+ WDL_fft((WDL_FFT_COMPLEX*)buf, half, isInverse);
+ r2(buf);
+ }
+ else
+ {
+ v2(buf);
+ }
+
+ /* Source: http://www.katjaas.nl/realFFT/realFFT2.html */
+
+ for (i = 1; i < quart; ++i)
+ {
+ p = (WDL_FFT_COMPLEX*)buf + permute[i];
+ q = (WDL_FFT_COMPLEX*)buf + permute[half - i];
+
+/* tw.re = cos(2*PI * i / len);
+ tw.im = sin(2*PI * i / len); */
+
+ if (i < eighth)
+ {
+ j = i - 1;
+ tw.re = d[j].re;
+ tw.im = d[j].im;
+ }
+ else if (i > eighth)
+ {
+ j = quart - i - 1;
+ tw.re = d[j].im;
+ tw.im = d[j].re;
+ }
+ else
+ {
+ tw.re = tw.im = sqrthalf;
+ }
+
+ if (!isInverse) tw.re = -tw.re;
+
+ sum.re = p->re + q->re;
+ sum.im = p->im + q->im;
+ diff.re = p->re - q->re;
+ diff.im = p->im - q->im;
+
+ tw1 = tw.re * sum.im + tw.im * diff.re;
+ tw2 = tw.im * sum.im - tw.re * diff.re;
+
+ p->re = sum.re - tw1;
+ p->im = diff.im - tw2;
+ q->re = sum.re + tw1;
+ q->im = -(diff.im + tw2);
+ }
+
+ p = (WDL_FFT_COMPLEX*)buf + permute[i];
+ p->re *= 2;
+ p->im *= -2;
+
+ if (isInverse) WDL_fft((WDL_FFT_COMPLEX*)buf, half, isInverse);
+}
+
+void WDL_real_fft(WDL_FFT_REAL* buf, int len, int isInverse)
+{
+ switch (len)
+ {
+ case 2: if (!isInverse) r2(buf); else v2(buf); break;
+ case 4: case 8: two_for_one(buf, 0, len, isInverse); break;
+#define TMP(x) case x: two_for_one(buf, d##x, len, isInverse); break;
+ TMP(16)
+ TMP(32)
+ TMP(64)
+ TMP(128)
+ TMP(256)
+ TMP(512)
+ TMP(1024)
+ TMP(2048)
+ TMP(4096)
+ TMP(8192)
+ TMP(16384)
+ TMP(32768)
+#undef TMP
+ }
+}
diff --git a/3rdparty/wdlfft/fft.h b/3rdparty/wdlfft/fft.h
new file mode 100644
index 00000000000..d2be245fb04
--- /dev/null
+++ b/3rdparty/wdlfft/fft.h
@@ -0,0 +1,77 @@
+/*
+ WDL - fft.h
+ Copyright (C) 2006 and later Cockos Incorporated
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+
+
+ This file defines the interface to the WDL FFT library. These routines are based on the
+ DJBFFT library, which are Copyright 1999 D. J. Bernstein, djb@pobox.com
+
+ The DJB FFT web page is: http://cr.yp.to/djbfft.html
+
+*/
+
+#ifndef _WDL_FFT_H_
+#define _WDL_FFT_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef WDL_FFT_REALSIZE
+#define WDL_FFT_REALSIZE 4
+#endif
+
+#if WDL_FFT_REALSIZE == 4
+typedef float WDL_FFT_REAL;
+#elif WDL_FFT_REALSIZE == 8
+typedef double WDL_FFT_REAL;
+#else
+#error invalid FFT item size
+#endif
+
+typedef struct {
+ WDL_FFT_REAL re;
+ WDL_FFT_REAL im;
+} WDL_FFT_COMPLEX;
+
+extern void WDL_fft_init();
+
+extern void WDL_fft_complexmul(WDL_FFT_COMPLEX *dest, WDL_FFT_COMPLEX *src, int len);
+extern void WDL_fft_complexmul2(WDL_FFT_COMPLEX *dest, WDL_FFT_COMPLEX *src, WDL_FFT_COMPLEX *src2, int len);
+extern void WDL_fft_complexmul3(WDL_FFT_COMPLEX *destAdd, WDL_FFT_COMPLEX *src, WDL_FFT_COMPLEX *src2, int len);
+
+/* Expects WDL_FFT_COMPLEX input[0..len-1] scaled by 1.0/len, returns
+WDL_FFT_COMPLEX output[0..len-1] order by WDL_fft_permute(len). */
+extern void WDL_fft(WDL_FFT_COMPLEX *, int len, int isInverse);
+
+/* Expects WDL_FFT_REAL input[0..len-1] scaled by 0.5/len, returns
+WDL_FFT_COMPLEX output[0..len/2-1], for len >= 4 order by
+WDL_fft_permute(len/2). Note that output[len/2].re is stored in
+output[0].im. */
+extern void WDL_real_fft(WDL_FFT_REAL *, int len, int isInverse);
+
+extern int WDL_fft_permute(int fftsize, int idx);
+extern int *WDL_fft_permute_tab(int fftsize);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif \ No newline at end of file
diff --git a/COPYING b/COPYING
new file mode 100644
index 00000000000..74d0fc76826
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,249 @@
+MAME is a registered trademark of Gregory Ember.
+
+MAME as a whole is made available under the terms of the GNU General
+Public License. Individual source files may be made available under
+less restrictive licenses, as noted in their respective header
+comments.
+
+Full license texts may be found in docs/legal in source and binary
+distributions.
+
+
+MAME
+Copyright (c) 1997-2020 MAMEdev and contributors
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 2, as provided
+in docs/legal/GPL-2.0.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+
+This software is based in part on the work of the Independent JPEG Group.
+
+
+Asio C++ Library
+Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+
+Permission is hereby granted, free of charge, to any person or
+organization obtaining a copy of the software and accompanying
+documentation covered by this license (the "Software") to use,
+reproduce, display, distribute, execute, and transmit the Software, and
+to prepare derivative works of the Software, and to permit third-parties
+to whom the Software is furnished to do so, all subject to the
+following:
+
+The copyright notices in the Software and this entire statement,
+including the above license grant, this restriction and the following
+disclaimer, must be included in all copies of the Software, in whole or
+in part, and all derivative works of the Software, unless such copies or
+derivative works are solely in the form of machine-executable object
+code generated by a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
+NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE
+DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY,
+WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+Berkeley SoftFloat - software implementation of binary floating-point that conforms to the IEEE Standard for Floating-Point Arithmetic
+Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California
+
+FLAC - Free Lossless Audio Codec
+Copyright (c) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson
+
+The msinttypes r29
+Copyright (c) 2006-2013 Alexander Chemeris
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+bgfx, bimg and bx
+Copyright (c) 2010-2019 Branimir Karadzic
+
+linenoise.c -- guerrilla line editing library
+Copyright (c) 2010, Salvatore Sanfilippo <antirez at gmail dot com>
+Copyright (c) 2010, Pieter Noordhuis <pcnoordhuis at gmail dot com>
+Copyright (c) 2011, Steve Bennett <steveb at workware dot net dot au>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Expat
+Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd and Clark Cooper
+Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers
+
+Lua - a powerful, fast, lightweight, embeddable scripting language
+Copyright (c) 1994-2017 Lua.org, PUC-Rio
+
+LuaFileSystem - File System Library for Lua
+Copyright (c) 2003-2015 Kepler Project
+
+LuaSQLite 3 - a Lua 5.1 to 5.3 wrapper for the SQLite3 library
+Copyright (c) 2002-2016 Tiago Dionizio, Doug Currie
+
+lua-linenoise
+Copyright (c) 2011-2015 Rob Hoelz <rob@hoelz.ro>
+
+lua_zlib - Lua 5.1 interface to zlib
+Copyright (c) 2009 Brian Maher
+
+OpenGL Mathematics (GLM)
+Copyright (c) 2005 -2016 G-Truc Creation
+
+PortAudio Portable Real-Time Audio Library
+Copyright (c) 1999-2006 Ross Bencina and Phil Burk
+
+PortMidi Portable Real-Time MIDI Library
+Copyright (c) 1999-2000 Ross Bencina and Phil Burk
+Copyright (c) 2001-2009 Roger B. Dannenberg
+
+pugixml - a C++ XML processing library
+Copyright (c) 2006-2016 Arseny Kapoulkine
+
+RapidJSON - A fast JSON parser/generator for C++ with both SAX/DOM style API
+Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
+
+Sol - a C++ library binding to Lua
+Copyright (c) 2013-2016 Rapptz and contributors
+
+tap-windows.h
+Copyright (C) 2002-2014 OpenVPN Technologies, Inc.
+
+utf8proc
+Copyright (c) 2014-2015 Steven G. Johnson, Jiahao Chen, Tony Kelman, Jonas Fonseca, and other contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+LZMA SDK
+
+LZMA SDK is written and placed in the public domain by Igor Pavlov.
+
+Some code in LZMA SDK is based on public domain code from another
+developers:
+ 1) PPMd var.H (2001): Dmitry Shkarin
+ 2) SHA-256: Wei Dai (Crypto++ library)
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute the original LZMA SDK code, either in source code form or as
+a compiled binary, for any purpose, commercial or non-commercial, and by
+any means.
+
+LZMA SDK code is compatible with open source licenses, for example, you
+can include it to GNU GPL or GNU LGPL code.
+
+
+Nano SVG = Simple stupid SVG parser
+Copyright (c) 2013-14 Mikko Mononen memon@inside.org
+
+Simple DirectMedia Layer
+Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
+
+WDL - fft.cpp
+Copyright (c) 2006 and later Cockos Incorporated
+Copyright (c) 1999 D. J. Bernstein
+
+zlib data compression library
+Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any source
+ distribution.
+
+
+SQLite
+
+2001 September 15
+
+The author disclaims copyright to this source code. In place of a legal
+notice, here is a blessing:
+
+ May you do good and not evil.
+ May you find forgiveness for yourself and forgive others.
+ May you share freely, never taking more than you give.
diff --git a/dist.mak b/dist.mak
index d2a0a0d41a2..1c8d9507aa6 100644
--- a/dist.mak
+++ b/dist.mak
@@ -102,9 +102,9 @@ BINDIR := build/$(PROJECTTYPE)/bin/$(BUILDARCH)/$(BUILDVARIANT)
STAGEDIR := build/release/$(BUILDARCH)/$(BUILDVARIANT)/$(TARGET)
BINARIES = $(MAINBIN) castool chdman floptool imgtool jedutil ldresample ldverify nltool nlwav romcmp unidasm
-SIMPLE_DIRS := ctrlr docs/man docs/swlist hash ini/examples ini/presets nl_examples
+SIMPLE_DIRS := ctrlr docs/legal docs/man docs/swlist hash ini/examples ini/presets
LOCALISATIONS := $(wildcard language/*/*.mo)
-COPIED_FILES := uismall.bdf roms/dir.txt $(foreach DIR,$(SIMPLE_DIRS),$(wildcard $(DIR)/*)) language/LICENSE language/README.md $(LOCALISATIONS)
+COPIED_FILES := COPYING uismall.bdf roms/dir.txt $(foreach DIR,$(SIMPLE_DIRS),$(wildcard $(DIR)/*)) language/LICENSE language/README.md $(LOCALISATIONS)
CREATED_DIRS := docs ini roms $(SIMPLE_DIRS) language $(dir $(LOCALISATIONS))
GEN_FOLDERS := $(addprefix $(STAGEDIR)/,$(CREATED_DIRS))
diff --git a/docs/legal/BSD-2-Clause b/docs/legal/BSD-2-Clause
new file mode 100644
index 00000000000..4f940427222
--- /dev/null
+++ b/docs/legal/BSD-2-Clause
@@ -0,0 +1,24 @@
+Copyright <YEAR> <COPYRIGHT HOLDER>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/legal/BSD-3-Clause b/docs/legal/BSD-3-Clause
new file mode 100644
index 00000000000..cc9ab753198
--- /dev/null
+++ b/docs/legal/BSD-3-Clause
@@ -0,0 +1,28 @@
+Copyright <YEAR> <COPYRIGHT HOLDER>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/legal/BSL-1.0 b/docs/legal/BSL-1.0
new file mode 100644
index 00000000000..08a61a07e8a
--- /dev/null
+++ b/docs/legal/BSL-1.0
@@ -0,0 +1,23 @@
+Permission is hereby granted, free of charge, to any person or
+organization obtaining a copy of the software and accompanying
+documentation covered by this license (the "Software") to use,
+reproduce, display, distribute, execute, and transmit the Software, and
+to prepare derivative works of the Software, and to permit third-parties
+to whom the Software is furnished to do so, all subject to the
+following:
+
+The copyright notices in the Software and this entire statement,
+including the above license grant, this restriction and the following
+disclaimer, must be included in all copies of the Software, in whole or
+in part, and all derivative works of the Software, unless such copies or
+derivative works are solely in the form of machine-executable object
+code generated by a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
+NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE
+DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY,
+WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/legal/CC0 b/docs/legal/CC0
new file mode 100644
index 00000000000..ccb8349e965
--- /dev/null
+++ b/docs/legal/CC0
@@ -0,0 +1,114 @@
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work
+of authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without
+fear of later claims of infringement build upon, modify, incorporate in
+other works, reuse and redistribute as freely as possible in any form
+whatsoever and for any purposes, including without limitation commercial
+purposes. These owners may contribute to the Commons to promote the
+ideal of a free culture and the further production of creative, cultural
+and scientific works, or to gain reputation or greater distribution for
+their Work in part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or
+she is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under
+its terms, with knowledge of his or her Copyright and Related Rights in
+the Work and the meaning and intended legal effect of CC0 on those
+rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or
+ performer(s);
+ iii. publicity and privacy rights pertaining to a person's image or
+ likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a
+ Work, subject to the limitations in paragraph 4(a), below;
+ v. rights protecting the extraction, dissemination, use and reuse
+ of data in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC
+ of the European Parliament and of the Council of 11 March 1996
+ on the legal protection of databases, and under any national
+ implementation thereof, including any amended or successor
+ version of such directive); and
+ vii. other similar, equivalent or corresponding rights throughout the
+ world based on applicable law or treaty, and any national
+ implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in
+contravention of, applicable law, Affirmer hereby overtly, fully,
+permanently, irrevocably and unconditionally waives, abandons, and
+surrenders all of Affirmer's Copyright and Related Rights and associated
+claims and causes of action, whether now known or unknown (including
+existing as well as future claims and causes of action), in the Work
+(i) in all territories worldwide, (ii) for the maximum duration provided
+by applicable law or treaty (including future time extensions), (iii) in
+any current or future medium and for any number of copies, and (iv) for
+any purpose whatsoever, including without limitation commercial,
+advertising or promotional purposes (the "Waiver"). Affirmer makes the
+Waiver for the benefit of each member of the public at large and to the
+detriment of Affirmer's heirs and successors, fully intending that such
+Waiver shall not be subject to revocation, rescission, cancellation,
+termination, or any other legal or equitable action to disrupt the quiet
+enjoyment of the Work by the public as contemplated by Affirmer's
+express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non
+exclusive, irrevocable and unconditional license to exercise Affirmer's
+Copyright and Related Rights in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or
+future medium and for any number of copies, and (iv) for any purpose
+whatsoever, including without limitation commercial, advertising or
+promotional purposes (the "License"). The License shall be deemed
+effective as of the date CC0 was applied by Affirmer to the Work.
+Should any part of the License for any reason be judged legally invalid
+or ineffective under applicable law, such partial invalidity or
+ineffectiveness shall not invalidate the remainder of the License, and
+in such case Affirmer hereby affirms that he or she will not
+(i) exercise any of his or her remaining Copyright and Related Rights in
+the Work or (ii) assert any associated claims and causes of action with
+respect to the Work, in either case contrary to Affirmer's express
+Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ i. No trademark or patent rights held by Affirmer are waived,
+ abandoned, surrendered, licensed or otherwise affected by this
+ document.
+ ii. Affirmer offers the Work as-is and makes no representations or
+ warranties of any kind concerning the Work, express, implied,
+ statutory or otherwise, including without limitation warranties
+ of title, merchantability, fitness for a particular purpose, non
+ infringement, or the absence of latent or other defects,
+ accuracy, or the present or absence of errors, whether or not
+ discoverable, all to the greatest extent permissible under
+ applicable law.
+ iii. Affirmer disclaims responsibility for clearing rights of other
+ persons that may apply to the Work or any use thereof, including
+ without limitation any person's Copyright and Related Rights in
+ the Work. Further, Affirmer disclaims responsibility for
+ obtaining any necessary consents, permissions or other rights
+ required for any use of the Work.
+ iv. Affirmer understands and acknowledges that Creative Commons is
+ not a party to this document and has no duty or obligation with
+ respect to this CC0 or use of the Work.
diff --git a/docs/legal/GPL-2.0 b/docs/legal/GPL-2.0
new file mode 100644
index 00000000000..2eec45e85ea
--- /dev/null
+++ b/docs/legal/GPL-2.0
@@ -0,0 +1,341 @@
+GNU GENERAL PUBLIC LICENSE
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to
+share and change it. By contrast, the GNU General Public License is
+intended to guarantee your freedom to share and change free software--to
+make sure the software is free for all its users. This General Public
+License applies to most of the Free Software Foundation's software and
+to any other program whose authors commit to using it. (Some other Free
+Software Foundation software is covered by the GNU Library General
+Public License instead.) You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price.
+Our General Public Licenses are designed to make sure that you have the
+freedom to distribute copies of free software (and charge for this
+service if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone
+to deny you these rights or to ask you to surrender the rights. These
+restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis
+or for a fee, you must give the recipients all the rights that you have.
+You must make sure that they, too, receive or can get the source code.
+And you must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+Finally, any free program is threatened constantly by software patents.
+We wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program
+proprietary. To prevent this, we have made it clear that any patent
+must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a
+notice placed by the copyright holder saying it may be distributed under
+the terms of this General Public License. The "Program", below, refers
+to any such program or work, and a "work based on the Program" means
+either the Program or any derivative work under copyright law: that is
+to say, a work containing the Program or a portion of it, either
+verbatim or with modifications and/or translated into another language.
+(Hereinafter, translation is included without limitation in the term
+"modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of running
+the Program is not restricted, and the output from the Program is
+covered only if its contents constitute a work based on the Program
+(independent of having been made by running the Program). Whether that
+is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source
+code as you receive it, in any medium, provided that you conspicuously
+and appropriately publish on each copy an appropriate copyright notice
+and disclaimer of warranty; keep intact all the notices that refer to
+this License and to the absence of any warranty; and give any other
+recipients of the Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of
+it, thus forming a work based on the Program, and copy and distribute
+such modifications or work under the terms of Section 1 above, provided
+that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you
+ provide a warranty) and that users may redistribute the program
+ under these conditions, and telling the user how to view a copy
+ of this License. (Exception: if the Program itself is
+ interactive but does not normally print such an announcement,
+ your work based on the Program is not required to print an
+ announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program, and
+can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based on
+the Program, the distribution of the whole must be on the terms of this
+License, whose permissions for other licensees extend to the entire
+whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of a
+storage or distribution medium does not bring the other work under the
+scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of
+ Sections 1 and 2 above on a medium customarily used for software
+ interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer to
+ distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to control
+compilation and installation of the executable. However, as a special
+exception, the source code distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies the
+executable.
+
+If distribution of executable or object code is made by offering access
+to copy from a designated place, then offering equivalent access to copy
+the source code from the same place counts as distribution of the source
+code, even though third parties are not compelled to copy the source
+along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt otherwise
+to copy, modify, sublicense or distribute the Program is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this License
+will not have their licenses terminated so long as such parties remain
+in full compliance.
+
+5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and all
+its terms and conditions for copying, distributing or modifying the
+Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further restrictions
+on the recipients' exercise of the rights granted herein. You are not
+responsible for enforcing compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent license
+would not permit royalty-free redistribution of the Program by all those
+who receive copies directly or indirectly through you, then the only way
+you could satisfy both it and this License would be to refrain entirely
+from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is implemented
+by public license practices. Many people have made generous
+contributions to the wide range of software distributed through that
+system in reliance on consistent application of that system; it is up to
+the author/donor to decide if he or she is willing to distribute
+software through any other system and a licensee cannot impose that
+choice.
+
+This section is intended to make thoroughly clear what is believed to be
+a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License may
+add an explicit geographical distribution limitation excluding those
+countries, so that distribution is permitted only in or among countries
+not thus excluded. In such case, this License incorporates the
+limitation as if written in the body of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Program does not specify a version
+number of this License, you may choose any version ever published by the
+Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the
+author to ask for permission. For software which is copyrighted by the
+Free Software Foundation, write to the Free Software Foundation; we
+sometimes make exceptions for this. Our decision will be guided by the
+two goals of preserving the free status of all derivatives of our free
+software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
+ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH
+YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
+DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
+DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM
+(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
+INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF
+THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR
+OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+To do so, attach the following notices to the program. It is safest to
+attach them to the start of each source file to most effectively convey
+the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ One line to give the program's name and a brief idea of what it does.
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the
+ Free Software Foundation, Inc.,
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type
+ `show w'. This is free software, and you are welcome to redistribute
+ it under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than `show w' and
+`show c'; they could even be mouse-clicks or menu items--whatever suits
+your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ program `Gnomovision' (which makes passes at compilers) written by
+ James Hacker.
+
+ signature of Ty Coon, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications
+with the library. If this is what you want to do, use the GNU Library
+General Public License instead of this License.
diff --git a/docs/legal/LGPL-2.1 b/docs/legal/LGPL-2.1
new file mode 100644
index 00000000000..fec7e1cee36
--- /dev/null
+++ b/docs/legal/LGPL-2.1
@@ -0,0 +1,499 @@
+GNU Lesser General Public License
+Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies of this
+ license document, but changing it is not allowed.
+
+ [This is the first released version of the Lesser GPL. It also
+ counts as the successor of the GNU Library Public License,
+ version 2, hence the version number 2.1.]
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to
+share and change it. By contrast, the GNU General Public Licenses are
+intended to guarantee your freedom to share and change free software--to
+make sure the software is free for all its users.
+
+This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the Free
+Software Foundation and other authors who decide to use it. You can use
+it too, but we suggest you first think carefully about whether this
+license or the ordinary General Public License is the better strategy to
+use in any particular case, based on the explanations below.
+
+When we speak of free software, we are referring to freedom of use, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish); that you receive source code or can get it if
+you want it; that you can change the software and use pieces of it in
+new free programs; and that you are informed that you can do these
+things.
+
+To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+For example, if you distribute copies of the library, whether gratis or
+for a fee, you must give the recipients all the rights that we gave you.
+You must make sure that they, too, receive or can get the source code.
+If you link other code with the library, you must provide complete
+object files to the recipients, so that they can relink them with the
+library after making changes to the library and recompiling it. And you
+must show them these terms so they know their rights.
+
+We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+To protect each distributor, we want to make it very clear that there is
+no warranty for the free library. Also, if the library is modified by
+someone else and passed on, the recipients should know that what they
+have is not the original version, so that the original author's
+reputation will not be affected by problems that might be introduced by
+others.
+
+Finally, software patents pose a constant threat to the existence of any
+free program. We wish to make sure that a company cannot effectively
+restrict the users of a free program by obtaining a restrictive license
+from a patent holder. Therefore, we insist that any patent license
+obtained for a version of the library must be consistent with the full
+freedom of use specified in this license.
+
+Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License. This license, the GNU Lesser General Public
+License, applies to certain designated libraries, and is quite different
+from the ordinary General Public License. We use this license for
+certain libraries in order to permit linking those libraries into
+non-free programs.
+
+When a program is linked with a library, whether statically or using a
+shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the entire
+combination fits its criteria of freedom. The Lesser General Public
+License permits more lax criteria for linking other code with the
+library.
+
+We call this license the "Lesser" General Public License because it does
+Less to protect the user's freedom than the ordinary General Public
+License. It also provides other free software developers Less of an
+advantage over competing non-free programs. These disadvantages are the
+reason we use the ordinary General Public License for many libraries.
+However, the Lesser license provides advantages in certain special
+circumstances.
+
+For example, on rare occasions, there may be a special need to encourage
+the widest possible use of a certain library, so that it becomes a
+de-facto standard. To achieve this, non-free programs must be allowed
+to use the library. A more frequent case is that a free library does
+the same job as widely used non-free libraries. In this case, there is
+little to gain by limiting the free library to free software only, so we
+use the Lesser General Public License.
+
+In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of free
+software. For example, permission to use the GNU C Library in non-free
+programs enables many more people to use the whole GNU operating system,
+as well as its variant, the GNU/Linux operating system.
+
+Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is linked
+with the Library has the freedom and the wherewithal to run that program
+using a modified version of the Library.
+
+The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or other
+authorized party saying it may be distributed under the terms of this
+Lesser General Public License (also called "this License"). Each
+licensee is addressed as "you".
+
+A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+The "Library", below, refers to any such software library or work which
+has been distributed under these terms. A "work based on the Library"
+means either the Library or any derivative work under copyright law:
+that is to say, a work containing the Library or a portion of it, either
+verbatim or with modifications and/or translated straightforwardly into
+another language. (Hereinafter, translation is included without
+limitation in the term "modification".)
+
+"Source code" for a work means the preferred form of the work for making
+modifications to it. For a library, complete source code means all the
+source code for all modules it contains, plus any associated interface
+definition files, plus the scripts used to control compilation and
+installation of the library.
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of running
+a program using the Library is not restricted, and output from such a
+program is covered only if its contents constitute a work based on the
+Library (independent of the use of the Library in a tool for writing
+it). Whether that is true depends on what the Library does and what the
+program that uses the Library does.
+
+1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the notices
+that refer to this License and to the absence of any warranty; and
+distribute a copy of this License along with the Library.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Library or any portion of
+it, thus forming a work based on the Library, and copy and distribute
+such modifications or work under the terms of Section 1 above, provided
+that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no charge
+ to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure
+ that, in the event an application does not supply such function
+ or table, the facility still operates, and performs whatever part
+ of its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has a
+ purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must be
+ optional: if the application does not supply it, the square root
+ function must still compute square roots.)
+
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the Library,
+ and can be reasonably considered independent and separate works in
+ themselves, then this License, and its terms, do not apply to those
+ sections when you distribute them as separate works. But when you
+ distribute the same sections as part of a whole which is a work
+ based on the Library, the distribution of the whole must be on the
+ terms of this License, whose permissions for other licensees extend
+ to the entire whole, and thus to each and every part regardless of
+ who wrote it.
+
+ Thus, it is not the intent of this section to claim rights or
+ contest your rights to work written entirely by you; rather, the
+ intent is to exercise the right to control the distribution of
+ derivative or collective works based on the Library.
+
+ In addition, mere aggregation of another work not based on the
+ Library with the Library (or with a work based on the Library) on a
+ volume of a storage or distribution medium does not bring the other
+ work under the scope of this License.
+
+3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so that
+they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in these
+notices.
+
+Once this change is made in a given copy, it is irreversible for that
+copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+This option is useful when you wish to copy part of the code of the
+Library into a program that is not a library.
+
+4. You may copy and distribute the Library (or a portion or derivative
+of it, under Section 2) in object code or executable form under the
+terms of Sections 1 and 2 above provided that you accompany it with the
+complete corresponding machine-readable source code, which must be
+distributed under the terms of Sections 1 and 2 above on a medium
+customarily used for software interchange.
+
+If distribution of object code is made by offering access to copy from a
+designated place, then offering equivalent access to copy the source
+code from the same place satisfies the requirement to distribute the
+source code, even though third parties are not compelled to copy the
+source along with the object code.
+
+5. A program that contains no derivative of any portion of the Library,
+but is designed to work with the Library by being compiled or linked
+with it, is called a "work that uses the Library". Such a work, in
+isolation, is not a derivative work of the Library, and therefore falls
+outside the scope of this License.
+
+However, linking a "work that uses the Library" with the Library creates
+an executable that is a derivative of the Library (because it contains
+portions of the Library), rather than a "work that uses the library".
+The executable is therefore covered by this License. Section 6 states
+terms for distribution of such executables.
+
+When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be linked
+without the Library, or if the work is itself a library. The threshold
+for this to be true is not precisely defined by law.
+
+If such an object file uses only numerical parameters, data structure
+layouts and accessors, and small macros and small inline functions (ten
+lines or less in length), then the use of the object file is
+unrestricted, regardless of whether it is legally a derivative work.
+(Executables containing this object code plus portions of the Library
+will still fall under Section 6.)
+
+Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6, whether
+or not they are linked directly with the Library itself.
+
+6. As an exception to the Sections above, you may also combine or link
+a "work that uses the Library" with the Library to produce a work
+containing portions of the Library, and distribute that work under terms
+of your choice, provided that the terms permit modification of the work
+for the customer's own use and reverse engineering for debugging such
+modifications.
+
+You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one of
+these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in
+ the Library will not necessarily be able to recompile the
+ application to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer
+ system, rather than copying library functions into the
+ executable, and (2) will operate properly with a modified version
+ of the library, if the user installs one, as long as the modified
+ version is interface-compatible with the version that the work
+ was made with.
+
+ c) Accompany the work with a written offer, valid for at least three
+ years, to give the same user the materials specified in
+ Subsection 6a, above, for a charge no more than the cost of
+ performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the
+ above specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+For an executable, the required form of the "work that uses the Library"
+must include any data and utility programs needed for reproducing the
+executable from it. However, as a special exception, the materials to be
+distributed need not include anything that is normally distributed (in
+either source or binary form) with the major components (compiler,
+kernel, and so on) of the operating system on which the executable runs,
+unless that component itself accompanies the executable.
+
+It may happen that this requirement contradicts the license restrictions
+of other proprietary libraries that do not normally accompany the
+operating system. Such a contradiction means you cannot use both them
+and the Library together in an executable that you distribute.
+
+7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise permitted,
+and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities.
+ This must be distributed under the terms of the Sections above.
+
+ b) Give prominent notice with the combined library of the fact that
+ part of it is a work based on the Library, and explaining where
+ to find the accompanying uncombined form of the same work.
+
+8. You may not copy, modify, sublicense, link with, or distribute the
+Library except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, link with, or distribute the
+Library is void, and will automatically terminate your rights under this
+License. However, parties who have received copies, or rights, from you
+under this License will not have their licenses terminated so long as
+such parties remain in full compliance.
+
+9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and all
+its terms and conditions for copying, distributing or modifying the
+Library or works based on it.
+
+10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent license
+would not permit royalty-free redistribution of the Library by all those
+who receive copies directly or indirectly through you, then the only way
+you could satisfy both it and this License would be to refrain entirely
+from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply, and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is implemented
+by public license practices. Many people have made generous
+contributions to the wide range of software distributed through that
+system in reliance on consistent application of that system; it is up to
+the author/donor to decide if he or she is willing to distribute
+software through any other system and a licensee cannot impose that
+choice.
+
+This section is intended to make thoroughly clear what is believed to be
+a consequence of the rest of this License.
+
+12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may
+add an explicit geographical distribution limitation excluding those
+countries, so that distribution is permitted only in or among countries
+not thus excluded. In such case, this License incorporates the
+limitation as if written in the body of this License.
+
+13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time. Such
+new versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a license
+version number, you may choose any version ever published by the Free
+Software Foundation.
+
+14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free Software
+Foundation; we sometimes make exceptions for this. Our decision will be
+guided by the two goals of preserving the free status of all derivatives
+of our free software and of promoting the sharing and reuse of software
+generally.
+
+NO WARRANTY
+
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
+ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH
+YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
+DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
+DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY
+(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
+INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF
+THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR
+OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Libraries
+
+If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of
+the ordinary General Public License).
+
+To apply these terms, attach the following notices to the library. It
+is safest to attach them to the start of each source file to most
+effectively convey the exclusion of warranty; and each file should have
+at least the "copyright" line and a pointer to where the full notice is
+found.
+
+ <one line to give the library's name and an idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the
+ Free Software Foundation, Inc.,
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by
+ James Random Hacker.
+
+ signature of Ty Coon, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/docs/legal/MIT b/docs/legal/MIT
new file mode 100644
index 00000000000..f287107d6f7
--- /dev/null
+++ b/docs/legal/MIT
@@ -0,0 +1,20 @@
+Copyright <YEAR> <COPYRIGHT HOLDER>
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/docs/legal/Zlib b/docs/legal/Zlib
new file mode 100644
index 00000000000..30da938c7b2
--- /dev/null
+++ b/docs/legal/Zlib
@@ -0,0 +1,20 @@
+Copyright (c) <year> <copyright holders>
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any source
+ distribution.
diff --git a/scripts/src/3rdparty.lua b/scripts/src/3rdparty.lua
index bec2382971d..d51ba5196ef 100644
--- a/scripts/src/3rdparty.lua
+++ b/scripts/src/3rdparty.lua
@@ -74,6 +74,7 @@ links {
}
end
+
--------------------------------------------------
-- zlib library objects
--------------------------------------------------
@@ -139,6 +140,7 @@ links {
}
end
+
--------------------------------------------------
-- SoftFloat library objects
--------------------------------------------------
@@ -179,6 +181,7 @@ end
MAME_DIR .. "3rdparty/softfloat/fyl2x.c",
}
+
--------------------------------------------------
-- SoftFloat 3 library objects
--------------------------------------------------
@@ -523,6 +526,7 @@ files {
MAME_DIR .. "3rdparty/softfloat3/source/f128M_lt_quiet.c",
}
+
-------------------------------------------------
-- libJPEG library objects
--------------------------------------------------
@@ -605,6 +609,7 @@ links {
}
end
+
--------------------------------------------------
-- libflac library objects
--------------------------------------------------
@@ -698,6 +703,7 @@ links {
}
end
+
--------------------------------------------------
-- lib7z library objects
--------------------------------------------------
@@ -784,6 +790,7 @@ end
-- MAME_DIR .. "3rdparty/lzma/C/XzIn.c",
}
+
--------------------------------------------------
-- LUA library objects
--------------------------------------------------
@@ -889,6 +896,7 @@ links {
}
end
+
--------------------------------------------------
-- small lua library objects
--------------------------------------------------
@@ -995,9 +1003,12 @@ links {
end
end
+
+
--------------------------------------------------
-- portmidi library objects
--------------------------------------------------
+
if _OPTIONS["NO_USE_MIDI"]~="1" then
if not _OPTIONS["with-system-portmidi"] then
project "portmidi"
@@ -1079,6 +1090,7 @@ links {
end
end
+
--------------------------------------------------
-- BX library objects
--------------------------------------------------
@@ -1157,6 +1169,7 @@ project "bx"
MAME_DIR .. "3rdparty/bx/src/url.cpp",
}
+
--------------------------------------------------
-- BIMG library objects
--------------------------------------------------
@@ -1232,6 +1245,7 @@ project "bimg"
MAME_DIR .. "3rdparty/bimg/3rdparty/astc-codec/src/decoder/weight_infill.cc",
}
+
--------------------------------------------------
-- BGFX library objects
--------------------------------------------------
@@ -1420,9 +1434,11 @@ end
}
end
+
--------------------------------------------------
-- PortAudio library objects
--------------------------------------------------
+
if _OPTIONS["NO_USE_PORTAUDIO"]~="1" then
if not _OPTIONS["with-system-portaudio"] then
project "portaudio"
@@ -1591,6 +1607,7 @@ links {
end
end
+
--------------------------------------------------
-- SDL2 library
--------------------------------------------------
@@ -2101,9 +2118,11 @@ end
end
+
--------------------------------------------------
-- linenoise library
--------------------------------------------------
+
if (_OPTIONS["osd"] ~= "uwp") then
project "linenoise"
uuid "7320ffc8-2748-4add-8864-ae29b72a8511"
@@ -2138,9 +2157,9 @@ project "utf8proc"
uuid "1f881f09-0395-4483-ac37-2935fb092187"
kind "StaticLib"
- defines {
- "UTF8PROC_DLLEXPORT="
- }
+ defines {
+ "UTF8PROC_DLLEXPORT="
+ }
configuration "Debug"
defines {
@@ -2166,3 +2185,23 @@ links {
}
end
+
+--------------------------------------------------
+-- wdlfft library objects (from Cockos WDL)
+--------------------------------------------------
+
+project "wdlfft"
+ uuid "74ca017e-fa0d-48b8-81d6-8081a37be14c"
+ kind "StaticLib"
+
+ configuration { "gmake or ninja" }
+ buildoptions_c {
+ "-Wno-strict-prototypes",
+ }
+
+ configuration { }
+
+ files {
+ MAME_DIR .. "3rdparty/wdlfft/fft.c",
+ MAME_DIR .. "3rdparty/wdlfft/fft.h"
+ }
diff --git a/scripts/src/main.lua b/scripts/src/main.lua
index 4be1b9af7af..65eeadd4300 100644
--- a/scripts/src/main.lua
+++ b/scripts/src/main.lua
@@ -258,6 +258,7 @@ end
ext_lib("expat"),
"softfloat",
"softfloat3",
+ "wdlfft",
ext_lib("jpeg"),
"7z",
}
diff --git a/scripts/src/sound.lua b/scripts/src/sound.lua
index d1028cceeb6..fdf1ea43f66 100644
--- a/scripts/src/sound.lua
+++ b/scripts/src/sound.lua
@@ -1551,7 +1551,5 @@ if (SOUNDS["VGMVIZ"]~=null) then
files {
MAME_DIR .. "src/devices/sound/vgm_visualizer.cpp",
MAME_DIR .. "src/devices/sound/vgm_visualizer.h",
- MAME_DIR .. "src/devices/sound/fft.cpp",
- MAME_DIR .. "src/devices/sound/fft.h",
}
end
diff --git a/src/devices/sound/fft.cpp b/src/devices/sound/fft.cpp
deleted file mode 100644
index af5e6536feb..00000000000
--- a/src/devices/sound/fft.cpp
+++ /dev/null
@@ -1,1206 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Justin Frankel
-/*
- WDL - fft.cpp
- Copyright (C) 2006 and later Cockos Incorporated
- Copyright 1999 D. J. Bernstein
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
-
-
- This file implements the WDL FFT library. These routines are based on the
- DJBFFT library, which are Copyright 1999 D. J. Bernstein, djb@pobox.com
-
- The DJB FFT web page is: http://cr.yp.to/djbfft.html
-
-
- This file is modified from the original; it has been reformatted for 4-space
- tabs and to have the 'register' keyword omitted.
-*/
-
-
-// this is based on djbfft
-
-#include "emu.h"
-#include <math.h>
-#include "fft.h"
-
-
-#define FFT_MAXBITLEN 15
-
-#ifdef _MSC_VER
-#define inline __inline
-#endif
-
-#define PI 3.1415926535897932384626433832795
-
-static WDL_FFT_COMPLEX d16[3];
-static WDL_FFT_COMPLEX d32[7];
-static WDL_FFT_COMPLEX d64[15];
-static WDL_FFT_COMPLEX d128[31];
-static WDL_FFT_COMPLEX d256[63];
-static WDL_FFT_COMPLEX d512[127];
-static WDL_FFT_COMPLEX d1024[127];
-static WDL_FFT_COMPLEX d2048[255];
-static WDL_FFT_COMPLEX d4096[511];
-static WDL_FFT_COMPLEX d8192[1023];
-static WDL_FFT_COMPLEX d16384[2047];
-static WDL_FFT_COMPLEX d32768[4095];
-
-
-#define sqrthalf (d16[1].re)
-
-#define VOL *(volatile WDL_FFT_REAL *)&
-
-#define TRANSFORM(a0,a1,a2,a3,wre,wim) { \
- t6 = a2.re; \
- t1 = a0.re - t6; \
- t6 += a0.re; \
- a0.re = t6; \
- t3 = a3.im; \
- t4 = a1.im - t3; \
- t8 = t1 - t4; \
- t1 += t4; \
- t3 += a1.im; \
- a1.im = t3; \
- t5 = wre; \
- t7 = t8 * t5; \
- t4 = t1 * t5; \
- t8 *= wim; \
- t2 = a3.re; \
- t3 = a1.re - t2; \
- t2 += a1.re; \
- a1.re = t2; \
- t1 *= wim; \
- t6 = a2.im; \
- t2 = a0.im - t6; \
- t6 += a0.im; \
- a0.im = t6; \
- t6 = t2 + t3; \
- t2 -= t3; \
- t3 = t6 * wim; \
- t7 -= t3; \
- a2.re = t7; \
- t6 *= t5; \
- t6 += t8; \
- a2.im = t6; \
- t5 *= t2; \
- t5 -= t1; \
- a3.im = t5; \
- t2 *= wim; \
- t4 += t2; \
- a3.re = t4; \
- }
-
-#define TRANSFORMHALF(a0,a1,a2,a3) { \
- t1 = a2.re; \
- t5 = a0.re - t1; \
- t1 += a0.re; \
- a0.re = t1; \
- t4 = a3.im; \
- t8 = a1.im - t4; \
- t1 = t5 - t8; \
- t5 += t8; \
- t4 += a1.im; \
- a1.im = t4; \
- t3 = a3.re; \
- t7 = a1.re - t3; \
- t3 += a1.re; \
- a1.re = t3; \
- t8 = a2.im; \
- t6 = a0.im - t8; \
- t2 = t6 + t7; \
- t6 -= t7; \
- t8 += a0.im; \
- a0.im = t8; \
- t4 = t6 + t5; \
- t3 = sqrthalf; \
- t4 *= t3; \
- a3.re = t4; \
- t6 -= t5; \
- t6 *= t3; \
- a3.im = t6; \
- t7 = t1 - t2; \
- t7 *= t3; \
- a2.re = t7; \
- t2 += t1; \
- t2 *= t3; \
- a2.im = t2; \
- }
-
-#define TRANSFORMZERO(a0,a1,a2,a3) { \
- t5 = a2.re; \
- t1 = a0.re - t5; \
- t5 += a0.re; \
- a0.re = t5; \
- t8 = a3.im; \
- t4 = a1.im - t8; \
- t7 = a3.re; \
- t6 = t1 - t4; \
- a2.re = t6; \
- t1 += t4; \
- a3.re = t1; \
- t8 += a1.im; \
- a1.im = t8; \
- t3 = a1.re - t7; \
- t7 += a1.re; \
- a1.re = t7; \
- t6 = a2.im; \
- t2 = a0.im - t6; \
- t7 = t2 + t3; \
- a2.im = t7; \
- t2 -= t3; \
- a3.im = t2; \
- t6 += a0.im; \
- a0.im = t6; \
- }
-
-#define UNTRANSFORM(a0,a1,a2,a3,wre,wim) { \
- t6 = VOL wre; \
- t1 = VOL a2.re; \
- t1 *= t6; \
- t8 = VOL wim; \
- t3 = VOL a2.im; \
- t3 *= t8; \
- t2 = VOL a2.im; \
- t4 = VOL a2.re; \
- t5 = VOL a3.re; \
- t5 *= t6; \
- t7 = VOL a3.im; \
- t1 += t3; \
- t7 *= t8; \
- t5 -= t7; \
- t3 = t5 + t1; \
- t5 -= t1; \
- t2 *= t6; \
- t6 *= a3.im; \
- t4 *= t8; \
- t2 -= t4; \
- t8 *= a3.re; \
- t6 += t8; \
- t1 = a0.re - t3; \
- t3 += a0.re; \
- a0.re = t3; \
- t7 = a1.im - t5; \
- t5 += a1.im; \
- a1.im = t5; \
- t4 = t2 - t6; \
- t6 += t2; \
- t8 = a1.re - t4; \
- t4 += a1.re; \
- a1.re = t4; \
- t2 = a0.im - t6; \
- t6 += a0.im; \
- a0.im = t6; \
- a2.re = t1; \
- a3.im = t7; \
- a3.re = t8; \
- a2.im = t2; \
- }
-
-
-#define UNTRANSFORMHALF(a0,a1,a2,a3) { \
- t6 = sqrthalf; \
- t1 = a2.re; \
- t2 = a2.im - t1; \
- t2 *= t6; \
- t1 += a2.im; \
- t1 *= t6; \
- t4 = a3.im; \
- t3 = a3.re - t4; \
- t3 *= t6; \
- t4 += a3.re; \
- t4 *= t6; \
- t8 = t3 - t1; \
- t7 = t2 - t4; \
- t1 += t3; \
- t2 += t4; \
- t4 = a1.im - t8; \
- a3.im = t4; \
- t8 += a1.im; \
- a1.im = t8; \
- t3 = a1.re - t7; \
- a3.re = t3; \
- t7 += a1.re; \
- a1.re = t7; \
- t5 = a0.re - t1; \
- a2.re = t5; \
- t1 += a0.re; \
- a0.re = t1; \
- t6 = a0.im - t2; \
- a2.im = t6; \
- t2 += a0.im; \
- a0.im = t2; \
- }
-
-#define UNTRANSFORMZERO(a0,a1,a2,a3) { \
- t2 = a3.im; \
- t3 = a2.im - t2; \
- t2 += a2.im; \
- t1 = a2.re; \
- t4 = a3.re - t1; \
- t1 += a3.re; \
- t5 = a0.re - t1; \
- a2.re = t5; \
- t6 = a0.im - t2; \
- a2.im = t6; \
- t7 = a1.re - t3; \
- a3.re = t7; \
- t8 = a1.im - t4; \
- a3.im = t8; \
- t1 += a0.re; \
- a0.re = t1; \
- t2 += a0.im; \
- a0.im = t2; \
- t3 += a1.re; \
- a1.re = t3; \
- t4 += a1.im; \
- a1.im = t4; \
- }
-
-static void c2(WDL_FFT_COMPLEX *a)
-{
- WDL_FFT_REAL t1;
-
- t1 = a[1].re;
- a[1].re = a[0].re - t1;
- a[0].re += t1;
-
- t1 = a[1].im;
- a[1].im = a[0].im - t1;
- a[0].im += t1;
-}
-
-static inline void c4(WDL_FFT_COMPLEX *a)
-{
- WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
-
- t5 = a[2].re;
- t1 = a[0].re - t5;
- t7 = a[3].re;
- t5 += a[0].re;
- t3 = a[1].re - t7;
- t7 += a[1].re;
- t8 = t5 + t7;
- a[0].re = t8;
- t5 -= t7;
- a[1].re = t5;
- t6 = a[2].im;
- t2 = a[0].im - t6;
- t6 += a[0].im;
- t5 = a[3].im;
- a[2].im = t2 + t3;
- t2 -= t3;
- a[3].im = t2;
- t4 = a[1].im - t5;
- a[3].re = t1 + t4;
- t1 -= t4;
- a[2].re = t1;
- t5 += a[1].im;
- a[0].im = t6 + t5;
- t6 -= t5;
- a[1].im = t6;
-}
-
-static void c8(WDL_FFT_COMPLEX *a)
-{
- WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
-
- t7 = a[4].im;
- t4 = a[0].im - t7;
- t7 += a[0].im;
- a[0].im = t7;
-
- t8 = a[6].re;
- t5 = a[2].re - t8;
- t8 += a[2].re;
- a[2].re = t8;
-
- t7 = a[6].im;
- a[6].im = t4 - t5;
- t4 += t5;
- a[4].im = t4;
-
- t6 = a[2].im - t7;
- t7 += a[2].im;
- a[2].im = t7;
-
- t8 = a[4].re;
- t3 = a[0].re - t8;
- t8 += a[0].re;
- a[0].re = t8;
-
- a[4].re = t3 - t6;
- t3 += t6;
- a[6].re = t3;
-
- t7 = a[5].re;
- t3 = a[1].re - t7;
- t7 += a[1].re;
- a[1].re = t7;
-
- t8 = a[7].im;
- t6 = a[3].im - t8;
- t8 += a[3].im;
- a[3].im = t8;
- t1 = t3 - t6;
- t3 += t6;
-
- t7 = a[5].im;
- t4 = a[1].im - t7;
- t7 += a[1].im;
- a[1].im = t7;
-
- t8 = a[7].re;
- t5 = a[3].re - t8;
- t8 += a[3].re;
- a[3].re = t8;
-
- t2 = t4 - t5;
- t4 += t5;
-
- t6 = t1 - t4;
- t8 = sqrthalf;
- t6 *= t8;
- a[5].re = a[4].re - t6;
- t1 += t4;
- t1 *= t8;
- a[5].im = a[4].im - t1;
- t6 += a[4].re;
- a[4].re = t6;
- t1 += a[4].im;
- a[4].im = t1;
-
- t5 = t2 - t3;
- t5 *= t8;
- a[7].im = a[6].im - t5;
- t2 += t3;
- t2 *= t8;
- a[7].re = a[6].re - t2;
- t2 += a[6].re;
- a[6].re = t2;
- t5 += a[6].im;
- a[6].im = t5;
-
- c4(a);
-}
-
-static void c16(WDL_FFT_COMPLEX *a)
-{
- WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
-
- TRANSFORMZERO(a[0],a[4],a[8],a[12]);
- TRANSFORM(a[1],a[5],a[9],a[13],d16[0].re,d16[0].im);
- TRANSFORMHALF(a[2],a[6],a[10],a[14]);
- TRANSFORM(a[3],a[7],a[11],a[15],d16[0].im,d16[0].re);
- c4(a + 8);
- c4(a + 12);
-
- c8(a);
-}
-
-/* a[0...8n-1], w[0...2n-2]; n >= 2 */
-static void cpass(WDL_FFT_COMPLEX *a,const WDL_FFT_COMPLEX *w,unsigned int n)
-{
- WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
- WDL_FFT_COMPLEX *a1;
- WDL_FFT_COMPLEX *a2;
- WDL_FFT_COMPLEX *a3;
-
- a2 = a + 4 * n;
- a1 = a + 2 * n;
- a3 = a2 + 2 * n;
- --n;
-
- TRANSFORMZERO(a[0],a1[0],a2[0],a3[0]);
- TRANSFORM(a[1],a1[1],a2[1],a3[1],w[0].re,w[0].im);
-
- for (;;) {
- TRANSFORM(a[2],a1[2],a2[2],a3[2],w[1].re,w[1].im);
- TRANSFORM(a[3],a1[3],a2[3],a3[3],w[2].re,w[2].im);
- if (!--n) break;
- a += 2;
- a1 += 2;
- a2 += 2;
- a3 += 2;
- w += 2;
- }
-}
-
-static void c32(WDL_FFT_COMPLEX *a)
-{
- cpass(a,d32,4);
- c8(a + 16);
- c8(a + 24);
- c16(a);
-}
-
-static void c64(WDL_FFT_COMPLEX *a)
-{
- cpass(a,d64,8);
- c16(a + 32);
- c16(a + 48);
- c32(a);
-}
-
-static void c128(WDL_FFT_COMPLEX *a)
-{
- cpass(a,d128,16);
- c32(a + 64);
- c32(a + 96);
- c64(a);
-}
-
-static void c256(WDL_FFT_COMPLEX *a)
-{
- cpass(a,d256,32);
- c64(a + 128);
- c64(a + 192);
- c128(a);
-}
-
-static void c512(WDL_FFT_COMPLEX *a)
-{
- cpass(a,d512,64);
- c128(a + 384);
- c128(a + 256);
- c256(a);
-}
-
-/* a[0...8n-1], w[0...n-2]; n even, n >= 4 */
-static void cpassbig(WDL_FFT_COMPLEX *a,const WDL_FFT_COMPLEX *w,unsigned int n)
-{
- WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
- WDL_FFT_COMPLEX *a1;
- WDL_FFT_COMPLEX *a2;
- WDL_FFT_COMPLEX *a3;
- unsigned int k;
-
- a2 = a + 4 * n;
- a1 = a + 2 * n;
- a3 = a2 + 2 * n;
- k = n - 2;
-
- TRANSFORMZERO(a[0],a1[0],a2[0],a3[0]);
- TRANSFORM(a[1],a1[1],a2[1],a3[1],w[0].re,w[0].im);
- a += 2;
- a1 += 2;
- a2 += 2;
- a3 += 2;
-
- do {
- TRANSFORM(a[0],a1[0],a2[0],a3[0],w[1].re,w[1].im);
- TRANSFORM(a[1],a1[1],a2[1],a3[1],w[2].re,w[2].im);
- a += 2;
- a1 += 2;
- a2 += 2;
- a3 += 2;
- w += 2;
- } while (k -= 2);
-
- TRANSFORMHALF(a[0],a1[0],a2[0],a3[0]);
- TRANSFORM(a[1],a1[1],a2[1],a3[1],w[0].im,w[0].re);
- a += 2;
- a1 += 2;
- a2 += 2;
- a3 += 2;
-
- k = n - 2;
- do {
- TRANSFORM(a[0],a1[0],a2[0],a3[0],w[-1].im,w[-1].re);
- TRANSFORM(a[1],a1[1],a2[1],a3[1],w[-2].im,w[-2].re);
- a += 2;
- a1 += 2;
- a2 += 2;
- a3 += 2;
- w -= 2;
- } while (k -= 2);
-}
-
-
-static void c1024(WDL_FFT_COMPLEX *a)
-{
- cpassbig(a,d1024,128);
- c256(a + 768);
- c256(a + 512);
- c512(a);
-}
-
-static void c2048(WDL_FFT_COMPLEX *a)
-{
- cpassbig(a,d2048,256);
- c512(a + 1536);
- c512(a + 1024);
- c1024(a);
-}
-
-static void c4096(WDL_FFT_COMPLEX *a)
-{
- cpassbig(a,d4096,512);
- c1024(a + 3072);
- c1024(a + 2048);
- c2048(a);
-}
-
-static void c8192(WDL_FFT_COMPLEX *a)
-{
- cpassbig(a,d8192,1024);
- c2048(a + 6144);
- c2048(a + 4096);
- c4096(a);
-}
-
-static void c16384(WDL_FFT_COMPLEX *a)
-{
- cpassbig(a,d16384,2048);
- c4096(a + 8192 + 4096);
- c4096(a + 8192);
- c8192(a);
-}
-
-static void c32768(WDL_FFT_COMPLEX *a)
-{
- cpassbig(a,d32768,4096);
- c8192(a + 16384 + 8192);
- c8192(a + 16384);
- c16384(a);
-}
-
-
-/* n even, n > 0 */
-void WDL_fft_complexmul(WDL_FFT_COMPLEX *a,WDL_FFT_COMPLEX *b,int n)
-{
- WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
- if (n<2 || (n&1)) return;
-
- do {
- t1 = a[0].re * b[0].re;
- t2 = a[0].im * b[0].im;
- t3 = a[0].im * b[0].re;
- t4 = a[0].re * b[0].im;
- t5 = a[1].re * b[1].re;
- t6 = a[1].im * b[1].im;
- t7 = a[1].im * b[1].re;
- t8 = a[1].re * b[1].im;
- t1 -= t2;
- t3 += t4;
- t5 -= t6;
- t7 += t8;
- a[0].re = t1;
- a[1].re = t5;
- a[0].im = t3;
- a[1].im = t7;
- a += 2;
- b += 2;
- } while (n -= 2);
-}
-
-void WDL_fft_complexmul2(WDL_FFT_COMPLEX *c, WDL_FFT_COMPLEX *a, WDL_FFT_COMPLEX *b, int n)
-{
- WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
- if (n<2 || (n&1)) return;
-
- do {
- t1 = a[0].re * b[0].re;
- t2 = a[0].im * b[0].im;
- t3 = a[0].im * b[0].re;
- t4 = a[0].re * b[0].im;
- t5 = a[1].re * b[1].re;
- t6 = a[1].im * b[1].im;
- t7 = a[1].im * b[1].re;
- t8 = a[1].re * b[1].im;
- t1 -= t2;
- t3 += t4;
- t5 -= t6;
- t7 += t8;
- c[0].re = t1;
- c[1].re = t5;
- c[0].im = t3;
- c[1].im = t7;
- a += 2;
- b += 2;
- c += 2;
- } while (n -= 2);
-}
-
-void WDL_fft_complexmul3(WDL_FFT_COMPLEX *c, WDL_FFT_COMPLEX *a, WDL_FFT_COMPLEX *b, int n)
-{
- WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
- if (n<2 || (n&1)) return;
-
- do {
- t1 = a[0].re * b[0].re;
- t2 = a[0].im * b[0].im;
- t3 = a[0].im * b[0].re;
- t4 = a[0].re * b[0].im;
- t5 = a[1].re * b[1].re;
- t6 = a[1].im * b[1].im;
- t7 = a[1].im * b[1].re;
- t8 = a[1].re * b[1].im;
- t1 -= t2;
- t3 += t4;
- t5 -= t6;
- t7 += t8;
- c[0].re += t1;
- c[1].re += t5;
- c[0].im += t3;
- c[1].im += t7;
- a += 2;
- b += 2;
- c += 2;
- } while (n -= 2);
-}
-
-
-static inline void un4(WDL_FFT_COMPLEX *a)
-{
- WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
-
- t1 = VOL a[1].re;
- t3 = a[0].re - t1;
- t6 = VOL a[2].re;
- t1 += a[0].re;
- t8 = a[3].re - t6;
- t6 += a[3].re;
- a[0].re = t1 + t6;
- t1 -= t6;
- a[2].re = t1;
-
- t2 = VOL a[1].im;
- t4 = a[0].im - t2;
- t2 += a[0].im;
- t5 = VOL a[3].im;
- a[1].im = t4 + t8;
- t4 -= t8;
- a[3].im = t4;
-
- t7 = a[2].im - t5;
- t5 += a[2].im;
- a[1].re = t3 + t7;
- t3 -= t7;
- a[3].re = t3;
- a[0].im = t2 + t5;
- t2 -= t5;
- a[2].im = t2;
-}
-
-static void un8(WDL_FFT_COMPLEX *a)
-{
- WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
-
- un4(a);
-
- t1 = a[5].re;
- a[5].re = a[4].re - t1;
- t1 += a[4].re;
-
- t3 = a[7].re;
- a[7].re = a[6].re - t3;
- t3 += a[6].re;
-
- t8 = t3 - t1;
- t1 += t3;
-
- t6 = a[2].im - t8;
- t8 += a[2].im;
- a[2].im = t8;
-
- t5 = a[0].re - t1;
- a[4].re = t5;
- t1 += a[0].re;
- a[0].re = t1;
-
- t2 = a[5].im;
- a[5].im = a[4].im - t2;
- t2 += a[4].im;
-
- t4 = a[7].im;
- a[7].im = a[6].im - t4;
- t4 += a[6].im;
-
- a[6].im = t6;
-
- t7 = t2 - t4;
- t2 += t4;
-
- t3 = a[2].re - t7;
- a[6].re = t3;
- t7 += a[2].re;
- a[2].re = t7;
-
- t6 = a[0].im - t2;
- a[4].im = t6;
- t2 += a[0].im;
- a[0].im = t2;
-
- t6 = sqrthalf;
-
- t1 = a[5].re;
- t2 = a[5].im - t1;
- t2 *= t6;
- t1 += a[5].im;
- t1 *= t6;
- t4 = a[7].im;
- t3 = a[7].re - t4;
- t3 *= t6;
- t4 += a[7].re;
- t4 *= t6;
-
- t8 = t3 - t1;
- t1 += t3;
- t7 = t2 - t4;
- t2 += t4;
-
- t4 = a[3].im - t8;
- a[7].im = t4;
- t5 = a[1].re - t1;
- a[5].re = t5;
- t3 = a[3].re - t7;
- a[7].re = t3;
- t6 = a[1].im - t2;
- a[5].im = t6;
-
- t8 += a[3].im;
- a[3].im = t8;
- t1 += a[1].re;
- a[1].re = t1;
- t7 += a[3].re;
- a[3].re = t7;
- t2 += a[1].im;
- a[1].im = t2;
-}
-
-static void un16(WDL_FFT_COMPLEX *a)
-{
- WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
-
- un8(a);
- un4(a + 8);
- un4(a + 12);
-
- UNTRANSFORMZERO(a[0],a[4],a[8],a[12]);
- UNTRANSFORMHALF(a[2],a[6],a[10],a[14]);
- UNTRANSFORM(a[1],a[5],a[9],a[13],d16[0].re,d16[0].im);
- UNTRANSFORM(a[3],a[7],a[11],a[15],d16[0].im,d16[0].re);
-}
-
-/* a[0...8n-1], w[0...2n-2] */
-static void upass(WDL_FFT_COMPLEX *a,const WDL_FFT_COMPLEX *w,unsigned int n)
-{
- WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
- WDL_FFT_COMPLEX *a1;
- WDL_FFT_COMPLEX *a2;
- WDL_FFT_COMPLEX *a3;
-
- a2 = a + 4 * n;
- a1 = a + 2 * n;
- a3 = a2 + 2 * n;
- n -= 1;
-
- UNTRANSFORMZERO(a[0],a1[0],a2[0],a3[0]);
- UNTRANSFORM(a[1],a1[1],a2[1],a3[1],w[0].re,w[0].im);
-
- for (;;) {
- UNTRANSFORM(a[2],a1[2],a2[2],a3[2],w[1].re,w[1].im);
- UNTRANSFORM(a[3],a1[3],a2[3],a3[3],w[2].re,w[2].im);
- if (!--n) break;
- a += 2;
- a1 += 2;
- a2 += 2;
- a3 += 2;
- w += 2;
- }
-}
-
-static void un32(WDL_FFT_COMPLEX *a)
-{
- un16(a);
- un8(a + 16);
- un8(a + 24);
- upass(a,d32,4);
-}
-
-static void un64(WDL_FFT_COMPLEX *a)
-{
- un32(a);
- un16(a + 32);
- un16(a + 48);
- upass(a,d64,8);
-}
-
-static void un128(WDL_FFT_COMPLEX *a)
-{
- un64(a);
- un32(a + 64);
- un32(a + 96);
- upass(a,d128,16);
-}
-
-static void un256(WDL_FFT_COMPLEX *a)
-{
- un128(a);
- un64(a + 128);
- un64(a + 192);
- upass(a,d256,32);
-}
-
-static void un512(WDL_FFT_COMPLEX *a)
-{
- un256(a);
- un128(a + 256);
- un128(a + 384);
- upass(a,d512,64);
-}
-
-
-/* a[0...8n-1], w[0...n-2]; n even, n >= 4 */
-static void upassbig(WDL_FFT_COMPLEX *a,const WDL_FFT_COMPLEX *w,unsigned int n)
-{
- WDL_FFT_REAL t1, t2, t3, t4, t5, t6, t7, t8;
- WDL_FFT_COMPLEX *a1;
- WDL_FFT_COMPLEX *a2;
- WDL_FFT_COMPLEX *a3;
- unsigned int k;
-
- a2 = a + 4 * n;
- a1 = a + 2 * n;
- a3 = a2 + 2 * n;
- k = n - 2;
-
- UNTRANSFORMZERO(a[0],a1[0],a2[0],a3[0]);
- UNTRANSFORM(a[1],a1[1],a2[1],a3[1],w[0].re,w[0].im);
- a += 2;
- a1 += 2;
- a2 += 2;
- a3 += 2;
-
- do {
- UNTRANSFORM(a[0],a1[0],a2[0],a3[0],w[1].re,w[1].im);
- UNTRANSFORM(a[1],a1[1],a2[1],a3[1],w[2].re,w[2].im);
- a += 2;
- a1 += 2;
- a2 += 2;
- a3 += 2;
- w += 2;
- } while (k -= 2);
-
- UNTRANSFORMHALF(a[0],a1[0],a2[0],a3[0]);
- UNTRANSFORM(a[1],a1[1],a2[1],a3[1],w[0].im,w[0].re);
- a += 2;
- a1 += 2;
- a2 += 2;
- a3 += 2;
-
- k = n - 2;
- do {
- UNTRANSFORM(a[0],a1[0],a2[0],a3[0],w[-1].im,w[-1].re);
- UNTRANSFORM(a[1],a1[1],a2[1],a3[1],w[-2].im,w[-2].re);
- a += 2;
- a1 += 2;
- a2 += 2;
- a3 += 2;
- w -= 2;
- } while (k -= 2);
-}
-
-
-
-static void un1024(WDL_FFT_COMPLEX *a)
-{
- un512(a);
- un256(a + 512);
- un256(a + 768);
- upassbig(a,d1024,128);
-}
-
-static void un2048(WDL_FFT_COMPLEX *a)
-{
- un1024(a);
- un512(a + 1024);
- un512(a + 1536);
- upassbig(a,d2048,256);
-}
-
-
-static void un4096(WDL_FFT_COMPLEX *a)
-{
- un2048(a);
- un1024(a + 2048);
- un1024(a + 3072);
- upassbig(a,d4096,512);
-}
-
-static void un8192(WDL_FFT_COMPLEX *a)
-{
- un4096(a);
- un2048(a + 4096);
- un2048(a + 6144);
- upassbig(a,d8192,1024);
-}
-
-static void un16384(WDL_FFT_COMPLEX *a)
-{
- un8192(a);
- un4096(a + 8192);
- un4096(a + 8192 + 4096);
- upassbig(a,d16384,2048);
-}
-
-static void un32768(WDL_FFT_COMPLEX *a)
-{
- un16384(a);
- un8192(a + 16384);
- un8192(a + 16384 + 8192 );
- upassbig(a,d32768,4096);
-}
-
-
-static void __fft_gen(WDL_FFT_COMPLEX *buf, const WDL_FFT_COMPLEX *buf2, int sz, int isfull)
-{
- int x;
- double div=PI*0.25/(sz+1);
-
- if (isfull) div*=2.0;
-
- for (x = 0; x < sz; x ++)
- {
- if (!(x & 1) || !buf2)
- {
- buf[x].re = (WDL_FFT_REAL) cos((x+1)*div);
- buf[x].im = (WDL_FFT_REAL) sin((x+1)*div);
- }
- else
- {
- buf[x].re = buf2[x >> 1].re;
- buf[x].im = buf2[x >> 1].im;
- }
- }
-}
-
-#ifndef WDL_FFT_NO_PERMUTE
-
-static unsigned int fftfreq_c(unsigned int i,unsigned int n)
-{
- unsigned int m;
-
- if (n <= 2) return i;
-
- m = n >> 1;
- if (i < m) return fftfreq_c(i,m) << 1;
-
- i -= m;
- m >>= 1;
- if (i < m) return (fftfreq_c(i,m) << 2) + 1;
- i -= m;
- return ((fftfreq_c(i,m) << 2) - 1) & (n - 1);
-}
-
-static int _idxperm[2<<FFT_MAXBITLEN];
-
-static void idx_perm_calc(int offs, int n)
-{
- int i, j;
- _idxperm[offs] = 0;
- for (i = 1; i < n; ++i) {
- j = fftfreq_c(i, n);
- _idxperm[offs+n-j] = i;
- }
-}
-
-int WDL_fft_permute(int fftsize, int idx)
-{
- return _idxperm[fftsize+idx-2];
-}
-int *WDL_fft_permute_tab(int fftsize)
-{
- return _idxperm + fftsize - 2;
-}
-
-
-#endif
-
-void WDL_fft_init()
-{
- static int ffttabinit;
- if (!ffttabinit)
- {
- int i, offs;
- ffttabinit=1;
-
-#define fft_gen(x,y,z) __fft_gen(x,y,sizeof(x)/sizeof(x[0]),z)
- fft_gen(d16,0,1);
- fft_gen(d32,d16,1);
- fft_gen(d64,d32,1);
- fft_gen(d128,d64,1);
- fft_gen(d256,d128,1);
- fft_gen(d512,d256,1);
- fft_gen(d1024,d512,0);
- fft_gen(d2048,d1024,0);
- fft_gen(d4096,d2048,0);
- fft_gen(d8192,d4096,0);
- fft_gen(d16384,d8192,0);
- fft_gen(d32768,d16384,0);
-#undef fft_gen
-
-#ifndef WDL_FFT_NO_PERMUTE
- offs = 0;
- for (i = 2; i <= 32768; i *= 2)
- {
- idx_perm_calc(offs, i);
- offs += i;
- }
-#endif
-
- }
-}
-
-void WDL_fft(WDL_FFT_COMPLEX *buf, int len, int isInverse)
-{
- switch (len)
- {
- case 2: c2(buf); break;
-#define TMP(x) case x: if (!isInverse) c##x(buf); else un##x(buf); break;
- TMP(4)
- TMP(8)
- TMP(16)
- TMP(32)
- TMP(64)
- TMP(128)
- TMP(256)
- TMP(512)
- TMP(1024)
- TMP(2048)
- TMP(4096)
- TMP(8192)
- TMP(16384)
- TMP(32768)
-#undef TMP
- }
-}
-
-static inline void r2(WDL_FFT_REAL *a)
-{
- WDL_FFT_REAL t1, t2;
-
- t1 = a[0] + a[1];
- t2 = a[0] - a[1];
- a[0] = t1 * 2;
- a[1] = t2 * 2;
-}
-
-static inline void v2(WDL_FFT_REAL *a)
-{
- WDL_FFT_REAL t1, t2;
-
- t1 = a[0] + a[1];
- t2 = a[0] - a[1];
- a[0] = t1;
- a[1] = t2;
-}
-
-static void two_for_one(WDL_FFT_REAL* buf, const WDL_FFT_COMPLEX *d, int len, int isInverse)
-{
- const unsigned int half = (unsigned)len >> 1, quart = half >> 1, eighth = quart >> 1;
- const int *permute = WDL_fft_permute_tab(half);
- unsigned int i, j;
-
- WDL_FFT_COMPLEX *p, *q, tw, sum, diff;
- WDL_FFT_REAL tw1, tw2;
-
- if (!isInverse)
- {
- WDL_fft((WDL_FFT_COMPLEX*)buf, half, isInverse);
- r2(buf);
- }
- else
- {
- v2(buf);
- }
-
- /* Source: http://www.katjaas.nl/realFFT/realFFT2.html */
-
- for (i = 1; i < quart; ++i)
- {
- p = (WDL_FFT_COMPLEX*)buf + permute[i];
- q = (WDL_FFT_COMPLEX*)buf + permute[half - i];
-
-/* tw.re = cos(2*PI * i / len);
- tw.im = sin(2*PI * i / len); */
-
- if (i < eighth)
- {
- j = i - 1;
- tw.re = d[j].re;
- tw.im = d[j].im;
- }
- else if (i > eighth)
- {
- j = quart - i - 1;
- tw.re = d[j].im;
- tw.im = d[j].re;
- }
- else
- {
- tw.re = tw.im = sqrthalf;
- }
-
- if (!isInverse) tw.re = -tw.re;
-
- sum.re = p->re + q->re;
- sum.im = p->im + q->im;
- diff.re = p->re - q->re;
- diff.im = p->im - q->im;
-
- tw1 = tw.re * sum.im + tw.im * diff.re;
- tw2 = tw.im * sum.im - tw.re * diff.re;
-
- p->re = sum.re - tw1;
- p->im = diff.im - tw2;
- q->re = sum.re + tw1;
- q->im = -(diff.im + tw2);
- }
-
- p = (WDL_FFT_COMPLEX*)buf + permute[i];
- p->re *= 2;
- p->im *= -2;
-
- if (isInverse) WDL_fft((WDL_FFT_COMPLEX*)buf, half, isInverse);
-}
-
-void WDL_real_fft(WDL_FFT_REAL* buf, int len, int isInverse)
-{
- switch (len)
- {
- case 2: if (!isInverse) r2(buf); else v2(buf); break;
- case 4: case 8: two_for_one(buf, 0, len, isInverse); break;
-#define TMP(x) case x: two_for_one(buf, d##x, len, isInverse); break;
- TMP(16)
- TMP(32)
- TMP(64)
- TMP(128)
- TMP(256)
- TMP(512)
- TMP(1024)
- TMP(2048)
- TMP(4096)
- TMP(8192)
- TMP(16384)
- TMP(32768)
-#undef TMP
- }
-} \ No newline at end of file
diff --git a/src/devices/sound/fft.h b/src/devices/sound/fft.h
deleted file mode 100644
index a278b50a8c8..00000000000
--- a/src/devices/sound/fft.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Justin Frankel
-/*
- WDL - fft.h
- Copyright (C) 2006 and later Cockos Incorporated
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
-
-
- This file defines the interface to the WDL FFT library. These routines are based on the
- DJBFFT library, which are Copyright 1999 D. J. Bernstein, djb@pobox.com
-
- The DJB FFT web page is: http://cr.yp.to/djbfft.html
-
-
- This file is modified from the original; it has been reformatted for 4-space
- tabs.
-*/
-
-#ifndef WDL_FFT_H
-#define WDL_FFT_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef WDL_FFT_REALSIZE
-#define WDL_FFT_REALSIZE 8
-#endif
-
-#if WDL_FFT_REALSIZE == 4
-typedef float WDL_FFT_REAL;
-#elif WDL_FFT_REALSIZE == 8
-typedef double WDL_FFT_REAL;
-#else
-#error invalid FFT item size
-#endif
-
-typedef struct {
- WDL_FFT_REAL re;
- WDL_FFT_REAL im;
-} WDL_FFT_COMPLEX;
-
-extern void WDL_fft_init();
-
-extern void WDL_fft_complexmul(WDL_FFT_COMPLEX *dest, WDL_FFT_COMPLEX *src, int len);
-extern void WDL_fft_complexmul2(WDL_FFT_COMPLEX *dest, WDL_FFT_COMPLEX *src, WDL_FFT_COMPLEX *src2, int len);
-extern void WDL_fft_complexmul3(WDL_FFT_COMPLEX *destAdd, WDL_FFT_COMPLEX *src, WDL_FFT_COMPLEX *src2, int len);
-
-/* Expects WDL_FFT_COMPLEX input[0..len-1] scaled by 1.0/len, returns
-WDL_FFT_COMPLEX output[0..len-1] order by WDL_fft_permute(len). */
-extern void WDL_fft(WDL_FFT_COMPLEX *, int len, int isInverse);
-
-/* Expects WDL_FFT_REAL input[0..len-1] scaled by 0.5/len, returns
-WDL_FFT_COMPLEX output[0..len/2-1], for len >= 4 order by
-WDL_fft_permute(len/2). Note that output[len/2].re is stored in
-output[0].im. */
-extern void WDL_real_fft(WDL_FFT_REAL *, int len, int isInverse);
-
-extern int WDL_fft_permute(int fftsize, int idx);
-extern int *WDL_fft_permute_tab(int fftsize);
-
-#ifdef __cplusplus
-};
-#endif
-
-#endif \ No newline at end of file
diff --git a/src/devices/sound/vgm_visualizer.cpp b/src/devices/sound/vgm_visualizer.cpp
index 3d4407d3822..4c5af833ea2 100644
--- a/src/devices/sound/vgm_visualizer.cpp
+++ b/src/devices/sound/vgm_visualizer.cpp
@@ -12,16 +12,18 @@
#include "emu.h"
#include "sound/vgm_visualizer.h"
-#include "fft.h"
+
+#include "wdlfft/fft.h"
#include <cmath>
-static float lerp(float a, float b, float f)
+constexpr float lerp(float a, float b, float f)
{
return (b - a) * f + a;
}
+
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************