Annotation of Examples/SoundAndMusic/SoundKit/SoundEditor/SoundController.m, revision 1.1.1.1

1.1       root        1: /*
                      2:  * You may freely copy, distribute and reuse the code in this example.  
                      3:  * NeXT disclaims any warranty of any kind, expressed or implied, as to 
                      4:  * its fitness for any particular use.
                      5:  */
                      6: 
                      7: 
                      8: #import "SoundController.h"
                      9: #import "SaveToController.h"
                     10: #import "SoundDocument.h"
                     11: #import <soundkit/soundkit.h>
                     12: #import <appkit/Application.h>
                     13: #import <appkit/OpenPanel.h>
                     14: #import <appkit/Cursor.h>
                     15: #import <appkit/Button.h>
                     16: #import <appkit/Panel.h>
                     17: #import <appkit/publicWraps.h> /* for NXBeep() */
                     18: #import <sys/param.h>          /* for MAXPATHLEN */
                     19: #import <string.h>
                     20: #import <objc/NXStringTable.h>
                     21: 
                     22: static char pathname[1024];
                     23: 
                     24: static BOOL getOpenPath(char *buf, char const *theType)
                     25: {
                     26:     static id openPanel = nil;
                     27:     char const *fileTypes[2] = {0,0};
                     28:     int opr;
                     29: 
                     30:     if (!openPanel)
                     31:         openPanel = [OpenPanel new];
                     32:     if (theType && *theType)
                     33:        fileTypes[0] = theType;
                     34:     [NXApp setAutoupdate:NO];
                     35:     
                     36:     if (*buf)
                     37:       opr = [openPanel runModalForDirectory:buf
                     38:                 file:NULL types:fileTypes];
                     39:     else
                     40:       opr = [openPanel runModalForDirectory:"/NextLibrary/Sounds" 
                     41:         file:"Basso.snd" types:fileTypes];
                     42:     if (opr) {
                     43:        strcpy(buf,[openPanel filename]);
                     44:        [NXApp setAutoupdate:YES];
                     45:        return YES;
                     46:     } else {
                     47:        [NXApp setAutoupdate:YES];
                     48:        return NO;
                     49:     }
                     50: }
                     51: 
                     52: 
                     53: static BOOL getSavePath(char *buf, char const *defaultPath, View *accessory)
                     54: {
                     55:     static id  savePanel = nil;
                     56:     BOOL       ok;
                     57:     char       dirName[1024], fileName[256];
                     58: 
                     59:     if (!savePanel) {
                     60:         const char *const types[2] = {"snd", NULL};
                     61:         savePanel = [SavePanel new];
                     62:         [savePanel setRequiredFileType:types[0]];
                     63:     }
                     64:     [savePanel setAccessoryView:accessory];
                     65:     [NXApp setAutoupdate:NO];
                     66:     if (defaultPath && *defaultPath) {
                     67:        char *p;
                     68:        strcpy(dirName,defaultPath);
                     69:        if (p = rindex(dirName,'/')) {
                     70:            strcpy(fileName, p+1);
                     71:            *p = '\0';
                     72:        } else {
                     73:            strcpy(fileName,defaultPath);
                     74:            fileName[0] = '\0';
                     75:        }
                     76:        ok = [savePanel runModalForDirectory:dirName file:fileName];
                     77:     } else 
                     78:        ok = [savePanel runModal];
                     79:     [NXApp setAutoupdate:YES];
                     80:     if (ok) {
                     81:        strcpy(buf,[savePanel filename]);
                     82:        return YES;
                     83:     } else 
                     84:        return NO;
                     85: }
                     86: 
                     87: 
                     88: @implementation SoundController
                     89: 
                     90: - init
                     91: {
                     92:     [super init];
                     93:     [controlPanel removeFromEventMask:(NX_KEYDOWNMASK|NX_KEYUPMASK)];
                     94:     [controlPanel setFloatingPanel:YES];
                     95:     return self;
                     96: }
                     97: 
                     98: - appDidInit:sender
                     99: {
                    100:     [self newSoundDoc:self];   /* User Interface guidelines recommend opening 
                    101:                                a new document at launch time.  We do this in
                    102:                                appDidInit: rather than init to make sure that
                    103:                                the stringTable has been unarchived */ 
                    104:     return self;
                    105: }
                    106: 
                    107: - info:sender
                    108: {
                    109:     if (!infoPanel)
                    110:        [NXApp loadNibSection:"InfoPanel.nib" owner:self];
                    111:     [infoPanel orderFront:self];
                    112:     return self;       
                    113: }
                    114: 
                    115: - newSoundDoc:sender
                    116: {
                    117:     static char filenamebuf[MAXPATHLEN+1];
                    118:     strcpy(filenamebuf, [[OpenPanel new] directory]);
                    119:                                /* doesn't instantiate a new OpenPanel 
                    120:                                   if one already exists */
                    121:     strcat(filenamebuf,[stringTable valueForStringKey:"/UNTITLED"]);
                    122:     [self setDocument:[[SoundDocument alloc] init]];
                    123:     [currentDocument setFileName:filenamebuf];
                    124:     return self;
                    125: }
                    126: 
                    127: 
                    128: - setDocument:aDocument
                    129: {
                    130:     [self stop:nil];
                    131:     currentDocument = aDocument;
                    132:     [recordButton setEnabled:([currentDocument isRecordable]? YES : NO)];
                    133:     [playButton setEnabled:YES];
                    134:     [currentDocument setDelegate:self];
                    135:     return self;
                    136: }
                    137: 
                    138: - document
                    139: {
                    140:     return currentDocument;
                    141: }
                    142: 
                    143: - openFile:(char *)fileName
                    144: {
                    145:     id newDocument;
                    146:     newDocument = [[SoundDocument alloc] init];
                    147:     [newDocument setFileName:fileName];
                    148:     [newDocument load:nil];
                    149:     [self setDocument:newDocument];
                    150:     return self;
                    151: }
                    152: 
                    153: - open:sender
                    154: {
                    155:     if (getOpenPath(pathname,"snd"))
                    156:        [self openFile:pathname];
                    157:     return self;
                    158: }
                    159: 
                    160: - saveAs:sender withAccessory:accessory
                    161: {
                    162:     char pathname[1024];
                    163:     id doc = currentDocument;
                    164:     if (accessory)
                    165:        [saveToController setSound:[doc sound]];
                    166:     if (doc && getSavePath(pathname,[doc fileName],accessory)) {
                    167:        if (accessory)
                    168:            [doc saveToFormat:[saveToController soundTemplate]
                    169:                 fileName: pathname];
                    170:        else {
                    171:            [doc setFileName:pathname];
                    172:            [doc save:sender];
                    173:        }
                    174:     }
                    175:     return self;
                    176: }
                    177: 
                    178: - saveAs:sender
                    179: {
                    180:     return [self saveAs:sender withAccessory:nil];
                    181: }
                    182: 
                    183: - saveTo:sender
                    184: {
                    185:     return [self saveAs:sender withAccessory:saveToAccessoryView];
                    186: }
                    187: 
                    188: - save:sender
                    189: {
                    190:     if (currentDocument) {
                    191:        if ([currentDocument fileName]
                    192:                && strcmp(strrchr([currentDocument fileName],'/'),"/UNTITLED"))
                    193:            [currentDocument save:sender];
                    194:        else
                    195:            [self saveAs:sender];
                    196:     }
                    197:     return self;
                    198: }
                    199: 
                    200: - revertToSaved:sender
                    201: {
                    202:     if (currentDocument)
                    203:        [currentDocument revertToSaved:sender];
                    204:     return self;
                    205: }
                    206: 
                    207: - play:sender
                    208: {
                    209:     if (![currentDocument isPlayable]) {
                    210:        NXBeep();
                    211:        return nil;
                    212:     }
                    213:     if (currentDocument) {
                    214:        [playButton setEnabled:NO];
                    215:        [recordButton setEnabled:NO];
                    216:        [stopButton setEnabled:YES];
                    217:        [pauseButton setState:0];
                    218:        [currentDocument play:sender];
                    219:     }
                    220:     return self;
                    221: }
                    222: 
                    223: - willPlay:sender
                    224: {
                    225:     [meter setSound:[sender soundBeingProcessed]];
                    226:     [meter run:self];
                    227:     return self;
                    228: }
                    229: 
                    230: - didPlay:sender
                    231: {
                    232:     [playButton setState:0];
                    233:     [playButton setEnabled:YES];
                    234:     [recordButton setState:0];
                    235:     [recordButton setEnabled:YES];
                    236:     [pauseButton setState:0];
                    237:     [meter stop:self];
                    238:     return self;
                    239: }
                    240: 
                    241: - stop:sender
                    242: {
                    243:     if (currentDocument)
                    244:        [currentDocument stop:sender];
                    245:     [playButton setState:0];
                    246:     [playButton setEnabled:YES];
                    247:     [recordButton setState:0];
                    248:     [recordButton setEnabled:YES];
                    249:     [pauseButton setState:0];
                    250:     return self;
                    251: }
                    252: 
                    253: - pause:sender
                    254: {
                    255:     if (!currentDocument || (![playButton state] && ![recordButton state])) {
                    256:        [pauseButton setState:0];
                    257:        return self;
                    258:     } else if ([pauseButton state])
                    259:        [currentDocument pause:self];
                    260:     else
                    261:        [currentDocument resume:self];
                    262:     return self;
                    263: }
                    264: 
                    265: - record:sender
                    266: {
                    267:     if (currentDocument) {
                    268:        [recordButton setEnabled:NO];
                    269:        [playButton setEnabled:NO];
                    270:        [stopButton setEnabled:YES];
                    271:        [currentDocument record:sender];
                    272:     }
                    273:     return self;
                    274: }
                    275: 
                    276: - willRecord:sender
                    277: {
                    278:     [meter setSound:[sender soundBeingProcessed]];
                    279:     [meter run:self];
                    280:     return self;
                    281: }
                    282: 
                    283: - didRecord:sender
                    284: {
                    285:     [playButton setState:0];
                    286:     [playButton setEnabled:YES];
                    287:     [recordButton setState:0];
                    288:     [recordButton setEnabled:YES];
                    289:     [pauseButton setState:0];
                    290:     [meter stop:self];
                    291:     return self;
                    292: }
                    293: 
                    294: - soundDidChange:sender
                    295: {
                    296:     if (currentDocument)
                    297:        [currentDocument touch];
                    298:     return self;
                    299: }
                    300: 
                    301: - hadError:sender
                    302: {
                    303:     int err = [[sender soundBeingProcessed] processingError];
                    304: 
                    305:     if ([playButton state])
                    306:        NXRunAlertPanel([stringTable valueForStringKey:"Play error"],
                    307:            SNDSoundError(err),
                    308:            [stringTable valueForStringKey:"OK"],
                    309:            NULL,NULL);
                    310:     else if ([recordButton state])
                    311:        NXRunAlertPanel([stringTable valueForStringKey:"Record error"],
                    312:            SNDSoundError(err),
                    313:            [stringTable valueForStringKey:"OK"],
                    314:            NULL,NULL);
                    315:     return [self stop:self];
                    316: }
                    317: 
                    318: - appDidHide:sender
                    319: {
                    320:     [self stop:nil];
                    321:     return self;
                    322: }
                    323: 
                    324: - appDidBecomeActive:sender
                    325: {
                    326:     [controlPanel orderFront:nil];
                    327:     return self;
                    328: }
                    329: 
                    330: - stringTable
                    331: {
                    332:     return stringTable;        
                    333: }
                    334: 
                    335: @end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.