#include #include #include #include #include #include #include #include #include #include #include #include #include #include "prelude.h" #include "prelude_protos.h" #include "prelude_pragmas.h" extern long file_length(char *file); extern void out_put(char *s); extern void itoa(int n,char s[]); extern void ltoa(long n,char s[]); extern void reverse(char *s); struct PreludeBase *PreludeBase; char template[] ="Filename/A,FREQ/K,OFFSET/K,LENGTH/K,MSB16/S,LSB16/S,8BIT/S,ADPCM/S,ULAW/S,MPEG/S,MONO/S,CARDID/K,VOLUME/K,BUFSIZE/K"; char version_string[]="$VER: PrlPlay 2.0 (01.11.98)"; char no_memory[]="\nSorry - I need SOME MORE bytes of memory.\n"; char no_file[]="\nSorry - I need something to play.\n"; #define a_filename 0 #define a_freq 1 #define a_offset 2 #define a_length 3 #define a_msb16 4 #define a_lsb16 5 #define a_8bit 6 #define a_adpcm 7 #define a_ulaw 8 #define a_mpeg 9 #define a_mono 10 #define a_cardid 11 #define a_volume 12 #define a_bufsize 13 UWORD PlayMode,PlayFreq,CardID,Volume; ULONG Offset,BufSize; long Length; ULONG signal,signals; long args[15]; struct RDArgs *myargs; STRPTR FileName; APTR buffer[2]; BPTR fhandle; struct TagItem tags[]= { PRL_VOL_DAC_LEFT,0, PRL_VOL_DAC_RIGHT,0, PRL_SMPL_MODE,0, PRL_FREQUENCY,0, PRL_ADDON_TASK,0, PRL_ADDON_MASK,0, TAG_DONE,0 }; main() { int i,actbuf,stopped; long bytesread,bytesread2; char inmybuffer[16]; for(i=0;i<11;i++) args[i]=0; PreludeBase=(struct PreludeBase *)OpenLibrary("prelude.library",3L); if(!PreludeBase) printf("Sorry, no Prelude available\n"); PreludeBase->PrlCtrl->PL_SigTask=FindTask(NULL); signal=AllocSignal(-1); if(!signal) { PreludeBase->PrlCtrl->PL_SigTask=0; CloseLibrary((struct Library *)PreludeBase); return(0); }; PreludeBase->PrlCtrl->PL_SigMask=1L<PrlCtrl->PL_SigTask; tags[5].ti_Data=PreludeBase->PrlCtrl->PL_SigMask; myargs = (struct RDArgs *)ReadArgs(template,args,0); if(args[a_filename] == 0) { printf("Usage: %s\n",template); return(0); }; if(args[a_filename]) printf("%s with:\n",args[a_filename]); if(args[a_freq]) printf("Freq: %ld\n",atoi((STRPTR)args[a_freq])); if(args[a_offset]) printf("Offset: %ld\n",atoi((STRPTR)args[a_offset])); if(args[a_length]) printf("Length: %ld\n",atoi((STRPTR)args[a_length])); if(args[a_cardid]) printf("Playback on Card ID %ld\n",atoi((STRPTR)args[a_cardid])); printf("Mode: "); if(args[a_msb16]) printf("MSB 16Bit "); if(args[a_lsb16]) printf("LSB 16Bit "); if(args[a_8bit]) printf("8 Bit "); if(args[a_adpcm]) printf("ADPCM "); if(args[a_ulaw]) printf("ULAW "); if(args[a_mpeg]) printf("MPEG via AddOn "); if(args[a_mono]) printf("Mono "); else printf("Stereo "); printf("\n"); if(args[a_volume]) printf("Volume: %ld\n",atoi((STRPTR)args[a_volume])); if(args[a_bufsize]) printf("Using %ldk buffers\n",atoi((STRPTR)args[a_bufsize])); if(args[a_freq]) PlayFreq=atoi((STRPTR)args[a_freq]); else PlayFreq=44100; if(args[a_offset]) Offset=atoi((STRPTR)args[a_offset]); else Offset=0; if(args[a_length]) Length=atoi((STRPTR)args[a_length]); else Length=0; if(args[a_bufsize]) BufSize=atoi((STRPTR)args[a_bufsize])*1024; else BufSize=64*1024; PlayMode=0; if(args[a_msb16]) PlayMode=PRL_FMT|PRL_FMTX; if(args[a_lsb16]) PlayMode=PRL_FMT; if(args[a_8bit]) PlayMode=0; if(args[a_adpcm]) PlayMode=PRL_FMTX|PRL_Compressed; if(args[a_ulaw]) PlayMode=PRL_Compressed; if(!args[a_mono]) PlayMode|=PRL_Stereo; if(args[a_mpeg]) PlayMode=PRL_MODE_ADDON | PRL_ADDON_MPEG; if(args[a_cardid]) CardID=atoi((STRPTR)args[a_cardid]); if(args[a_volume]) Volume=atoi((STRPTR)args[a_volume]); else Volume=0; if(args[a_filename]) { FileName=(STRPTR)AllocVec(strlen((STRPTR)args[a_filename])+16,MEMF_CLEAR); strcpy(FileName,(STRPTR)args[a_filename]); } else FileName=0; FreeArgs(myargs); buffer[0]=(APTR)AllocVec(BufSize,MEMF_CLEAR); buffer[1]=(APTR)AllocVec(BufSize,MEMF_CLEAR); if((!buffer[0])||(!buffer[1])) { if(buffer[0]) FreeVec(buffer[0]); if(buffer[1]) FreeVec(buffer[1]); if(FileName) FreeVec(FileName); printf("%s\n",no_memory); PreludeBase->PrlCtrl->PL_SigTask=0; FreeSignal(signal); CloseLibrary((struct Library *)PreludeBase); return(0); }; fhandle=Open(FileName,MODE_OLDFILE); if(!fhandle) { if(buffer[0]) FreeVec(buffer[0]); if(buffer[1]) FreeVec(buffer[1]); if(FileName) FreeVec(FileName); printf("%s\n",no_file); PreludeBase->PrlCtrl->PL_SigTask=0; FreeSignal(signal); CloseLibrary((struct Library *)PreludeBase); return(0); }; tags[0].ti_Data=Volume; tags[1].ti_Data=Volume; tags[2].ti_Data=PlayMode; tags[3].ti_Data=PlayFreq; PrlSwitch(CardID); SetPrlCtrl(tags); if(Offset) { if(Offset>BufSize) for(;;) { Read(fhandle,buffer[0],BufSize); Offset=Offset-BufSize; if(Offset<=BufSize) break; }; Read(fhandle,buffer[0],Offset); }; if((Length>BufSize)||(Length==0)) { bytesread=Read(fhandle,buffer[0],BufSize); bytesread2=Read(fhandle,buffer[1],BufSize); PrlPlay(buffer[0],bytesread,PlayMode,PlayFreq); PrlPlay(buffer[1],bytesread2,PlayMode,PlayFreq); } else { bytesread=Read(fhandle,buffer[0],Length); PrlPlay(buffer[0],Length,PlayMode,PlayFreq); }; if((Length==0)||(Length>BufSize)) for(actbuf=0;;actbuf=1-actbuf) { signals=Wait(1L<PrlCtrl->PL_SigTask=0; FreeSignal(signal); PrlStop(0xff); CloseLibrary((struct Library *)PreludeBase); if(fhandle) Close(fhandle); if(buffer[0]) FreeVec(buffer[0]); if(buffer[1]) FreeVec(buffer[1]); if(FileName) FreeVec(FileName); return(0); } void out_put(char *outtxt) { Write(Output(),outtxt,strlen(outtxt)); } long file_length(file) /* returns 0 if file doesn't exist */ char *file; /* returns -1 if file is a directory */ { /* returns length of file */ long length; BPTR lock; struct FileInfoBlock *fib_ptr; fib_ptr = AllocVec(sizeof(struct FileInfoBlock),MEMF_CLEAR|MEMF_PUBLIC); if(!fib_ptr) return 0L; lock = Lock((char *)file,SHARED_LOCK); if(!lock) { FreeVec(fib_ptr); return(0L); }; if(!Examine((BPTR)lock,fib_ptr)) { FreeVec(fib_ptr); return(0L); }; length=fib_ptr->fib_Size; UnLock((BPTR)lock); FreeVec(fib_ptr); if(!length) length--; return(length); } void itoa(n,s) register int n; register char s[]; { ltoa((long)(n),s); } void ltoa(n,s) register long n; register char s[]; { register int i = 0, vorz = 0; if(n<0) { vorz=TRUE; n=-1; }; do { s[i++] = n % 10 + '0'; } while((n/=10)>0); if(vorz) s[i++]='-'; s[i]=0; reverse(s); } void reverse(s) register char *s; { register int c,i,j; for(i=0,j=strlen(s)-1;i