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 | //THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX | 
        ||
| 8 | //SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO | 
        ||
| 9 | //END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A | 
        ||
| 10 | //ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS | 
        ||
| 11 | //IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS | 
        ||
| 12 | //SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE | 
        ||
| 13 | //FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE | 
        ||
| 14 | //CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS | 
        ||
| 15 | //AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE. | 
        ||
| 16 | //COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED. | 
        ||
| 17 | // | 
        ||
| 18 | // $Source: /cvsroot/dxx-rebirth/d1x-rebirth/main/snddecom.c,v $ | 
        ||
| 19 | // $Revision: 1.1.1.1 $ | 
        ||
| 20 | // $Author: zicodxx $ | 
        ||
| 21 | // $Date: 2006/03/17 19:43:28 $ | 
        ||
| 22 | // | 
        ||
| 23 | // Routines for compressing digital sounds. | 
        ||
| 24 | // | 
        ||
| 25 | // $Log: snddecom.c,v $ | 
        ||
| 26 | // Revision 1.1.1.1  2006/03/17 19:43:28  zicodxx | 
        ||
| 27 | // initial import | 
        ||
| 28 | // | 
        ||
| 29 | // Revision 1.1.1.1  1999/06/14 22:11:34  donut | 
        ||
| 30 | // Import of d1x 1.37 source. | 
        ||
| 31 | // | 
        ||
| 32 | // Revision 2.0  1995/02/27  11:29:36  john | 
        ||
| 33 | // New version 2.0, which has no anonymous unions, builds with | 
        ||
| 34 | // Watcom 10.0, and doesn't require parsing BITMAPS.TBL. | 
        ||
| 35 | // | 
        ||
| 36 | // Revision 1.2  1994/11/30  14:08:46  john | 
        ||
| 37 | // First version. | 
        ||
| 38 | // Revision 1.1  1994/11/29  14:33:51  john | 
        ||
| 39 | // Initial revision | 
        ||
| 40 | // | 
        ||
| 41 | |||
| 42 | #include "dxxsconf.h" | 
        ||
| 43 | #include "snddecom.h" | 
        ||
| 44 | #include <array> | 
        ||
| 45 | |||
| 46 | const std::array<int, 16> index_table{{  | 
        ||
| 47 | -1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8  | 
        ||
| 48 | }};  | 
        ||
| 49 | const std::array<int, 89> step_table{{  | 
        ||
| 50 | 7, 8, 9, 10, 11, 12, 13, 14,  | 
        ||
| 51 | 16, 17, 19, 21, 23, 25, 28,  | 
        ||
| 52 | 31, 34, 37, 41, 45, 50, 55,  | 
        ||
| 53 | 60, 66, 73, 80, 88, 97, 107,  | 
        ||
| 54 | 118, 130, 143, 157, 173, 190, 209,  | 
        ||
| 55 | 230, 253, 279, 307, 337, 371, 408,  | 
        ||
| 56 | 449, 494, 544, 598, 658, 724, 796,  | 
        ||
| 57 | 876, 963,1060,1166,1282,1411,1552,  | 
        ||
| 58 | 1707,1878,  | 
        ||
| 59 | 2066,2272,2499,2749,3024,3327,3660,4026,  | 
        ||
| 60 | 4428,4871,5358,5894,6484,7132,7845,8630,  | 
        ||
| 61 | 9493,10442,11487,12635,13899,15289,16818,  | 
        ||
| 62 | 18500,20350,22385,24623,27086,29794,32767  | 
        ||
| 63 | }};  | 
        ||
| 64 | |||
| 65 | void sound_decompress(unsigned char *data, int size, unsigned char *outp) {  | 
        ||
| 66 | int newtoken = 1;  | 
        ||
| 67 | int predicted = 0, index = 0, step = 7;  | 
        ||
| 68 | int code, diff, out;  | 
        ||
| 69 | while (size) {  | 
        ||
| 70 | if (newtoken)  | 
        ||
| 71 | code = (*data) & 15;  | 
        ||
| 72 | else {  | 
        ||
| 73 | code = (*(data++)) >> 4;  | 
        ||
| 74 | size--;  | 
        ||
| 75 |         } | 
        ||
| 76 | newtoken ^= 1;  | 
        ||
| 77 | diff = 0;  | 
        ||
| 78 | if (code & 4)  | 
        ||
| 79 | diff += step;  | 
        ||
| 80 | if (code & 2)  | 
        ||
| 81 | diff += (step >> 1);  | 
        ||
| 82 | if (code & 1)  | 
        ||
| 83 | diff += (step >> 2);  | 
        ||
| 84 | diff += (step >> 3);  | 
        ||
| 85 | if (code & 8)  | 
        ||
| 86 | diff = -diff;  | 
        ||
| 87 | out = predicted + diff;  | 
        ||
| 88 | if (out > 32767)  | 
        ||
| 89 | out = 32767;  | 
        ||
| 90 | if (out < -32768)  | 
        ||
| 91 | out = -32768;  | 
        ||
| 92 | predicted = out;  | 
        ||
| 93 | *(outp++) = ((out >> 8) & 255) ^ 0x80;  | 
        ||
| 94 | index += index_table[code];  | 
        ||
| 95 | if (index < 0)  | 
        ||
| 96 | index = 0;  | 
        ||
| 97 | if (index > 88)  | 
        ||
| 98 | index = 88;  | 
        ||
| 99 | step = step_table[index];  | 
        ||
| 100 |     } | 
        ||
| 101 | } |