This is SoundInfo.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import <appkit/Application.h> #import <appkit/Panel.h> #import <appkit/FormCell.h> #import <sound/soundstruct.h> #import <sys/file.h> #import "SoundInfo.h" #import "sfheader.h" extern int open(), read(); extern void close(); extern char *rindex(); @implementation SoundInfo + new { self = [super new]; [NXApp loadNibSection:"SoundInfo.nib" owner:self]; return self; } - display:(SNDSoundStruct *)sndhdr title:(char const *)title { int ssize, channels, frames, hours, minutes; float seconds; char *format, time[32]; SFHEADER *sfhdr; [siPanel setTitle:title]; [siSize setIntValue:sndhdr->dataSize]; [siRate setIntValue:sndhdr->samplingRate]; channels = sndhdr->channelCount; [siChannels setIntValue:channels]; if (channels < 1) channels = 1; switch (sndhdr->dataFormat) { case SND_FORMAT_MULAW_8: case SND_FORMAT_MULAW_SQUELCH: format = "8-bit muLaw"; ssize = 1; break; case SND_FORMAT_LINEAR_8: format = "8-bit linear"; ssize = 1; break; case SND_FORMAT_LINEAR_16: format = "16-bit linear"; ssize = 2; break; case SND_FORMAT_LINEAR_24: format = "24-bit linear"; ssize = 3; break; case SND_FORMAT_LINEAR_32: format = "32-bit linear"; ssize = 4; break; case SND_FORMAT_FLOAT: format = "32-bit floating pt"; ssize = 4; break; case SND_FORMAT_DOUBLE: format = "64-bit floating pt"; ssize = 8; break; case SND_FORMAT_INDIRECT: format = "Fragmented"; ssize = 8; break; default: format = "DSP?"; ssize = 8; break; } [siFormat setStringValue:format]; frames = sndhdr->dataSize / ssize / channels; [siFrames setIntValue:frames]; seconds = (float) frames / (float) sndhdr->samplingRate; hours = (int) (seconds / 3600); minutes = (int) ((seconds - hours * 3600) / 60); seconds = seconds - hours * 3600 - minutes * 60; sprintf (time, "%02d:%02d:%05.2f", hours, minutes, seconds); [siTime setStringValue:time]; sfhdr = (SFHEADER *) sndhdr; if ((sndhdr->dataLocation == SIZEOF_HEADER) && (sfhdr->sfinfo.sf_magic == SF_MAGIC)) [siCSound setStringValue:"YES"]; else [siCSound setStringValue:"NO"]; [siPanel makeKeyAndOrderFront:self]; [NXApp runModalFor:siPanel]; return self; } - displaySound:soundobj title:(char const *)title { [self display:[soundobj soundStruct] title:title]; return self; } - (BOOL)displaySoundFile:(char const *)path { int fd; SFHEADER sndhdr; char const *title; if ((fd = open (path, O_RDONLY)) < 0) return NO; if (read (fd, &sndhdr, sizeof (sndhdr)) < sizeof (SNDSoundStruct)) return NO; close (fd); if (sndhdr.sfinfo.NeXTheader.magic != SND_MAGIC) return NO; if ((title = rindex (path, '/')) == NULL) title = path; else title++; [self display:(SNDSoundStruct *)&sndhdr title:title]; return YES; } - windowWillClose:sender { [NXApp stopModal]; return self; } - setSiSize:anObject { siSize = anObject; [siSize setSelectable:NO]; [siSize setEditable:NO]; return self; } - setSiCSound:anObject { siCSound = anObject; [siCSound setSelectable:NO]; [siCSound setEditable:NO]; return self; } - setSiFrames:anObject { siFrames = anObject; [siFrames setSelectable:NO]; [siFrames setEditable:NO]; return self; } - setSiFormat:anObject { siFormat = anObject; [siFormat setSelectable:NO]; [siFormat setEditable:NO]; return self; } - setSiTime:anObject { siTime = anObject; [siTime setSelectable:NO]; [siTime setEditable:NO]; return self; } - setSiRate:anObject { siRate = anObject; [siRate setSelectable:NO]; [siRate setEditable:NO]; return self; } - setSiPanel:anObject { siPanel = anObject; [siPanel setDelegate:self]; return self; } - setSiChannels:anObject { siChannels = anObject; [siChannels setSelectable:NO]; [siChannels setEditable:NO]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.