void remote_connect_teardown( void ) { net_applemidi_inv *by = NULL; net_response_t *response = NULL; net_applemidi_command *cmd = NULL; char *remote_service_name = NULL; net_ctx_t *ctx; remote_service_name = config_string_get("remote.connect"); logging_printf( LOGGING_DEBUG, "remote_connect_teardown: Disconnecting from [%s]\n", remote_service_name); remote_connect_wait_for_thread(); ctx = net_ctx_find_by_name( remote_service_name ); if( ! ctx ) { logging_printf( LOGGING_ERROR, "remote_connect_teardown: Unable to find connection for [%s]\n", remote_service_name); return; }; // Build the BY packet by = net_applemidi_inv_create(); if( ! by ) { logging_printf( LOGGING_ERROR, "remote_connect_teardown: Unable to allocate memory for by packet\n"); return; } by->ssrc = ctx->send_ssrc; by->version = 2; by->initiator = ctx->initiator; cmd = net_applemidi_cmd_create( NET_APPLEMIDI_CMD_END ); if( ! cmd ) { logging_printf( LOGGING_ERROR, "remote_connect_teardown: Unable to create AppleMIDI command\n"); net_applemidi_inv_destroy( &by ); goto remote_teardown_fail; } cmd->data = by; response = net_response_create(); if( response ) { int ret = 0; ret = net_applemidi_pack( cmd , &(response->buffer), &(response->len) ); if( ret != 0 ) { logging_printf( LOGGING_ERROR, "remote_connect_teardown: Unable to pack response to by command\n"); } else { net_ctx_send( ctx, response->buffer, response->len , USE_CONTROL_PORT); hex_dump( response->buffer, response->len ); } } else { logging_printf( LOGGING_ERROR, "remote_connect_teardown: Unable to create response packet\n"); } remote_teardown_fail: net_response_destroy( &response ); net_applemidi_cmd_destroy( &cmd ); }
net_response_t * cmd_inv_handler( char *ip_address, uint16_t port, void *data ) { net_applemidi_command *cmd = NULL; net_applemidi_inv *inv = NULL; net_applemidi_inv *accept_inv = NULL; net_ctx_t *ctx = NULL; net_response_t *response; char *service_name = NULL; if( ! data ) return NULL; inv = ( net_applemidi_inv *) data; logging_printf( LOGGING_DEBUG, "INV(%s:%u\n ", ip_address, port ); logging_printf( LOGGING_DEBUG, "\tname=%s\n", inv->name); logging_printf( LOGGING_DEBUG, "\tssrc=0x%08x\n", inv->ssrc); logging_printf( LOGGING_DEBUG, "\tversion=0x%08x\n", inv->version); logging_printf( LOGGING_DEBUG, "\tinitiator=0x%08x )\n", inv->initiator); ctx = net_ctx_find_by_ssrc( inv->ssrc ); if( ! ctx ) { logging_printf( LOGGING_DEBUG, "cmd_inv_hander: Registering new connection\n"); ctx = net_ctx_register( inv->ssrc, inv->initiator, ip_address, port ); if( ! ctx ) { logging_printf( LOGGING_ERROR, "cmd_inv_handler: Error registering connection\n"); } } cmd = new_net_applemidi_command( NET_APPLEMIDI_CMD_ACCEPT ); if( ! cmd ) { logging_printf( LOGGING_ERROR, "Unable to allocate memory for accept_inv command\n"); net_ctx_reset( ctx ); return NULL; } accept_inv = new_net_applemidi_inv(); if( ! accept_inv ) { logging_printf( LOGGING_ERROR, "Unabled to allocate memory for accept_inv command data\n"); free( cmd ); net_ctx_reset( ctx ); return NULL; } accept_inv->ssrc = ctx->send_ssrc; accept_inv->version = 2; accept_inv->initiator = ctx->initiator; service_name = config_get("service.name"); if( service_name ) { accept_inv->name = (char *)strdup( service_name ); } else { accept_inv->name = (char *)strdup( "RaveloxMIDI" ); } cmd->data = accept_inv; response = new_net_response(); if( response ) { int ret = 0; ret = net_applemidi_pack( cmd , &(response->buffer), &(response->len) ); if( ret != 0 ) { logging_printf( LOGGING_ERROR, "Unable to pack response to inv command\n"); net_response_destroy( &response ); } } net_applemidi_cmd_destroy( &cmd ); return response; }