Annotation of src/usr.bin/aucat/aparams.c, Revision 1.9
1.9 ! ratchov 1: /* $OpenBSD: aparams.c,v 1.8 2009/08/17 15:07:49 ratchov Exp $ */
1.1 ratchov 2: /*
3: * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org>
4: *
5: * Permission to use, copy, modify, and distribute this software for any
6: * purpose with or without fee is hereby granted, provided that the above
7: * copyright notice and this permission notice appear in all copies.
8: *
9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16: */
17:
18: #include "aparams.h"
1.4 ratchov 19:
20: int aparams_ctltovol[128] = {
21: 0,
22: 256, 266, 276, 287, 299, 310, 323, 335,
23: 348, 362, 376, 391, 406, 422, 439, 456,
24: 474, 493, 512, 532, 553, 575, 597, 621,
25: 645, 670, 697, 724, 753, 782, 813, 845,
26: 878, 912, 948, 985, 1024, 1064, 1106, 1149,
27: 1195, 1241, 1290, 1341, 1393, 1448, 1505, 1564,
28: 1625, 1689, 1756, 1825, 1896, 1971, 2048, 2128,
29: 2212, 2299, 2389, 2483, 2580, 2682, 2787, 2896,
30: 3010, 3128, 3251, 3379, 3511, 3649, 3792, 3941,
31: 4096, 4257, 4424, 4598, 4778, 4966, 5161, 5363,
32: 5574, 5793, 6020, 6256, 6502, 6757, 7023, 7298,
33: 7585, 7883, 8192, 8514, 8848, 9195, 9556, 9931,
34: 10321, 10726, 11148, 11585, 12040, 12513, 13004, 13515,
35: 14045, 14596, 15170, 15765, 16384, 17027, 17696, 18390,
36: 19112, 19863, 20643, 21453, 22295, 23170, 24080, 25025,
37: 26008, 27029, 28090, 29193, 30339, 31530, 32768
38: };
1.8 ratchov 39:
40: /*
41: * Fake parameters for byte-streams
42: */
43: struct aparams aparams_none = { 1, 0, 0, 0, 0, 0, 0, 0 };
1.1 ratchov 44:
45: /*
1.2 ratchov 46: * Generate a string corresponding to the encoding in par,
1.7 ratchov 47: * return the length of the resulting string.
1.2 ratchov 48: */
49: int
50: aparams_enctostr(struct aparams *par, char *ostr)
51: {
52: char *p = ostr;
53:
54: *p++ = par->sig ? 's' : 'u';
55: if (par->bits > 9)
56: *p++ = '0' + par->bits / 10;
57: *p++ = '0' + par->bits % 10;
58: if (par->bps > 1) {
59: *p++ = par->le ? 'l' : 'b';
60: *p++ = 'e';
61: if (par->bps != APARAMS_BPS(par->bits) ||
62: par->bits < par->bps * 8) {
63: *p++ = par->bps + '0';
64: if (par->bits < par->bps * 8) {
65: *p++ = par->msb ? 'm' : 'l';
66: *p++ = 's';
67: *p++ = 'b';
68: }
69: }
70: }
71: *p++ = '\0';
72: return p - ostr - 1;
73: }
74:
75: /*
76: * Parse an encoding string, examples: s8, u8, s16, s16le, s24be ...
1.7 ratchov 77: * set *istr to the char following the encoding. Return the number
78: * of bytes consumed.
1.2 ratchov 79: */
80: int
81: aparams_strtoenc(struct aparams *par, char *istr)
82: {
83: char *p = istr;
84: int i, sig, bits, le, bps, msb;
1.6 ratchov 85:
1.2 ratchov 86: #define IS_SEP(c) \
87: (((c) < 'a' || (c) > 'z') && \
88: ((c) < 'A' || (c) > 'Z') && \
89: ((c) < '0' || (c) > '9'))
90:
91: /*
92: * get signedness
93: */
94: if (*p == 's') {
95: sig = 1;
96: } else if (*p == 'u') {
97: sig = 0;
98: } else
99: return 0;
100: p++;
1.6 ratchov 101:
1.2 ratchov 102: /*
103: * get number of bits per sample
104: */
105: bits = 0;
106: for (i = 0; i < 2; i++) {
107: if (*p < '0' || *p > '9')
108: break;
109: bits = (bits * 10) + *p - '0';
110: p++;
111: }
112: if (bits < BITS_MIN || bits > BITS_MAX)
113: return 0;
114: bps = APARAMS_BPS(bits);
115: msb = 1;
116: le = NATIVE_LE;
117:
118: /*
1.7 ratchov 119: * get (optional) endianness
1.2 ratchov 120: */
121: if (p[0] == 'l' && p[1] == 'e') {
122: le = 1;
123: p += 2;
124: } else if (p[0] == 'b' && p[1] == 'e') {
125: le = 0;
126: p += 2;
127: } else if (IS_SEP(*p)) {
128: goto done;
129: } else
130: return 0;
131:
132: /*
1.7 ratchov 133: * get (optional) number of bytes
1.2 ratchov 134: */
135: if (*p >= '0' && *p <= '9') {
136: bps = *p - '0';
137: if (bps < (bits + 7) / 8 ||
138: bps > (BITS_MAX + 7) / 8)
139: return 0;
140: p++;
141:
142: /*
1.7 ratchov 143: * get (optional) alignement
1.2 ratchov 144: */
145: if (p[0] == 'm' && p[1] == 's' && p[2] == 'b') {
146: msb = 1;
147: p += 3;
148: } else if (p[0] == 'l' && p[1] == 's' && p[2] == 'b') {
149: msb = 0;
150: p += 3;
151: } else if (IS_SEP(*p)) {
152: goto done;
153: } else
154: return 0;
155: } else if (!IS_SEP(*p))
156: return 0;
157:
158: done:
159: par->msb = msb;
160: par->sig = sig;
161: par->bits = bits;
162: par->bps = bps;
163: par->le = le;
164: return p - istr;
165: }
166:
167: /*
1.1 ratchov 168: * Initialise parameters structure with the defaults natively supported
169: * by the machine.
170: */
171: void
172: aparams_init(struct aparams *par, unsigned cmin, unsigned cmax, unsigned rate)
173: {
174: par->bps = 2; /* 2 bytes per sample */
175: par->bits = 16; /* 16 significant bits per sample */
176: par->sig = 1; /* samples are signed */
177: par->le = NATIVE_LE;
178: par->msb = 1; /* msb justified */
179: par->cmin = cmin;
180: par->cmax = cmax;
181: par->rate = rate;
182: }
183:
184:
185: /*
1.3 ratchov 186: * Return true if both encodings are the same.
1.1 ratchov 187: */
188: int
1.3 ratchov 189: aparams_eqenc(struct aparams *par1, struct aparams *par2)
1.1 ratchov 190: {
191: if (par1->bps != par2->bps ||
192: par1->bits != par2->bits ||
1.3 ratchov 193: par1->sig != par2->sig)
1.1 ratchov 194: return 0;
195: if ((par1->bits != 8 * par1->bps) && par1->msb != par2->msb)
196: return 0;
197: if (par1->bps > 1 && par1->le != par2->le)
198: return 0;
199: return 1;
200: }
1.3 ratchov 201:
202: /*
203: * Return true if both parameters are the same.
204: */
205: int
206: aparams_eq(struct aparams *par1, struct aparams *par2)
207: {
208: if (!aparams_eqenc(par1, par2) ||
209: par1->cmin != par2->cmin ||
210: par1->cmax != par2->cmax ||
211: par1->rate != par2->rate)
212: return 0;
213: return 1;
214: }
215:
216: /*
1.7 ratchov 217: * Return true if first channel range includes second range.
1.3 ratchov 218: */
219: int
220: aparams_subset(struct aparams *subset, struct aparams *set)
221: {
222: return subset->cmin >= set->cmin && subset->cmax <= set->cmax;
223: }
224:
225: /*
1.7 ratchov 226: * Grow channels range and sample rate of ``set'' in order ``subset'' to
1.5 ratchov 227: * become an actual subset of it.
228: */
229: void
230: aparams_grow(struct aparams *set, struct aparams *subset)
231: {
232: if (set->cmin > subset->cmin)
233: set->cmin = subset->cmin;
234: if (set->cmax < subset->cmax)
235: set->cmax = subset->cmax;
236: if (set->rate < subset->rate)
237: set->rate = subset->rate;
238: }
239:
240: /*
1.7 ratchov 241: * Return true if rates are the same.
1.3 ratchov 242: */
243: int
244: aparams_eqrate(struct aparams *p1, struct aparams *p2)
245: {
246: /* XXX: allow 1/9 halftone of difference */
247: return p1->rate == p2->rate;
248: }
249:
1.1 ratchov 250:
251: /*
252: * Return the number of bytes per frame with the given parameters.
253: */
254: unsigned
255: aparams_bpf(struct aparams *par)
256: {
257: return (par->cmax - par->cmin + 1) * par->bps;
258: }
1.2 ratchov 259:
260: void
261: aparams_copyenc(struct aparams *dst, struct aparams *src)
262: {
263: dst->sig = src->sig;
264: dst->le = src->le;
265: dst->msb = src->msb;
266: dst->bits = src->bits;
267: dst->bps = src->bps;
268: }