This is snd3zyxel.c in view mode; [Download] [Up]
/* This is snd3zyxel NeXT snd to ADPCM3 Zyxel-voice file converter Convert (stdio) sound-files to zyxel (stdout). Copyright 1994 (C) Thomas Funke. Changed to ADPCM3 by kiwi@belly. Based on vcnvt.c by ZyXEL Corp. */ #import <sound/sound.h> #import <sound/convertsound.h> #import "precomp.h" void Adaptive(char Data); int Delta = 5; int EstMax = 0; int M[] = {0x399A, 0x3A9F, 0x4D14, 0x6607}; typedef unsigned char uchar; /* by kiwi@belly */ void lin16_to_ad3 (short a) //convert 16bit value to 3bit { char TmpCompBit; char Data =0; static int Rdata = 0; static char Rcnt = 8; Rdata &= 0xff00 ; if ( a -= EstMax ) { TmpCompBit = 4 ; /* ----------------------------------------------------- */ /* If the data is negative, set flag and change the sign */ /* ----------------------------------------------------- */ if ( a < 0 ) { a = -a ; Data = TmpCompBit ; } /* --------------------------------------------------- */ /* Quantize the waveform data, delta value is adaptive */ /* --------------------------------------------------- */ while ( ((a-=Delta)>0) && --TmpCompBit ) Data += 1 ; /* ---------------------------- */ /* Rdata is the compressed data */ /* ---------------------------- */ Rdata |= ( Data << 5 ) ; } /* ------------------------------------------------------ */ /* check if the compressed data can be pack into one byte */ /* ------------------------------------------------------ */ TmpCompBit = 3 ; while ( TmpCompBit-- ) { Rdata <<= 1 ; if ( !(--Rcnt) ) { putc(Rdata>>8,stdout) ; if (((Rdata>>8) & 255 )== 0x10) putc (0x10, stdout); // double DLE Rcnt = 8 ; } } /* -------------------------------------- */ /* Adaptive the Delta and Estimat Maximum */ /* -------------------------------------- */ Adaptive(Data); } void Adaptive(char DataBit) { int TmpMax ; char SignBit ; long TmpDelta ; long t0; /******* This part is modified for the Firmware > 6.10 **************/ /**/ t0 = (long)EstMax ; /**/ /**/ t0 *= 3973 ; /**/ /**/ t0 += 2048 ; /**/ /**/ t0 /= 4096 ; /**/ /**/ EstMax = (int)t0 ; /**/ /********************************************************************/ SignBit = DataBit & 4 ; DataBit &= ~(4) ; if ( (Delta&1) && !SignBit ) ++EstMax ; /* ------------------- */ /* Calculate the Delta */ /* ------------------- */ TmpDelta = Delta ; TmpDelta *= M[(int)DataBit] ; TmpDelta += 8192 ; TmpDelta >>= 14 ; /* -------------------- */ /* Calculate the EstMax */ /* -------------------- */ TmpMax = (Delta>>1) ; while ( DataBit-- ) TmpMax += Delta ; if ( SignBit ) EstMax -= TmpMax ; else EstMax += TmpMax ; Delta = (int)TmpDelta ; } void write_zyxel (void) // write to stdout zyxel-data { struct zyxel header = {0}; short *p; char *pend; int err; SNDSoundStruct *sndp1, *sndp2; SNDSoundStruct snd; if ((err=SNDRead (0, &sndp1)) != SND_ERR_NONE) { fprintf (stderr, "Error reading sound file: %s\n", SNDSoundError(err)); exit (1); } // Convert Sound to 9600 / lin / mono snd.magic = SND_MAGIC; snd.dataLocation = sizeof (SNDSoundStruct); snd.dataSize = 0; snd.dataFormat = SND_FORMAT_LINEAR_16; snd.samplingRate = 9600; snd.channelCount = 1; sndp2 = &snd; if ((err=SNDConvertSound (sndp1, &sndp2)) != SND_ERR_NONE) { fprintf (stderr, "Error converting sound: %s\n", SNDSoundError(err)); exit (1); } // Write Zyxel header strncpy ((char*)&header.title, "ZyXEL", sizeof(header.title)); header.mode = ZYX_VOC; header.voice = ZYX_AD3; // 3 bit ADPCM fwrite (&header, sizeof(header), 1, stdout); // start loop p = (void *) sndp2 + sndp2->dataLocation; pend = (void *) sndp2 + sndp2->dataSize - 6; while ((char *) p < pend) { short in[1]; in[0] = *p++; lin16_to_ad3 (in[0]); } } int main () { write_zyxel (); return 0; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.