mirror of
https://github.com/ZDoom/fluidsynth.git
synced 2025-01-19 16:00:51 +00:00
jack midi autoconnect (#450)
This commit is contained in:
parent
c0ff5a0af1
commit
cf09b654ab
1 changed files with 46 additions and 1 deletions
|
@ -82,6 +82,8 @@ struct _fluid_jack_midi_driver_t
|
||||||
int midi_port_count;
|
int midi_port_count;
|
||||||
jack_port_t **midi_port; // array of midi port handles
|
jack_port_t **midi_port; // array of midi port handles
|
||||||
fluid_midi_parser_t *parser;
|
fluid_midi_parser_t *parser;
|
||||||
|
int autoconnect_inputs;
|
||||||
|
int autoconnect_is_outdated;
|
||||||
};
|
};
|
||||||
|
|
||||||
static fluid_jack_client_t *new_fluid_jack_client(fluid_settings_t *settings,
|
static fluid_jack_client_t *new_fluid_jack_client(fluid_settings_t *settings,
|
||||||
|
@ -94,7 +96,7 @@ void fluid_jack_driver_shutdown(void *arg);
|
||||||
int fluid_jack_driver_srate(jack_nframes_t nframes, void *arg);
|
int fluid_jack_driver_srate(jack_nframes_t nframes, void *arg);
|
||||||
int fluid_jack_driver_bufsize(jack_nframes_t nframes, void *arg);
|
int fluid_jack_driver_bufsize(jack_nframes_t nframes, void *arg);
|
||||||
int fluid_jack_driver_process(jack_nframes_t nframes, void *arg);
|
int fluid_jack_driver_process(jack_nframes_t nframes, void *arg);
|
||||||
|
void fluid_jack_port_registration(jack_port_id_t port, int is_registering, void *arg);
|
||||||
|
|
||||||
static fluid_mutex_t last_client_mutex = FLUID_MUTEX_INIT; /* Probably not necessary, but just in case drivers are created by multiple threads */
|
static fluid_mutex_t last_client_mutex = FLUID_MUTEX_INIT; /* Probably not necessary, but just in case drivers are created by multiple threads */
|
||||||
static fluid_jack_client_t *last_client = NULL; /* Last unpaired client. For audio/MIDI driver pairing. */
|
static fluid_jack_client_t *last_client = NULL; /* Last unpaired client. For audio/MIDI driver pairing. */
|
||||||
|
@ -109,6 +111,31 @@ fluid_jack_audio_driver_settings(fluid_settings_t *settings)
|
||||||
fluid_settings_register_str(settings, "audio.jack.server", "", 0);
|
fluid_settings_register_str(settings, "audio.jack.server", "", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Connect all midi input ports to all terminal midi output ports
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fluid_jack_midi_autoconnect(jack_client_t *client, fluid_jack_midi_driver_t *midi_driver) {
|
||||||
|
int i, j;
|
||||||
|
const char ** midi_source_ports;
|
||||||
|
|
||||||
|
midi_source_ports = jack_get_ports(client, NULL, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput | JackPortIsTerminal);
|
||||||
|
if(midi_source_ports != NULL)
|
||||||
|
{
|
||||||
|
for(j = 0; midi_source_ports[j] != NULL; j++)
|
||||||
|
{
|
||||||
|
for(i = 0; i < midi_driver->midi_port_count; i++)
|
||||||
|
{
|
||||||
|
FLUID_LOG(FLUID_INFO, "jack midi autoconnect \"%s\" to \"%s\"", midi_source_ports[j], jack_port_name(midi_driver->midi_port[i]));
|
||||||
|
jack_connect(client, midi_source_ports[j], jack_port_name(midi_driver->midi_port[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jack_free(midi_source_ports);
|
||||||
|
}
|
||||||
|
|
||||||
|
midi_driver->autoconnect_is_outdated = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create Jack client as necessary, share clients of the same server.
|
* Create Jack client as necessary, share clients of the same server.
|
||||||
* @param settings Settings object
|
* @param settings Settings object
|
||||||
|
@ -213,6 +240,7 @@ new_fluid_jack_client(fluid_settings_t *settings, int isaudio, void *driver)
|
||||||
goto error_recovery;
|
goto error_recovery;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jack_set_port_registration_callback(client_ref->client, fluid_jack_port_registration, client_ref);
|
||||||
jack_set_process_callback(client_ref->client, fluid_jack_driver_process, client_ref);
|
jack_set_process_callback(client_ref->client, fluid_jack_driver_process, client_ref);
|
||||||
jack_set_buffer_size_callback(client_ref->client, fluid_jack_driver_bufsize, client_ref);
|
jack_set_buffer_size_callback(client_ref->client, fluid_jack_driver_bufsize, client_ref);
|
||||||
jack_set_sample_rate_callback(client_ref->client, fluid_jack_driver_srate, client_ref);
|
jack_set_sample_rate_callback(client_ref->client, fluid_jack_driver_srate, client_ref);
|
||||||
|
@ -629,6 +657,11 @@ fluid_jack_driver_process(jack_nframes_t nframes, void *arg)
|
||||||
|
|
||||||
if(midi_driver)
|
if(midi_driver)
|
||||||
{
|
{
|
||||||
|
if(midi_driver->autoconnect_is_outdated)
|
||||||
|
{
|
||||||
|
fluid_jack_midi_autoconnect(client->client, midi_driver);
|
||||||
|
}
|
||||||
|
|
||||||
for(i = 0; i < midi_driver->midi_port_count; i++)
|
for(i = 0; i < midi_driver->midi_port_count; i++)
|
||||||
{
|
{
|
||||||
midi_buffer = jack_port_get_buffer(midi_driver->midi_port[i], 0);
|
midi_buffer = jack_port_get_buffer(midi_driver->midi_port[i], 0);
|
||||||
|
@ -728,6 +761,15 @@ fluid_jack_driver_shutdown(void *arg)
|
||||||
/* exit (1); */
|
/* exit (1); */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fluid_jack_port_registration(jack_port_id_t port, int is_registering, void *arg)
|
||||||
|
{
|
||||||
|
fluid_jack_client_t *client_ref = (fluid_jack_client_t *)arg;
|
||||||
|
if(client_ref->midi_driver != NULL)
|
||||||
|
{
|
||||||
|
client_ref->midi_driver->autoconnect_is_outdated = client_ref->midi_driver->autoconnect_inputs && is_registering != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void fluid_jack_midi_driver_settings(fluid_settings_t *settings)
|
void fluid_jack_midi_driver_settings(fluid_settings_t *settings)
|
||||||
{
|
{
|
||||||
|
@ -770,6 +812,9 @@ new_fluid_jack_midi_driver(fluid_settings_t *settings,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fluid_settings_getint(settings, "midi.autoconnect", &dev->autoconnect_inputs);
|
||||||
|
dev->autoconnect_is_outdated = dev->autoconnect_inputs;
|
||||||
|
|
||||||
dev->client_ref = new_fluid_jack_client(settings, FALSE, dev);
|
dev->client_ref = new_fluid_jack_client(settings, FALSE, dev);
|
||||||
|
|
||||||
if(!dev->client_ref)
|
if(!dev->client_ref)
|
||||||
|
|
Loading…
Reference in a new issue