From 71d9f1ca2bf382fb968997a4a5774531d61506b2 Mon Sep 17 00:00:00 2001 From: Devin Anderson Date: Fri, 8 Apr 2011 11:26:25 -0700 Subject: [PATCH 1/2] Change naming scheme of 'alsarawmidi' ports for uniqueness when two MIDI interfaces with the same name are connected. Change 'alsarawmidi' ALSA port buffer size to 32 (lowest possible - it would be nice to make this lower) so that realtime MIDI messages can be sent ASAP when necessary. --- linux/alsarawmidi/JackALSARawMidiDriver.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/linux/alsarawmidi/JackALSARawMidiDriver.cpp b/linux/alsarawmidi/JackALSARawMidiDriver.cpp index 00b35c50..42771357 100755 --- a/linux/alsarawmidi/JackALSARawMidiDriver.cpp +++ b/linux/alsarawmidi/JackALSARawMidiDriver.cpp @@ -54,6 +54,7 @@ JackALSARawMidiDriver::~JackALSARawMidiDriver() int JackALSARawMidiDriver::Attach() { + const char *alias; jack_nframes_t buffer_size = fEngineControl->fBufferSize; jack_port_id_t index; jack_nframes_t latency = buffer_size; @@ -74,10 +75,15 @@ JackALSARawMidiDriver::Attach() // X: Do we need to deallocate ports? return -1; } + alias = input_port->GetAlias(); port = fGraphManager->GetPort(index); - port->SetAlias(input_port->GetAlias()); + port->SetAlias(alias); port->SetLatencyRange(JackCaptureLatency, &latency_range); fCapturePortList[i] = index; + + jack_info("JackALSARawMidiDriver::Attach - input port registered " + "(name='%s', alias='%s').", name, alias); + } if (! fEngineControl->fSyncMode) { latency += buffer_size; @@ -96,10 +102,15 @@ JackALSARawMidiDriver::Attach() // X: Do we need to deallocate ports? return -1; } + alias = output_port->GetAlias(); port = fGraphManager->GetPort(index); - port->SetAlias(output_port->GetAlias()); + port->SetAlias(alias); port->SetLatencyRange(JackPlaybackLatency, &latency_range); fPlaybackPortList[i] = index; + + jack_info("JackALSARawMidiDriver::Attach - output port registered " + "(name='%s', alias='%s').", name, alias); + } return 0; } From 20233db13eef564a7a1535d90ad9bdd9a7d599ff Mon Sep 17 00:00:00 2001 From: Devin Anderson Date: Fri, 8 Apr 2011 12:06:06 -0700 Subject: [PATCH 2/2] Oops! Forgot to add port uniqueness changes. --- linux/alsarawmidi/JackALSARawMidiPort.cpp | 27 ++++++++++++++--------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/linux/alsarawmidi/JackALSARawMidiPort.cpp b/linux/alsarawmidi/JackALSARawMidiPort.cpp index 04fec375..021241cf 100755 --- a/linux/alsarawmidi/JackALSARawMidiPort.cpp +++ b/linux/alsarawmidi/JackALSARawMidiPort.cpp @@ -28,11 +28,12 @@ using Jack::JackALSARawMidiPort; JackALSARawMidiPort::JackALSARawMidiPort(snd_rawmidi_info_t *info, size_t index) { + int card = snd_rawmidi_info_get_card(info); + unsigned int device = snd_rawmidi_info_get_device(info); + unsigned int subdevice = snd_rawmidi_info_get_subdevice(info); char device_id[32]; - snprintf(device_id, sizeof(device_id), "hw:%d,%d,%d", - snd_rawmidi_info_get_card(info), - snd_rawmidi_info_get_device(info), - snd_rawmidi_info_get_subdevice(info)); + snprintf(device_id, sizeof(device_id), "hw:%d,%d,%d", card, device, + subdevice); const char *alias_prefix; const char *error_message; snd_rawmidi_t **in; @@ -76,6 +77,15 @@ JackALSARawMidiPort::JackALSARawMidiPort(snd_rawmidi_info_t *info, func = "snd_rawmidi_params_set_avail_min"; goto free_params; } + + // Smallest valid buffer size. + code = snd_rawmidi_params_set_buffer_size(rawmidi, params, 32); + if (code) { + error_message = snd_strerror(code); + func = "snd_rawmidi_params_set_buffer_size"; + goto free_params; + } + code = snd_rawmidi_params_set_no_active_sensing(rawmidi, params, 1); if (code) { error_message = snd_strerror(code); @@ -95,12 +105,9 @@ JackALSARawMidiPort::JackALSARawMidiPort(snd_rawmidi_info_t *info, func = "snd_rawmidi_poll_descriptors_count"; goto close; } - snprintf(alias, sizeof(alias), "%s%d", alias_prefix, index); - device_name = snd_rawmidi_info_get_subdevice_name(info); - if (! strlen(device_name)) { - device_name = snd_rawmidi_info_get_name(info); - } - snprintf(name, sizeof(name), "system:%s %s", device_name, name_suffix); + snprintf(alias, sizeof(alias), "%s%d", alias_prefix, index + 1); + snprintf(name, sizeof(name), "system:%d-%d %s %d %s", card + 1, device + 1, + snd_rawmidi_info_get_name(info), subdevice + 1, name_suffix); return; free_params: snd_rawmidi_params_free(params);