vgmstream/BUILD.md
bnnm 46108764d5 Add XMPlay makefile
When linking using the .def there are some warnings that could be
improved, ignore for now.
2017-01-03 14:27:06 +01:00

4.8 KiB

vgmstream

Compilation requirements

GCC: you need GCC and MAKE somewhere in path. In Windows this means one of these:

MSVC / Visual Studio: Visual Studio Community 2015 (free) should work:

Git: optional, to generate version numbers:

Compiling modules

test.exe / in_vgmstream (Winamp) / xmp-vgmstream (XMPlay)

With GCC: use the ./Makefile in the root folder, see inside for options. For compilation flags check the Makefile in each folder. You need to manually rebuild if you change a .h file (use make clean).

In Linux you may need to use Makefile.unix.am instead, and note that some Linux makefiles aren't up to date.

Windows CMD example for test.exe:

set PATH=%PATH%;C:\Git\usr\bin
set PATH=%PATH%;C:\mingw-w64\i686-5.4.0-win32-sjlj-rt_v5-rev0\mingw32\bin

cd vgmstream

mingw32-make.exe mingw_test -f Makefile ^
 VGM_ENABLE_FFMPEG=1 VGM_ENABLE_MAIATRAC3PLUS=0 ^
 SHELL=sh.exe CC=gcc.exe AR=ar.exe STRIP=strip.exe DLLTOOL=dlltool.exe WINDRES=windres.exe

With MSVC: open ./vgmstream.sln and compile in Visual Studio. For XMPlay open xmp-vgmstream/xmp-vgmstream.sln instead; FDK-AAC/QAAC/others may be needed (see below).

foo_input_vgmstream (foobar2000)

Requires MSVC (foobar/SDK only links to MSVC C++ DLLs) and these dependencies:

Open ./vgmstream.sln as a base and add fb2k/foo_input_vgmstream.vcxproj, which expects the above, and all projects from those dependencies.

Depending on your VS version you may need to manually do the following:

  • Change each project's compiler version from VS2010 to yours
  • For foobar add (vgmstream)/../WTL91_5321_Final/Include to the compilers's additional includes
  • For foobar add (vgmstream)/../foobar/foobar2000/shared/shared.lib to the linker's additional dependencies VS2013 may not be compatible with the SDK.

Development

Structure

vgmstream uses C (C89 when possible), except the foobar2000 plugin (C++).

./                   docs, scripts
./ext_includes/      external includes for compiling
./ext_libs/          external libs/DLLs for linking
./fb2k/              foobar2000 plugin
./src/               main vgmstream code and helpers
./src/coding/        format sample decoders
./src/layout/        format data demuxers
./src/meta/          format header parsers
./test/              test.exe CLI
./unix/              Audacious plugin
./winamp/            Winamp plugin
./xmp-vgmstream/     XMPlay plugin

Overview

vgmstream works by parsing a music stream header (meta/), reading/demuxing data or looping (layout/) and decoding the compressed data into listenable PCM samples (coding/).

Very simplified it goes like this:

  • player (test.exe, winamp plugin, etc) inits the stream [main]
  • init tries all parsers (metas) until one works [init_vgmstream]
  • parser reads header (channels, sample rate, loop points) and set ups a VGMSTREAM struct + layout/coding, if the format is correct [init_vgmstream_(format-name)]
  • player gets total_samples to play, based on the number of loops and other settings [get_vgmstream_play_samples]
  • player asks to fill a small sample buffer [render_vgmstream]
  • layout prepares bytes to read from the stream [render_vgmstream_(layout)]
  • decoder decodes bytes into PCM samples [decode_vgmstream_(coding)]
  • player plays those samples, asks to fill sample buffer, repeats until total_samples
  • layout moves back to loop_start when loop_end is reached [vgmstream_do_loop]

Adding new formats

For new simple formats, assuming existing layout/coding:

  • src/meta/(format-name).c: create new format parser that reads all needed info from the stream header and inits VGMSTREAM
  • src/meta/meta.h: register parser's init
  • src/vgmstream.h: register new meta
  • src/vgmstream.c: add parser init to search list, add meta description
  • src/formats.c: add new extension to the format list fb2k/in_vgmstream.cpp: add new extension to the file associations list
  • src/Makefile src/meta/Makefile.unix.am src/libvgmstream.vcproj/vcxproj/filters: to compile new (format-name).c parser
  • if the format needs an external library don't forget to make it optional with: #ifdef VGM_USE_X ... #endif