Subversion Repositories Games.Descent

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 pmbaty 1
/*
2
 * This file is part of the DXX-Rebirth project <https://www.dxx-rebirth.com/>.
3
 * It is copyright by its individual contributors, as recorded in the
4
 * project's Git history.  See COPYING.txt at the top level for license
5
 * terms and a link to the Git history.
6
 */
7
#include "mve_audio.h"
8
#include "dxxsconf.h"
9
#include <array>
10
 
11
constexpr std::array<int, 256> audio_exp_table{
12
{
13
         0,      1,      2,      3,      4,      5,      6,      7,      8,      9,     10,     11,     12,     13,     14,     15,
14
        16,     17,     18,     19,     20,     21,     22,     23,     24,     25,     26,     27,     28,     29,     30,     31,
15
        32,     33,     34,     35,     36,     37,     38,     39,     40,     41,     42,     43,     47,     51,     56,     61,
16
        66,     72,     79,     86,     94,    102,    112,    122,    133,    145,    158,    173,    189,    206,    225,    245,
17
       267,    292,    318,    348,    379,    414,    452,    493,    538,    587,    640,    699,    763,    832,    908,    991,
18
      1081,   1180,   1288,   1405,   1534,   1673,   1826,   1993,   2175,   2373,   2590,   2826,   3084,   3365,   3672,   4008,
19
      4373,   4772,   5208,   5683,   6202,   6767,   7385,   8059,   8794,   9597,  10472,  11428,  12471,  13609,  14851,  16206,
20
     17685,  19298,  21060,  22981,  25078,  27367,  29864,  32589, -29973, -26728, -23186, -19322, -15105, -10503,  -5481,     -1,
21
         1,      1,   5481,  10503,  15105,  19322,  23186,  26728,  29973, -32589, -29864, -27367, -25078, -22981, -21060, -19298,
22
    -17685, -16206, -14851, -13609, -12471, -11428, -10472,  -9597,  -8794,  -8059,  -7385,  -6767,  -6202,  -5683,  -5208,  -4772,
23
     -4373,  -4008,  -3672,  -3365,  -3084,  -2826,  -2590,  -2373,  -2175,  -1993,  -1826,  -1673,  -1534,  -1405,  -1288,  -1180,
24
     -1081,   -991,   -908,   -832,   -763,   -699,   -640,   -587,   -538,   -493,   -452,   -414,   -379,   -348,   -318,   -292,
25
      -267,   -245,   -225,   -206,   -189,   -173,   -158,   -145,   -133,   -122,   -112,   -102,    -94,    -86,    -79,    -72,
26
       -66,    -61,    -56,    -51,    -47,    -43,    -42,    -41,    -40,    -39,    -38,    -37,    -36,    -35,    -34,    -33,
27
       -32,    -31,    -30,    -29,    -28,    -27,    -26,    -25,    -24,    -23,    -22,    -21,    -20,    -19,    -18,    -17,
28
       -16,    -15,    -14,    -13,    -12,    -11,    -10,     -9,     -8,     -7,     -6,     -5,     -4,     -3,     -2,     -1
29
}
30
};
31
 
32
static int getWord(const unsigned char **fin)
33
{
34
    int value = ((*fin)[1] << 8) | (*fin)[0];
35
    *fin += 2;
36
    return value;
37
}
38
 
39
static void sendWord(short **fout, int nOffset)
40
{
41
    *(*fout)++ = nOffset;
42
}
43
 
44
static void processSwath(short *fout, const unsigned char *data, int swath, int *offsets)
45
{
46
    for (int i=0; i<swath; i++)
47
    {
48
        offsets[i&1] += audio_exp_table[data[i]];
49
        sendWord(&fout, offsets[i&1]);
50
    }
51
}
52
 
53
void mveaudio_uncompress(short *buffer, const unsigned char *data)
54
{
55
    int nCurOffsets[2];
56
    int swath;
57
 
58
    data += 4;
59
    swath = getWord(&data) / 2;
60
    nCurOffsets[0] = getWord(&data);
61
    nCurOffsets[1] = getWord(&data);
62
    sendWord(&buffer, nCurOffsets[0]);
63
    sendWord(&buffer, nCurOffsets[1]);
64
    processSwath(buffer, data, swath, nCurOffsets);
65
}