]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - sys/dev/sound/pcm/g711.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / sys / dev / sound / pcm / g711.h
1 /*-
2  * Copyright (c) 2008-2009 Ariff Abdullah <ariff@FreeBSD.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28
29 #ifndef _SND_G711_H_
30 #define _SND_G711_H_
31
32 #define G711_TABLE_SIZE         256
33
34 #define ULAW_TO_U8      {                                               \
35             3,    7,   11,   15,   19,   23,   27,   31,                \
36            35,   39,   43,   47,   51,   55,   59,   63,                \
37            66,   68,   70,   72,   74,   76,   78,   80,                \
38            82,   84,   86,   88,   90,   92,   94,   96,                \
39            98,   99,  100,  101,  102,  103,  104,  105,                \
40           106,  107,  108,  109,  110,  111,  112,  113,                \
41           113,  114,  114,  115,  115,  116,  116,  117,                \
42           117,  118,  118,  119,  119,  120,  120,  121,                \
43           121,  121,  122,  122,  122,  122,  123,  123,                \
44           123,  123,  124,  124,  124,  124,  125,  125,                \
45           125,  125,  125,  125,  126,  126,  126,  126,                \
46           126,  126,  126,  126,  127,  127,  127,  127,                \
47           127,  127,  127,  127,  127,  127,  127,  127,                \
48           128,  128,  128,  128,  128,  128,  128,  128,                \
49           128,  128,  128,  128,  128,  128,  128,  128,                \
50           128,  128,  128,  128,  128,  128,  128,  128,                \
51           253,  249,  245,  241,  237,  233,  229,  225,                \
52           221,  217,  213,  209,  205,  201,  197,  193,                \
53           190,  188,  186,  184,  182,  180,  178,  176,                \
54           174,  172,  170,  168,  166,  164,  162,  160,                \
55           158,  157,  156,  155,  154,  153,  152,  151,                \
56           150,  149,  148,  147,  146,  145,  144,  143,                \
57           143,  142,  142,  141,  141,  140,  140,  139,                \
58           139,  138,  138,  137,  137,  136,  136,  135,                \
59           135,  135,  134,  134,  134,  134,  133,  133,                \
60           133,  133,  132,  132,  132,  132,  131,  131,                \
61           131,  131,  131,  131,  130,  130,  130,  130,                \
62           130,  130,  130,  130,  129,  129,  129,  129,                \
63           129,  129,  129,  129,  129,  129,  129,  129,                \
64           128,  128,  128,  128,  128,  128,  128,  128,                \
65           128,  128,  128,  128,  128,  128,  128,  128,                \
66           128,  128,  128,  128,  128,  128,  128,  128,                \
67         }
68
69 #define ALAW_TO_U8      {                                               \
70           108,  109,  106,  107,  112,  113,  110,  111,                \
71           100,  101,   98,   99,  104,  105,  102,  103,                \
72           118,  118,  117,  117,  120,  120,  119,  119,                \
73           114,  114,  113,  113,  116,  116,  115,  115,                \
74            43,   47,   35,   39,   59,   63,   51,   55,                \
75            11,   15,    3,    7,   27,   31,   19,   23,                \
76            86,   88,   82,   84,   94,   96,   90,   92,                \
77            70,   72,   66,   68,   78,   80,   74,   76,                \
78           127,  127,  127,  127,  127,  127,  127,  127,                \
79           127,  127,  127,  127,  127,  127,  127,  127,                \
80           128,  128,  128,  128,  128,  128,  128,  128,                \
81           128,  128,  128,  128,  128,  128,  128,  128,                \
82           123,  123,  123,  123,  124,  124,  124,  124,                \
83           121,  121,  121,  121,  122,  122,  122,  122,                \
84           126,  126,  126,  126,  126,  126,  126,  126,                \
85           125,  125,  125,  125,  125,  125,  125,  125,                \
86           148,  147,  150,  149,  144,  143,  146,  145,                \
87           156,  155,  158,  157,  152,  151,  154,  153,                \
88           138,  138,  139,  139,  136,  136,  137,  137,                \
89           142,  142,  143,  143,  140,  140,  141,  141,                \
90           213,  209,  221,  217,  197,  193,  205,  201,                \
91           245,  241,  253,  249,  229,  225,  237,  233,                \
92           170,  168,  174,  172,  162,  160,  166,  164,                \
93           186,  184,  190,  188,  178,  176,  182,  180,                \
94           129,  129,  129,  129,  129,  129,  129,  129,                \
95           129,  129,  129,  129,  129,  129,  129,  129,                \
96           128,  128,  128,  128,  128,  128,  128,  128,                \
97           128,  128,  128,  128,  128,  128,  128,  128,                \
98           133,  133,  133,  133,  132,  132,  132,  132,                \
99           135,  135,  135,  135,  134,  134,  134,  134,                \
100           130,  130,  130,  130,  130,  130,  130,  130,                \
101           131,  131,  131,  131,  131,  131,  131,  131,                \
102         }
103
104 #define U8_TO_ULAW      {                                               \
105              0,    0,    0,    0,    0,    1,    1,    1,               \
106              1,    2,    2,    2,    2,    3,    3,    3,               \
107              3,    4,    4,    4,    4,    5,    5,    5,               \
108              5,    6,    6,    6,    6,    7,    7,    7,               \
109              7,    8,    8,    8,    8,    9,    9,    9,               \
110              9,   10,   10,   10,   10,   11,   11,   11,               \
111             11,   12,   12,   12,   12,   13,   13,   13,               \
112             13,   14,   14,   14,   14,   15,   15,   15,               \
113             15,   16,   16,   17,   17,   18,   18,   19,               \
114             19,   20,   20,   21,   21,   22,   22,   23,               \
115             23,   24,   24,   25,   25,   26,   26,   27,               \
116             27,   28,   28,   29,   29,   30,   30,   31,               \
117             31,   32,   33,   34,   35,   36,   37,   38,               \
118             39,   40,   41,   42,   43,   44,   45,   46,               \
119             47,   49,   51,   53,   55,   57,   59,   61,               \
120             63,   66,   70,   74,   78,   84,   92,  104,               \
121            254,  231,  219,  211,  205,  201,  197,  193,               \
122            190,  188,  186,  184,  182,  180,  178,  176,               \
123            175,  174,  173,  172,  171,  170,  169,  168,               \
124            167,  166,  165,  164,  163,  162,  161,  160,               \
125            159,  159,  158,  158,  157,  157,  156,  156,               \
126            155,  155,  154,  154,  153,  153,  152,  152,               \
127            151,  151,  150,  150,  149,  149,  148,  148,               \
128            147,  147,  146,  146,  145,  145,  144,  144,               \
129            143,  143,  143,  143,  142,  142,  142,  142,               \
130            141,  141,  141,  141,  140,  140,  140,  140,               \
131            139,  139,  139,  139,  138,  138,  138,  138,               \
132            137,  137,  137,  137,  136,  136,  136,  136,               \
133            135,  135,  135,  135,  134,  134,  134,  134,               \
134            133,  133,  133,  133,  132,  132,  132,  132,               \
135            131,  131,  131,  131,  130,  130,  130,  130,               \
136            129,  129,  129,  129,  128,  128,  128,  128,               \
137         }
138
139 #define U8_TO_ALAW      {                                               \
140            42,   42,   42,   42,   42,   43,   43,   43,                \
141            43,   40,   40,   40,   40,   41,   41,   41,                \
142            41,   46,   46,   46,   46,   47,   47,   47,                \
143            47,   44,   44,   44,   44,   45,   45,   45,                \
144            45,   34,   34,   34,   34,   35,   35,   35,                \
145            35,   32,   32,   32,   32,   33,   33,   33,                \
146            33,   38,   38,   38,   38,   39,   39,   39,                \
147            39,   36,   36,   36,   36,   37,   37,   37,                \
148            37,   58,   58,   59,   59,   56,   56,   57,                \
149            57,   62,   62,   63,   63,   60,   60,   61,                \
150            61,   50,   50,   51,   51,   48,   48,   49,                \
151            49,   54,   54,   55,   55,   52,   52,   53,                \
152            53,   10,   11,    8,    9,   14,   15,   12,                \
153            13,    2,    3,    0,    1,    6,    7,    4,                \
154             5,   24,   30,   28,   18,   16,   22,   20,                \
155           106,  110,   98,  102,  122,  114,   75,   90,                \
156           213,  197,  245,  253,  229,  225,  237,  233,                \
157           149,  151,  145,  147,  157,  159,  153,  155,                \
158           133,  132,  135,  134,  129,  128,  131,  130,                \
159           141,  140,  143,  142,  137,  136,  139,  138,                \
160           181,  181,  180,  180,  183,  183,  182,  182,                \
161           177,  177,  176,  176,  179,  179,  178,  178,                \
162           189,  189,  188,  188,  191,  191,  190,  190,                \
163           185,  185,  184,  184,  187,  187,  186,  186,                \
164           165,  165,  165,  165,  164,  164,  164,  164,                \
165           167,  167,  167,  167,  166,  166,  166,  166,                \
166           161,  161,  161,  161,  160,  160,  160,  160,                \
167           163,  163,  163,  163,  162,  162,  162,  162,                \
168           173,  173,  173,  173,  172,  172,  172,  172,                \
169           175,  175,  175,  175,  174,  174,  174,  174,                \
170           169,  169,  169,  169,  168,  168,  168,  168,                \
171           171,  171,  171,  171,  170,  170,  170,  170,                \
172         }
173
174
175 #define _G711_TO_INTPCM(t, v)   ((intpcm_t)                             \
176                                  ((int8_t)((t)[(uint8_t)(v)] ^ 0x80)))
177
178 #define _INTPCM_TO_G711(t, v)   ((t)[(uint8_t)((v) ^ 0x80)])
179
180
181 #define G711_DECLARE_TABLE(t)                                           \
182 static const struct {                                                   \
183         const uint8_t ulaw_to_u8[G711_TABLE_SIZE];                      \
184         const uint8_t alaw_to_u8[G711_TABLE_SIZE];                      \
185         const uint8_t u8_to_ulaw[G711_TABLE_SIZE];                      \
186         const uint8_t u8_to_alaw[G711_TABLE_SIZE];                      \
187 } t = {                                                                 \
188         ULAW_TO_U8, ALAW_TO_U8,                                         \
189         U8_TO_ULAW, U8_TO_ALAW                                          \
190 }
191
192 #define G711_DECLARE_OP(t)                                              \
193 static __inline intpcm_t                                                \
194 pcm_read_ulaw(uint8_t v)                                                \
195 {                                                                       \
196                                                                         \
197         return (_G711_TO_INTPCM((t).ulaw_to_u8, v));                    \
198 }                                                                       \
199                                                                         \
200 static __inline intpcm_t                                                \
201 pcm_read_alaw(uint8_t v)                                                \
202 {                                                                       \
203                                                                         \
204         return (_G711_TO_INTPCM((t).alaw_to_u8, v));                    \
205 }                                                                       \
206                                                                         \
207 static __inline void                                                    \
208 pcm_write_ulaw(uint8_t *dst, intpcm_t v)                                \
209 {                                                                       \
210                                                                         \
211         *dst = _INTPCM_TO_G711((t).u8_to_ulaw, v);                      \
212 }                                                                       \
213                                                                         \
214 static __inline void                                                    \
215 pcm_write_alaw(uint8_t *dst, intpcm_t v)                                \
216 {                                                                       \
217                                                                         \
218         *dst = _INTPCM_TO_G711((t).u8_to_alaw, v);                      \
219 }
220
221 #define G711_DECLARE(t)                                                 \
222         G711_DECLARE_TABLE(t);                                          \
223         G711_DECLARE_OP(t)
224
225 #endif  /* !_SND_G711_H_ */