Home | History | Annotate | Line # | Download | only in common
      1 /*	$NetBSD: auconv.h,v 1.6 2023/04/15 12:39:44 mlelstv Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 1997 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Lennart Augustsson.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 #include <sys/types.h>
     33 #include <sys/audioio.h>
     34 
     35 /* Convert between signed and unsigned. */
     36 static inline void change_sign8(u_char *, int);
     37 static inline void change_sign16_le(u_char *, int);
     38 static inline void change_sign16_be(u_char *, int);
     39 static inline void change_sign32_le(u_char *, int);
     40 static inline void change_sign32_be(u_char *, int);
     41 /* Convert between little and big endian. */
     42 static inline void swap_bytes(u_char *, int);
     43 static inline void swap_bytes32(u_char *, int);
     44 static inline void swap_bytes_change_sign16_le(u_char *, int);
     45 static inline void swap_bytes_change_sign16_be(u_char *, int);
     46 static inline void change_sign16_swap_bytes_le(u_char *, int);
     47 static inline void change_sign16_swap_bytes_be(u_char *, int);
     48 static inline void swap_bytes_change_sign32_le(u_char *, int);
     49 static inline void swap_bytes_change_sign32_be(u_char *, int);
     50 static inline void change_sign32_swap_bytes_le(u_char *, int);
     51 static inline void change_sign32_swap_bytes_be(u_char *, int);
     52 
     53 static inline void
     54 change_sign8(u_char *p, int cc)
     55 {
     56 	while (--cc >= 0) {
     57 		*p ^= 0x80;
     58 		++p;
     59 	}
     60 }
     61 
     62 static inline void
     63 change_sign16_le(u_char *p, int cc)
     64 {
     65 	while ((cc -= 2) >= 0) {
     66 		p[1] ^= 0x80;
     67 		p += 2;
     68 	}
     69 }
     70 
     71 static inline void
     72 change_sign16_be(u_char *p, int cc)
     73 {
     74 	while ((cc -= 2) >= 0) {
     75 		p[0] ^= 0x80;
     76 		p += 2;
     77 	}
     78 }
     79 
     80 static inline void
     81 change_sign24_le(u_char *p, int cc)
     82 {
     83 	while ((cc -= 3) >= 0) {
     84 		p[2] ^= 0x80;
     85 		p += 3;
     86 	}
     87 }
     88 
     89 static inline void
     90 change_sign24_be(u_char *p, int cc)
     91 {
     92 	while ((cc -= 3) >= 0) {
     93 		p[0] ^= 0x80;
     94 		p += 3;
     95 	}
     96 }
     97 
     98 static inline void
     99 change_sign32_le(u_char *p, int cc)
    100 {
    101 	while ((cc -= 4) >= 0) {
    102 		p[3] ^= 0x80;
    103 		p += 4;
    104 	}
    105 }
    106 
    107 static inline void
    108 change_sign32_be(u_char *p, int cc)
    109 {
    110 	while ((cc -= 4) >= 0) {
    111 		p[0] ^= 0x80;
    112 		p += 4;
    113 	}
    114 }
    115 
    116 static inline void
    117 swap_bytes(u_char *p, int cc)
    118 {
    119 	u_char t;
    120 
    121 	while ((cc -= 2) >= 0) {
    122 		t = p[0];
    123 		p[0] = p[1];
    124 		p[1] = t;
    125 		p += 2;
    126 	}
    127 }
    128 
    129 static inline void
    130 swap_bytes32(u_char *p, int cc)
    131 {
    132 	u_char t;
    133 
    134 	while ((cc -= 4) >= 0) {
    135 		t = p[0];
    136 		p[0] = p[3];
    137 		p[3] = t;
    138 		t = p[1];
    139 		p[1] = p[2];
    140 		p[2] = t;
    141 		p += 4;
    142 	}
    143 }
    144 
    145 static inline void
    146 swap_bytes_change_sign16_le(u_char *p, int cc)
    147 {
    148 	u_char t;
    149 
    150 	while ((cc -= 2) >= 0) {
    151 		t = p[1];
    152 		p[1] = p[0] ^ 0x80;
    153 		p[0] = t;
    154 		p += 2;
    155 	}
    156 }
    157 
    158 static inline void
    159 swap_bytes_change_sign16_be(u_char *p, int cc)
    160 {
    161 	u_char t;
    162 
    163 	while ((cc -= 2) >= 0) {
    164 		t = p[0];
    165 		p[0] = p[1] ^ 0x80;
    166 		p[1] = t;
    167 		p += 2;
    168 	}
    169 }
    170 
    171 static inline void
    172 change_sign16_swap_bytes_le(u_char *p, int cc)
    173 {
    174 	swap_bytes_change_sign16_be(p, cc);
    175 }
    176 
    177 static inline void
    178 change_sign16_swap_bytes_be(u_char *p, int cc)
    179 {
    180 	swap_bytes_change_sign16_le(p, cc);
    181 }
    182 
    183 static inline void
    184 swap_bytes_change_sign24_le(u_char *p, int cc)
    185 {
    186 	u_char t;
    187 
    188 	while ((cc -= 3) >= 0) {
    189 		t = p[2];
    190 		p[2] = p[0] ^ 0x80;
    191 		p[0] = t;
    192 		p += 3;
    193 	}
    194 }
    195 
    196 static inline void
    197 swap_bytes_change_sign24_be(u_char *p, int cc)
    198 {
    199 	u_char t;
    200 
    201 	while ((cc -= 3) >= 0) {
    202 		t = p[0];
    203 		p[0] = p[2] ^ 0x80;
    204 		p[2] = t;
    205 		p += 3;
    206 	}
    207 }
    208 
    209 static inline void
    210 change_sign24_swap_bytes_le(u_char *p, int cc)
    211 {
    212 	swap_bytes_change_sign24_be(p, cc);
    213 }
    214 
    215 static inline void
    216 change_sign24_swap_bytes_be(u_char *p, int cc)
    217 {
    218 	swap_bytes_change_sign24_le(p, cc);
    219 }
    220 
    221 static inline void
    222 swap_bytes_change_sign32_le(u_char *p, int cc)
    223 {
    224 	u_char t;
    225 
    226 	while ((cc -= 4) >= 0) {
    227 		t = p[3];
    228 		p[3] = p[0] ^ 0x80;
    229 		p[0] = t;
    230 		t = p[1];
    231 		p[1] = p[2];
    232 		p[2] = t;
    233 		p += 4;
    234 	}
    235 }
    236 
    237 static inline void
    238 swap_bytes_change_sign32_be(u_char *p, int cc)
    239 {
    240 	u_char t;
    241 
    242 	while ((cc -= 4) >= 0) {
    243 		t = p[0];
    244 		p[0] = p[3] ^ 0x80;
    245 		p[3] = t;
    246 		t = p[1];
    247 		p[1] = p[2];
    248 		p[2] = t;
    249 		p += 4;
    250 	}
    251 }
    252 
    253 static inline void
    254 change_sign32_swap_bytes_le(u_char *p, int cc)
    255 {
    256 	swap_bytes_change_sign32_be(p, cc);
    257 }
    258 
    259 static inline void
    260 change_sign32_swap_bytes_be(u_char *p, int cc)
    261 {
    262 	swap_bytes_change_sign32_le(p, cc);
    263 }
    264