This is Manager.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "Manager.h" #import <strings.h> #import <math.h> #import <defaults.h> #import <libc.h> #import <streams/streams.h> #import <appkit/Speaker.h> #import <appkit/Listener.h> int tagToChan[5] = {4,2,0,1,3}; int chanToTag[5] = {2,3,1,4,0}; @implementation Manager - (int)app:sender openFile:(const char *)path type:(const char *)type { int i; files = (char**)malloc(10*sizeof(char*)); for(i=1;i<10;i++) files[1]=NULL; files[0]=(char*)rindex(path,'/')+1; files[0][-1]=(char)0; direct=(char*)path; fprintf(stderr,"Dir: %s File %s\n", direct, files[0]); [self doOpenSound:1]; return 1; } /* appAcceptsAnotherFile -- our app accepts to open files from the workspace */ - (BOOL)appAcceptsAnotherFile:sender { return YES; } /* regDefaults: -- To register default values */ - regDefaults:sender { const char temp[128]; defSrate = samplingRate[currentSound]; [loadForm setIntValue:defSrate]; defLength = lengthplayed[currentSound]; sprintf((char*) temp,"%d", defSrate); NXWriteDefault((const char*)"Niveaux",(const char*)"SRate",temp); sprintf((char*) temp,"%d",[[outputMatrix selectedCell] tag]); NXWriteDefault((const char*)"Niveaux",(const char*)"Output",temp); return self; } - useDefaults:sender { samplingRate[currentSound] = defSrate; lengthplayed[currentSound] = defLength; [sampRateForm setIntValue:defSrate]; return self; } // The following method is necessary because when you click on the // Inspector Panel, it becomes Key (and first Responder) and Manager // no longer responds to key events! Since Manager is the Inspector's // delegate, it will receive the following message each time the // Inspector becomes key, and make Manager the Inspector's first // responder. - windowDidBecomeKey:sender { [sender makeFirstResponder:self]; return self; } - appWillInit:sender { int i; const char *defOutput, *defSRateTmp; defOutput=NXGetDefaultValue((const char*)"Niveaux",(const char*)"Output"); defSRateTmp=NXGetDefaultValue((const char*)"Niveaux",(const char*)"SRate"); fprintf(stderr,"defOutput %s defSRateTmp %s\n", defOutput, defSRateTmp); if(defOutput == 0 || defSRateTmp == 0) { NXWriteDefault((const char*)"Niveaux",(const char*)"Output", (const char*)"0"); NXWriteDefault((const char*)"Niveaux",(const char*)"SRate", (const char*)"16000"); defSrate = 16000; } else { defSrate = atoi(defSRateTmp); i=atoi(defOutput); [outputMatrix selectCellWithTag:i]; [playObject setOutput:i]; } for(i=0;i<10;i++) scaleFactor[i] = 1.0; openPanel = [OpenPanel new]; [openPanel allowMultipleFiles:YES]; [openPanel setDelegate:self]; [openPanel setAccessoryView:loadView]; [loadForm setIntValue:defSrate]; [playObject setMonoMode:MONO]; [playObject setDelegate:self]; firstTime = 1; Nmax = 0; defLength = 0; ALL_PLAY = 0; silence = 0; generalVol = 1; return self; } - saveSound:sender { static int firstTimeSave=1; int i=0,j,file_numb,ans; short *stemp; char temp[200]; if(Nmax == 0 || Nmax == -1) return self; if(firstTimeSave) { strcpy(saveDir,direct); firstTimeSave = 0; } [saveDirCell setStringValue:saveDir at:0]; ans = 1; while(ans != 0) { ans = [NXApp runModalFor:savePanel]; [messageForm setStringValue:" "]; fprintf(stderr,"End of runModal! ans= %d directory %s\n", ans,saveDir); if(ans) for(i=0;i<Nmax;i++) { SNDGetDataPointer(sounds[i], (char**) &stemp, &j, &j); strcpy(temp, saveDir); strcat(temp, "/"); strcat(temp, filenames[i]); file_numb = open(temp,O_RDWR|O_CREAT,0644); if(file_numb == -1) { fprintf(stderr,"Can't write!! %s\n", temp); break; } else write(file_numb, stemp, N[i]*sizeof(short)); } if(i == Nmax) ans = 0; else [messageForm setStringValue:"Invalid Directory"]; } [messageForm setStringValue:" "]; return self; } - adjustAmp:sender { int i; i = [[sender selectedCell] tag]; scaleFactor[i] = [sender floatValue]; [ampForm selectCellWithTag:i]; [[ampForm selectedCell] setFloatValue:scaleFactor[i]]; currentSound = i; return self; } - rescaleAmp:sender { int i,j; float scalefactor; short *stemp; for(i=0;i<Nmax;i++) { if(fabs(scaleFactor[i] - 1) < 0.0001) continue; SNDGetDataPointer(sounds[i], (char**) &stemp, &j, &j); scalefactor = scaleFactor[i]; for(j=0;j<N[i];j++) *stemp++ *= scalefactor; scaleFactor[i] = 1; [sliderMatrix selectCellWithTag:i]; [[sliderMatrix selectedCell] setFloatValue:1]; [ampForm selectCellWithTag:i]; [[ampForm selectedCell] setStringValue:"1.00"]; } return self; } - openSound:sender { int i; const char *foo; [openPanel setAccessoryView:loadView]; [openPanel setTitle:(const char *)"Close Sounds and Open"]; if(firstTime) { foo = ((Nmax) ? directories[Nmax-1] : NXHomeDirectory()); i=[openPanel runModalForDirectory:foo file:""]; } else i=[openPanel runModalForDirectory:[openPanel directory] file:""]; firstTime = 0; files = (char**) [openPanel filenames]; direct = (char*) [openPanel directory]; if(i) [self doOpenSound:0]; return self; } - openMoreSound:sender { int i; const char *foo; [openPanel setAccessoryView:loadView]; [openPanel setTitle:(const char *)"Open "]; if(firstTime) { foo = ((Nmax) ? directories[Nmax-1] : NXHomeDirectory()); i=[openPanel runModalForDirectory:foo file:""]; } else i=[openPanel runModalForDirectory:[openPanel directory] file:""]; firstTime = 0; files = (char**) [openPanel filenames]; direct = (char*) [openPanel directory]; if(i) [self doOpenSound:1]; return self; } - (int) doOpenSound:(int)more { int i,j; if(!more) [self closeSound:self]; i=((more) ? Nmax : 0); for(j=0; files != NULL && files[j] != NULL && i<10 && j<10; i++,j++) [self doOpenOneSound:files[j]:direct:[loadForm intValue]]; Nmax = i; for(i=Nmax;i<10;i++) { [buttonMatrix selectCellWithTag:i]; [sliderMatrix selectCellWithTag:i]; [openMatrix selectCellWithTag:i]; [inspectMatrix selectCellWithTag:i]; [[buttonMatrix selectedCell] setEnabled:NO]; [[sliderMatrix selectedCell] setEnabled:NO]; [[openMatrix selectedCell] setEnabled:NO]; [[inspectMatrix selectedCell] setEnabled:NO]; [fieldMatrix setStringValue:" " at:i]; } [[NXApp keyWindow] addToEventMask:NX_KEYDOWNMASK|NX_KEYUPMASK]; [[NXApp keyWindow] makeFirstResponder:self]; return 0; } - (int) doOpenOneSound:(char*)filename:(char*)directory:(int)tempSrate { int i,trash; char temp[200]; short *stemp; i = Nmax; if(filename != NULL && i < 10) { strcpy(temp, directory); strcat(temp, "/"); strcat(temp, filename); mapfile[i] = NXMapFile((const char*) temp, NX_READWRITE); if(mapfile[i] == 0) { NXRunAlertPanel("Open","Cannot open %s\n","OK",NULL,NULL, temp); return -1; } else { NXGetMemoryBuffer(mapfile[i], (char**) &stemp, &N[i], &trash); trash=SNDAlloc(&sounds[i],20, SND_FORMAT_LINEAR_16,0, 1,4); sounds[i]->dataSize = N[i] - sizeof(SNDSoundStruct); bcopy((char*)sounds[i],(char*)stemp,sizeof(SNDSoundStruct)); N[i]/=sizeof(short); sounds[i] = (SNDSoundStruct*) stemp; // A Word of explanation: In order to be able to play a sound using // the Play object, you have to have a SNDSoundStruct to pass to the // object, with at least the correct value of the datalocation. When // the opened sound is not a soundfile, it doesn't have a header so // we copy a SNDSoundStruct on the first samples or the sound. When // the sound is saved, remember that the first 14 samples have been // destroyed and replaced by the SNDSoundStruct. } [buttonMatrix selectCellWithTag:i]; [sliderMatrix selectCellWithTag:i]; [openMatrix selectCellWithTag:i]; [inspectMatrix selectCellWithTag:i]; [[buttonMatrix selectedCell] setEnabled:YES]; [[sliderMatrix selectedCell] setEnabled:YES]; [[openMatrix selectedCell] setEnabled:YES]; [[inspectMatrix selectedCell] setEnabled:YES]; [fieldMatrix setStringValue:filename at:i]; strcpy(filenames[i], filename); strcpy(directories[i],directory); samplingRate[i]=tempSrate; lengthplayed[i]=defLength; stereo[i]=4; // Mono mode default. } else return -1; Nmax++; [generalVolSlider setEnabled:YES]; [[NXApp keyWindow] addToEventMask:NX_KEYDOWNMASK|NX_KEYUPMASK]; [[NXApp keyWindow] makeFirstResponder:self]; return 0; } - play:sender { int i; [self inspect:sender]; i = [[sender selectedCell] tag]; if(i>=Nmax) return self; fprintf(stderr,"Playing file: %d soundfile%d\n",i,(int)sounds[i]); if(!ALL_PLAY) [(Play *) playObject stop]; else usleep((unsigned) (silence*1000000)); [playObject setOutput:[[outputMatrix selectedCell] tag]]; [playObject setGain:scaleFactor[i]]; [playObject setSamplingRate:samplingRate[i]]; [playObject setMonoMode:stereo[i]]; if(!lengthplayed[i]) [playObject playSound:sounds[i]:0:N[i]]; else [playObject playSound:sounds[i]:0:MIN(N[i],lengthplayed[i])]; currentSound = i; return self; } - setSampRate:sender { samplingRate[currentSound] = [sender intValueAt:0]; [[NXApp keyWindow] makeFirstResponder:self]; return self; } - setStereo:sender { stereo[currentSound] = tagToChan[[[sender selectedCell] tag]]; [[NXApp keyWindow] makeFirstResponder:self]; return self; } -keyDown:(NXEvent *) anEvent { int tempCurrent; NXEvent *nextEvent; nextEvent = [NXApp getNextEvent:(NX_KEYDOWNMASK|NX_KEYUPMASK)]; tempCurrent = (nextEvent->data).key.charCode - 49; // fprintf(stderr,"currentSound %d\n", currentSound); if(tempCurrent == -1) tempCurrent = 9; if(tempCurrent >= Nmax || tempCurrent < 0) { if(tempCurrent >= 10 || tempCurrent < 0) [self stop:self]; return self; } if(ALL_PLAY) return self; currentSound = tempCurrent; if(nextEvent->flags & NX_COMMANDMASK) //Command 1 opens inspector 1 { [inspectMatrix selectCellWithTag:currentSound]; [[inspectMatrix selectedCell] performClick:[inspectMatrix selectedCell]]; return self; } [buttonMatrix selectCellWithTag:currentSound]; [[buttonMatrix selectedCell] performClick:[buttonMatrix selectedCell]]; return self; } -okSave:sender { int i; i = [[sender selectedCell] tag]; fprintf(stderr,"Stop modal! Tag %d\n",i); strcpy(saveDir,[saveDirCell stringValueAt:0]); [NXApp stopModal:i]; [savePanel close]; return self; } - willPlay:sender { fprintf(stderr,"WILLPLAY nomn de dieu! current playing sound %d\n", currentSound); currentPlayingSound = currentSound; return self; } - stop:sender { ALL_PLAY = 0; [(Play *) playObject stop]; return self; } - setLength:sender { lengthplayed[currentSound] = [sender intValueAt:0]; [[NXApp keyWindow] makeFirstResponder:self]; return self; } - closeSound:sender { int i,Size,trash; short *stemp; for(i=0;i<Nmax;i++) { NXGetMemoryBuffer(mapfile[i],(char**)&stemp, &trash, &Size); vm_deallocate(task_self(),(pointer_t)stemp,Size); NXClose(mapfile[i]); } Nmax = 0; [generalVolSlider setEnabled:NO]; return self; } - openEdsndP:sender { char temp[128]; int i, msgDelivered; id mySpeaker; port_t thePort; i = [[sender selectedCell] tag]; strcpy(temp, directories[i]); strcat(temp, "/"); strcat(temp, filenames[i]); mySpeaker = [[Speaker alloc] init]; thePort = NXPortFromName("edsndP", NULL); if (thePort != PORT_NULL) { [mySpeaker setSendPort:thePort]; msgDelivered = [mySpeaker openFile:temp ok:&i]; } [mySpeaker free]; port_deallocate(task_self(), thePort); return self; } - saveConfiguration:sender { static int first = 1; int i; static char *saveConfigName; FILE *fopen(),*fp; if(first == 1) { saveConfigPanel = [SavePanel new]; [saveConfigPanel setDelegate:self]; [saveConfigPanel setTitle:(const char *)"Save Configuration"]; i=[saveConfigPanel runModalForDirectory:NXHomeDirectory() file:""]; } else { [saveConfigPanel setTitle:(const char *)"Save Configuration"]; i=[saveConfigPanel runModalForDirectory: [saveConfigPanel directory] file:""]; } first = 0; if(!i) return self; saveConfigName = (char*) [saveConfigPanel filename]; fp = fopen(saveConfigName,"w"); fprintf(fp,"%d \n",Nmax); for(i=0;i<Nmax;i++) fprintf(fp,"%s %s %f %d %d %d\n", directories[i], filenames[i], scaleFactor[i], samplingRate[i], lengthplayed[i], stereo[i]); fprintf(fp,"%f \n",silence); fclose(fp); return self; } - readConfiguration:sender { static int first = 1; int i,NNmax; char *saveConfigName; FILE *fopen(),*fp; if(first) readConfigPanel = [OpenPanel new]; [readConfigPanel setAccessoryView:nil]; [readConfigPanel setDelegate:self]; [readConfigPanel setTitle:(const char *)"Read Configuration"]; if(first) i=[readConfigPanel runModalForDirectory:NXHomeDirectory() file:""]; else i=[readConfigPanel runModalForDirectory: [readConfigPanel directory] file:""]; first = 0; if(!i) return self; saveConfigName = (char*) [readConfigPanel filename]; fp = fopen(saveConfigName,"r"); if(fp == NULL) return self; fscanf(fp,"%d",&NNmax); if(NNmax < 0 || NNmax > 10) return self; [self closeSound:self]; for(i=0;i<NNmax;i++) { fscanf(fp,"%s %s %f %d", directories[i],filenames[i],&scaleFactor[i],&samplingRate[i]); [self doOpenOneSound:filenames[i]:directories[i]:samplingRate[i]]; fscanf(fp," %d %d",&lengthplayed[i],&stereo[i]); [sliderMatrix selectCellWithTag:i]; [[sliderMatrix selectedCell] setFloatValue:scaleFactor[i]]; [ampForm selectCellWithTag:i]; [[ampForm selectedCell] setFloatValue:scaleFactor[i]]; // Careful! The doOpenSound method will alter Nmax, so we need to have // a local copy, hence the NNmax! } fscanf(fp,"%f ",&silence); [silenceForm setFloatValue:silence]; for(i=Nmax;i<10;i++) { [buttonMatrix selectCellWithTag:i]; [sliderMatrix selectCellWithTag:i]; [openMatrix selectCellWithTag:i]; [inspectMatrix selectCellWithTag:i]; [[buttonMatrix selectedCell] setEnabled:NO]; [[sliderMatrix selectedCell] setEnabled:NO]; [[openMatrix selectedCell] setEnabled:NO]; [[inspectMatrix selectedCell] setEnabled:NO]; [fieldMatrix setStringValue:" " at:i]; } fclose(fp); [generalVolSlider setEnabled:(Nmax != 0)]; return self; } - inspect:sender { char toto[128]; char *aux; int temp; strcpy(toto,"Sound "); currentSound = [[sender selectedCell] tag]; sprintf(toto+60,"%d", currentSound+1); strcat(toto,toto+60); [inspectorPanel orderFront:self]; [inspectorPanel setTitle:toto]; [sampRateForm setIntValue:samplingRate[currentSound]]; [lengthForm setIntValue:lengthplayed[currentSound]]; [stereoForm selectCellWithTag:chanToTag[stereo[currentSound]]]; [iPanelSoundName setTitle:toto at:0]; [iPanelSoundName setStringValue:filenames[currentSound] at:0]; temp=strlen(directories[currentSound]); if(temp > 25) { int i; strcpy(toto,"..."); aux = index(directories[currentSound],'/'); for(i=1;strlen(aux)>23;i++) aux = index((char*)(aux+1),'/'); // strcat(toto,(char*)(directories[currentSound]+temp-22)); strcat(toto,aux); aux = toto; } else aux = directories[currentSound]; [iPanelSoundName setStringValue:aux at:1]; [[NXApp keyWindow] makeFirstResponder:self]; NXPing(); return self; } - delete:sender { int i; //int Size,toto; //char **stemp; for(i=currentSound;i<Nmax-1;i++) { sounds[i] = sounds[i+1]; strcpy(filenames[i], filenames[i+1]); strcpy(directories[i], directories[i+1]); samplingRate[i] = samplingRate[i+1]; scaleFactor[i] = scaleFactor[i+1]; lengthplayed[i] = lengthplayed[i+1]; stereo[i] = stereo[i+1]; mapfile[i] = mapfile[i+1]; N[i] = N[i+1]; [sliderMatrix selectCellWithTag:i]; [[sliderMatrix selectedCell] setFloatValue:scaleFactor[i]]; [fieldMatrix setStringValue:filenames[i] at:i]; [ampForm selectCellWithTag:i]; [[ampForm selectedCell] setFloatValue:scaleFactor[i]]; } [sliderMatrix selectCellWithTag:Nmax-1]; [[sliderMatrix selectedCell] setFloatValue:1]; [[sliderMatrix selectedCell] setEnabled:NO]; [fieldMatrix setStringValue:" " at:Nmax-1]; [ampForm selectCellWithTag:Nmax-1]; [[ampForm selectedCell] setFloatValue:1.0]; [buttonMatrix selectCellWithTag:Nmax-1]; [openMatrix selectCellWithTag:Nmax-1]; [inspectMatrix selectCellWithTag:Nmax-1]; [[buttonMatrix selectedCell] setEnabled:NO]; [[openMatrix selectedCell] setEnabled:NO]; [[inspectMatrix selectedCell] setEnabled:NO]; // NXGetMemoryBuffer(mapfile[currentSound],(char**)&stemp, &toto, // &Size); vm_deallocate(task_self(),(pointer_t)stemp,Size); // NXClose(mapfile[currentSound]); Nmax--; if(currentSound == Nmax) currentSound--; if(currentSound >= 0) { [inspectMatrix selectCellWithTag:currentSound]; [[inspectMatrix selectedCell] performClick:[inspectMatrix selectedCell]]; } else [inspectorPanel performClose:self]; [generalVolSlider setEnabled:(Nmax != 0)]; return self; } - error:(char*)aString { NXRunAlertPanel("Play","%s\n","OK",NULL,NULL, aString); return self; } - reload:sender { int Nmax_temp, trash, Size, DefLengthTemp; char *stemp; NXGetMemoryBuffer(mapfile[currentSound],(char**)&stemp, &trash, &Size); vm_deallocate(task_self(),(pointer_t)stemp,Size); NXClose(mapfile[currentSound]); Nmax_temp = Nmax; DefLengthTemp = defLength; defLength = lengthplayed[currentSound]; Nmax = currentSound; [self doOpenOneSound:filenames[currentSound]:directories[currentSound] :samplingRate[currentSound]]; Nmax = Nmax_temp; defLength = DefLengthTemp; return self; } - didPlay:sender { if(ALL_PLAY) [self playAll:nil]; return self; } - playAll:sender { static int currentplayed = 0; if(sender != nil) { ALL_PLAY = 1; currentplayed = 0; } if(currentplayed >= Nmax) { ALL_PLAY = 0; return self; } [inspectMatrix selectCellWithTag:currentplayed]; [[inspectMatrix selectedCell] performClick:[inspectMatrix selectedCell]]; [self play:inspectMatrix]; currentplayed ++; return self; } - setSilence:sender { silence = [sender floatValue]; if(silence > 10) { [sender setFloatValue:10.0]; silence = 10; } return self; } - setGeneralVol:sender { float newVol, deltaVol; int i; newVol = 0.04*floor([sender floatValue]*25); deltaVol = (generalVol - newVol); if(deltaVol < 0.04 && deltaVol > -0.04) return self; generalVol = newVol; for(i=0;i<Nmax;i++) { scaleFactor[i] -= deltaVol; [ampForm selectCellWithTag:i]; [[ampForm selectedCell] setFloatValue:scaleFactor[i]]; [sliderMatrix selectCellWithTag:i]; [[sliderMatrix selectedCell] setFloatValue:scaleFactor[i]]; } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.