//_______________________________________________________________________ static Boolean GetByte (SCCPtr scc, Byte *c) { if (MidiStreamGetByte(&scc->xmt, c)) return true; else { MidiEvPtr e = Pop(&scc->seq); if (e) { e = MidiStreamPutEvent (&scc->xmt, e); if (e) MidiTask (KeyOffTask, Date(e), 0, (long)scc, (long)e, 0); return MidiStreamGetByte(&scc->xmt, c); } } return false; }
//_______________________________________________________________________ static void KeyOffTask (long date, short refNum, long a1,long a2,long a3) { MidiEvPtr e = (MidiEvPtr)a1; DrvMemPtr mem = (DrvMemPtr)a2; Ev2StreamPtr f = &mem->outFifo; Byte c; MidiStreamPutEvent (f, e); while (MidiStreamGetByte (f, &c)) { write (mem->devId, &c, 1); } }
//_______________________________________________________________________ static void RcvAlarm (short refNum) { DrvMemPtr mem = GetData (); Ev2StreamPtr f = &mem->outFifo; MidiEvPtr off, e = MidiGetEv (refNum); Byte c; while (e) { off = MidiStreamPutEvent (f, e); while (MidiStreamGetByte (f, &c)) { write (mem->devId, &c, 1); } if (off) MidiTask (KeyOffTask, Date(off), refNum, (long)off, (long)mem, 0); e = MidiGetEv (refNum); } }
//_________________________________________________________ static void SendSmallEv(SlotPtr slot, MidiEvPtr e, sendState* state) { MIDIPacketList* pktlist = (MIDIPacketList*)state->packetBuffer; MIDIPacket* packet = MIDIPacketListInit(pktlist); unsigned char * ptr = state->evBuffer; OSErr err; int n = 0; e = MidiStreamPutEvent (&state->outsmall, e); if (e) MidiTask (KOffTask, Date(e), gRefNum, (long)e, (long)slot, 0); // typeNote while (MidiStreamGetByte (&state->outsmall, ptr++)) {n++;} MIDIPacketListAdd(pktlist,sizeof(state->packetBuffer),packet,MIDIGetCurrentHostTime(),n,state->evBuffer); err = MIDISend(slot->port,slot->dest,pktlist); if (err != noErr) fprintf(stderr, "MIDISend : error %ld\n", err); }
//_________________________________________________________ static void SendSysExAux(SlotPtr slot) { int i,bytestosend; unsigned char* ptr; OSErr err; // Prepare bytes bytestosend = min(MAX_SYSEX_BYTES,slot->remaining); slot->remaining-= bytestosend; ptr = slot->data; for (i = 0 ; i < bytestosend ; i++) MidiStreamGetByte (&slot->outsysex, ptr++); // Init completion structure slot->request.destination = slot->dest; slot->request.data = slot->data; slot->request.bytesToSend = bytestosend; slot->request.complete = FALSE; slot->request.completionProc = CompletionProc; slot->request.completionRefCon = slot; err = MIDISendSysex(&slot->request); if (err != noErr) fprintf(stderr, "MIDISendSysex : error %ld\n", err); }