I've been replaying
Outcast for the umpteenth time, courtesy of
Good Old Games' rerelease and still enjoy it tremendously. (
Here are some of my notes about why Outcast is cool.)
In a
previous post I outlined how to read the contents of the game's archive files. Here I'll describe how the audio files are stored.
Audio files have
.sfx extensions and there are vast numbers of them. They are compressed using the
GSM 06.10 cell phone audio compression standard. All the audio files have a 20-byte header followed by a sequence of 33-byte frames of GSM data. Since this is a cell-phone audio standard, each frame can be decoded independently.
All the headers start with the same 12 bytes: 32 54 76 98 01 00 00 00 00 00 80 3F. After this comes two 4-byte little-endian numbers: the number of bytes of data following the header, which should be divisible by 33; and the sample rate (22050 samples per second in the file I'm looking at).
Each 33-byte frame decodes to 160 16-bit samples, so the compressed data rate is around 4.5 KB per second. I used
code by Jutta Degener and Carsten Bormann to decode the frames.
Here's a random snip of dialogue from the game (ilott_found_naarn_g_7-9). Ilott has just learned of his brother's death at the hands of Kroax: