home *** CD-ROM | disk | FTP | other *** search
- /*
- ** $PROJECT: midi.datatype
- **
- ** $VER: dispatch.c 40.0 (11.09.97)
- **
- ** This file holds the datatypes class dispatcher and handles the
- ** BOOPSI gadget (control panel).
- **
- ** Copyright 1997 by Martin Gierich.
- ** All Rights Reserved !
- **
- ** Based on binary.datatype created by Stefan Ruppert.
- **
- ** $HISTORY:
- ** 11.09.97 : 40.00 : Initial BETA release
- **
- ** $TABSIZE: 3
- */
-
-
- /* ------------------------------- autodoc -------------------------------- */
-
- /*FS*/ /*"AutoDoc"*/
- /****** midi.datatype/midi.datatype **************************************
- *
- * NAME
- * midi.datatype -- data type for midi stream files with timestamps
- *
- * FUNCTION
- * The midi data type, a base-class of all midi data, is used to
- * load, save and play standard midi files and similar music files
- * (using datatypes subclasses). A control panel can be applied to a
- * window.
- * The control panel currently is very simple and triggers one of
- * STM_PLAY and STM_PAUSE, depending on the playing state.
- * The midi player makes use of camd.library and realtime.library.
- *
- * PREFS
- * The data type tries to load the prefs file from
- * "ENV:DataTypes/midi.prefs" and parses it using ReadArgs() on each
- * OM_NEW method to set up the attributes. The template is:
- *
- * CLUSTER/K,VOLUME/N/K
- *
- * CLUSTER - sets MDTA_Cluster to the given name, default is "out.0".
- * VOLUME - sets SDTA_Volume to the given value, default is 64.
- *
- * The options can be on several lines. The prefs file must end with
- * a line feed, so you cannot use SETENV.
- *
- * METHODS
- * OM_NEW -- Create a new object from a SMF file
- *
- * OM_DISPOSE -- dispose the object (triggers STM_STOP)
- *
- * OM_GET -- get a attribute of the object
- *
- * OM_SET -- set attributes of the object
- *
- * OM_UPDATE -- update some attributes of the object
- *
- * GM_HITTEST -- check if gadget has been hit
- *
- * GM_GOACTIVE -- gadget pressed
- *
- * GM_GOINACTIVE -- gadget released
- *
- * GM_HANDLEINPUT -- handle intuition input events
- *
- * GM_LAYOUT -- layout the control panel (calculate sizes)
- *
- * GM_RENDER -- attach the control panel to a window
- *
- * DTM_REMOVEDTOBJECT -- remove control panel from window
- *
- * DTM_WRITE
- * DTWM_RAW writes a SMF file
- * DTWM_IFF is unsupported, since there is no IFF-MIDI format yet
- *
- * DTM_TRIGGER
- * STM_PLAY starts playing (a separate process will be launched)
- * or continues playing after pause
- * STM_PAUSE pauses playing (might start playing first)
- * STM_STOP stops playing and removes the player process
- *
- * TAGS
- * MDTA_Cluster -- (UBYTE *) name of the CAMD cluster to play midi
- * data to. Default: "out.0". Applicability is (ISG).
- *
- * Tags defined in datatypes/soundclass.h:
- * SDTA_Cycles
- * SDTA_Volume -- volume does not get used yet
- * SDTA_SignalTask
- * SDTA_SignalBit
- *
- * Tags defined in datatypes/datatypesclass.h
- * DTA_Methods
- * DTA_TriggerMethods
- * DTA_NominalVert
- * DTA_NominalHoriz
- * DTA_Title
- * DTA_ObjName
- * DTA_Name
- * DTA_Immediate
- * DTA_Repeat
- *
- * Tags that will change in future, do not use !
- * MDTA_Buffer -- (UBYTE *) pointer to buffer with SMF file contents
- * MDTA_BufferLen -- (ULONG) size of this buffer
- *
- * LIMITATIONS
- * It is not very useful for loading/saving yet.
- * No reset gets send before starting playing.
- * No use is made of volume setting.
- *
- * BUGS
- * None known.
- *
- * SEE ALSO
- * datatypesclass (have a look at datatypes.library V45),
- * sound_dtc
- *
- ******************************************************************************
- */
- /*FE*/
-
-
- /* ------------------------------- includes ------------------------------- */
-
- #include <string.h>
-
- #include <exec/types.h>
- #include <exec/ports.h>
- #include <exec/memory.h>
- #include <exec/lists.h>
- #include <exec/semaphores.h>
- #include <exec/execbase.h>
- #include <dos/dos.h>
- #include <dos/dostags.h>
- #include <dos/dosextens.h>
- #include <intuition/intuition.h>
- #include <intuition/classes.h>
- #include <intuition/classusr.h>
- #include <intuition/cghooks.h>
- #include <intuition/gadgetclass.h>
- #include <intuition/imageclass.h>
- #include <graphics/gfxbase.h>
- #include <graphics/gfx.h>
- #include <utility/tagitem.h>
- #include <libraries/gadtools.h>
- #include <datatypes/datatypes.h>
- #include <datatypes/datatypesclass.h>
- #include <datatypes/soundclass.h>
-
- #include <clib/alib_protos.h>
- #include <clib/alib_stdio_protos.h>
- #include <proto/dos.h>
- #include <proto/exec.h>
- #include <proto/intuition.h>
- #include <proto/iffparse.h>
- #include <proto/graphics.h>
- #include <proto/utility.h>
- #include <proto/datatypes.h>
- #include <proto/dtclass.h>
-
- #include "debug.h"
- #include "register.h"
- #include "midiclass.h"
-
-
- /* ------------------------------ prototypes ------------------------------ */
-
- ClassCall ULONG dispatch ( REGA0 Class *cl , REGA2 Object *obj , REGA1 Msg msg );
- ULONG RenderPlayButton(Object *obj, struct GadgetInfo *gi, struct MidiDTData *mdt);
- void drawFrame(struct RastPort *rp, UWORD pen1, UWORD pen2, UWORD pen3, WORD x, WORD y, WORD w, WORD h);
- BOOL readPrefs(struct MidiDTData *bd, STRPTR file);
- ULONG getattr(Class *cl, Object *obj, struct opGet *msg);
- ULONG setattrs(Class *cl, Object *obj, struct opSet *msg);
- ULONG notifyAttrChanges(Object *obj, void *ginfo, ULONG flags, ULONG tag1,...);
- ULONG setSuperAttrs(Class *cl,Object *obj, void *ginfo, ULONG tag1,...);
- ULONG TriggerPlayMidi(struct MidiDTData *mdt, ULONG Function, APTR Data);
- ClassCall void PlayMidi(void);
-
-
- /* ------------------------------- defines -------------------------------- */
-
- #define GOBJ(o) ((struct Gadget *) (o))
- #define GPRMSG(msg) ((struct gpRender *) (msg))
- #define GPIMSG(msg) ((struct gpInput *) (msg))
- #define SETMSG(msg) ((struct opSet *) (msg))
- #define WRMSG(msg) ((struct dtWrite *) (msg))
- #define TRMSG(msg) ((struct dtTrigger *) (msg))
-
- #define ISBITSET(x,y) ((x)&(y))
- #define ISBITCLEARED(x,y) (!((x)&(y)))
- #define SETBIT(x,y) ((x)|=(y))
- #define CLEARBIT(x,y) ((x)&=~(y))
-
- #define prefstemplate "CLUSTER/K,VOLUME/N/K"
- enum
- {
- ARG_CLUSTER,
- ARG_VOLUME,
- ARG_MAX
- };
-
-
- /* ---------------------------- constant data ----------------------------- */
-
- const ULONG methods[] = {
- OM_NEW,
- OM_DISPOSE,
- OM_GET,
- OM_SET,
- OM_UPDATE,
- GM_HITTEST,
- GM_GOACTIVE,
- GM_GOINACTIVE,
- GM_HANDLEINPUT,
- GM_LAYOUT,
- GM_RENDER,
- DTM_REMOVEDTOBJECT,
- DTM_WRITE,
- DTM_TRIGGER,
- ~0};
-
- const struct DTMethod triggers[] = {
- {"PLAY","PLAY",STM_PLAY},
- {"PAUSE","PAUSE",STM_PAUSE},
- {"STOP","STOP",STM_STOP},
- {NULL,NULL,0L}
- };
-
- extern char ExLibName[];
-
-
- /* --------------------------- class dispatcher --------------------------- */
-
- /*FS*/ Class *initClass (struct ClassBase * cb)
- {
- Class *cl;
-
- if (cl = MakeClass (&ExLibName[0], "datatypesclass", NULL, sizeof(struct MidiDTData), 0L))
- {
- cl->cl_Dispatcher.h_Entry = (HOOKFUNC) dispatch;
- cl->cl_UserData = (ULONG) cb;
- AddClass (cl);
- }
-
- return (cl);
- }
- /*FE*/
-
-
- /*FS*/ ClassCall ULONG dispatch(REGA0 Class *cl,REGA2 Object *obj,REGA1 Msg msg)
- {
- //struct ClassBase *cb = (struct ClassBase *) cl->cl_UserData;
- struct MidiDTData *mdt = INST_DATA(cl,obj);
- ULONG retval = 0;
-
- //D(bug("ID: 0x%lx TaskPri: %ld ",msg->MethodID,FindTask(NULL)->tc_Node.ln_Pri));
- switch(msg->MethodID)
- {
-
- case OM_NEW:
- {
- Object *newobj;
- ULONG filesize;
-
- if((newobj = (Object *) DoSuperMethodA(cl,obj,msg)))
- {
- mdt = INST_DATA(cl,newobj);
-
- D(bug("Method: OM_NEW cl=%lx obj=%lx msg=%lx mdt=%lx\n",cl,obj,msg,mdt));
- mdt->mdt_Flags=0;
- mdt->mdt_Cycles=1;
- mdt->mdt_Volume=64;
- mdt->mdt_Playing=STM_STOP;
- strcpy(mdt->mdt_Cluster, "out.0");
- readPrefs(mdt, "ENV:DataTypes/midi.prefs");
- setattrs(cl,newobj,(struct opSet *) msg);
-
- /* if no buffer is provided , get the handle from the superclass
- and load the file in the buffer */
- if(!mdt->mdt_Buffer)
- {
- BPTR fh;
- ULONG type;
- LONG num;
-
- if(((num = GetDTAttrs((Object *) newobj,DTA_Handle , &fh,
- DTA_SourceType, &type,
- TAG_DONE)) == 2) && fh)
- {
- switch(type)
- {
- case DTST_FILE:
- if( Seek(fh,0L,OFFSET_END) != -1 )
- {
- if( (filesize=Seek(fh,0L,OFFSET_BEGINNING)) != -1 )
- {
- if((mdt->mdt_Buffer = AllocMem(filesize, MEMF_ANY|MEMF_PUBLIC)))
- {
- SETBIT(mdt->mdt_Flags, MDTF_ALLOCATED);
- mdt->mdt_BufferLen = filesize;
- mdt->mdt_BufferEnd = &mdt->mdt_Buffer[filesize];
- Read(fh,mdt->mdt_Buffer,filesize);
- }
- }
- }
- if(!NameFromFH(fh,mdt->mdt_FileName,sizeof(mdt->mdt_FileName)))
- strcpy(mdt->mdt_FileName,"unknown");
- break;
- case DTST_RAM:
- strcpy(mdt->mdt_FileName,"RAM");
- break;
- default:
- D(bug("not supported SourceType : %ld\n",type));
- }
-
- }
- }
-
- if(mdt->mdt_Buffer)
- {
- retval = (ULONG) newobj;
- setSuperAttrs(cl,newobj,NULL,GA_RelSpecial,TRUE,TAG_DONE);
- if (mdt->mdt_Immediate)
- DoMethod(newobj,DTM_TRIGGER,NULL,STM_PLAY,NULL);
- D(bug("Buffer=0x%lx Size=%ld\n",mdt->mdt_Buffer,mdt->mdt_BufferLen));
- } else /* something was going wrong, thus dispose myself */
- {
- D(bug("midi.datatype IO error : %ld\n",IoErr()));
- CoerceMethod(cl,(Object *) retval,OM_DISPOSE);
- }
- }
- else
- D(bug("Error during OM_NEW !\n"));
- }
- break;
-
- case OM_DISPOSE:
- D(bug("Method: OM_DISPOSE\n"));
- TriggerPlayMidi(mdt, STM_STOP, NULL);
- while(mdt->mdt_PlayProc)
- Delay(10);
- if(mdt->mdt_Buffer && ISBITSET(mdt->mdt_Flags, MDTF_ALLOCATED))
- {
- FreeMem(mdt->mdt_Buffer,mdt->mdt_BufferLen);
- D(bug("Dispose OK\n"));
- }
- retval = DoSuperMethodA(cl,obj,msg);
- break;
-
- case OM_UPDATE:
- D(bug("Method: OM_UPDATE\n"));
- goto OM_SETstart;
- case OM_SET:
- D(bug("Method: OM_SET\n"));
- OM_SETstart:
- if((retval = setattrs(cl,obj,SETMSG(msg))))
- if( ISBITSET(mdt->mdt_Flags, MDTF_NEEDLAYOUT) && SETMSG(msg)->ops_GInfo )
- {
- D(bug("SET/UPDATE calls GM_LAYOUT\n"));
- DoMethod(obj,GM_LAYOUT,SETMSG(msg)->ops_GInfo,TRUE);
- CLEARBIT(mdt->mdt_Flags, MDTF_NEEDLAYOUT);
- }
-
- /* Pass the attributes to the super class and force a refresh if we need it */
- if((retval += DoSuperMethodA (cl, obj, msg)) && (OCLASS (obj) == cl))
- {
- struct RastPort *rp;
-
- /* Get a pointer to the rastport */
- if( SETMSG(msg)->ops_GInfo && (rp = ObtainGIRPort(SETMSG(msg)->ops_GInfo)))
- {
- D(bug("SET/UPDATE calls GM_RENDER\n"));
-
- /* Force a redraw */
- DoMethod(obj,GM_RENDER,SETMSG(msg)->ops_GInfo,rp,GREDRAW_REDRAW);
-
- /* Release the temporary rastport */
- ReleaseGIRPort (rp);
- }
-
- if(msg->MethodID == OM_UPDATE)
- DoMethod(obj,OM_NOTIFY,SETMSG(msg)->ops_AttrList,SETMSG(msg)->ops_GInfo,0);
-
- retval = 0;
- }
- break;
-
- case OM_GET:
- if(!(retval = getattr(cl,obj,(struct opGet *) msg)))
- retval = DoSuperMethodA(cl,obj,msg);
- D(bug("Method: OM_GET %lx ret %lx %lx\n",((struct opGet *)msg)->opg_AttrID,retval,*((struct opGet *)msg)->opg_Storage));
- break;
-
- case GM_HITTEST:
- D(bug("Method: OM_HITTEST\n"));
- retval=GMR_GADGETHIT;
- break;
-
- case GM_GOACTIVE:
- if(GPIMSG(msg)->gpi_IEvent && ISBITCLEARED(GOBJ(obj)->Flags, GFLG_DISABLED) )
- {
- SETBIT(GOBJ(obj)->Flags, GFLG_SELECTED);
- RenderPlayButton(obj, GPIMSG(msg)->gpi_GInfo, mdt);
- retval=GMR_MEACTIVE;
- }
- else
- retval=GMR_NOREUSE;
- D(bug("Method: OM_GOACTIVE ret %lx\n",retval));
- break;
-
- case GM_GOINACTIVE:
- D(bug("Method: OM_GOINACTIVE\n"));
- CLEARBIT(GOBJ(obj)->Flags, GFLG_SELECTED);
- retval=RenderPlayButton(obj, GPIMSG(msg)->gpi_GInfo, mdt);
- break;
-
- case GM_LAYOUT:
- D(bug("Method: OM_LAYOUT\n"));
- /* Let the super-class partake */
- DoSuperMethodA (cl, obj, msg);
- retval=GetDTAttrs(obj, DTA_Domain, &(mdt->mdt_Domain), TAG_DONE);
- if ( ((struct gpLayout *)msg)->gpl_Initial )
- {
- notifyAttrChanges (obj, ((struct gpLayout *) msg)->gpl_GInfo, NULL,
- GA_ID, GOBJ(obj)->GadgetID,
- DTA_NominalVert, 50,
- DTA_NominalHoriz, 50,
- DTA_Title, mdt->mdt_Name,
- DTA_Busy, FALSE,
- DTA_Sync, TRUE,
- TAG_DONE);
- }
- break;
-
- case GM_RENDER:
- D(bug("Method: OM_RENDER\n"));
- RenderPlayButton(obj, GPRMSG(msg)->gpr_GInfo, mdt);
- retval=1;
- break;
-
- case DTM_REMOVEDTOBJECT:
- D(bug("Method: DTM_REMOVEDTOBJECT\n"));
- retval = DoSuperMethodA(cl,obj,msg);
- break;
-
- case GM_HANDLEINPUT:
- {
- struct Gadget *g=GOBJ(obj);
- struct gpInput *gpi=GPIMSG(msg);
- struct InputEvent *ie=gpi->gpi_IEvent;
-
- D(bug("Method: OM_HANDLEINPUT Class %lx Code %lx\n",ie->ie_Class,ie->ie_Code));
- retval=GMR_MEACTIVE;
- if(ie->ie_Class==IECLASS_RAWMOUSE)
- switch (ie->ie_Code)
- {
- case SELECTUP:
- if( (gpi->gpi_Mouse.X < 5) ||
- (gpi->gpi_Mouse.X > mdt->mdt_Domain->Width-5) ||
- (gpi->gpi_Mouse.Y < 5) ||
- (gpi->gpi_Mouse.Y > mdt->mdt_Domain->Height-5))
- {
- D(bug("REUSE\n"));
- retval=GMR_REUSE;
- }
- else
- {
- D(bug("NOREUSE\n"));
- retval=GMR_NOREUSE|GMR_VERIFY;
- TriggerPlayMidi(mdt, mdt->mdt_Playing==STM_PLAY ?
- STM_PAUSE : STM_PLAY, NULL);
- }
- break;
-
- case MENUDOWN:
- D(bug("MENU\n"));
- retval=GMR_REUSE;
- break;
-
- case IECODE_NOBUTTON:
- if( (gpi->gpi_Mouse.X < 5) ||
- (gpi->gpi_Mouse.X > mdt->mdt_Domain->Width-5) ||
- (gpi->gpi_Mouse.Y < 5) ||
- (gpi->gpi_Mouse.Y > mdt->mdt_Domain->Height-5))
- {
- if(ISBITSET(g->Flags, GFLG_SELECTED))
- {
- D(bug("CLEARBIT\n"));
- CLEARBIT(g->Flags, GFLG_SELECTED);
- RenderPlayButton(obj, gpi->gpi_GInfo, mdt);
- }
- }
- else if(ISBITCLEARED(g->Flags, GFLG_SELECTED))
- {
- D(bug("SETBIT\n"));
- SETBIT(g->Flags, GFLG_SELECTED);
- RenderPlayButton(obj, gpi->gpi_GInfo, mdt);
- }
- break;
- }
- }
- break;
-
- case DTM_WRITE:
- D(bug("Method: OM_WRITE\n"));
- switch(WRMSG(msg)->dtw_Mode)
- {
- case DTWM_RAW:
- D(bug("dtWrite Rawmode : filehandle %lx\n",WRMSG(msg)->dtw_FileHandle));
- D(bug("attrs at : %lx\n",WRMSG(msg)->dtw_AttrList));
- D({
- struct TagItem *tstate = WRMSG(msg)->dtw_AttrList;
- struct TagItem *tag;
-
- while((tag = NextTagItem(&tstate)))
- bug("{%08lx,%ld}\n",tag->ti_Tag,tag->ti_Data);
- });
- if (WRMSG(msg)->dtw_FileHandle)
- Write(WRMSG(msg)->dtw_FileHandle,mdt->mdt_Buffer,mdt->mdt_BufferLen);
- retval = 1;
- break;
- default:
- retval = DoSuperMethodA(cl,obj,msg);
- }
- break;
-
- case DTM_TRIGGER:
- D(bug("Method: OM_TRIGGER trigger %ld\n",TRMSG(msg)->dtt_Function));
- retval=TriggerPlayMidi(mdt, TRMSG(msg)->dtt_Function, TRMSG(msg)->dtt_Data);
- break;
-
- default:
- D(bug("Method: ID=0x%lx ret %lx\n", msg->MethodID,retval));
- retval = DoSuperMethodA(cl,obj,msg);
- }
- return(retval);
- }
- /*FE*/
-
-
-
-
-
- /*FS*/ ULONG notifyAttrChanges(Object *obj, void *ginfo, ULONG flags, ULONG tag1,...)
- {
- return(DoMethod(obj, OM_NOTIFY, &tag1, ginfo, flags));
- }
- /*FE*/
-
- /*FS*/ ULONG setSuperAttrs(Class *cl,Object *obj, void *ginfo,ULONG tag1,...)
- {
- return(DoSuperMethod(cl,obj, OM_SET, &tag1, ginfo));
- }
- /*FE*/
-
- /*FS*/ ULONG getattr(Class *cl,Object *obj,struct opGet *msg)
- {
- struct MidiDTData *mdt = INST_DATA(cl,obj);
- ULONG *storage = msg->opg_Storage;
-
- switch(msg->opg_AttrID)
- {
- case DTA_Methods:
- *storage = (ULONG) methods;
- break;
- case DTA_TriggerMethods:
- *storage = (ULONG) triggers;
- break;
- case DTA_NominalVert:
- *storage = 50L;
- break;
- case DTA_NominalHoriz:
- *storage = 50L;
- break;
- case DTA_Title:
- case DTA_ObjName:
- case DTA_Name:
- *storage = (ULONG) mdt->mdt_Name;
- break;
- case SDTA_Cycles:
- *storage = (ULONG) mdt->mdt_Cycles;
- break;
- case SDTA_Volume:
- *storage = (ULONG) mdt->mdt_Volume;
- break;
- case SDTA_SignalTask:
- *storage = (ULONG) mdt->mdt_SignalTask;
- break;
- case SDTA_SignalBit:
- *storage = mdt->mdt_SignalBit;
- break;
- case MDTA_Buffer:
- *storage = (ULONG) mdt->mdt_Buffer;
- break;
- case MDTA_BufferLen:
- *storage = mdt->mdt_BufferLen;
- break;
- case MDTA_Cluster:
- *storage = (ULONG) mdt->mdt_Cluster;
- break;
- default:
- return(0);
- }
- return(1);
- }
- /*FE*/
-
- /*FS*/ ULONG setattrs(Class *cl,Object *obj,struct opSet *msg)
- {
- //struct ClassBase *cb = (struct ClassBase *) cl->cl_UserData;
- struct MidiDTData *mdt = INST_DATA(cl,obj);
-
- struct TagItem *tstate = msg->ops_AttrList;
- struct TagItem *tag;
-
- ULONG retval = 0;
- ULONG tidata;
-
- while((tag = NextTagItem(&tstate)))
- {
- tidata = tag->ti_Data;
-
- D(bug("setattr tag : {0x%08lx, 0x%08lx}\n",tag->ti_Tag,tidata));
- retval++;
- switch(tag->ti_Tag)
- {
- case DTA_Name:
- strncpy(mdt->mdt_Name, (char *)tidata, 31);
- break;
- case DTA_Immediate:
- mdt->mdt_Immediate=tidata;
- break;
- case DTA_Repeat:
- mdt->mdt_Repeat=tidata;
- break;
- case SDTA_Cycles:
- mdt->mdt_Cycles=tidata;
- break;
- case SDTA_Volume:
- if (tidata > 64)
- mdt->mdt_Volume=64;
- else
- mdt->mdt_Volume=tidata;
- break;
- case SDTA_SignalTask:
- mdt->mdt_SignalTask=(struct Task *)tidata;
- break;
- case SDTA_SignalBit:
- mdt->mdt_SignalBit=tidata;
- break;
- case MDTA_Buffer:
- {
- ULONG len = GetTagData(MDTA_BufferLen,0,msg->ops_AttrList);
-
- if(tidata && len)
- {
- if((mdt->mdt_Buffer) && (mdt->mdt_Flags & MDTF_ALLOCATED))
- FreeMem(mdt->mdt_Buffer,mdt->mdt_BufferLen);
-
- mdt->mdt_Buffer = (UBYTE *) tidata;
- mdt->mdt_BufferLen = len;
- mdt->mdt_BufferEnd = &mdt->mdt_Buffer[len];
- CLEARBIT(mdt->mdt_Flags, MDTF_ALLOCATED);
- SETBIT(mdt->mdt_Flags, MDTF_NEEDLAYOUT);
-
- retval++;
- } else
- retval--;
- }
- break;
- case MDTA_Cluster:
- strncpy(mdt->mdt_Cluster, (char *)tidata, 30);
- break;
- default:
- retval--;
- }
- }
- return(retval);
- }
- /*FE*/
-
-
- /*FS*/ BOOL readPrefs(struct MidiDTData *mdt,STRPTR file)
- {
- struct RDArgs *rdargs;
- struct RDArgs *args;
- BPTR fh;
-
- if((fh = Open(file,MODE_OLDFILE)))
- {
- UBYTE buf[256];
- ULONG para[ARG_MAX];
- LONG i;
-
- D(bug("Prefs file %s opened\n",file));
- while(FGets(fh,buf,sizeof(buf)))
- {
- D(bug("Prefs line : %s",buf));
- i=strlen(buf);
- if( i>1 && (buf[i-1]=='\n' && (rdargs=(struct RDArgs *)AllocDosObject(DOS_RDARGS,NULL))) )
- {
- rdargs->RDA_Source.CS_Buffer = buf;
- rdargs->RDA_Source.CS_Length = strlen(buf);
-
- for(i=0 ; i<ARG_MAX ; i++)
- para[i]=0;
-
- if((args = ReadArgs(prefstemplate,(LONG *) para,rdargs)))
- {
- D(bug("Prefs: Cluster %ld, Volume %ld\n",para[ARG_CLUSTER],para[ARG_VOLUME]));
- if(para[ARG_CLUSTER])
- strncpy(mdt->mdt_Cluster, (char*) para[ARG_CLUSTER], 30);
-
- if(para[ARG_VOLUME])
- {
- mdt->mdt_Volume = (UWORD) *((LONG *) para[ARG_VOLUME]);
-
- if(mdt->mdt_Volume > 64)
- mdt->mdt_Volume = 64;
- }
- }
- FreeDosObject(DOS_RDARGS , rdargs);
- }
- }
- Close(fh);
- }
-
- return((BOOL) (fh == NULL));
- }
- /*FE*/
-
-
- /*FS*/ void drawFrame(struct RastPort *rp, UWORD pen1, UWORD pen2, UWORD pen3,
- WORD x, WORD y, WORD w, WORD h)
- {
- SetAPen(rp, pen1);
- Move(rp, x, y+h-1);
- Draw(rp, x, y);
- Draw(rp, x+w-1,y);
-
- SetAPen(rp, pen2);
- Move(rp, x+w, y+1);
- Draw(rp, x+w, y+h);
- Draw(rp, x+1, y+h);
-
- SetAPen(rp, pen3);
- Move(rp, x+5, y+5);
- Draw(rp, x+w-5,y+h/2);
- Draw(rp, x+5, y+h-5);
- Draw(rp, x+5, y+5);
- }
- /*FE*/
-
- /*FS*/ ULONG RenderPlayButton(Object *obj, struct GadgetInfo *gi, struct MidiDTData *mdt)
- {
- struct Gadget *g=GOBJ(obj);
- struct RastPort *rp;
- ULONG retval=FALSE;
- UWORD *pens=gi->gi_DrInfo->dri_Pens;
-
-
- if(rp=ObtainGIRPort(gi))
- {
- BYTE selected=ISBITSET(g->Flags, GFLG_SELECTED);
- WORD x=mdt->mdt_Domain->Left +6,
- y=mdt->mdt_Domain->Top +6,
- w=mdt->mdt_Domain->Width -12,
- h=mdt->mdt_Domain->Height -12;
-
- if ( w>15 && h>15)
- {
- if(ISBITSET(g->Flags, GFLG_RELRIGHT))
- x+=w-1;
- if(selected)
- drawFrame(rp, pens[SHADOWPEN], pens[SHINEPEN], pens[HIGHLIGHTTEXTPEN], x,y,w,h);
- else
- drawFrame(rp, pens[SHINEPEN], pens[SHADOWPEN], pens[HIGHLIGHTTEXTPEN], x,y,w,h);
- }
- ReleaseGIRPort(rp);
- retval=TRUE;
- }
- return retval;
- }
- /*FE*/
-
-
- /*FS*/ ULONG TriggerPlayMidi(struct MidiDTData *mdt, ULONG Function, APTR Data)
- {
- struct MsgPort *mport;
-
- mdt->mdt_Playing=Function;
- D(bug("Playfunction: %ld\n",Function));
- if( !mdt->mdt_PlayProc && Function!=STM_STOP )
- {
- if(mport = CreateMsgPort())
- {
- struct PlayMsg msg={ { {NULL, NULL, NT_MESSAGE, 0, NULL},
- NULL, (UWORD)sizeof(struct PlayMsg) }, NULL };
-
- msg.msg.mn_Node.ln_Type = NT_MESSAGE;
- msg.msg.mn_ReplyPort = mport;
- msg.mdt = mdt;
- if(mdt->mdt_PlayProc=CreateNewProcTags(NP_Entry, &PlayMidi,
- NP_Name, (ULONG)"MidiDT Player",
- NP_Priority, -1L,
- TAG_DONE))
- {
- PutMsg(&mdt->mdt_PlayProc->pr_MsgPort, &msg);
- WaitPort(mport);
- GetMsg(mport);
- D(bug("Player launched, Cluster %s, Volume %ld\n",mdt->mdt_Cluster,(LONG)mdt->mdt_Volume));
- }
- DeleteMsgPort(mport);
- }
- D(else bug("CreateMsgPort failed\n"));
- }
- return(TRUE);
- }
- /*FE*/
-