This is snd2zyxel.c in view mode; [Download] [Up]
/* NeXT snd to Zyxel-voice file converter Convert (stdio) sound-files to zyxel (stdout). Copyright 1994 (C) Thomas Funke. */ #import <sound/sound.h> #import <sound/convertsound.h> #import "precomp.h" typedef unsigned char uchar; uchar lin16_to_ad2 (short a) //convert 16bit value to 2bit { static short a0 = 0; static uchar e; static int D = 5; //Delta float E; static int M[] = {0x3800, 0x5600}; E = (a - a0) / (float) D; if (E < 0) { if (E < -1.5) e = 3; else e = 2; } else { if (E > 1.5) e = 1; else e = 0; } D = D * M[e & 1]; D += 0x2000; D >>= 14; //div 16384 if (D < 5) D = 5; a0 = a; return e; } 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_AD2; // 2 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[4]; uchar out; in[0] = *p++; in[1] = *p++; in[2] = *p++; in[3] = *p++; out = (lin16_to_ad2 (in[0]) << 6) + (lin16_to_ad2 (in[1]) << 4) + (lin16_to_ad2 (in[2]) << 2) + (lin16_to_ad2 (in[3])); fwrite (&out, 1, 1, stdout); if (out == 0x10) fwrite (&out, 1, 1, stdout); // double DLE } } 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.