Example #1
0
static int _applemidi_idle_timeout( void * drv, struct timespec * ts ) {
  struct MIDIDriverAppleMIDI * driver = drv;
  struct sockaddr * addr;
  socklen_t size;

  _applemidi_update_runloop_source( driver );

  RTPSessionNextPeer( driver->rtp_session, &(driver->peer) );
  if( driver->peer != NULL ) {
    /* check if receiver feedback needs to be sent */
    if( driver->sync == 0 ) {
      /* no sync packets active. start new sync */
      RTPPeerGetAddress( driver->peer, &size, &addr );
      return _applemidi_start_sync( driver, driver->rtp_socket, size, addr );
    }
  }

  /* check for messages in dispatch (incoming) queue:
   *   if message needs to be dispatched (timestamp >= now+latency)
   *   call MIDIDriverAppleMIDIReceiveMessage
   * send receiver feedback
   * if the last synchronization happened a certain time ago, synchronize again */

  return 0;
}
Example #2
0
static int _applemidi_init_addr_with_peer( struct AppleMIDICommand * command, struct RTPPeer * peer ) {
  struct sockaddr * addr;
  socklen_t size;

  RTPPeerGetAddress( peer, &size, &addr );
  memcpy( &(command->addr), addr, size );
  command->size = size;
  return 0;
}
Example #3
0
static int _applemidi_disconnect_peer( struct MIDIDriverAppleMIDI * driver, struct RTPPeer * peer ) {
  int result = 0;
  struct sockaddr * rtp_addr = NULL;
  struct sockaddr_storage addr;
  socklen_t size;
  if( RTPPeerGetAddress( peer, &size, &rtp_addr ) || rtp_addr == NULL ) {
    return 1;
  }
  _applemidi_control_addr( size, rtp_addr, (struct sockaddr *) &addr );
  result = _applemidi_endsession( driver, driver->control_socket, size, (struct sockaddr *) &addr );
  RTPSessionRemovePeer( driver->rtp_session, peer );
  return result;
}
Example #4
0
static int _applemidi_disconnect_peer(struct MIDIDriverAppleMIDI *driver,
				      struct RTPPeer *peer)
{
	int result = 0;
	struct sockaddr_in *rtp_addr = NULL;
	int size;
	if (RTPPeerGetAddress(peer, &size, &rtp_addr) || rtp_addr == NULL) {
		return 1;
	}
	result = _applemidi_endsession(driver, driver->control_socket->sk, size,
				       (struct sockaddr_in *)&rtp_addr);
	RTPSessionRemovePeer(driver->rtp_session, peer);
	return result;
}
Example #5
0
void _applemidi_idle_timeout(unsigned long data)
{
	struct sockaddr_in *addr;
	int size;

	struct MIDIDriverAppleMIDI *driver = (struct MIDIDriverAppleMIDI *)data;
	mod_timer(&driver->timer, jiffies + msecs_to_jiffies(1500));

	pr_debug("====called timeout (%ld) dat: %lx ====\n", jiffies, data);

	if (spin_trylock(&(driver->lock))) {
		RTPSessionNextPeer(driver->rtp_session, &(driver->peer));
		if (driver->peer != NULL) {
			/* check if receiver feedback needs to be sent */
			if (driver->sync == 0) {
				/* no sync packets active. start new sync */
				RTPPeerGetAddress(driver->peer, &size, &addr);

				pr_debug("start sync with client: %pI4\n",
					 &addr->sin_addr.s_addr);
				_applemidi_start_sync(
				    driver, driver->rtp_socket->sk, size, addr);
				// no return
			}
		}
		spin_unlock(&(driver->lock));
	} else {
		pr_warn("could not so sync timeout because of midi event\n");
	}
	//
	// /* check for messages in dispatch (incoming) queue:
	//  *   if message needs to be dispatched (timestamp >= now+latency)
	//  *   call MIDIDriverAppleMIDIReceiveMessage
	//  * send receiver feedback
	//  * if the last synchronization happened a certain time ago,
	// synchronize again */
	//
	// return 0;
}