This is Abspieler.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import "Abspieler.h"
char *lade_module(char *);
char *lade_module_normal(FILE *, int);
char *lade_module_pp(FILE *, int, char *);
extern int Aktion_Todo;
extern char Aktion_Pfad[1024];
#define LADEN 2
#define LOAD_AND_PLAY 1
#define ABSPIELEN 2
#define BEIM_BEENDEN 1
#define END_OK 0
extern int be_stat;
extern mutex_t be_stat_lock;
@implementation Abspieler
extern int spektrum;
extern float nullWert[];
extern int klang_reset;
int noch_starten = 0;
int init_klar = 0;
int autor_gesetzt = 0;
int MaxPatternGlobal = 100;
/* ------------------------------------------------------------ */
/* Unterstuetzende C-Funktionen */
char *lade_module(char *dateiname)
{
struct stat stbuf;// Statbuffer
char temp[10]; // Kleiner temporaerer Buffer
FILE *fp; // Filepointer fuer Datei
char *ptr; // Pointer auf den eingelesenen Buffer
int groesse; // Groesse der Datei
ptr = NULL;
if(stat(dateiname, &stbuf) == -1)
{
return NULL;
}
groesse = stbuf.st_size;
if((fp = fopen(dateiname, "r")) != NULL)
{
// zur Identifizierung die ersten acht Bytes lesen
if(fread(temp, 8, 1, fp) == 1)
{
if(strncmp(temp, "PP20", 4) == 0)
{
// Aha, ein Module mit Powerpacker gepackt.
ptr = lade_module_pp(fp, groesse, &temp[4]);
}
else if(strncmp(temp, "PX20", 4) == 0)
{
// Fehlermeldung ausgeben
}
else
{
// Also kein mit Powerpacker gepacktes Module
ptr = lade_module_normal(fp, groesse);
}
}
fclose(fp);
}
return ptr;
}
char *lade_module_normal(FILE *fp, int groesse)
{
char *ptr;
ptr = calloc(groesse, 1);
// An den Dateianfang fahren...
fseek(fp, 0L, SEEK_SET);
// ...und einlesen
if(fread(ptr, groesse, 1, fp) != 1)
{
fprintf(stderr, "Fehler beim Lesen...\n");
return NULL;
}
return ptr;
}
char *lade_module_pp(FILE *fp, int groesse, char *tmpbuf)
{
char temp[10];
char *ptr;
int effizienz, info, groesse_neu;
effizienz = info = 0;
// Effizienz kopieren
memcpy(&effizienz, tmpbuf, 4);
// Vier Bytes vor das Ende der Datei fahren
fseek(fp, -4L, SEEK_END);
if(fread(temp, 4, 1, fp) != 1)
{
fprintf(stderr, "Fehler beim Lesen\n");
return NULL;
}
// Laenge der Datei ermitteln
memcpy(&info, &temp[0], 4);
info = (info >> 8) + 8;
ptr = calloc(info, 1);
// Acht Bytes hinter den Anfang der Datei fahren
fseek(fp, 8, SEEK_SET);
groesse_neu = groesse - 8;
if(fread(ptr, groesse_neu, 1, fp) != 1)
{
fprintf(stderr, "Fehler beim Lesen\n");
return NULL;
}
// Funktion in PowerPackerD.o
Decrunch(ptr + groesse_neu, ptr, effizienz);
return ptr;
}
/* ------------------------------------------------------------ */
/* Ab hier Objective-C Methoden */
- init
{
be_stat_lock = mutex_alloc();
return self;
}
- ladeModule:sender
{
mutex_lock(be_stat_lock);
if(be_stat == END_OK)
{
mutex_unlock(be_stat_lock);
[fftView neueWerte:&nullWert[0]];
[self ladeModule:self datei:NULL];
} else
{
mutex_unlock(be_stat_lock);
[Stopknopf performClick:self];
Aktion_Todo = LADEN;
}
return self;
}
- ladeModule:sender datei:(const char *)datei
{
const char *const suffix[] = {"mod", "pp", "MOD", "PP", NULL};
const char *const *modname;
char pfad[4096];
if(spielAb == YES)
{
[Stopknopf performClick:self];
spielAb = NO;
modulePuffer = NULL;
}
[Fenster setTitle:[stringTab valueForStringKey:"keinModuleGeladen"]];
[self setzeModuleNamen:[stringTab valueForStringKey:"keinTitel"] laenge:0];
[AktPattern setStringValue:""];
[PosAnzeiger neuePos:0:MaxPatternGlobal];
[fftView neueWerte:&nullWert[0]];
// Tracker zuruecksetzen!!!
if(datei == NULL)
{
openPanel = [OpenPanel new];
[openPanel setTitle:[stringTab valueForStringKey:"moduleLaden"]];
[openPanel allowMultipleFiles:NO];
if ([openPanel runModalForDirectory:stdPfad file:NULL types:suffix] &&
(modname = [openPanel filenames]) != NULL)
{
if(*modname)
{
strcpy(pfad, [openPanel directory]);
strcat(pfad, "/");
strcat(pfad, *modname);
}
else
{
[self knopfZustand:0];
return self;
}
}
else
{
[self knopfZustand:0];
return self;
}
}
else
{
strcpy(pfad, datei);
}
if((modulePuffer = lade_module(pfad)) != NULL)
{
if(!trackerPlayer)
{
trackerPlayer = [[TrackerPlayer alloc] init];
[trackerPlayer setDelegate:self];
[trackerPlayer setFFTView:fftView];
[trackerPlayer setzeStringTab:stringTab];
}
[Fenster setTitleAsFilename:pfad];
spielAb =
[trackerPlayer ladeModuleEin:modulePuffer
mix:stereoMix speed:speed endlos:endlos fft:fftspeed];
free(modulePuffer);
}
if ((init_klar == 1) && (noch_starten == 1))
{
[Abspielknopf performClick:self];
noch_starten = 0;
}
return self;
}
- setzeSampleNamen:(char *)name nr:(int)nr lae:(int)lae
offset:(int)offset ofle:(int)ofle
{
int i;
[[SamMat1Name cellAt:nr-1:0] setStringValue:name];
if (autor_gesetzt == 1)
{
[AutorFeld setStringValue:name];
autor_gesetzt = 2;
}
if ((autor_gesetzt == 0) && (name))
{
for (i = 0; i < strlen(name); i++)
{
if ((name[i] == 'b') || (name[i] == 'B'))
{
if ((name[i + 1] == 'y') || (name[i + 1] == 'Y'))
{
if ((name[i + 2] == ' ') && ((name[i + 3] != ' ')
&& (name[i + 3] != 0x0)))
{
[AutorFeld setStringValue:&name[i + 3]];
autor_gesetzt = 2;
}
else if ((name[i + 2] == 0x0) || (name[i + 2] == ' '))
autor_gesetzt = 1;
}
}
}
}
if (lae != -1)
[[SamMat1Laenge cellAt:nr-1:0] setIntValue:lae];
else
[[SamMat1Laenge cellAt:nr-1:0] setStringValue:""];
if (offset != -1)
[[SamMat1Offset cellAt:nr-1:0] setIntValue:offset];
else
[[SamMat1Offset cellAt:nr-1:0] setStringValue:""];
DPSFlush();
return self;
}
- setzeAktuellesPattern:(int)pattern
{
if (pattern != -1)
{
[AktPattern setIntValue:pattern+1];
[PosAnzeiger neuePos:pattern+1:MaxPatternGlobal];
}
else
{
[AktPattern setStringValue:""];
[PosAnzeiger neuePos:0:MaxPatternGlobal];
}
DPSFlush();
return self;
}
- setzeModuleNamen:(const char *)name laenge:(int)laenge
{
[Modulename setStringValue:name];
MaxPatternGlobal = laenge;
[AutorFeld setStringValue:[stringTab valueForStringKey:"unbekannt"]];
autor_gesetzt = 0;
DPSFlush();
return self;
}
- moduleAbspielen
{
if(spielAb == YES)
{
[fftView neueWerte:&nullWert[0]];
[trackerPlayer starteAbspielen];
[Abspielknopf setState:1];
}
return self;
}
- knopfAbspielen:sender
{
if(![Pauseknopf state]) // Im Pausemodus?
{
[Stopknopf performClick:self];
if(spielAb == NO)
{
[self ladeModule:self datei:NULL];
}
if(spielAb == YES)
{
[self moduleAbspielen];
}
}
else
{
[Abspielknopf setState:1];
[Pauseknopf performClick:self];
}
return self;
}
- knopfPause:sender
{
[trackerPlayer pausiereAbspielen];
if([Pauseknopf state])
{
[PosAnzeiger anfangPause];
[Abspielknopf setEnabled:YES];
}
else
{
[PosAnzeiger endePause];
[Abspielknopf setEnabled:NO];
}
return self;
}
extern initSimpleMsg(simpleMsg *);
- knopfStop:sender
{
simpleMsg msg;
[PosAnzeiger stoppeZeit];
if([trackerPlayer beimAbspielen] == YES)
{
[trackerPlayer beendeAbspielen];
initSimpleMsg(&msg);
msg.Aktion = FFT_CLEAR;
msg_send(&msg.h, MSG_OPTION_NONE, 0);
[AktPattern setStringValue:""]; // mz 14.5.92
[PosAnzeiger neuePos:0:MaxPatternGlobal];
}
[self knopfZustand:0];
return self;
}
- knopfZustand:(int)flag
{
if(flag == 0)
{
[PosAnzeiger stoppeZeit];
[Abspielknopf setState:0];
[Abspielknopf setEnabled:YES];
[Pauseknopf setState:0];
[Stopknopf setState:0];
[Pauseknopf setEnabled:NO];
[Stopknopf setEnabled:NO];
}
else
{
[Abspielknopf setState:1];
[Abspielknopf setEnabled:NO];
[Pauseknopf setState:0];
[Pauseknopf setEnabled:YES];
[Stopknopf setEnabled:YES];
}
DPSFlush();
return self;
}
- abspielKnopf { return Abspielknopf; }
- pauseKnopf { return Pauseknopf; }
- stopKnopf { return Stopknopf; }
- aendereGeschwindigkeit:sender
{
switch([sender tag])
{
case 1: // Slider
speed = [sender intValue];
if(trackerPlayer)
[trackerPlayer setzeGeschwindigkeit:speed];
return self;
break;
case 3: speed = 30; break;
case 4: speed = 40; break;
case 5: speed = 50; break;
case 6: speed = 60; break;
case 7: speed = 70; break;
case 8: speed = 80; break;
default: speed = 50; break;
}
[gSlider setIntValue:speed];
if(trackerPlayer)
[trackerPlayer setzeGeschwindigkeit:speed];
return self;
}
- aendereStereo:sender
{
switch([sender tag])
{
case 1: // Slider
stereoMix = [sender intValue];
if(trackerPlayer)
[trackerPlayer setzeStereo:stereoMix];
return self;
break;
case 2: stereoMix = 0; break;
case 3: stereoMix = 34; break;
case 4: stereoMix = 67; break;
case 5: stereoMix = 100; break;
default: stereoMix = 34; break;
}
[sSlider setIntValue:stereoMix];
if(trackerPlayer)
[trackerPlayer setzeStereo:stereoMix];
return self;
}
- aendereKlang:sender
{
spektrum = (spektrum + 1) % 2;
klang_reset = 1;
return self;
}
- aendereTiefpass:sender
{
SNDSetFilter((int)[sender state]);
return self;
}
- setzeTiefpassSwitch:(BOOL)flag
{
[tiefpassSwitch setIntValue:flag];
return self;
}
- aendereEndlos:sender
{
endlos = [sender state];
if(trackerPlayer)
[trackerPlayer setzeEndlos:endlos];
return self;
}
void ueberpruefeTiefpass(DPSTimedEntry number, double now, char *data)
{
int filterOn;
SNDGetFilter(&filterOn);
[(id)data setzeTiefpassSwitch:filterOn];
}
/* Bringt Prefs-Fenster nach vorne */
- zeigePrefs:sender
{
[meinePrefs zeigePrefsFenster:self];
return self;
}
- zeigeProgramm:sender
{
[meinProgramm zeigeProgrammFenster:self];
return self;
}
- stellePrefsEin:(BOOL)init
{
if(meinePrefs && (init == YES))
return self;
if(!meinePrefs)
meinePrefs = [[Prefs alloc] init:self];
[endlosSwitch setIntValue:[meinePrefs endlosAbspielen]];
endlos = (BOOL)[meinePrefs endlosAbspielen];
if(trackerPlayer)
[trackerPlayer setzeEndlos:endlos];
[klangSwitch setIntValue:[meinePrefs klangSpektrum]];
spektrum = [meinePrefs klangSpektrum];
klang_reset = 1;
[self setzeTiefpassSwitch:(BOOL)[meinePrefs tiefpassFilter]];
SNDSetFilter([meinePrefs tiefpassFilter]);
[sSlider setIntValue: 100 - [meinePrefs stereoEffekt]];
stereoMix = 100 - [meinePrefs stereoEffekt];
if(trackerPlayer)
[trackerPlayer setzeStereo:stereoMix];
[gSlider setIntValue:[meinePrefs geschwindigkeit]];
speed = [meinePrefs geschwindigkeit];
if(trackerPlayer)
[trackerPlayer setzeGeschwindigkeit:speed];
fftspeed = [meinePrefs fftSpeed];
if (trackerPlayer)
[trackerPlayer setzeFFTSpeed:fftspeed];
stdPfad = [meinePrefs stdPfad];
return self;
}
/*
* Delegation Methods fuer Application
*/
- windowWillResize:sender toSize:(NXSize *)frameSize
{
if(frameSize->width < Breite)
frameSize->width = Breite;
if(frameSize->height < Hoehe)
frameSize->height = Hoehe;
return self;
}
- appDidInit:sender
{
NXRect winFrame;
[Fenster getFrame:&winFrame];
Breite = winFrame.size.width;
Hoehe = winFrame.size.height;
[self stellePrefsEin:YES];
if(!meinProgramm)
meinProgramm = [[Programm alloc] init:self];
(void) DPSAddTimedEntry(0.5, (DPSTimedEntryProc)ueberpruefeTiefpass,
self, 10);
if (noch_starten == 1)
{
[Abspielknopf performClick:self];
noch_starten = 0;
}
if(!trackerPlayer)
[self knopfZustand:0];
init_klar = 1;
// [Fenster makeKeyAndOrderFront:self];
return self;
}
- (BOOL) appAcceptsAnotherFile:sender
{
return YES;
}
- (int)appOpenFile:(const char *)datei type:(const char *)type
{
if((strcasecmp(type, "mod") == 0) || (strcasecmp(type, "pp") == 0))
{
[self stellePrefsEin:YES];
mutex_lock(be_stat_lock);
if(be_stat != END_OK)
{
mutex_unlock(be_stat_lock);
[Stopknopf performClick:self];
Aktion_Todo = LOAD_AND_PLAY;
strcpy(Aktion_Pfad, datei);
[Fenster makeKeyAndOrderFront:self]; //mz 27.6.92
return YES;
}
mutex_unlock(be_stat_lock);
noch_starten = 1;
[self ladeModule:self datei:datei];
if(spielAb == YES)
noch_starten = 1;
else
noch_starten = 0;
[Fenster makeKeyAndOrderFront:self]; //mz 27.6.92
return YES;
}
else
{
return NO;
}
}
- willPosAnzeiger
{
return PosAnzeiger;
}
- (char *)GibStdPfad;
{
return (char *)stdPfad;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.