int prSendSysex(VMGlobals *g, int numArgsPushed) { int err, uid, size; if( !isKindOfSlot(g->sp, s_int8array->u.classobj) ) return errWrongType; PyrInt8Array* packet = slotRawInt8Array(g->sp); size = packet->size; PyrSlot *u = g->sp - 1; err = slotIntVal(u, &uid); if (err) return err; MIDIEndpointRef dest; MIDIObjectType mtype; MIDIObjectFindByUniqueID(uid, (MIDIObjectRef*)&dest, &mtype); if (mtype != kMIDIObjectType_Destination) return errFailed; if (!dest) return errFailed; MIDISysexSendRequest *pk = (MIDISysexSendRequest*) malloc (sizeof(MIDISysexSendRequest) + size); Byte *data = (Byte *)pk + sizeof(MIDISysexSendRequest); memcpy(data,packet->b, size); pk->complete = false; pk -> destination = dest; pk -> data = data; pk -> bytesToSend = size; pk->completionProc = freeSysex; pk->completionRefCon = 0; return ((MIDISendSysex(pk) == (OSStatus)0) ? errNone : errFailed); }
//_________________________________________________________ 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); }