Coverage Report

Created: 2025-10-10 07:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libsndfile/src/alaw.c
Line
Count
Source
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
27
static sf_count_t alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
28
static sf_count_t alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
29
static sf_count_t alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
30
static sf_count_t alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
31
32
static sf_count_t alaw_write_s2alaw (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
33
static sf_count_t alaw_write_i2alaw (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
34
static sf_count_t alaw_write_f2alaw (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
35
static sf_count_t alaw_write_d2alaw (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
36
37
static void alaw2s_array (unsigned char *buffer, int count, short *ptr) ;
38
static void alaw2i_array (unsigned char *buffer, int count, int *ptr) ;
39
static void alaw2f_array (unsigned char *buffer, int count, float *ptr, float normfact) ;
40
static void alaw2d_array (unsigned char *buffer, int count, double *ptr, double normfact) ;
41
42
static void s2alaw_array (const short *buffer, int count, unsigned char *ptr) ;
43
static void i2alaw_array (const int *buffer, int count, unsigned char *ptr) ;
44
static void f2alaw_array (const float *buffer, int count, unsigned char *ptr, float normfact) ;
45
static void d2alaw_array (const double *buffer, int count, unsigned char *ptr, double normfact) ;
46
47
48
int
49
alaw_init (SF_PRIVATE *psf)
50
895
{
51
895
  if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
52
895
  { psf->read_short   = alaw_read_alaw2s ;
53
895
    psf->read_int   = alaw_read_alaw2i ;
54
895
    psf->read_float   = alaw_read_alaw2f ;
55
895
    psf->read_double  = alaw_read_alaw2d ;
56
895
    } ;
57
58
895
  if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
59
0
  { psf->write_short  = alaw_write_s2alaw ;
60
0
    psf->write_int    = alaw_write_i2alaw ;
61
0
    psf->write_float  = alaw_write_f2alaw ;
62
0
    psf->write_double = alaw_write_d2alaw ;
63
0
    } ;
64
65
895
  psf->bytewidth = 1 ;
66
895
  psf->blockwidth = psf->sf.channels ;
67
68
895
  if (psf->filelength > psf->dataoffset)
69
595
    psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : psf->filelength - psf->dataoffset ;
70
300
  else
71
300
    psf->datalength = 0 ;
72
73
895
  psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ;
74
75
895
  return 0 ;
76
895
} /* alaw_init */
77
78
/*==============================================================================
79
 *  Private static functions and data.
80
 */
81
82
static
83
short 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
118
static
119
unsigned 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
293
static inline void
294
alaw2s_array (unsigned char *buffer, int count, short *ptr)
295
4.72M
{ for (int i = 0 ; i < count ; i++)
296
4.72M
    ptr [i] = alaw_decode [(int) buffer [i]] ;
297
650
} /* alaw2s_array */
298
299
static inline void
300
alaw2i_array (unsigned char *buffer, int count, int *ptr)
301
4.54M
{ for (int i = 0 ; i < count ; i++)
302
4.54M
    ptr [i] = ((uint32_t) alaw_decode [(int) buffer [i]]) << 16 ;
303
639
} /* alaw2i_array */
304
305
static inline void
306
alaw2f_array (unsigned char *buffer, int count, float *ptr, float normfact)
307
1.89M
{ for (int i = 0 ; i < count ; i++)
308
1.58M
    ptr [i] = normfact * alaw_decode [(int) buffer [i]] ;
309
314k
} /* alaw2f_array */
310
311
static inline void
312
alaw2d_array (unsigned char *buffer, int count, double *ptr, double normfact)
313
4.31M
{ for (int i = 0 ; i < count ; i++)
314
4.31M
    ptr [i] = normfact * alaw_decode [(int) buffer [i]] ;
315
632
} /* alaw2d_array */
316
317
static inline void
318
s2alaw_array (const short *ptr, int count, unsigned char *buffer)
319
0
{ for (int i = 0 ; i < count ; i++)
320
0
  { if (ptr [i] >= 0)
321
0
      buffer [i] = alaw_encode [ptr [i] / 16] ;
322
0
    else
323
0
      buffer [i] = 0x7F & alaw_encode [ptr [i] / -16] ;
324
0
    } ;
325
0
} /* s2alaw_array */
326
327
static inline void
328
i2alaw_array (const int *ptr, int count, unsigned char *buffer)
329
0
{ for (int i = 0 ; i < count ; i++)
330
0
  { if (ptr [i] == INT_MIN)
331
0
      buffer [i] = alaw_encode [INT_MAX >> (16 + 4)] ;
332
0
    else if (ptr [i] >= 0)
333
0
      buffer [i] = alaw_encode [ptr [i] >> (16 + 4)] ;
334
0
    else
335
0
      buffer [i] = 0x7F & alaw_encode [- ptr [i] >> (16 + 4)] ;
336
0
    } ;
337
0
} /* i2alaw_array */
338
339
static inline void
340
f2alaw_array (const float *ptr, int count, unsigned char *buffer, float normfact)
341
0
{ for (int i = 0 ; i < count ; i++)
342
0
  { if (ptr [i] >= 0)
343
0
      buffer [i] = alaw_encode [psf_lrintf (normfact * ptr [i])] ;
344
0
    else
345
0
      buffer [i] = 0x7F & alaw_encode [- psf_lrintf (normfact * ptr [i])] ;
346
0
    } ;
347
0
} /* f2alaw_array */
348
349
static inline void
350
d2alaw_array (const double *ptr, int count, unsigned char *buffer, double normfact)
351
0
{ for (int i = 0 ; i < count ; i++)
352
0
  { if (!isfinite (ptr [i]))
353
0
      buffer [i] = 0 ;
354
0
    else if (ptr [i] >= 0)
355
0
      buffer [i] = alaw_encode [psf_lrint (normfact * ptr [i])] ;
356
0
    else
357
0
      buffer [i] = 0x7F & alaw_encode [- psf_lrint (normfact * ptr [i])] ;
358
0
    } ;
359
0
} /* d2alaw_array */
360
361
/*==============================================================================
362
*/
363
364
static sf_count_t
365
alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
366
84
{ BUF_UNION ubuf ;
367
84
  int     bufferlen, readcount ;
368
84
  sf_count_t  total = 0 ;
369
370
84
  bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
371
372
650
  while (len > 0)
373
650
  { if (len < bufferlen)
374
59
      bufferlen = (int) len ;
375
650
    readcount = (int) psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ;
376
650
    alaw2s_array (ubuf.ucbuf, readcount, ptr + total) ;
377
650
    total += readcount ;
378
650
    if (readcount < bufferlen)
379
84
      break ;
380
566
    len -= readcount ;
381
566
    } ;
382
383
84
  return total ;
384
84
} /* alaw_read_alaw2s */
385
386
static sf_count_t
387
alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
388
96
{ BUF_UNION ubuf ;
389
96
  int     bufferlen, readcount ;
390
96
  sf_count_t  total = 0 ;
391
392
96
  bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
393
394
639
  while (len > 0)
395
639
  { if (len < bufferlen)
396
76
      bufferlen = (int) len ;
397
639
    readcount = (int) psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ;
398
639
    alaw2i_array (ubuf.ucbuf, readcount, ptr + total) ;
399
639
    total += readcount ;
400
639
    if (readcount < bufferlen)
401
96
      break ;
402
543
    len -= readcount ;
403
543
    } ;
404
405
96
  return total ;
406
96
} /* alaw_read_alaw2i */
407
408
static sf_count_t
409
alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
410
314k
{ BUF_UNION ubuf ;
411
314k
  int     bufferlen, readcount ;
412
314k
  sf_count_t  total = 0 ;
413
314k
  float normfact ;
414
415
314k
  normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
416
417
314k
  bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
418
419
629k
  while (len > 0)
420
314k
  { if (len < bufferlen)
421
314k
      bufferlen = (int) len ;
422
314k
    readcount = (int) psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ;
423
314k
    alaw2f_array (ubuf.ucbuf, readcount, ptr + total, normfact) ;
424
314k
    total += readcount ;
425
314k
    if (readcount < bufferlen)
426
44
      break ;
427
314k
    len -= readcount ;
428
314k
    } ;
429
430
314k
  return total ;
431
314k
} /* alaw_read_alaw2f */
432
433
static sf_count_t
434
alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
435
126
{ BUF_UNION ubuf ;
436
126
  int     bufferlen, readcount ;
437
126
  sf_count_t  total = 0 ;
438
126
  double  normfact ;
439
440
126
  normfact = (psf->norm_double) ? 1.0 / ((double) 0x8000) : 1.0 ;
441
126
  bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
442
443
632
  while (len > 0)
444
632
  { if (len < bufferlen)
445
94
      bufferlen = (int) len ;
446
632
    readcount = (int) psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ;
447
632
    alaw2d_array (ubuf.ucbuf, readcount, ptr + total, normfact) ;
448
632
    total += readcount ;
449
632
    if (readcount < bufferlen)
450
126
      break ;
451
506
    len -= readcount ;
452
506
    } ;
453
454
126
  return total ;
455
126
} /* alaw_read_alaw2d */
456
457
/*=============================================================================================
458
*/
459
460
static sf_count_t
461
alaw_write_s2alaw (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
462
0
{ BUF_UNION ubuf ;
463
0
  int     bufferlen, writecount ;
464
0
  sf_count_t  total = 0 ;
465
466
0
  bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
467
468
0
  while (len > 0)
469
0
  { if (len < bufferlen)
470
0
      bufferlen = (int) len ;
471
0
    s2alaw_array (ptr + total, bufferlen, ubuf.ucbuf) ;
472
0
    writecount = (int) psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ;
473
0
    total += writecount ;
474
0
    if (writecount < bufferlen)
475
0
      break ;
476
0
    len -= writecount ;
477
0
    } ;
478
479
0
  return total ;
480
0
} /* alaw_write_s2alaw */
481
482
static sf_count_t
483
alaw_write_i2alaw (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
484
0
{ BUF_UNION ubuf ;
485
0
  int     bufferlen, writecount ;
486
0
  sf_count_t  total = 0 ;
487
488
0
  bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
489
490
0
  while (len > 0)
491
0
  { if (len < bufferlen)
492
0
      bufferlen = (int) len ;
493
0
    i2alaw_array (ptr + total, bufferlen, ubuf.ucbuf) ;
494
0
    writecount = (int) psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ;
495
0
    total += writecount ;
496
0
    if (writecount < bufferlen)
497
0
      break ;
498
0
    len -= writecount ;
499
0
    } ;
500
501
0
  return total ;
502
0
} /* alaw_write_i2alaw */
503
504
static sf_count_t
505
alaw_write_f2alaw (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
506
0
{ BUF_UNION ubuf ;
507
0
  int     bufferlen, writecount ;
508
0
  sf_count_t  total = 0 ;
509
0
  float normfact ;
510
511
0
  normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) / 16.0 : 1.0 / 16 ;
512
513
0
  bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
514
515
0
  while (len > 0)
516
0
  { if (len < bufferlen)
517
0
      bufferlen = (int) len ;
518
0
    f2alaw_array (ptr + total, bufferlen, ubuf.ucbuf, normfact) ;
519
0
    writecount = (int) psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ;
520
0
    total += writecount ;
521
0
    if (writecount < bufferlen)
522
0
      break ;
523
0
    len -= writecount ;
524
0
    } ;
525
526
0
  return total ;
527
0
} /* alaw_write_f2alaw */
528
529
static sf_count_t
530
alaw_write_d2alaw (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
531
0
{ BUF_UNION ubuf ;
532
0
  int     bufferlen, writecount ;
533
0
  sf_count_t  total = 0 ;
534
0
  double  normfact ;
535
536
0
  normfact = (psf->norm_double) ? (1.0 * 0x7FFF) / 16.0 : 1.0 / 16.0 ;
537
538
0
  bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
539
540
0
  while (len > 0)
541
0
  { if (len < bufferlen)
542
0
      bufferlen = (int) len ;
543
0
    d2alaw_array (ptr + total, bufferlen, ubuf.ucbuf, normfact) ;
544
0
    writecount = (int) psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ;
545
0
    total += writecount ;
546
0
    if (writecount < bufferlen)
547
0
      break ;
548
0
    len -= writecount ;
549
0
    } ;
550
551
0
  return total ;
552
0
} /* alaw_write_d2alaw */
553