~dridi/bjxa

BandJAM XA audio codec

8db8476 Prepare for 0.1

~dridi pushed to ~dridi/bjxa git

a month ago

4774a04 readme: Tweak build instructions for sourcehut

~dridi pushed to ~dridi/bjxa git

2 months ago
bjxa - BandJAM XA audio codec
=============================

This is an audio codec for BandJAM XA audio files used in several games, some
of them open source. Unfortunately the source code for xa.exe and xadec.dll
was not available and limited to Windows 32 bit systems. The libbjxa library
and bjxa program offer a portable interface to decode XA files.

Because CDROM XA from which BandJAM XA derives is a lossy codec, it is better
not to convert existing XA files into WAVE files to then re-encode them with a
more modern lossy codec.

This is the result of a reverse engineering project to not only offer a
decoder for the file format but also document it.

Installation
------------

Go to the releases page [1] and follow the link to latest release to download
a release archive in the form of 'bjxa-<version>.tar.gz', extract its contents
and once inside the source directory, follow these steps:

    $ ./configure
    $ make
    $ make check # optional but recommended
    $ sudo make install

If the project fails to build, it might be because your system or linker does
not support version scripts. In this case bjxa can be configured without the
version script support:

    $ ./configure --without-ld-version-script

To learn more about available configuration options, you can run and inspect
the output of './configure --help'.

RPM Packaging
-------------

Instead of directly installing the package you can build an RPM:

    make rpm

The resulting packages can be found in the 'rpmbuild' directory in your
build tree.

If you need to build an RPM for a different platform you may use 'mock(1)'
with the proper '--root' option. All you got to do is run 'make mockbuild'
and set the desired flags in the 'MOCK_OPTS' variable. For instance, to
build RPMs for CentOS 7:

    make mockbuild MOCK_OPTS='--root epel-7-x86_64'

The resulting packages can be found in the 'mockbuild' directory in your
build tree.

Documentation
-------------

Once installed, you should have access to comprehensive manuals describing how
to use the libbjxa library or bjxa program, and the BandJAM XA file format.

In particular, the bjxa(3) manual comes with a code example showing how the
actual bjxa(1) program uses the library to decode XA files. The bjxa(5) manual
describes the BandJAM XA file format, loosely based on the CDROM XA standard
for real time compressed audio on some CDROM-based systems.

Portability
-----------

bjxa has been successfully tested on the following systems:

- FreeBSD
- GNU/Linux (Fedora)
- Illumos (OmniOS)
- NetBSD

It has been tested on Fedora for the following architectures:

- aarch64
- armv7hl
- i686
- ppc64
- ppc64le
- s390x
- x86_64 (amd64)

bjxa has been partially cross-compiled for Windows, testing using Wine fails
halfway through. To build it on a Unix-like system with MinGW, you can try
this:

    $ ./configure \
    >        --host=<ARCH>-w64-mingw32 \
    >        --disable-static \
    >        CFLAGS=" \
    >            -Wno-pedantic \
    >            -std=gnu99 \
    >            -U_POSIX_C_SOURCE \
    >            -U_XOPEN_SOURCE \
    >        "
    $ make LDFLAGS=-no-undefined

And replace '<ARCH>' with the desired architecture.

Windows Support
---------------

The project should in theory also work on Windows but it hasn't been verified.
However there is a .NET variant of bjxa written in C#. Starting with version
0.2 a Zip file containing the source code and Windows executables is available
on release pages. The DLL and EXE are however not built and tested on Windows,
instead Mono is used for building and Wine for testing.

Assuming the installation instructions were followed to build from source, and
assuming the Mono development files are available on the system, the following
steps will reconfigure the project and build the C# code:

    $ ./configure --with-dotnet --enable-silent-rules
    [...]
    $ make
      CCLD     dotnet/libbjxa.dll
      CCLD     dotnet/bjxa.exe
      GEN      dotnet/bjxa-0.2.zip

The test suite currently doesn't test the C# code, it has been manually tested
to produce bit-for-bit identical WAVE files.

It is possible to specify a C# compiler and command line options to the
compiler, for example to enable debug assertions:

    $ ./configure --with-dotnet CSC=past/to/csc CSFLAGS=-d:DEBUG

Hacking
-------

bjxa relies on autotools for building, and a range of tools for testing
and code coverage. The basic usage is as follows:

   $ path/to/bjxa/bootstrap \
   >        [--enable-asan] \
   >        [--enable-msan] \
   >        [--enable-ubsan] \
   >        [--enable-lcov] \
   >        [--without-ld-version-script]
   $ make check

The first command will reveal the missing bits, and the second the potential
failures. Code coverage MUST be turned off when the test suite is used for
checking because it turns off assertions.

The 'bootstrap' script needs to be run only once. In order to reconfigure
the build tree, you can use autoconf's 'configure' script. Command-line
arguments to the 'bootstrap' script are passed to 'configure'.

By default the 'bootstrap' script configures the build tree to include .NET
support. To only build the C library from git, pass the '--without-dotnet'
argument to the 'bootstrap' execution.

For code coverage, the simplest way to get a report is as follows:

   $ path/to/bjxa/bootsrap --enable-lcov
   $ make lcov
   $ xdg-open lcov/index.html

One goal is to maintain the 100% coverage of the C library.

[1] https://git.sr.ht/~dridi/bjxa/refs