1193640Sariff/*-
2193640Sariff * Copyright (c) 2008-2009 Ariff Abdullah <ariff@FreeBSD.org>
3193640Sariff * All rights reserved.
4193640Sariff *
5193640Sariff * Redistribution and use in source and binary forms, with or without
6193640Sariff * modification, are permitted provided that the following conditions
7193640Sariff * are met:
8193640Sariff * 1. Redistributions of source code must retain the above copyright
9193640Sariff *    notice, this list of conditions and the following disclaimer.
10193640Sariff * 2. Redistributions in binary form must reproduce the above copyright
11193640Sariff *    notice, this list of conditions and the following disclaimer in the
12193640Sariff *    documentation and/or other materials provided with the distribution.
13193640Sariff *
14193640Sariff * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15193640Sariff * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16193640Sariff * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17193640Sariff * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18193640Sariff * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19193640Sariff * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20193640Sariff * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21193640Sariff * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22193640Sariff * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23193640Sariff * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24193640Sariff * SUCH DAMAGE.
25193640Sariff *
26193640Sariff * $FreeBSD$
27193640Sariff */
28193640Sariff
29193640Sariff#ifndef _SND_G711_H_
30193640Sariff#define _SND_G711_H_
31193640Sariff
32193640Sariff#define G711_TABLE_SIZE		256
33193640Sariff
34193640Sariff#define ULAW_TO_U8	{						\
35193640Sariff	    3,    7,   11,   15,   19,   23,   27,   31,		\
36193640Sariff	   35,   39,   43,   47,   51,   55,   59,   63,		\
37193640Sariff	   66,   68,   70,   72,   74,   76,   78,   80,		\
38193640Sariff	   82,   84,   86,   88,   90,   92,   94,   96,		\
39193640Sariff	   98,   99,  100,  101,  102,  103,  104,  105,		\
40193640Sariff	  106,  107,  108,  109,  110,  111,  112,  113,		\
41193640Sariff	  113,  114,  114,  115,  115,  116,  116,  117,		\
42193640Sariff	  117,  118,  118,  119,  119,  120,  120,  121,		\
43193640Sariff	  121,  121,  122,  122,  122,  122,  123,  123,		\
44193640Sariff	  123,  123,  124,  124,  124,  124,  125,  125,		\
45193640Sariff	  125,  125,  125,  125,  126,  126,  126,  126,		\
46193640Sariff	  126,  126,  126,  126,  127,  127,  127,  127,		\
47193640Sariff	  127,  127,  127,  127,  127,  127,  127,  127,		\
48193640Sariff	  128,  128,  128,  128,  128,  128,  128,  128,		\
49193640Sariff	  128,  128,  128,  128,  128,  128,  128,  128,		\
50193640Sariff	  128,  128,  128,  128,  128,  128,  128,  128,		\
51193640Sariff	  253,  249,  245,  241,  237,  233,  229,  225,		\
52193640Sariff	  221,  217,  213,  209,  205,  201,  197,  193,		\
53193640Sariff	  190,  188,  186,  184,  182,  180,  178,  176,		\
54193640Sariff	  174,  172,  170,  168,  166,  164,  162,  160,		\
55193640Sariff	  158,  157,  156,  155,  154,  153,  152,  151,		\
56193640Sariff	  150,  149,  148,  147,  146,  145,  144,  143,		\
57193640Sariff	  143,  142,  142,  141,  141,  140,  140,  139,		\
58193640Sariff	  139,  138,  138,  137,  137,  136,  136,  135,		\
59193640Sariff	  135,  135,  134,  134,  134,  134,  133,  133,		\
60193640Sariff	  133,  133,  132,  132,  132,  132,  131,  131,		\
61193640Sariff	  131,  131,  131,  131,  130,  130,  130,  130,		\
62193640Sariff	  130,  130,  130,  130,  129,  129,  129,  129,		\
63193640Sariff	  129,  129,  129,  129,  129,  129,  129,  129,		\
64193640Sariff	  128,  128,  128,  128,  128,  128,  128,  128,		\
65193640Sariff	  128,  128,  128,  128,  128,  128,  128,  128,		\
66193640Sariff	  128,  128,  128,  128,  128,  128,  128,  128,		\
67193640Sariff	}
68193640Sariff
69193640Sariff#define ALAW_TO_U8	{						\
70193640Sariff	  108,  109,  106,  107,  112,  113,  110,  111,		\
71193640Sariff	  100,  101,   98,   99,  104,  105,  102,  103,		\
72193640Sariff	  118,  118,  117,  117,  120,  120,  119,  119,		\
73193640Sariff	  114,  114,  113,  113,  116,  116,  115,  115,		\
74193640Sariff	   43,   47,   35,   39,   59,   63,   51,   55,		\
75193640Sariff	   11,   15,    3,    7,   27,   31,   19,   23,		\
76193640Sariff	   86,   88,   82,   84,   94,   96,   90,   92,		\
77193640Sariff	   70,   72,   66,   68,   78,   80,   74,   76,		\
78193640Sariff	  127,  127,  127,  127,  127,  127,  127,  127,		\
79193640Sariff	  127,  127,  127,  127,  127,  127,  127,  127,		\
80193640Sariff	  128,  128,  128,  128,  128,  128,  128,  128,		\
81193640Sariff	  128,  128,  128,  128,  128,  128,  128,  128,		\
82193640Sariff	  123,  123,  123,  123,  124,  124,  124,  124,		\
83193640Sariff	  121,  121,  121,  121,  122,  122,  122,  122,		\
84193640Sariff	  126,  126,  126,  126,  126,  126,  126,  126,		\
85193640Sariff	  125,  125,  125,  125,  125,  125,  125,  125,		\
86193640Sariff	  148,  147,  150,  149,  144,  143,  146,  145,		\
87193640Sariff	  156,  155,  158,  157,  152,  151,  154,  153,		\
88193640Sariff	  138,  138,  139,  139,  136,  136,  137,  137,		\
89193640Sariff	  142,  142,  143,  143,  140,  140,  141,  141,		\
90193640Sariff	  213,  209,  221,  217,  197,  193,  205,  201,		\
91193640Sariff	  245,  241,  253,  249,  229,  225,  237,  233,		\
92193640Sariff	  170,  168,  174,  172,  162,  160,  166,  164,		\
93193640Sariff	  186,  184,  190,  188,  178,  176,  182,  180,		\
94193640Sariff	  129,  129,  129,  129,  129,  129,  129,  129,		\
95193640Sariff	  129,  129,  129,  129,  129,  129,  129,  129,		\
96193640Sariff	  128,  128,  128,  128,  128,  128,  128,  128,		\
97193640Sariff	  128,  128,  128,  128,  128,  128,  128,  128,		\
98193640Sariff	  133,  133,  133,  133,  132,  132,  132,  132,		\
99193640Sariff	  135,  135,  135,  135,  134,  134,  134,  134,		\
100193640Sariff	  130,  130,  130,  130,  130,  130,  130,  130,		\
101193640Sariff	  131,  131,  131,  131,  131,  131,  131,  131,		\
102193640Sariff	}
103193640Sariff
104193640Sariff#define U8_TO_ULAW	{						\
105193640Sariff	     0,    0,    0,    0,    0,    1,    1,    1,		\
106193640Sariff	     1,    2,    2,    2,    2,    3,    3,    3,		\
107193640Sariff	     3,    4,    4,    4,    4,    5,    5,    5,		\
108193640Sariff	     5,    6,    6,    6,    6,    7,    7,    7,		\
109193640Sariff	     7,    8,    8,    8,    8,    9,    9,    9,		\
110193640Sariff	     9,   10,   10,   10,   10,   11,   11,   11,		\
111193640Sariff	    11,   12,   12,   12,   12,   13,   13,   13,		\
112193640Sariff	    13,   14,   14,   14,   14,   15,   15,   15,		\
113193640Sariff	    15,   16,   16,   17,   17,   18,   18,   19,		\
114193640Sariff	    19,   20,   20,   21,   21,   22,   22,   23,		\
115193640Sariff	    23,   24,   24,   25,   25,   26,   26,   27,		\
116193640Sariff	    27,   28,   28,   29,   29,   30,   30,   31,		\
117193640Sariff	    31,   32,   33,   34,   35,   36,   37,   38,		\
118193640Sariff	    39,   40,   41,   42,   43,   44,   45,   46,		\
119193640Sariff	    47,   49,   51,   53,   55,   57,   59,   61,		\
120193640Sariff	    63,   66,   70,   74,   78,   84,   92,  104,		\
121193640Sariff	   254,  231,  219,  211,  205,  201,  197,  193,		\
122193640Sariff	   190,  188,  186,  184,  182,  180,  178,  176,		\
123193640Sariff	   175,  174,  173,  172,  171,  170,  169,  168,		\
124193640Sariff	   167,  166,  165,  164,  163,  162,  161,  160,		\
125193640Sariff	   159,  159,  158,  158,  157,  157,  156,  156,		\
126193640Sariff	   155,  155,  154,  154,  153,  153,  152,  152,		\
127193640Sariff	   151,  151,  150,  150,  149,  149,  148,  148,		\
128193640Sariff	   147,  147,  146,  146,  145,  145,  144,  144,		\
129193640Sariff	   143,  143,  143,  143,  142,  142,  142,  142,		\
130193640Sariff	   141,  141,  141,  141,  140,  140,  140,  140,		\
131193640Sariff	   139,  139,  139,  139,  138,  138,  138,  138,		\
132193640Sariff	   137,  137,  137,  137,  136,  136,  136,  136,		\
133193640Sariff	   135,  135,  135,  135,  134,  134,  134,  134,		\
134193640Sariff	   133,  133,  133,  133,  132,  132,  132,  132,		\
135193640Sariff	   131,  131,  131,  131,  130,  130,  130,  130,		\
136193640Sariff	   129,  129,  129,  129,  128,  128,  128,  128,		\
137193640Sariff	}
138193640Sariff
139193640Sariff#define U8_TO_ALAW	{						\
140193640Sariff	   42,   42,   42,   42,   42,   43,   43,   43,		\
141193640Sariff	   43,   40,   40,   40,   40,   41,   41,   41,		\
142193640Sariff	   41,   46,   46,   46,   46,   47,   47,   47,		\
143193640Sariff	   47,   44,   44,   44,   44,   45,   45,   45,		\
144193640Sariff	   45,   34,   34,   34,   34,   35,   35,   35,		\
145193640Sariff	   35,   32,   32,   32,   32,   33,   33,   33,		\
146193640Sariff	   33,   38,   38,   38,   38,   39,   39,   39,		\
147193640Sariff	   39,   36,   36,   36,   36,   37,   37,   37,		\
148193640Sariff	   37,   58,   58,   59,   59,   56,   56,   57,		\
149193640Sariff	   57,   62,   62,   63,   63,   60,   60,   61,		\
150193640Sariff	   61,   50,   50,   51,   51,   48,   48,   49,		\
151193640Sariff	   49,   54,   54,   55,   55,   52,   52,   53,		\
152193640Sariff	   53,   10,   11,    8,    9,   14,   15,   12,		\
153193640Sariff	   13,    2,    3,    0,    1,    6,    7,    4,		\
154193640Sariff	    5,   24,   30,   28,   18,   16,   22,   20,		\
155193640Sariff	  106,  110,   98,  102,  122,  114,   75,   90,		\
156193640Sariff	  213,  197,  245,  253,  229,  225,  237,  233,		\
157193640Sariff	  149,  151,  145,  147,  157,  159,  153,  155,		\
158193640Sariff	  133,  132,  135,  134,  129,  128,  131,  130,		\
159193640Sariff	  141,  140,  143,  142,  137,  136,  139,  138,		\
160193640Sariff	  181,  181,  180,  180,  183,  183,  182,  182,		\
161193640Sariff	  177,  177,  176,  176,  179,  179,  178,  178,		\
162193640Sariff	  189,  189,  188,  188,  191,  191,  190,  190,		\
163193640Sariff	  185,  185,  184,  184,  187,  187,  186,  186,		\
164193640Sariff	  165,  165,  165,  165,  164,  164,  164,  164,		\
165193640Sariff	  167,  167,  167,  167,  166,  166,  166,  166,		\
166193640Sariff	  161,  161,  161,  161,  160,  160,  160,  160,		\
167193640Sariff	  163,  163,  163,  163,  162,  162,  162,  162,		\
168193640Sariff	  173,  173,  173,  173,  172,  172,  172,  172,		\
169193640Sariff	  175,  175,  175,  175,  174,  174,  174,  174,		\
170193640Sariff	  169,  169,  169,  169,  168,  168,  168,  168,		\
171193640Sariff	  171,  171,  171,  171,  170,  170,  170,  170,		\
172193640Sariff	}
173193640Sariff
174193640Sariff
175193640Sariff#define _G711_TO_INTPCM(t, v)	((intpcm_t)				\
176193640Sariff				 ((int8_t)((t)[(uint8_t)(v)] ^ 0x80)))
177193640Sariff
178193640Sariff#define _INTPCM_TO_G711(t, v)	((t)[(uint8_t)((v) ^ 0x80)])
179193640Sariff
180193640Sariff
181193640Sariff#define G711_DECLARE_TABLE(t)						\
182193640Sariffstatic const struct {							\
183193640Sariff	const uint8_t ulaw_to_u8[G711_TABLE_SIZE];			\
184193640Sariff	const uint8_t alaw_to_u8[G711_TABLE_SIZE];			\
185193640Sariff	const uint8_t u8_to_ulaw[G711_TABLE_SIZE];			\
186193640Sariff	const uint8_t u8_to_alaw[G711_TABLE_SIZE];			\
187193640Sariff} t = {									\
188193640Sariff	ULAW_TO_U8, ALAW_TO_U8,						\
189193640Sariff	U8_TO_ULAW, U8_TO_ALAW						\
190193640Sariff}
191193640Sariff
192193640Sariff#define G711_DECLARE_OP(t)						\
193193640Sariffstatic __inline intpcm_t						\
194193640Sariffpcm_read_ulaw(uint8_t v)						\
195193640Sariff{									\
196193640Sariff									\
197193640Sariff	return (_G711_TO_INTPCM((t).ulaw_to_u8, v));			\
198193640Sariff}									\
199193640Sariff									\
200193640Sariffstatic __inline intpcm_t						\
201193640Sariffpcm_read_alaw(uint8_t v)						\
202193640Sariff{									\
203193640Sariff									\
204193640Sariff	return (_G711_TO_INTPCM((t).alaw_to_u8, v));			\
205193640Sariff}									\
206193640Sariff									\
207193640Sariffstatic __inline void							\
208193640Sariffpcm_write_ulaw(uint8_t *dst, intpcm_t v)				\
209193640Sariff{									\
210193640Sariff									\
211193640Sariff	*dst = _INTPCM_TO_G711((t).u8_to_ulaw, v);			\
212193640Sariff}									\
213193640Sariff									\
214193640Sariffstatic __inline void							\
215193640Sariffpcm_write_alaw(uint8_t *dst, intpcm_t v)				\
216193640Sariff{									\
217193640Sariff									\
218193640Sariff	*dst = _INTPCM_TO_G711((t).u8_to_alaw, v);			\
219193640Sariff}
220193640Sariff
221193640Sariff#define G711_DECLARE(t)							\
222193640Sariff	G711_DECLARE_TABLE(t);						\
223193640Sariff	G711_DECLARE_OP(t)
224193640Sariff
225193640Sariff#endif	/* !_SND_G711_H_ */
226