=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/aucat/Attic/aparams.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- src/usr.bin/aucat/Attic/aparams.c 2008/05/23 07:15:46 1.1 +++ src/usr.bin/aucat/Attic/aparams.c 2008/10/26 08:49:43 1.2 @@ -1,4 +1,4 @@ -/* $OpenBSD: aparams.c,v 1.1 2008/05/23 07:15:46 ratchov Exp $ */ +/* $OpenBSD: aparams.c,v 1.2 2008/10/26 08:49:43 ratchov Exp $ */ /* * Copyright (c) 2008 Alexandre Ratchov * @@ -22,6 +22,128 @@ #include "aparams.h" /* + * Generate a string corresponding to the encoding in par, + * return the length of the resulting string + */ +int +aparams_enctostr(struct aparams *par, char *ostr) +{ + char *p = ostr; + + *p++ = par->sig ? 's' : 'u'; + if (par->bits > 9) + *p++ = '0' + par->bits / 10; + *p++ = '0' + par->bits % 10; + if (par->bps > 1) { + *p++ = par->le ? 'l' : 'b'; + *p++ = 'e'; + if (par->bps != APARAMS_BPS(par->bits) || + par->bits < par->bps * 8) { + *p++ = par->bps + '0'; + if (par->bits < par->bps * 8) { + *p++ = par->msb ? 'm' : 'l'; + *p++ = 's'; + *p++ = 'b'; + } + } + } + *p++ = '\0'; + return p - ostr - 1; +} + +/* + * Parse an encoding string, examples: s8, u8, s16, s16le, s24be ... + * set *istr to the char following the encoding. Retrun the number + * of bytes consumed + */ +int +aparams_strtoenc(struct aparams *par, char *istr) +{ + char *p = istr; + int i, sig, bits, le, bps, msb; + +#define IS_SEP(c) \ + (((c) < 'a' || (c) > 'z') && \ + ((c) < 'A' || (c) > 'Z') && \ + ((c) < '0' || (c) > '9')) + + /* + * get signedness + */ + if (*p == 's') { + sig = 1; + } else if (*p == 'u') { + sig = 0; + } else + return 0; + p++; + + /* + * get number of bits per sample + */ + bits = 0; + for (i = 0; i < 2; i++) { + if (*p < '0' || *p > '9') + break; + bits = (bits * 10) + *p - '0'; + p++; + } + if (bits < BITS_MIN || bits > BITS_MAX) + return 0; + bps = APARAMS_BPS(bits); + msb = 1; + le = NATIVE_LE; + + /* + * get (optionnal) endianness + */ + if (p[0] == 'l' && p[1] == 'e') { + le = 1; + p += 2; + } else if (p[0] == 'b' && p[1] == 'e') { + le = 0; + p += 2; + } else if (IS_SEP(*p)) { + goto done; + } else + return 0; + + /* + * get (optionnal) number of bytes + */ + if (*p >= '0' && *p <= '9') { + bps = *p - '0'; + if (bps < (bits + 7) / 8 || + bps > (BITS_MAX + 7) / 8) + return 0; + p++; + + /* + * get (optionnal) alignement + */ + if (p[0] == 'm' && p[1] == 's' && p[2] == 'b') { + msb = 1; + p += 3; + } else if (p[0] == 'l' && p[1] == 's' && p[2] == 'b') { + msb = 0; + p += 3; + } else if (IS_SEP(*p)) { + goto done; + } else + return 0; + } else if (!IS_SEP(*p)) + return 0; + +done: + par->msb = msb; + par->sig = sig; + par->bits = bits; + par->bps = bps; + par->le = le; + return p - istr; +} + +/* * Initialise parameters structure with the defaults natively supported * by the machine. */ @@ -44,14 +166,10 @@ void aparams_print(struct aparams *par) { - fprintf(stderr, "%c", par->sig ? 's' : 'u'); - fprintf(stderr, "%u", par->bits); - if (par->bps > 1) - fprintf(stderr, "%s", par->le ? "le" : "be"); - if ((par->bits & (par->bits - 1)) != 0 || par->bits != 8 * par->bps) { - fprintf(stderr, "/%u", par->bps); - fprintf(stderr, "%s", par->msb ? "msb" : "lsb"); - } + char enc[ENCMAX]; + + aparams_enctostr(par, enc); + fprintf(stderr, "%s", enc); fprintf(stderr, ",%u:%u", par->cmin, par->cmax); fprintf(stderr, ",%uHz", par->rate); } @@ -92,3 +210,14 @@ { return (par->cmax - par->cmin + 1) * par->bps; } + +void +aparams_copyenc(struct aparams *dst, struct aparams *src) +{ + dst->sig = src->sig; + dst->le = src->le; + dst->msb = src->msb; + dst->bits = src->bits; + dst->bps = src->bps; +} +