]> icculus.org git repositories - taylor/freespace2.git/blob - src/movie/mve_audio.cpp
fix crash in debug builds
[taylor/freespace2.git] / src / movie / mve_audio.cpp
1 /*
2  * $Logfile: /Freespace2/src/movie/mve_audio.cpp $
3  * $Revision$
4  * $Date$
5  * $Author$
6  *
7  * Handles compressed audio data in MVE files
8  *
9  * $Log$
10  * Revision 1.2  2005/03/29 07:50:34  taylor
11  * Update to newest movie code with much better video support and audio support from
12  *   Pierre Willenbrock.  Movies are enabled always now (no longer a build option)
13  *   and but can be skipped with the "--nomovies" or "-n" cmdline options.
14  *
15  *
16  *
17  * $NoKeywords: $
18  *
19  */
20
21 static int audio_exp_table[256] =
22 {
23          0,      1,      2,      3,      4,      5,      6,      7,      8,      9,     10,     11,     12,     13,     14,     15,
24         16,     17,     18,     19,     20,     21,     22,     23,     24,     25,     26,     27,     28,     29,     30,     31,
25         32,     33,     34,     35,     36,     37,     38,     39,     40,     41,     42,     43,     47,     51,     56,     61,
26         66,     72,     79,     86,     94,    102,    112,    122,    133,    145,    158,    173,    189,    206,    225,    245,
27        267,    292,    318,    348,    379,    414,    452,    493,    538,    587,    640,    699,    763,    832,    908,    991,
28       1081,   1180,   1288,   1405,   1534,   1673,   1826,   1993,   2175,   2373,   2590,   2826,   3084,   3365,   3672,   4008,
29       4373,   4772,   5208,   5683,   6202,   6767,   7385,   8059,   8794,   9597,  10472,  11428,  12471,  13609,  14851,  16206,
30      17685,  19298,  21060,  22981,  25078,  27367,  29864,  32589, -29973, -26728, -23186, -19322, -15105, -10503,  -5481,     -1,
31          1,      1,   5481,  10503,  15105,  19322,  23186,  26728,  29973, -32589, -29864, -27367, -25078, -22981, -21060, -19298,
32     -17685, -16206, -14851, -13609, -12471, -11428, -10472,  -9597,  -8794,  -8059,  -7385,  -6767,  -6202,  -5683,  -5208,  -4772,
33      -4373,  -4008,  -3672,  -3365,  -3084,  -2826,  -2590,  -2373,  -2175,  -1993,  -1826,  -1673,  -1534,  -1405,  -1288,  -1180,
34      -1081,   -991,   -908,   -832,   -763,   -699,   -640,   -587,   -538,   -493,   -452,   -414,   -379,   -348,   -318,   -292,
35       -267,   -245,   -225,   -206,   -189,   -173,   -158,   -145,   -133,   -122,   -112,   -102,    -94,    -86,    -79,    -72,
36        -66,    -61,    -56,    -51,    -47,    -43,    -42,    -41,    -40,    -39,    -38,    -37,    -36,    -35,    -34,    -33,
37        -32,    -31,    -30,    -29,    -28,    -27,    -26,    -25,    -24,    -23,    -22,    -21,    -20,    -19,    -18,    -17,
38        -16,    -15,    -14,    -13,    -12,    -11,    -10,     -9,     -8,     -7,     -6,     -5,     -4,     -3,     -2,     -1
39 };
40
41 static int getWord(unsigned char **fin)
42 {
43     int value = ((*fin)[1] << 8) | (*fin)[0];
44     *fin += 2;
45     return value;
46 }
47
48 static void sendWord(short **fout, int nOffset)
49 {
50         *(*fout)++ = (short)nOffset;
51 }
52
53 static void processSwath(short *fout, unsigned char *data, int swath, int *offsets)
54 {
55     int i;
56     for (i=0; i<swath; i++)
57     {
58         offsets[i&1] += audio_exp_table[data[i]];
59         sendWord(&fout, offsets[i&1]);
60     }
61 }
62
63 void mveaudio_uncompress(unsigned char *buf, unsigned char *data, int length)
64 {
65     int nCurOffsets[2];
66     int swath;
67
68     short *buffer = (short*)buf;
69
70     data += 4;
71     swath = getWord(&data) / 2;
72     nCurOffsets[0] = getWord(&data);
73     nCurOffsets[1] = getWord(&data);
74     sendWord(&buffer, nCurOffsets[0]);
75     sendWord(&buffer, nCurOffsets[1]);
76     processSwath(buffer, data, swath, nCurOffsets);
77 }