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; }
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; }
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; }
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; }
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; }