#include #include #include #include #include #include #include #include #include #include #include "rawkey.h" #include "menus.h" extern struct DosLibrary *DOSBase; char IDstring[50] = {"Samplescanner by Steven Lagerweij 160390"}; /*ddmmyy*/ struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; struct Window *win,*sswin,*savewin; struct IntuiMessage *message; struct MsgPort *diskport; struct IOExtTD *diskreq; extern struct MsgPort *CreatePort(); extern struct IORequest *CreateExtIO(); struct MsgPort *AudioPort; struct IOAudio Audio; char *LeftMouse = (char *) 0xBFE001; char Attached[128]; UBYTE Channels[] = { 0x0F }; int AudioDev = NULL; long to = 0,from = 88; char file[64]; char dir[64] = {"RAM:"}; struct Gadget *GadgetPtr; struct MenuItem *Item; ULONG MessageClass; USHORT code,MenuItem, GadgetID, block = 0; long volume = 64, period = 428, drive = 1,val,cnt; BYTE *diskbuffer, num; struct Message *GetMsg(); VOID _main() { if((FindUnit("DF1:"))) ThItem2.Flags |= ITEMENABLED; if((FindUnit("DF2:"))) ThItem3.Flags |= ITEMENABLED; if((FindUnit("DF3:"))) ThItem4.Flags |= ITEMENABLED; ThItem1.Flags |= CHECKED; drive = 0; OpenAll(); SetMenuStrip(win,&FirstMenu); SetPropTo(block); BufSize(block/88); Grafiek(0); for(;;) { if ((message = (struct IntuiMessage *) GetMsg(win->UserPort)) == NULL) { Wait(1<UserPort->mp_SigBit); continue; } MessageClass = message->Class; code = message->Code; ReplyMsg(message); if(MessageClass != RAWKEY) SetWindowTitles(win,"Sample scanner",NULL); switch (MessageClass) { case CLOSEWINDOW : CloseAll(); break; case MENUPICK : while(code != MENUNULL) { MenuItem = ITEMNUM(code); Item = (struct MenuItem *) ItemAddress(&FirstMenu, code); if(WhichMenu(code)) CloseAll(); code = Item->NextSelect; } break; case GADGETUP : BufSize(ProperInfo.HorizPot/PROPSHIFT); val = ReadBlock(88); if(val != 0) { if(val > 0) SetWindowTitles(win,"Error reading disk",NULL); else { switch(val) { case NODISK : SetWindowTitles(win,"No disk in drive",NULL); break; case OPENFAIL: SetWindowTitles(win,"Couldn't open trackdisk",NULL); break; default : SetWindowTitles(win,"Unspecified error",NULL); break; } } break; } PlayBlock(88); break; } } } BufSize(num) USHORT num; { char tmp[50]; block = num*88; if(block > 1672) block = 1672; SetAPen(win->RPort,1); sprintf(&tmp[0],"Block: %-4d",block); Move(win->RPort,125,18); Text(win->RPort,&tmp[0],strlen(&tmp[0])); return(0); } SetPropTo(num) USHORT num; { ModifyProp(&ProperGadget, win,NULL, ProperInfo.Flags, ((num/88) * PROPSHIFT), 0, ProperInfo.HorizBody,0 ); return(0); } OpenAll() { IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0); GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",0); if(!(win = (struct Window *)OpenWindow(&Newwin))) { DisplayBeep(0); CloseAll(); } if(!(diskbuffer = (BYTE *)AllocMem(88*512,MEMF_CLEAR | MEMF_CHIP))) { DisplayBeep(0); Delay(25); DisplayBeep(0); CloseAll(); } return(0); } CloseAll() { if(diskbuffer) FreeMem(diskbuffer,88*512); if(win) { ClearMenuStrip(win); CloseWindow(win); } if(GfxBase) CloseLibrary(GfxBase); if(IntuitionBase) CloseLibrary(IntuitionBase); exit(0); return(0); } struct IORequest *CreateExtIO(ioReplyPort,size) /* create extended I/O */ struct MsgPort *ioReplyPort; LONG size; { struct IORequest *ioReq; if(ioReplyPort == 0) return((struct IORequest *) 0); ioReq = (struct IORequest *)AllocMem (size,MEMF_CLEAR | MEMF_PUBLIC); if(ioReq==0) return((struct IORequest *) 0); ioReq->io_Message.mn_Node.ln_Type = NT_MESSAGE; ioReq->io_Message.mn_Node.ln_Pri = 0; ioReq->io_Message.mn_ReplyPort = ioReplyPort; return(ioReq); } DeleteExtIO(ioExt,size) /* Remove Extendend I/O */ struct IORequest *ioExt; LONG size; { ioExt->io_Message.mn_Node.ln_Type = 0xff; ioExt->io_Device = (struct Device *) -1; ioExt->io_Unit = (struct Unit *) -1; FreeMem(ioExt,size); return(0); } ReadBlock(len) short len; { short readerr,ret = -1,dev = TRUE; if((block < 0) || (block > 1759)) return(OUTOFRANGE); if(!(diskport = CreatePort(0,0))) return(ret); if(!(diskreq = (struct IOExtTD *) CreateExtIO(diskport,sizeof(struct IOExtTD)))) goto quit; if((dev = OpenDevice(TD_NAME,drive,diskreq,0))) goto quit; diskreq->iotd_Req.io_Command = TD_CHANGESTATE; DoIO(diskreq); if(diskreq->iotd_Req.io_Actual != 0) { ret = NODISK; goto quit; } diskreq->iotd_Req.io_Length = 1; diskreq->iotd_Req.io_Command = TD_MOTOR; DoIO(diskreq); diskreq->iotd_Req.io_Length = len*512; diskreq->iotd_Req.io_Data = (APTR)diskbuffer; diskreq->iotd_Req.io_Command = CMD_READ; diskreq->iotd_Req.io_Offset = block*512; DoIO(diskreq); readerr=diskreq->iotd_Req.io_Error; diskreq->iotd_Req.io_Length = 0; diskreq->iotd_Req.io_Command = TD_MOTOR; DoIO(diskreq); if(readerr != 0) ret = readerr; else ret = 0; quit: if(!dev) CloseDevice(diskreq); if(diskreq) DeleteExtIO(diskreq,sizeof(struct IOExtTD)); if(diskport) DeletePort(diskport); return(ret); } PlayBlock(len) short len; { AudioDev = NULL; AudioPort = 0; if(!(AudioPort = CreatePort("Audioport scanner"))) goto quit; Audio.ioa_Request.io_Message.mn_Node.ln_Pri = 128; Audio.ioa_Request.io_Message.mn_ReplyPort = AudioPort; Audio.ioa_Request.io_Command = ADCMD_ALLOCATE; Audio.ioa_Data = Channels; Audio.ioa_Length = (long)sizeof(Channels); AudioDev = OpenDevice(AUDIONAME,0,&Audio,0); if(AudioDev != NULL) goto quit; ag: Audio.ioa_Request.io_Command = CMD_WRITE; Audio.ioa_Request.io_Flags = ADIOF_PERVOL | ADIOF_SYNCCYCLE; Audio.ioa_Request.io_Unit = (struct Unit *)1; Audio.ioa_Data = (UBYTE *)diskbuffer; Audio.ioa_Length = len*512; Audio.ioa_Period = period; Audio.ioa_Volume = volume; Audio.ioa_Cycles = 1; BeginIO(&Audio); if(CheckIO(&Audio)) { WaitIO(&Audio); goto ag; } Grafiek(1); WaitIO(&Audio); quit: if(!AudioDev) CloseDevice(&Audio); if(AudioPort) DeletePort(AudioPort); return(0); } Grafiek(from) int from; { long ybase = 100,x = 44,cnt,bufpos = 0; LONG sum,sumlen; SetAPen(win->RPort,0); RectFill(win->RPort,4,(ybase-65),560,(ybase+85)); ShowNums(ybase); sumlen = (512*88)/512; /* Haha! */ SetAPen(win->RPort,3); Move(win->RPort,x,ybase); for(x=44;x<556;x++) { sum = 0; for(cnt=0;cntActiveWindow == win)) { if(from) AbortIO(&Audio); goto quit; } sum += diskbuffer[bufpos]; bufpos++; } sum = (sum / sumlen)/2; /* (average)/2 (/2 = only 128 pixels available)*/ Draw(win->RPort,x,ybase+sum); } quit: return(0); } ShowNums(ybase) long ybase; { long cnt,tblk = block; char tmp[6]; SetAPen(win->RPort,1); Move(win->RPort,2,ybase+3); Text(win->RPort," 0",4); Move(win->RPort,2,ybase-61); Text(win->RPort,"-128",4); Move(win->RPort,2,ybase+67); Text(win->RPort,"+128",4); SetAPen(win->RPort,2); Move(win->RPort,36,ybase-64); Draw(win->RPort,36,ybase+64); Move(win->RPort,44,ybase+70); Draw(win->RPort,555,ybase+70); SetAPen(win->RPort,1); Move(win->RPort,36,ybase); Draw(win->RPort,40,ybase); Move(win->RPort,36,ybase-64); Draw(win->RPort,40,ybase-64); Move(win->RPort,36,ybase+64); Draw(win->RPort,40,ybase+64); for(cnt=44;cnt<557;cnt+=64) { Move(win->RPort,cnt,ybase+67); Draw(win->RPort,cnt,ybase+73); Move(win->RPort,cnt-3,ybase+83); sprintf(&tmp[0],"%-4d",tblk); Text(win->RPort,&tmp[0],4); tblk += 11; } return(0); } WhichMenu(wcode) USHORT wcode; { USHORT whichMenu, whichItem, whichSubItem; whichMenu = MENUNUM(wcode); whichItem = ITEMNUM(wcode); whichSubItem = SUBNUM(wcode); switch(whichMenu) { case 0 : /* Options */ switch(whichItem) { case 1 : return(TRUE); case 0 : BlocksToFile(); break; } break; case 1 : /* Play */ switch(whichItem) { case 3 : FilterToggle(); break; case 2 : SampleSets(); break; case 1 : for(block=block;block<1759;block+=88) { BufSize(block/88); SetPropTo(block); if(((*LeftMouse & 0x40) != 0x40) && (IntuitionBase->ActiveWindow == win)) goto quit; val = ReadBlock(88); if(val != 0) { if(val > 0) SetWindowTitles(win,"Error reading disk",NULL); else { switch(val) { case NODISK : SetWindowTitles(win,"No disk in drive",NULL); break; case OPENFAIL: SetWindowTitles(win,"Couldn't open trackdisk",NULL); break; default : SetWindowTitles(win,"Unspecified error",NULL); break; } } break; } PlayBlock(88); } block = 0; BufSize(0); SetPropTo(block); break; case 0 : PlayBlock(88); break; } break; case 2 : /* Options */ switch(whichItem) { case 3 : ThItem4.Flags |= CHECKED; drive = 3; break; case 2 : ThItem3.Flags |= CHECKED; drive = 2; break; case 1 : ThItem2.Flags |= CHECKED; drive = 1; break; case 0 : ThItem1.Flags |= CHECKED; drive = 0; break; } break; } quit: return(0); } SampleSets() { char tmp[10]; sswin = NULL; if(!(sswin = (struct Window *)OpenWindow(&newsswin))) { SetWindowTitles(win,"Not enough memory for window",NULL); return(FALSE); } ModifyProp(&VolumeGadget, sswin,NULL, VolumeInfo.Flags, (MAXBODY/64) * volume, 0, VolumeInfo.HorizBody,0 ); ModifyProp(&PeriodGadget, sswin,NULL, PeriodInfo.Flags, ((MAXBODY/64) * ((period-128)/10)), 0, PeriodInfo.HorizBody,0 ); for(;;) { SetAPen(sswin->RPort,1); sprintf(&tmp[0],"%-2ld",volume); Move(sswin->RPort,22,26); Text(sswin->RPort,"Volume",6); Move(sswin->RPort,145,26); Text(sswin->RPort,&tmp[0],2); sprintf(&tmp[0],"%-4ld",period); Move(sswin->RPort,22,38); Text(sswin->RPort,"Period",6); Move(sswin->RPort,145,38); Text(sswin->RPort,&tmp[0],4); if(!(message = (struct IntuiMessage *)GetMsg(sswin->UserPort))) { Wait(1<UserPort->mp_SigBit); continue; } MessageClass = message->Class; code = message->Code; GadgetPtr = (struct Gadget *) message->IAddress; GadgetID = GadgetPtr->GadgetID; ReplyMsg(message); switch (MessageClass) { case CLOSEWINDOW : goto quit; case GADGETUP : switch(GadgetID) { case 1 :volume = (VolumeInfo.HorizPot/(MAXBODY/64)); break; case 2 :period = 128+((PeriodInfo.HorizPot/(MAXBODY/64))*10); break; } } } quit: if(sswin) CloseWindow(sswin); return(TRUE); } BlocksToFile() { char tmp[28]; long ret; savewin = NULL; if(!(savewin = (struct Window *)OpenWindow(&newsavewin))) { SetWindowTitles(win,"Not enough memory for window",NULL); return(FALSE); } ActivateGadget(&FromGadget,savewin,NULL); for(;;) { SetAPen(savewin->RPort,3); sprintf(&tmp[0],"From drive : DF%ld",drive); Move(savewin->RPort,10,18); Text(savewin->RPort,&tmp[0],16); Move(savewin->RPort,10,28); Text(savewin->RPort,"From block :",12); Move(savewin->RPort,10,38); Text(savewin->RPort,"To block :",12); Move(savewin->RPort,10,48); Text(savewin->RPort,"To file :",12); if(!(message = (struct IntuiMessage *)GetMsg(savewin->UserPort))) { Wait(1<UserPort->mp_SigBit); continue; } MessageClass = message->Class; code = message->Code; GadgetPtr = (struct Gadget *) message->IAddress; GadgetID = GadgetPtr->GadgetID; ReplyMsg(message); switch (MessageClass) { case CLOSEWINDOW : goto quit; case GADGETUP : switch(GadgetID) { /*filename String*/ case 1 : ActivateGadget(&FromGadget,savewin,NULL); break; /*to gadget */ case 2 : to = atoi(ToBuf); if((to < 0) || (to > 1759)) { to = 1; ToBuf[0] = '1'; ToBuf[1] = '\0'; RefreshGadgets(&ToGadget,savewin,NULL); } ActivateGadget(&StringGadget,savewin,NULL); break; /* from gadget */ case 3 : from = atoi(Frombuf); if((from < 0) || (from > 1759)) { from = 0; Frombuf[0] = '0'; Frombuf[1] = '\0'; RefreshGadgets(&FromGadget,savewin,NULL); } ActivateGadget(&ToGadget,savewin,NULL); break; case 4 : if(to <= from) { SetWindowTitles(savewin,"To must be > from",NULL); break; } if(SaveToFile()) goto quit; break; case 5 : ret = arpreq("GET FILENAME", file, dir,NULL); if((ret != 0) && (file[0] != '\0')) { Koppel(&dir[0],&file[0]); sprintf(&StringBuffer[0],"%s",&Attached[0]); RefreshGadgets(&StringGadget,savewin,NULL); } ActivateGadget(&FromGadget,savewin,NULL); break; } break; } } quit: if(savewin) CloseWindow(savewin); return(TRUE); } SaveToFile() { long remblk = block,numblk,loop = TRUE,realnum; char temp[100],*Fileptr = NULL; if(!(Fileptr = (char *)Open(&StringBuffer[0],1006))) { SetWindowTitles(savewin,"Couldn't open file",NULL); return(FALSE); } numblk = to-from; block = from; while(loop) { if(numblk >= 88) realnum = 88; else realnum = numblk; sprintf(&temp[0],"Reading... %-4ld blks ",realnum); Move(savewin->RPort,10,60); Text(savewin->RPort,&temp[0],strlen(&temp[0])); val = ReadBlock(realnum); if(val != 0) { if(val > 0) SetWindowTitles(win,"Error reading disk",NULL); else { switch(val) { case NODISK : SetWindowTitles(win,"No disk in drive",NULL); break; case OPENFAIL: SetWindowTitles(win,"Couldn't open trackdisk",NULL); break; default : SetWindowTitles(win,"Unspecified error",NULL); break; } } goto quit; } sprintf(&temp[0],"Writing... %-4ld blks left",numblk); Move(savewin->RPort,10,60); Text(savewin->RPort,&temp[0],strlen(&temp[0])); if(Write(Fileptr,diskbuffer,realnum*512) != realnum*512) { SetWindowTitles(win,"Error while writing !",NULL); Delay(25); loop = FALSE; } numblk -= realnum; block += realnum; if(numblk < 1) loop = FALSE; } quit: if(Fileptr) Close(Fileptr); block = remblk; return(TRUE); } FindUnit(devname) char *devname; { struct DeviceList *zoekdev; char isithim[50]; zoekdev = (struct DeviceList *) BADDR(((struct DosInfo *) BADDR(((struct RootNode *) (DOSBase->dl_Root))->rn_Info))->di_DevInfo); while(zoekdev != 0) { sprintf(&isithim[0],"%s:",BADDR(zoekdev->dl_Name)+1); if((zoekdev->dl_Type == DLT_DEVICE) && (stcpma(devname,&isithim[0]))) return(TRUE); zoekdev = (struct DeviceList *)BADDR(zoekdev->dl_Next); } return(FALSE); } Koppel(dirname,filename) /* Fix arpreq result */ char dirname[64],filename[64]; { if(dirname[0] == '\0') { sprintf(&Attached[0],"%s",&filename[0]); return(0); }; if((dirname[strlen(&dirname[0])-1] != ':') && (dirname[strlen(&dirname[0])-1] != '/')) sprintf(&Attached[0],"%s/%s",&dirname[0],&filename[0]); else /* ^ !!!! */ sprintf(&Attached[0],"%s%s",&dirname[0],&filename[0]); return(0); }