Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}