/* * event input callback - just redirect events to subscribers */ static int _alsa_input(struct snd_seq_event *ev, int direct, void *private_data, int atomic, int hop) { struct privateData *data = (struct privateData *)private_data; pr_debug("callback from alsa received of type %d\n", ev->type); spin_lock(&(data->drv->lock)); if (ev->type == SND_SEQ_EVENT_NOTEON) { data->msg.data.bytes[0] = 0x90; } else if (ev->type == SND_SEQ_EVENT_NOTEOFF) { data->msg.data.bytes[0] = 0x80; } else { return 1; } //might be changed to ev->data.raw?? for event independant passing data->msg.data.bytes[0] |= ev->data.note.channel & 0xf; data->msg.data.bytes[1] = ev->data.note.note; data->msg.data.bytes[2] = ev->data.note.velocity; data->msg.data.bytes[3] = 0; data->msg.data.size = 3; data->msg.data.data = NULL; data->msg.format = MIDIMessageFormatDetect(&(data->msg.data.bytes[0])); pr_debug("found format\n"); data->msg.timestamp = 0; RTPMIDISessionSend(data->drv->rtpmidi_session, &(data->list)); spin_unlock(&(data->drv->lock)); return 0; }
static int _applemidi_send_rtpmidi( struct MIDIDriverAppleMIDI * driver ) { struct MIDIMessageList messages[APPLEMIDI_MAX_MESSAGES_PER_PACKET]; int i, result; size_t length; MIDIMessageQueueGetLength( driver->out_queue, &length ); if( length > 0 ) { for( i=0; i<length && i<APPLEMIDI_MAX_MESSAGES_PER_PACKET; i++ ) { MIDIMessageQueuePop( driver->out_queue, &(messages[i].message) ); messages[i].next = &(messages[i+1]); } messages[i-1].next = NULL; result = RTPMIDISessionSend( driver->rtpmidi_session, &(messages[0]) ); for( i=0; i<length && i<APPLEMIDI_MAX_MESSAGES_PER_PACKET; i++ ) { if( messages[i].message != NULL ) MIDIMessageRelease( messages[i].message ); } return result; } else { return 0; } }