pulling trunk
[ardour.git] / libs / libsndfile / src / alaw.c
1 /*
2 ** Copyright (C) 1999-2005 Erik de Castro Lopo <erikd@mega-nerd.com>
3 **
4 ** This program is free software; you can redistribute it and/or modify
5 ** it under the terms of the GNU Lesser General Public License as published by
6 ** the Free Software Foundation; either version 2.1 of the License, or
7 ** (at your option) any later version.
8 **
9 ** This program is distributed in the hope that it will be useful,
10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 ** GNU Lesser General Public License for more details.
13 **
14 ** You should have received a copy of the GNU Lesser General Public License
15 ** along with this program; if not, write to the Free Software
16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 */
18
19 #include        "sndfile.h"
20 #include        "float_cast.h"
21 #include        "common.h"
22
23 static sf_count_t alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
24 static sf_count_t alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
25 static sf_count_t alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
26 static sf_count_t alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
27
28 static sf_count_t alaw_write_s2alaw (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
29 static sf_count_t alaw_write_i2alaw (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
30 static sf_count_t alaw_write_f2alaw (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
31 static sf_count_t alaw_write_d2alaw (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
32
33 static void alaw2s_array (unsigned char *buffer, int count, short *ptr) ;
34 static void alaw2i_array (unsigned char *buffer, int count, int *ptr) ;
35 static void alaw2f_array (unsigned char *buffer, int count, float *ptr, float normfact) ;
36 static void alaw2d_array (unsigned char *buffer, int count, double *ptr, double normfact) ;
37
38 static void s2alaw_array (const short *buffer, int count, unsigned char *ptr) ;
39 static void i2alaw_array (const int *buffer, int count, unsigned char *ptr) ;
40 static void f2alaw_array (const float *buffer, int count, unsigned char *ptr, float normfact) ;
41 static void d2alaw_array (const double *buffer, int count, unsigned char *ptr, double normfact) ;
42
43
44 int
45 alaw_init (SF_PRIVATE *psf)
46 {
47         if (psf->mode == SFM_READ || psf->mode == SFM_RDWR)
48         {       psf->read_short         = alaw_read_alaw2s ;
49                 psf->read_int           = alaw_read_alaw2i ;
50                 psf->read_float         = alaw_read_alaw2f ;
51                 psf->read_double        = alaw_read_alaw2d ;
52                 } ;
53
54         if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
55         {       psf->write_short        = alaw_write_s2alaw ;
56                 psf->write_int          = alaw_write_i2alaw ;
57                 psf->write_float        = alaw_write_f2alaw ;
58                 psf->write_double       = alaw_write_d2alaw ;
59                 } ;
60
61         psf->bytewidth = 1 ;
62         psf->blockwidth = psf->sf.channels ;
63
64         if (psf->filelength > psf->dataoffset)
65                 psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : psf->filelength - psf->dataoffset ;
66         else
67                 psf->datalength = 0 ;
68
69         psf->sf.frames = psf->datalength / psf->blockwidth ;
70
71         return 0 ;
72 } /* alaw_init */
73
74 /*==============================================================================
75  *      Private static functions and data.
76  */
77
78 static
79 short alaw_decode [256] =
80 {       -5504,  -5248,  -6016,  -5760,  -4480,  -4224,  -4992,  -4736,
81         -7552,  -7296,  -8064,  -7808,  -6528,  -6272,  -7040,  -6784,
82         -2752,  -2624,  -3008,  -2880,  -2240,  -2112,  -2496,  -2368,
83         -3776,  -3648,  -4032,  -3904,  -3264,  -3136,  -3520,  -3392,
84         -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944,
85         -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136,
86         -11008, -10496, -12032, -11520, -8960,  -8448,  -9984,  -9472,
87         -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568,
88         -344,   -328,   -376,   -360,   -280,   -264,   -312,   -296,
89         -472,   -456,   -504,   -488,   -408,   -392,   -440,   -424,
90         -88,    -72,    -120,   -104,   -24,    -8,             -56,    -40,
91         -216,   -200,   -248,   -232,   -152,   -136,   -184,   -168,
92         -1376,  -1312,  -1504,  -1440,  -1120,  -1056,  -1248,  -1184,
93         -1888,  -1824,  -2016,  -1952,  -1632,  -1568,  -1760,  -1696,
94         -688,   -656,   -752,   -720,   -560,   -528,   -624,   -592,
95         -944,   -912,   -1008,  -976,   -816,   -784,   -880,   -848,
96         5504,   5248,   6016,   5760,   4480,   4224,   4992,   4736,
97         7552,   7296,   8064,   7808,   6528,   6272,   7040,   6784,
98         2752,   2624,   3008,   2880,   2240,   2112,   2496,   2368,
99         3776,   3648,   4032,   3904,   3264,   3136,   3520,   3392,
100         22016,  20992,  24064,  23040,  17920,  16896,  19968,  18944,
101         30208,  29184,  32256,  31232,  26112,  25088,  28160,  27136,
102         11008,  10496,  12032,  11520,  8960,   8448,   9984,   9472,
103         15104,  14592,  16128,  15616,  13056,  12544,  14080,  13568,
104         344,    328,    376,    360,    280,    264,    312,    296,
105         472,    456,    504,    488,    408,    392,    440,    424,
106         88,             72,             120,    104,    24,             8,              56,             40,
107         216,    200,    248,    232,    152,    136,    184,    168,
108         1376,   1312,   1504,   1440,   1120,   1056,   1248,   1184,
109         1888,   1824,   2016,   1952,   1632,   1568,   1760,   1696,
110         688,    656,    752,    720,    560,    528,    624,    592,
111         944,    912,    1008,   976,    816,    784,    880,    848
112 } ; /* alaw_decode */
113
114 static
115 unsigned char alaw_encode [2048 + 1] =
116 {       0xd5, 0xd4, 0xd7, 0xd6, 0xd1, 0xd0, 0xd3, 0xd2, 0xdd, 0xdc, 0xdf, 0xde,
117         0xd9, 0xd8, 0xdb, 0xda, 0xc5, 0xc4, 0xc7, 0xc6, 0xc1, 0xc0, 0xc3, 0xc2,
118         0xcd, 0xcc, 0xcf, 0xce, 0xc9, 0xc8, 0xcb, 0xca, 0xf5, 0xf5, 0xf4, 0xf4,
119         0xf7, 0xf7, 0xf6, 0xf6, 0xf1, 0xf1, 0xf0, 0xf0, 0xf3, 0xf3, 0xf2, 0xf2,
120         0xfd, 0xfd, 0xfc, 0xfc, 0xff, 0xff, 0xfe, 0xfe, 0xf9, 0xf9, 0xf8, 0xf8,
121         0xfb, 0xfb, 0xfa, 0xfa, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4,
122         0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe1, 0xe1, 0xe1, 0xe1,
123         0xe0, 0xe0, 0xe0, 0xe0, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2,
124         0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xef, 0xef, 0xef, 0xef,
125         0xee, 0xee, 0xee, 0xee, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8,
126         0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0x95, 0x95, 0x95, 0x95,
127         0x95, 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
128         0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, 0x96,
129         0x96, 0x96, 0x96, 0x96, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
130         0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x93, 0x93, 0x93, 0x93,
131         0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
132         0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, 0x9c, 0x9c, 0x9c,
133         0x9c, 0x9c, 0x9c, 0x9c, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f,
134         0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x99, 0x99, 0x99, 0x99,
135         0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
136         0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a,
137         0x9a, 0x9a, 0x9a, 0x9a, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
138         0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84,
139         0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
140         0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
141         0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
142         0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x81, 0x81, 0x81, 0x81,
143         0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
144         0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
145         0x80, 0x80, 0x80, 0x80, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
146         0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82,
147         0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
148         0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
149         0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
150         0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8f, 0x8f, 0x8f, 0x8f,
151         0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
152         0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
153         0x8e, 0x8e, 0x8e, 0x8e, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
154         0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88,
155         0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
156         0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
157         0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
158         0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0xb5, 0xb5, 0xb5, 0xb5,
159         0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5,
160         0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5,
161         0xb5, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4,
162         0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4,
163         0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4,
164         0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7,
165         0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7,
166         0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6,
167         0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6,
168         0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6,
169         0xb6, 0xb6, 0xb6, 0xb6, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1,
170         0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1,
171         0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1,
172         0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0,
173         0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0,
174         0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb3, 0xb3, 0xb3, 0xb3,
175         0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3,
176         0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3,
177         0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2,
178         0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2,
179         0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2,
180         0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd,
181         0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd,
182         0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc,
183         0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc,
184         0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc,
185         0xbc, 0xbc, 0xbc, 0xbc, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
186         0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
187         0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
188         0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe,
189         0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe,
190         0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xb9, 0xb9, 0xb9, 0xb9,
191         0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9,
192         0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9,
193         0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8,
194         0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8,
195         0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8,
196         0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
197         0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
198         0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba,
199         0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
200         0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
201         0xba, 0xba, 0xba, 0xba, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
202         0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
203         0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
204         0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
205         0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
206         0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4,
207         0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
208         0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
209         0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
210         0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
211         0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
212         0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
213         0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
214         0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
215         0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
216         0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
217         0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
218         0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
219         0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
220         0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
221         0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
222         0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa1, 0xa1, 0xa1, 0xa1,
223         0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
224         0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
225         0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
226         0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
227         0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
228         0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
229         0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
230         0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
231         0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
232         0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
233         0xa0, 0xa0, 0xa0, 0xa0, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
234         0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
235         0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
236         0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
237         0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
238         0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2,
239         0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
240         0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
241         0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
242         0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
243         0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
244         0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
245         0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
246         0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
247         0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
248         0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
249         0xad, 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
250         0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
251         0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
252         0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
253         0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
254         0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xaf, 0xaf, 0xaf, 0xaf,
255         0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
256         0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
257         0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
258         0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
259         0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
260         0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
261         0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
262         0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
263         0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
264         0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
265         0xae, 0xae, 0xae, 0xae, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
266         0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
267         0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
268         0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
269         0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
270         0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8,
271         0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
272         0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
273         0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
274         0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
275         0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
276         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
277         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
278         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
279         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
280         0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
281         0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
282         0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
283         0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
284         0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
285         0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
286         0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a
287 } ; /* alaw_encode */
288
289 static inline void
290 alaw2s_array (unsigned char *buffer, int count, short *ptr)
291 {       while (--count >= 0)
292                 ptr [count] = alaw_decode [(int) buffer [count]] ;
293 } /* alaw2s_array */
294
295 static inline void
296 alaw2i_array (unsigned char *buffer, int count, int *ptr)
297 {       while (--count >= 0)
298                 ptr [count] = alaw_decode [(int) buffer [count]] << 16 ;
299 } /* alaw2i_array */
300
301 static inline void
302 alaw2f_array (unsigned char *buffer, int count, float *ptr, float normfact)
303 {       while (--count >= 0)
304                 ptr [count] = normfact * alaw_decode [(int) buffer [count]] ;
305 } /* alaw2f_array */
306
307 static inline void
308 alaw2d_array (unsigned char *buffer, int count, double *ptr, double normfact)
309 {       while (--count >= 0)
310                 ptr [count] = normfact * alaw_decode [(int) buffer [count]] ;
311 } /* alaw2d_array */
312
313 static inline void
314 s2alaw_array (const short *ptr, int count, unsigned char *buffer)
315 {       while (--count >= 0)
316         {       if (ptr [count] >= 0)
317                         buffer [count] = alaw_encode [ptr [count] / 16] ;
318                 else
319                         buffer [count] = 0x7F & alaw_encode [ptr [count] / -16] ;
320                 } ;
321 } /* s2alaw_array */
322
323 static inline void
324 i2alaw_array (const int *ptr, int count, unsigned char *buffer)
325 {       while (--count >= 0)
326         {       if (ptr [count] >= 0)
327                         buffer [count] = alaw_encode [ptr [count] >> (16 + 4)] ;
328                 else
329                         buffer [count] = 0x7F & alaw_encode [- ptr [count] >> (16 + 4)] ;
330                 } ;
331 } /* i2alaw_array */
332
333 static inline void
334 f2alaw_array (const float *ptr, int count, unsigned char *buffer, float normfact)
335 {       while (--count >= 0)
336         {       if (ptr [count] >= 0)
337                         buffer [count] = alaw_encode [lrintf (normfact * ptr [count])] ;
338                 else
339                         buffer [count] = 0x7F & alaw_encode [- lrintf (normfact * ptr [count])] ;
340                 } ;
341 } /* f2alaw_array */
342
343 static inline void
344 d2alaw_array (const double *ptr, int count, unsigned char *buffer, double normfact)
345 {       while (--count >= 0)
346         {       if (ptr [count] >= 0)
347                         buffer [count] = alaw_encode [lrint (normfact * ptr [count])] ;
348                 else
349                         buffer [count] = 0x7F & alaw_encode [- lrint (normfact * ptr [count])] ;
350                 } ;
351 } /* d2alaw_array */
352
353 /*==============================================================================
354 */
355
356 static sf_count_t
357 alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
358 {       int                     bufferlen, readcount ;
359         sf_count_t      total = 0 ;
360
361         bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
362
363         while (len > 0)
364         {       if (len < bufferlen)
365                         bufferlen = (int) len ;
366                 readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
367                 alaw2s_array (psf->u.ucbuf, readcount, ptr + total) ;
368                 total += readcount ;
369                 if (readcount < bufferlen)
370                         break ;
371                 len -= readcount ;
372                 } ;
373
374         return total ;
375 } /* alaw_read_alaw2s */
376
377 static sf_count_t
378 alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
379 {       int                     bufferlen, readcount ;
380         sf_count_t      total = 0 ;
381
382         bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
383
384         while (len > 0)
385         {       if (len < bufferlen)
386                         bufferlen = (int) len ;
387                 readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
388                 alaw2i_array (psf->u.ucbuf, readcount, ptr + total) ;
389                 total += readcount ;
390                 if (readcount < bufferlen)
391                         break ;
392                 len -= readcount ;
393                 } ;
394
395         return total ;
396 } /* alaw_read_alaw2i */
397
398 static sf_count_t
399 alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
400 {       int                     bufferlen, readcount ;
401         sf_count_t      total = 0 ;
402         float   normfact ;
403
404         normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
405
406         bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
407
408         while (len > 0)
409         {       if (len < bufferlen)
410                         bufferlen = (int) len ;
411                 readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
412                 alaw2f_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
413                 total += readcount ;
414                 if (readcount < bufferlen)
415                         break ;
416                 len -= readcount ;
417                 } ;
418
419         return total ;
420 } /* alaw_read_alaw2f */
421
422 static sf_count_t
423 alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
424 {       int                     bufferlen, readcount ;
425         sf_count_t      total = 0 ;
426         double  normfact ;
427
428         normfact = (psf->norm_double) ? 1.0 / ((double) 0x8000) : 1.0 ;
429         bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
430
431         while (len > 0)
432         {       if (len < bufferlen)
433                         bufferlen = (int) len ;
434                 readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
435                 alaw2d_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
436                 total += readcount ;
437                 if (readcount < bufferlen)
438                         break ;
439                 len -= readcount ;
440                 } ;
441
442         return total ;
443 } /* alaw_read_alaw2d */
444
445 /*=============================================================================================
446 */
447
448 static sf_count_t
449 alaw_write_s2alaw       (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
450 {       int                     bufferlen, writecount ;
451         sf_count_t      total = 0 ;
452
453         bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
454
455         while (len > 0)
456         {       if (len < bufferlen)
457                         bufferlen = (int) len ;
458                 s2alaw_array (ptr + total, bufferlen, psf->u.ucbuf) ;
459                 writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
460                 total += writecount ;
461                 if (writecount < bufferlen)
462                         break ;
463                 len -= writecount ;
464                 } ;
465
466         return total ;
467 } /* alaw_write_s2alaw */
468
469 static sf_count_t
470 alaw_write_i2alaw       (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
471 {       int                     bufferlen, writecount ;
472         sf_count_t      total = 0 ;
473
474         bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
475
476         while (len > 0)
477         {       if (len < bufferlen)
478                         bufferlen = (int) len ;
479                 i2alaw_array (ptr + total, bufferlen, psf->u.ucbuf) ;
480                 writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
481                 total += writecount ;
482                 if (writecount < bufferlen)
483                         break ;
484                 len -= writecount ;
485                 } ;
486
487         return total ;
488 } /* alaw_write_i2alaw */
489
490 static sf_count_t
491 alaw_write_f2alaw       (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
492 {       int                     bufferlen, writecount ;
493         sf_count_t      total = 0 ;
494         float   normfact ;
495
496         normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) / 16.0 : 1.0 / 16 ;
497
498         bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
499
500         while (len > 0)
501         {       if (len < bufferlen)
502                         bufferlen = (int) len ;
503                 f2alaw_array (ptr + total, bufferlen, psf->u.ucbuf, normfact) ;
504                 writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
505                 total += writecount ;
506                 if (writecount < bufferlen)
507                         break ;
508                 len -= writecount ;
509                 } ;
510
511         return total ;
512 } /* alaw_write_f2alaw */
513
514 static sf_count_t
515 alaw_write_d2alaw       (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
516 {       int                     bufferlen, writecount ;
517         sf_count_t      total = 0 ;
518         double  normfact ;
519
520         normfact = (psf->norm_double) ? (1.0 * 0x7FFF) / 16.0 : 1.0 / 16.0 ;
521
522         bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
523
524         while (len > 0)
525         {       if (len < bufferlen)
526                         bufferlen = (int) len ;
527                 d2alaw_array (ptr + total, bufferlen, psf->u.ucbuf, normfact) ;
528                 writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
529                 total += writecount ;
530                 if (writecount < bufferlen)
531                         break ;
532                 len -= writecount ;
533                 } ;
534
535         return total ;
536 } /* alaw_write_d2alaw */
537
538 /*
539 ** Do not edit or modify anything in this comment block.
540 ** The arch-tag line is a file identity tag for the GNU Arch 
541 ** revision control system.
542 **
543 ** arch-tag: 289ccfc2-42a6-4f1f-a29f-4dcc9bfa8752
544 */