This is LPApp.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "LPApp.h" #import "SoundInfo.h" #import "ScrollDis.h" #import "lpsf.h" #import "lp.h" #import <stdio.h> #import <sys/types.h> #import <sys/stat.h> #import <sys/file.h> #import <sound/soundstruct.h> #import <appkit/appkit.h> #import <streams/streams.h> #define SNDSIZE sizeof (SNDSoundStruct) #define min(a,b) ((a)>(b)?(b):(a)) #define max(a,b) ((a)<(b)?(b):(a)) #define DUMPFILE "/tmp/lpdump.tmp" static BOOL noquery = NO, lptouched = NO; static char AppPath[256]; SNDSoundStruct sndh; static int fildes; extern char **NXArgv, *getenv(); extern void pclose(); static float soundtime; static int sample_size; static struct stat statbuf; static id _status, _window; /* interface to anallpc, ptrack, lpconcat, lpdump */ char *comment; int npoles, lpframeoffset, ptframesize, ptframeoffset; float lpinskip, lpdur, ptframerate, ptinskip, ptdur, sr, ptlowest, pthighest; char soundFile[256], lpFile[256], ptFile[256]; extern void lpdump(FILE *outfile); extern int lpconcat(), anallpc(), ptrack(); static void alert (msg) const char *msg; { void NXAlert(); NXAlert (msg, NULL, NULL, NULL); return; } static BOOL getOpenPath (buf, file, sfx) char *buf; char const *file, *sfx; { static int init = 1; static char dir[512]; id openPanel; int rtn; char *q; char const *fileTypes[2] = {NULL, NULL}; if (init) { init = 0; if (q = getenv ("HOME")) strcpy (dir, q); else strcpy (dir, "."); } [NXWait set]; NXPing(); openPanel = [OpenPanel new]; [NXArrow set]; NXPing(); fileTypes[0] = sfx; [openPanel allowMultipleFiles:NO]; if ([openPanel runModalForDirectory:dir file:file types:fileTypes]) { strcpy (buf, [openPanel filename]); strcpy (dir, buf); *(rindex (dir, '/')) = '\0'; rtn = YES; } else rtn = NO; return rtn; } void report (char *s) { [_status setStringValue: s]; [_window flushWindow]; return; } static void displayFileName (id form, char *s) { char *pt, name[256]; pt = rindex (s, '/'); strcpy (name, pt + 1); strcat (name, ":"); *pt = '\0'; strcat (name, s); *pt = '/'; [form setStringValue: name]; return; } @implementation LPApp - setMyWindow:anObject { char *p; _window = myWindow = anObject; [myWindow makeKeyAndOrderFront:self]; strcpy (AppPath, NXArgv[0]); if (p = rindex (AppPath, '/')) *p = '\0'; else strcpy (AppPath, "."); soundFile[0] = '\0'; lpFile[0] = '\0'; ptFile[0] = '\0'; return self; } - setStatus:anObject { _status = status = anObject; return self; } - setPtFrameOffset:anObject { ptFrameOffset = anObject; return self; } - setLpFrameRate:anObject { lpFrameRate = anObject; return self; } - setPtLowEst:anObject { ptLowEst = anObject; return self; } - setPtSkip:anObject { ptSkip = anObject; return self; } - setPtDuration:anObject { ptDuration = anObject; return self; } - setPtFrameSize:anObject { ptFrameSize = anObject; return self; } - setLpFrameOffset:anObject { lpFrameOffset = anObject; return self; } - setLpComment:anObject { lpComment = anObject; return self; } - setLpPoles:anObject { lpPoles = anObject; return self; } - setPtHighEst:anObject { ptHighEst = anObject; return self; } - setLpDuration:anObject { lpDuration = anObject; return self; } - setLpSkip:anObject { lpSkip = anObject; return self; } - setLpButton:anObject { lpButton = anObject; return self; } - setPtButton:anObject { ptButton = anObject; return self; } - setMrgButton:anObject { mrgButton = anObject; return self; } - setSoundFileName:anObject { soundFileName = anObject; return self; } - setLpFileName:anObject { lpFileName = anObject; return self; } - setPtFileName:anObject { ptFileName = anObject; return self; } - setOffset:sender { int offset; if ((offset = [lpFrameOffset intValue]) < 1) offset = 1; if (offset > HALFFRAMAX) offset = HALFFRAMAX; [lpFrameOffset setIntValue:offset]; [ptFrameOffset setIntValue:offset]; [lpFrameRate setFloatValue:sr / (float) offset]; return self; } - setRate:sender { float rate; int offset; if ((rate = [lpFrameRate floatValue]) <= 0.0) rate = 1.0; offset = sr / rate; if (offset > HALFFRAMAX) offset = HALFFRAMAX; [lpFrameRate setFloatValue:sr / (float) offset]; [lpFrameOffset setIntValue:offset]; [ptFrameOffset setIntValue:offset]; return self; } - setPoles:sender { if ([lpPoles intValue] > POLEMAX) [lpPoles setIntValue:POLEMAX]; return self; } - setFrame:sender { if ([ptFrameSize intValue] > PFRAMAX) [ptFrameSize setIntValue:PFRAMAX]; return self; } - (int)openFile:(const char *)path ok:(int *)ok { noquery = YES; strcpy (soundFile, path); [self openSoundFile:self]; noquery = NO; *ok = YES; [myWindow makeKeyAndOrderFront:self]; return 0; } - (BOOL) checkLPFile:(char *)name { int fd, n; char lpbuf[LPBUFSIZ]; LPHEADER *lph; if((fd = open (name, O_RDONLY)) < 0) return NO; n = read (fd, lpbuf, LPBUFSIZ); close (fd); if (n < sizeof (LPHEADER)) return NO; lph = (LPHEADER *) lpbuf; if (lph->lpmagic != LP_MAGIC) return NO; [lpPoles setIntValue:lph->npoles]; [lpFrameRate setFloatValue:lph->framrate]; [lpFrameOffset setIntValue:lph->srate / lph->framrate]; if (lph->headersize > sizeof (LPHEADER)) [lpComment setStringValue:lph->text]; return YES; } - openSoundFile:sender { char *q; int fd; if (!noquery) { if (!getOpenPath (soundFile, NULL, "snd")) return self; } if ((fildes = open (soundFile, O_RDONLY)) < 0) { alert ("Can't open sound file."); soundFile[0] = '\0'; return self; } if ((read (fildes, &sndh, SNDSIZE) != SNDSIZE) || (sndh.magic != SND_MAGIC)) { alert ("Corrupt sound file."); soundFile[0] = '\0'; close (fildes); return self; } if (sndh.channelCount > 1) { alert ("Can't analyze multi-channel sound."); soundFile[0] = '\0'; close (fildes); return self; } close (fildes); switch (sndh.dataFormat) { case SND_FORMAT_MULAW_8: case SND_FORMAT_LINEAR_8: sample_size = 1; break; case SND_FORMAT_LINEAR_16: sample_size = 2; break; case SND_FORMAT_LINEAR_24: sample_size = 3; break; case SND_FORMAT_LINEAR_32: case SND_FORMAT_FLOAT: sample_size = 4; break; case SND_FORMAT_DOUBLE: sample_size = 8; break; default: alert ("Invalid data format."); soundFile[0] = '\0'; close (fildes); return self; } sr = (float) sndh.samplingRate; soundtime = (float) sndh.dataSize / (float) sample_size / sr; close (fildes); displayFileName (soundFileName, soundFile); [lpFileName setStringValue:""]; [ptFileName setStringValue:""]; [lpDuration setFloatValue:soundtime]; [ptDuration setFloatValue:soundtime]; strcpy (lpFile, soundFile); *(rindex (lpFile, '.')) = '\0'; strcat (lpFile, ".lpc"); if ([self checkLPFile:lpFile]) displayFileName (lpFileName, lpFile); strcpy (ptFile, soundFile); *(rindex (ptFile, '.')) = '\0'; strcat (ptFile, ".pt"); if (stat (ptFile, &statbuf) == 0) displayFileName (ptFileName, ptFile); return self; } - openLPFile:sender { char buf[256]; if (getOpenPath (buf, NULL, "lpc")) if ([self checkLPFile:buf]) { strcpy (lpFile, buf); displayFileName (lpFileName, lpFile); lptouched = YES; } return self; } - openPTFile:sender { char buf[256]; if (getOpenPath (buf, NULL, "pt")) if (stat (buf, &statbuf) == 0) { strcpy (ptFile, buf); displayFileName (ptFileName, ptFile); } return self; } - help:sender { char helpfile[256], command[256]; NXRect frame = {{100.0, 100.0}, {500.0, 300.0}}; NXStream *strm, *NXOpenFile(); FILE *pipe, *popen(); sprintf (helpfile, "%s/%s", AppPath, "LPC.man"); if (stat (helpfile, &statbuf) != 0) { alert ("Can't find help file."); return self; } if (helpView == nil) helpView = [ScrollingTextDisplay newFrame:&frame title:"LPC Manual"]; sprintf (command, "nroff -man %s | tr -d '_\\010'", helpfile); if ((pipe = popen (command, "r")) == NULL) { alert ("Sorry, no help."); fprintf (stderr, "failed command: %s\n", command); return self; } strm = NXOpenFile (fileno (pipe), NX_READONLY); [helpView show]; [helpView readText:strm burst:YES]; NXClose (strm); pclose (pipe); return self; } - free { if (helpView != nil) [helpView free]; if (dumpView != nil) [dumpView free]; if (soundView != nil) [soundView free]; self = [super free]; return self; } - soundInfo:sender { if (soundFile[0] == '\0') { alert ("No soundfile open."); return self; } if (soundView == nil) soundView = [SoundInfo new]; if (![soundView displaySoundFile:soundFile]) alert ("Missing or malformed soundfile."); return self; } - doLP:sender { if (soundFile[0] == '\0') { alert ("No soundfile open."); return self; } npoles = max (min ([lpPoles intValue], POLEMAX), 1); [lpPoles setIntValue:npoles]; lpframeoffset = min ([lpFrameOffset intValue], HALFFRAMAX); [lpFrameOffset setIntValue:lpframeoffset]; [lpFrameRate setFloatValue: sr / lpframeoffset]; lpdur = [lpDuration floatValue]; lpinskip = min ([lpSkip floatValue], lpdur); [lpSkip setFloatValue:lpinskip]; comment = [lpComment stringValue]; [myWindow flushWindow]; if (anallpc ()) { lptouched = YES; displayFileName (lpFileName, lpFile); } return self; } - doPitch:sender { if (soundFile[0] == '\0') { alert ("No soundfile open."); return self; } ptframesize = min ([ptFrameSize intValue], PFRAMAX); [ptFrameSize setIntValue:ptframesize]; ptframeoffset = min ([ptFrameOffset intValue], HALFFRAMAX); [ptFrameOffset setIntValue:ptframeoffset]; ptlowest = (float) [ptLowEst intValue]; pthighest = (float) [ptHighEst intValue]; ptdur = [ptDuration floatValue]; ptinskip = min ([ptSkip floatValue], ptdur); [ptSkip setFloatValue:ptinskip]; [myWindow flushWindow]; if (ptrack ()) displayFileName (ptFileName, ptFile); return self; } - doMerge:sender { int frameSize; if (![self checkLPFile:lpFile]) { alert ("LP file missing or corrupt."); return self; } if (stat (ptFile, &statbuf) != 0) { alert ("Pitch file missing."); return self; } if ((frameSize = [ptFrameOffset intValue]) == 0) frameSize = 1; ptframerate = sr / frameSize; if (lpconcat ()) lptouched = YES; return self; } - doAuto:sender { [lpButton performClick:self]; [ptButton performClick:self]; [mrgButton performClick:self]; return self; } - lpDump:sender { FILE *tmpfile, *fopen(); NXRect frame = {{100.0, 50.0}, {500.0, 300.0}}; NXStream *strm, *NXOpenFile(); if (stat (lpFile, &statbuf) != 0) { alert ("No LP file."); return; } if (dumpView == nil) dumpView = [ScrollingTextDisplay newFrame:&frame title:"LP Dump"]; [dumpView show]; if (!lptouched) return nil; tmpfile = fopen (DUMPFILE, "w"); lpdump (tmpfile); fclose (tmpfile); tmpfile = fopen (DUMPFILE, "r"); strm = NXOpenFile (fileno (tmpfile), NX_READONLY); [dumpView readText:strm burst:YES]; NXClose (strm); fclose (tmpfile); unlink (DUMPFILE); lptouched = NO; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.