/* * Copyright 1996 by Jutta Degener and Carsten Bormann, Technische * Universitaet Berlin. See the accompanying file "COPYRIGHT" for * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. */ /*$Header*/ /* Generate code to pack a bit array from a name:#bits description, * WAV #49 style. */ #include #include "taste.h" #include "proto.h" #include /* This module goes back to one Jeff Chilton used for his implementation * of the #49 WAV GSM format. (In his original patch 8, it replaced * bitter.c.) * * In Microsoft's WAV #49 version of the GSM format, two 32 1/2 * byte GSM frames are packed together to make one WAV frame, and * the GSM parameters are packed into bytes right-to-left rather * than left-to-right. * * That is, where toast's GSM format writes * * aaaaaabb bbbbcccc cdddddee ... * ___1____ ___2____ ___3____ * * for parameters a (6 bits), b (6 bits), c (5 bits), d (5 bits), e .. * the WAV format has * * bbaaaaaa ccccbbbb eedddddc ... * ___1____ ___2____ ___3____ * * (This format looks a lot prettier if one pictures octets coming * in through a fifo queue from the left, rather than waiting in the * right-hand remainder of a C array.) */ #define WORD_BITS 16 /* sizeof(uword) * CHAR_BIT on the * target architecture---if this isn't 16, * you're in trouble with this library anyway. */ #define BYTE_BITS 8 /* CHAR_BIT on the target architecture--- * if this isn't 8, you're in *deep* trouble. */ void write_code P2((s_spex, n_spex), struct spex * s_spex, int n_spex) { struct spex * sp = s_spex; int n_in = 0; printf("uword sr = 0;\n"); for (; n_spex > 0; n_spex--, sp++) { /* insert old * new var value unused * here * * [____________xxxxxx**********] * * <----- n_in ------> */ printf("sr = sr >> %d | %s << %d;\n", sp->varsize, sp->var, WORD_BITS - sp->varsize); n_in += sp->varsize; while (n_in >= BYTE_BITS) { printf("*c++ = sr >> %d;\n", WORD_BITS - n_in); n_in -= BYTE_BITS; } } while (n_in >= BYTE_BITS) { printf("*c++ = sr >> %d;\n", WORD_BITS - n_in); n_in -= BYTE_BITS; } if (n_in > 0) { fprintf(stderr, "warning: %d bits left over\n", n_in); } }