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