예제 #1
0
/*
 * 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;
}
예제 #2
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;
  }
}