static unsigned int readbits(FILE *file,int bits) { unsigned int value; if (bits<0 || bits>32) ERRORMSG(); if (bits==0) return(0); if (bits<DDS_bufsize) { DDS_bufsize-=bits; value=DDS_shiftr(DDS_buffer,DDS_bufsize); } else { value=DDS_shiftl(DDS_buffer,bits-DDS_bufsize); DDS_buffer=0; if( fread(&DDS_buffer,1,4,file) <= 0 ) DDS_buffer=0; else DDS_swapuint(&DDS_buffer); DDS_bufsize+=32-bits; value|=DDS_shiftr(DDS_buffer,DDS_bufsize); } DDS_buffer&=DDS_shiftl(1,DDS_bufsize)-1; DDS_bitcnt+=bits; return(value); }
static void flushbits(FILE *file) { if (DDS_bufsize>0) { DDS_buffer=DDS_shiftl(DDS_buffer,32-DDS_bufsize); if (DDS_ISINTEL) DDS_swapuint(&DDS_buffer); if (fwrite(&DDS_buffer,(DDS_bufsize+7)/8,1,file)!=1) ERRORMSG(); DDS_bitcnt+=(32-DDS_bufsize)&7; } }
// convert from float to unsigned short void convfloat(unsigned char *data,unsigned int bytes) { unsigned int i; unsigned char *ptr; float v,vmax; for (vmax=1.0f,ptr=data,i=0; i<bytes/4; i++,ptr+=4) { if (DDS_ISINTEL) DDS_swapuint((unsigned int *)ptr); v=fabs(*((float *)ptr)); if (v>vmax) vmax=v; } for (ptr=data,i=0; i<bytes/4; i++,ptr+=4) { v=fabs(*((float *)ptr))/vmax; data[2*i]=ftrc(65535.0f*v+0.5f)/256; data[2*i+1]=ftrc(65535.0f*v+0.5f)%256; } }