void midi_engine_stop(void) { struct midi_provider *n, *p; struct midi_port *q; if (!_connected) return; if (!midi_mutex) return; SDL_mutexP(midi_mutex); for (n = port_providers; n;) { p = n->next; q = NULL; while (midi_port_foreach(p, &q)) { midi_port_unregister(q->num); } if (n->thread) { SDL_KillThread(n->thread); } free(n->name); free(n); n = p; } _connected = 0; SDL_mutexV(midi_mutex); }
static void _ip_poll(struct midi_provider *p) { static int last_buildout = 0; struct midi_port *ptr; char *buffer; long i = 0; long m; SDL_mutexP(blocker); m = (volatile int)real_num_ports; if (m < last_buildout) { ptr = NULL; while (midi_port_foreach(p, &ptr)) { i = INT_SHAPED_PTR(ptr->userdata); if (i >= m) { midi_port_unregister(ptr->num); //port_top[i] (the address where ptr points to) is freed in midi_port_unregister. //So clear it to avoid midi_port_foreach crashing on next round ptr = NULL; } } last_buildout = m; } else if (m > last_buildout) { for (i = last_buildout; i < m; i++) { buffer = NULL; if (asprintf(&buffer, " Multicast/IP MIDI %lu", i+1) == -1) { perror("asprintf"); exit(255); } if (!buffer) { perror("asprintf"); exit(255); } midi_port_register(p, MIDI_INPUT | MIDI_OUTPUT, buffer, PTR_SHAPED_INT((intptr_t)i), 0); } last_buildout = m; } SDL_mutexV(blocker); }