Subversion Repositories Games.Descent

Rev

Blame | Last modification | View Log | Download | RSS feed

  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. }
  66.