[BACK]Return to aparams.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / aucat

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: }