[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.13

1.13    ! ratchov     1: /*     $OpenBSD: aparams.c,v 1.12 2010/11/05 15:23:18 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.10      ratchov    19: #ifdef DEBUG
                     20: #include "dbg.h"
                     21: #endif
1.4       ratchov    22:
                     23: int aparams_ctltovol[128] = {
                     24:            0,
                     25:          256,    266,    276,    287,    299,    310,    323,    335,
                     26:          348,    362,    376,    391,    406,    422,    439,    456,
                     27:          474,    493,    512,    532,    553,    575,    597,    621,
                     28:          645,    670,    697,    724,    753,    782,    813,    845,
                     29:          878,    912,    948,    985,   1024,   1064,   1106,   1149,
                     30:         1195,   1241,   1290,   1341,   1393,   1448,   1505,   1564,
                     31:         1625,   1689,   1756,   1825,   1896,   1971,   2048,   2128,
                     32:         2212,   2299,   2389,   2483,   2580,   2682,   2787,   2896,
                     33:         3010,   3128,   3251,   3379,   3511,   3649,   3792,   3941,
                     34:         4096,   4257,   4424,   4598,   4778,   4966,   5161,   5363,
                     35:         5574,   5793,   6020,   6256,   6502,   6757,   7023,   7298,
                     36:         7585,   7883,   8192,   8514,   8848,   9195,   9556,   9931,
                     37:        10321,  10726,  11148,  11585,  12040,  12513,  13004,  13515,
                     38:        14045,  14596,  15170,  15765,  16384,  17027,  17696,  18390,
                     39:        19112,  19863,  20643,  21453,  22295,  23170,  24080,  25025,
                     40:        26008,  27029,  28090,  29193,  30339,  31530,  32768
                     41: };
1.8       ratchov    42:
                     43: /*
                     44:  * Fake parameters for byte-streams
                     45:  */
                     46: struct aparams aparams_none = { 1, 0, 0, 0, 0, 0, 0, 0 };
1.1       ratchov    47:
1.13    ! ratchov    48: #ifdef DEBUG
1.1       ratchov    49: /*
1.2       ratchov    50:  * Generate a string corresponding to the encoding in par,
1.7       ratchov    51:  * return the length of the resulting string.
1.2       ratchov    52:  */
                     53: int
                     54: aparams_enctostr(struct aparams *par, char *ostr)
                     55: {
                     56:        char *p = ostr;
                     57:
                     58:        *p++ = par->sig ? 's' : 'u';
                     59:        if (par->bits > 9)
                     60:                *p++ = '0' + par->bits / 10;
                     61:        *p++ = '0' + par->bits % 10;
                     62:        if (par->bps > 1) {
                     63:                *p++ = par->le ? 'l' : 'b';
                     64:                *p++ = 'e';
                     65:                if (par->bps != APARAMS_BPS(par->bits) ||
                     66:                    par->bits < par->bps * 8) {
                     67:                        *p++ = par->bps + '0';
                     68:                        if (par->bits < par->bps * 8) {
                     69:                                *p++ = par->msb ? 'm' : 'l';
                     70:                                *p++ = 's';
                     71:                                *p++ = 'b';
                     72:                        }
                     73:                }
                     74:        }
                     75:        *p++ = '\0';
                     76:        return p - ostr - 1;
                     77: }
1.13    ! ratchov    78: #endif /* DEBUG */
1.2       ratchov    79:
                     80: /*
                     81:  * Parse an encoding string, examples: s8, u8, s16, s16le, s24be ...
1.7       ratchov    82:  * set *istr to the char following the encoding. Return the number
                     83:  * of bytes consumed.
1.2       ratchov    84:  */
                     85: int
                     86: aparams_strtoenc(struct aparams *par, char *istr)
                     87: {
                     88:        char *p = istr;
                     89:        int i, sig, bits, le, bps, msb;
1.6       ratchov    90:
1.2       ratchov    91: #define IS_SEP(c)                      \
                     92:        (((c) < 'a' || (c) > 'z') &&    \
                     93:         ((c) < 'A' || (c) > 'Z') &&    \
                     94:         ((c) < '0' || (c) > '9'))
                     95:
                     96:        /*
                     97:         * get signedness
                     98:         */
                     99:        if (*p == 's') {
                    100:                sig = 1;
                    101:        } else if (*p == 'u') {
                    102:                sig = 0;
                    103:        } else
                    104:                return 0;
                    105:        p++;
1.6       ratchov   106:
1.2       ratchov   107:        /*
                    108:         * get number of bits per sample
                    109:         */
                    110:        bits = 0;
                    111:        for (i = 0; i < 2; i++) {
                    112:                if (*p < '0' || *p > '9')
                    113:                        break;
                    114:                bits = (bits * 10) + *p - '0';
                    115:                p++;
                    116:        }
                    117:        if (bits < BITS_MIN || bits > BITS_MAX)
                    118:                return 0;
                    119:        bps = APARAMS_BPS(bits);
                    120:        msb = 1;
1.12      ratchov   121:        le = ADATA_LE;
1.2       ratchov   122:
                    123:        /*
1.7       ratchov   124:         * get (optional) endianness
1.2       ratchov   125:         */
                    126:        if (p[0] == 'l' && p[1] == 'e') {
                    127:                le = 1;
                    128:                p += 2;
                    129:        } else if (p[0] == 'b' && p[1] == 'e') {
                    130:                le = 0;
                    131:                p += 2;
                    132:        } else if (IS_SEP(*p)) {
                    133:                goto done;
                    134:        } else
                    135:                return 0;
                    136:
                    137:        /*
1.7       ratchov   138:         * get (optional) number of bytes
1.2       ratchov   139:         */
                    140:        if (*p >= '0' && *p <= '9') {
                    141:                bps = *p - '0';
                    142:                if (bps < (bits + 7) / 8 ||
                    143:                    bps > (BITS_MAX + 7) / 8)
                    144:                        return 0;
                    145:                p++;
                    146:
                    147:                /*
1.7       ratchov   148:                 * get (optional) alignement
1.2       ratchov   149:                 */
                    150:                if (p[0] == 'm' && p[1] == 's' && p[2] == 'b') {
                    151:                        msb = 1;
                    152:                        p += 3;
                    153:                } else if (p[0] == 'l' && p[1] == 's' && p[2] == 'b') {
                    154:                        msb = 0;
                    155:                        p += 3;
                    156:                } else if (IS_SEP(*p)) {
                    157:                        goto done;
                    158:                } else
                    159:                        return 0;
                    160:        } else if (!IS_SEP(*p))
                    161:                return 0;
                    162:
                    163: done:
                    164:                par->msb = msb;
                    165:        par->sig = sig;
                    166:        par->bits = bits;
                    167:        par->bps = bps;
                    168:        par->le = le;
                    169:        return p - istr;
                    170: }
                    171:
                    172: /*
1.1       ratchov   173:  * Initialise parameters structure with the defaults natively supported
                    174:  * by the machine.
                    175:  */
                    176: void
                    177: aparams_init(struct aparams *par, unsigned cmin, unsigned cmax, unsigned rate)
                    178: {
1.11      ratchov   179:        par->bps = sizeof(adata_t);
                    180:        par->bits = ADATA_BITS;
1.12      ratchov   181:        par->le = ADATA_LE;
1.11      ratchov   182:        par->sig = 1;
1.12      ratchov   183:        par->msb = 0;
1.1       ratchov   184:        par->cmin = cmin;
                    185:        par->cmax = cmax;
                    186:        par->rate = rate;
                    187: }
                    188:
1.10      ratchov   189: #ifdef DEBUG
                    190: /*
                    191:  * Print the format/channels/encoding on stderr.
                    192:  */
                    193: void
                    194: aparams_dbg(struct aparams *par)
                    195: {
                    196:        char enc[ENCMAX];
                    197:
                    198:        aparams_enctostr(par, enc);
                    199:        dbg_puts(enc);
                    200:        dbg_puts(",");
                    201:        dbg_putu(par->cmin);
                    202:        dbg_puts(":");
                    203:        dbg_putu(par->cmax);
                    204:        dbg_puts(",");
                    205:        dbg_putu(par->rate);
                    206: }
                    207: #endif
1.1       ratchov   208:
                    209: /*
1.3       ratchov   210:  * Return true if both encodings are the same.
1.1       ratchov   211:  */
                    212: int
1.3       ratchov   213: aparams_eqenc(struct aparams *par1, struct aparams *par2)
1.1       ratchov   214: {
                    215:        if (par1->bps != par2->bps ||
                    216:            par1->bits != par2->bits ||
1.3       ratchov   217:            par1->sig != par2->sig)
1.1       ratchov   218:                return 0;
                    219:        if ((par1->bits != 8 * par1->bps) && par1->msb != par2->msb)
                    220:                return 0;
                    221:        if (par1->bps > 1 && par1->le != par2->le)
                    222:                return 0;
                    223:        return 1;
1.3       ratchov   224: }
                    225:
                    226: /*
1.7       ratchov   227:  * Grow channels range and sample rate of ``set'' in order ``subset'' to
1.5       ratchov   228:  * become an actual subset of it.
                    229:  */
                    230: void
                    231: aparams_grow(struct aparams *set, struct aparams *subset)
                    232: {
                    233:        if (set->cmin > subset->cmin)
                    234:                set->cmin = subset->cmin;
                    235:        if (set->cmax < subset->cmax)
                    236:                set->cmax = subset->cmax;
                    237:        if (set->rate < subset->rate)
                    238:                set->rate = subset->rate;
                    239: }
                    240:
                    241: /*
1.7       ratchov   242:  * Return true if rates are the same.
1.3       ratchov   243:  */
                    244: int
                    245: aparams_eqrate(struct aparams *p1, struct aparams *p2)
                    246: {
                    247:        /* XXX: allow 1/9 halftone of difference */
                    248:        return p1->rate == p2->rate;
                    249: }
                    250:
1.1       ratchov   251:
                    252: /*
                    253:  * Return the number of bytes per frame with the given parameters.
                    254:  */
                    255: unsigned
                    256: aparams_bpf(struct aparams *par)
                    257: {
                    258:        return (par->cmax - par->cmin + 1) * par->bps;
                    259: }
1.2       ratchov   260:
                    261: void
                    262: aparams_copyenc(struct aparams *dst, struct aparams *src)
                    263: {
                    264:        dst->sig = src->sig;
                    265:        dst->le = src->le;
                    266:        dst->msb = src->msb;
                    267:        dst->bits = src->bits;
                    268:        dst->bps = src->bps;
                    269: }