WavPack encode/decode library, command-line programs, and several plugins
Clone or download
dbry Merge pull request #46 from Chocobo1/fix
Fix coding defects
Latest commit 90fb5f1 Sep 5, 2018
Permalink
Failed to load latest commit information.
audition fix typos (thanks yangfl!) Jul 22, 2018
cli Merge pull request #46 from Chocobo1/fix Sep 5, 2018
doc fix typos (thanks yangfl!) Jul 22, 2018
include update copyright dates and trim some trailing whitespace (thanks Joël!) Jul 1, 2018
man add man page for wvtag and update the other man pages (--import-id3) Jan 14, 2017
src Fix memory leak Sep 5, 2018
wavpackdll bump DLL version and fix MSVC build Jan 17, 2017
wavpackexe bump DLL version and fix MSVC build Jan 17, 2017
winamp Use correct printf format specifier Sep 5, 2018
wvgainexe Changes to incorporate Unicode handling into the command-line programs Dec 7, 2015
wvtagexe add wvtag to MSVC build and fix warnings (and one mistake) Jan 7, 2017
wvunpackexe build DSD branch on MSVC and squash warnings Aug 19, 2016
xmms Use correct printf format specifier Sep 5, 2018
.gitignore Git: ignore audio test files Mar 12, 2016
.travis.yml do more exhaustive testing for Travis (but should be faster) Jan 23, 2017
AUTHORS issue #36 issue #37: move ChangeLog to NEWS, create real ChangeLog, u… Jul 1, 2018
COPYING update copyright dates and trim some trailing whitespace (thanks Joël!) Jul 1, 2018
ChangeLog issue #36 issue #37: move ChangeLog to NEWS, create real ChangeLog, u… Jul 1, 2018
Makefile.am add README.md to extra distribution files Oct 28, 2017
NEWS issue #36 issue #37: move ChangeLog to NEWS, create real ChangeLog, u… Jul 1, 2018
README.md fix typos (thanks yangfl!) Jul 22, 2018
acinclude.m4 Add manpages from the Debian package Oct 5, 2009
autogen.sh Update autogen.sh Oct 12, 2009
configure.ac use Alexander Peslyak's MD5 implementation (or libcrypto if present) … Jul 24, 2017
license.txt update copyright dates and trim some trailing whitespace (thanks Joël!) Jul 1, 2018
masm.rules changes required to get the assembler optimizations to build in Visua… May 4, 2015
wavpack.pc.in fix wavpack.pc.in to work correctly with Arch Linux without special p… Nov 5, 2013
wavpack.sln add wvtag to MSVC build and fix warnings (and one mistake) Jan 7, 2017

README.md

Hybrid Lossless Wavefile Compressor

Copyright (c) 1998 - 2018 David Bryant.

All Rights Reserved.

Distributed under the BSD Software License.


This repository contains all of the source code required to build the WavPack library (libwavpack), and any associated command-line programs.

Additional references:


Build Status

Branch Status
master Build Status

Branches actively built by TravisCI.


Building

Windows

There are solution and project files for Visual Studio 2008, and additional source code to build the CoolEdit/Audition plugin and the Winamp plugin.

The CoolEdit/Audition plugin provides a good example for using the library to both read and write WavPack files, and the Winamp plugin makes extensive use of APEv2 tag reading and writing.

Both 32-bit and 64-bit platforms are provided.

Visual Studio 2008 does not support projects with x64 assembly very well. I have provided a copy of the edited masm.rules file that works for me, but I can't provide support if your build does not work. Please make a copy of your masm.rules file first.

On my system it lives here: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\VCProjectDefaults

Linux

To build everything on Linux, type:

  1. ./configure
    • --disable-asm
    • --enable-man
    • --enable-rpath
    • --enable-tests
    • --disable-apps
    • --disable-dsd
    • --enable-legacy
  2. make
    • Optionally, make install, to install into /usr/local/bin

If you are using the code directly from Git (rather than a distribution) then you will need to do a ./autogen.sh instead of the configure step. If assembly optimizations are available for your processor they will be automatically enabled, but if there is a problem with them then use the --disable-asm option to revert to pure C.

For Clang-based build systems (Darwin, FreeBSD, etc.), Clang version 3.5 or higher is required.

If you get a WARNING about unexpected libwavpack version when you run the command-line programs, you might try using --enable-rpath to hardcode the library location in the executables, or simply force static linking with --disable-shared.

There is now a CLI program to do a full suite of stress tests for libwavpack, and this is particularly useful for packagers to make sure that the assembly language optimizations are working correctly on various platforms. It is built with the configure option --enable-tests and requires Pthreads (it worked out-of-the-box on all the platforms I tried it on). There are lots of options, but the default test suite (consisting of 192 tests) is executed with wvtest --default. There is also a seeking test. On Windows a third-party Pthreads library is required, so I am not including this in the build for now.


Assembly

Assembly language optimizations are provided for x86 and x86-64 (AMD64) processors (encoding and decoding) and ARMv7 (decoding only).

The x86 assembly code includes a runtime check for MMX capability, so it will work on legacy i386 processors.

Documentation

There are four documentation files contained in the distribution:

File Description
doc/wavpack_doc.html Contains user-targeted documentation for the command-line programs.
doc/WavPack5PortingGuide.pdf This document is targeted at developers who are migrating to WavPack 5, and it provides a short description of the major improvements and how to utilize them.
doc/WavPack5LibraryDoc.pdf Contains a detailed description of the API provided by WavPack library appropriate for reading and writing WavPack files and manipulating APEv2 tags.
doc/WavPack5FileFormat.pdf Contains a description of the WavPack file format, including details needed for parsing WavPack, blocks, and interpreting the block header and flags.

There is also a description of the WavPack algorithms in the forth edition of David Salomon's book "Data Compression: The Complete Reference". This section can be found here: www.wavpack.com/WavPack.pdf

Portability

This code is designed to be easy to port to other platforms.

It is endian-agnostic and usually uses callbacks for I/O, although there's a convenience function for reading files that accepts filename strings and automatically handles correction files.

On Windows, there is now an option to select UTF-8 instead of ANSI.

To maintain compatibility on various platforms, the following conventions are used:

  • char must be 8-bits (signed or unsigned).
  • short must be 16-bits.
  • int and long must be at least 32-bits.

Design

The code's modules are organized in such a way that if major chunks of the functionality are not referenced (for example, creating WavPack files) then link-time dependency resolution should provide optimum binary sizes.

However, some functionality could not be easily excluded in this way and so there are additional macros that may be used to further reduce the size of the binary. Note that these must be defined for all modules:

Macros Description
NO_SEEKING To not allow seeking to a specific sample index (for applications that always read entire files).
NO_TAGS To not read specified fields from ID3v1 and APEv2 tags, and not create or edit APEv2 tags.
ENABLE_LEGACY Include support for Wavpack files from before version 4.0. This was eliminated by default with WavPack 5.
ENABLE_DSD Include support for DSD audio. New for WavPack 5 and the default, but obviously not universally required.

Note that this has been tested on many platforms.

Tiny Decoder

There are alternate versions of this library available specifically designed for resource limited CPUs, and hardware encoding and decoding.

There is the Tiny Decoder library which works with less than 32k of code and less than 4k of data, and has assembly language optimizations for the ARM and Freescale ColdFire CPUs.

The Tiny Decoder is also designed for embedded use and handles the pure lossless, lossy, and hybrid lossless modes.

Neither of these versions use any memory allocation functions, nor do they require floating-point arithmetic support.


Questions or comments should be directed to david@wavpack.com.

You may also find David on GitHub as dbry.