I am working on a larger project, wherein I needed to visualise audio waveforms. Surprisingly, there are not that many programs able to do this. Even the Swiss Army Knife for all things audio, SoX, plots only spectrograms and no waveforms.
There was just one little problem: there were no Windows binaries for audiowaveform available, there was even a related GitHub issue.
So I sat down and put some effort into making audiowaveform compile. I never liked DLL hell, so I aimed
at producing static binaries, both 32-bit and 64-bit. My earlier efforts to compile static Windows binaries
for tools like
sox helped here immensely.
Actually, I achieved what aimed at, on two different ways.
In short: The Dockerfile
compiles all dependencies (meaning: iconv, zlib, libmad, libid3tag, libogg, libvorbis, flac,
libsndfile, libpng, libimagequant, freetype2, expat, fontconfig, libgd and parts of boost) as static MinGW
libraries, and then compiles audiowaveform for Win32. Then the directories are cleaned and another binaries for Win64
are recompiled. All resulting binaries, as well as
.a files, are compressed to ZIP archives, as Windows can
unpack them without using external tool, and copied to the host system using the
docker cp command. Executing the script
automates the whole process.
There is a MinGW cross-compilation environment for free libraries called MXE. It is simple
(essentially, a single
Makefile), well-maintained (here) and contains
all (mentioned previously) dependencies already, so it was a natural choice.
The script (as well as the patch) for compilation using MXE resides in this gist (which is too large to be embedded here directly). Just copy both files to the machine with MXE and execute the script
Specify the path of MXE in the environment variable
MXE and the amount of parallel jobs in the variable
So, compile audiowaveform with dependencies using MXE in the directory
/opt/mxe on a quad-core CPU with command
MXE=/opt/mxe JOBS=4 ./audiowaveform-compile.sh
After a while (because MXE compiles all parts of boost, additionally to the required ones) you will have
two static Windows binaries,
audiowaveform-win64.exe, in the same directory
as the script.
The single compilation problem fixed was the difference between filename container types –
std::string on POSIX
std::wstring on Windows. After testing both ways of compilation, I contacted the main developer of
audiowaveform, Chris Needham, and asked him
about merging my code into the main repository. His reaction was very affirming, hence I made a
pull request, and he merged it.
The BBC has my code fixes. I am positively excited.