Browse Source

MIDI port pretty names (#498)

* Set MIDI port pretty names on macOS

* Set MIDI port pretty names on Windows

* Set MIDI port pretty names on Linux/alsarawmidi

* Update alsarawmidi port naming to match CoreMIDI and WinMME

* Rename PortSetPrettyNameProperty to PortSetDeviceName

* Set hardware property to MIDI port names
tags/v1.9.13
Luciano Iam Filipe Coelho <falktx@falktx.com> 5 years ago
parent
commit
c2ec4b37d4
20 changed files with 117 additions and 43 deletions
  1. +22
    -0
      common/JackEngine.cpp
  2. +2
    -0
      common/JackEngine.h
  3. +0
    -6
      common/JackLibAPI.cpp
  4. +8
    -0
      common/JackLockedEngine.h
  5. +8
    -0
      common/JackMetadata.cpp
  6. +7
    -2
      linux/alsarawmidi/JackALSARawMidiDriver.cpp
  7. +3
    -2
      linux/alsarawmidi/JackALSARawMidiInputPort.cpp
  8. +3
    -1
      linux/alsarawmidi/JackALSARawMidiInputPort.h
  9. +3
    -2
      linux/alsarawmidi/JackALSARawMidiOutputPort.cpp
  10. +3
    -1
      linux/alsarawmidi/JackALSARawMidiOutputPort.h
  11. +14
    -6
      linux/alsarawmidi/JackALSARawMidiPort.cpp
  12. +6
    -2
      linux/alsarawmidi/JackALSARawMidiPort.h
  13. +8
    -0
      macosx/coremidi/JackCoreMidiDriver.mm
  14. +5
    -1
      macosx/coremidi/JackCoreMidiPort.h
  15. +8
    -0
      macosx/coremidi/JackCoreMidiPort.mm
  16. +4
    -19
      windows/winmme/JackWinMMEDriver.cpp
  17. +1
    -0
      windows/winmme/JackWinMMEInputPort.cpp
  18. +1
    -0
      windows/winmme/JackWinMMEOutputPort.cpp
  19. +7
    -1
      windows/winmme/JackWinMMEPort.cpp
  20. +4
    -0
      windows/winmme/JackWinMMEPort.h

+ 22
- 0
common/JackEngine.cpp View File

@@ -34,6 +34,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "JackChannel.h"
#include "JackError.h"

extern const char* JACK_METADATA_HARDWARE;
extern const char* JACK_METADATA_PRETTY_NAME;

namespace Jack
{

@@ -1071,6 +1074,25 @@ int JackEngine::PortRename(int refnum, jack_port_id_t port, const char* name)
return 0;
}

int JackEngine::PortSetDeviceName(jack_port_id_t port, const char* pretty_name)
{
static const char* type = "text/plain";
jack_uuid_t uuid = jack_port_uuid_generate(port);
int res = fMetadata.SetProperty(NULL, uuid, JACK_METADATA_HARDWARE, pretty_name, type);
if (res == -1) {
return -1;
}

char *v, *t;
res = fMetadata.GetProperty(uuid, JACK_METADATA_PRETTY_NAME, &v, &t);
if (res == -1) {
res = fMetadata.SetProperty(NULL, uuid, JACK_METADATA_PRETTY_NAME, pretty_name, type);
}
return res;
}

//--------------------
// Session management
//--------------------


+ 2
- 0
common/JackEngine.h View File

@@ -138,6 +138,8 @@ class SERVER_EXPORT JackEngine : public JackLockAble

int PortRename(int refnum, jack_port_id_t port, const char* name);

int PortSetDeviceName(jack_port_id_t port, const char* pretty_name);

int ComputeTotalLatencies();

int PropertyChangeNotify(jack_uuid_t subject, const char* key,jack_property_change_t change);


+ 0
- 6
common/JackLibAPI.cpp View File

@@ -48,12 +48,6 @@ extern "C"
LIB_EXPORT int jack_get_client_pid (const char *name);

// Metadata API
LIB_EXPORT const char* JACK_METADATA_PRETTY_NAME = "http://jackaudio.org/metadata/pretty-name";
LIB_EXPORT const char* JACK_METADATA_HARDWARE = "http://jackaudio.org/metadata/hardware";
LIB_EXPORT const char* JACK_METADATA_CONNECTED = "http://jackaudio.org/metadata/connected";
LIB_EXPORT const char* JACK_METADATA_PORT_GROUP = "http://jackaudio.org/metadata/port-group";
LIB_EXPORT const char* JACK_METADATA_ICON_SMALL = "http://jackaudio.org/metadata/icon-small";
LIB_EXPORT const char* JACK_METADATA_ICON_LARGE = "http://jackaudio.org/metadata/icon-large";

LIB_EXPORT int jack_set_property(jack_client_t*, jack_uuid_t subject, const char* key, const char* value, const char* type);
LIB_EXPORT int jack_get_property(jack_uuid_t subject, const char* key, char** value, char** type);


+ 8
- 0
common/JackLockedEngine.h View File

@@ -246,6 +246,14 @@ class SERVER_EXPORT JackLockedEngine
CATCH_EXCEPTION_RETURN
}

int PortSetDeviceName(int refnum, jack_port_id_t port, const char* pretty_name)
{
TRY_CALL
JackLock lock(&fEngine);
return (fEngine.CheckClient(refnum)) ? fEngine.PortSetDeviceName(port, pretty_name) : -1;
CATCH_EXCEPTION_RETURN
}

int ComputeTotalLatencies()
{
TRY_CALL


+ 8
- 0
common/JackMetadata.cpp View File

@@ -25,6 +25,14 @@
#include <limits.h>


LIB_EXPORT const char* JACK_METADATA_PRETTY_NAME = "http://jackaudio.org/metadata/pretty-name";
LIB_EXPORT const char* JACK_METADATA_HARDWARE = "http://jackaudio.org/metadata/hardware";
LIB_EXPORT const char* JACK_METADATA_CONNECTED = "http://jackaudio.org/metadata/connected";
LIB_EXPORT const char* JACK_METADATA_PORT_GROUP = "http://jackaudio.org/metadata/port-group";
LIB_EXPORT const char* JACK_METADATA_ICON_SMALL = "http://jackaudio.org/metadata/icon-small";
LIB_EXPORT const char* JACK_METADATA_ICON_LARGE = "http://jackaudio.org/metadata/icon-large";


namespace Jack
{



+ 7
- 2
linux/alsarawmidi/JackALSARawMidiDriver.cpp View File

@@ -80,6 +80,8 @@ JackALSARawMidiDriver::Attach()
port = fGraphManager->GetPort(index);
port->SetAlias(alias);
port->SetLatencyRange(JackCaptureLatency, &latency_range);
fEngine->PortSetDeviceName(fClientControl.fRefNum, index,
input_port->GetDeviceName());
fCapturePortList[i] = index;

jack_info("JackALSARawMidiDriver::Attach - input port registered "
@@ -106,6 +108,8 @@ JackALSARawMidiDriver::Attach()
port = fGraphManager->GetPort(index);
port->SetAlias(alias);
port->SetLatencyRange(JackPlaybackLatency, &latency_range);
fEngine->PortSetDeviceName(fClientControl.fRefNum, index,
output_port->GetDeviceName());
fPlaybackPortList[i] = index;

jack_info("JackALSARawMidiDriver::Attach - output port registered "
@@ -405,6 +409,7 @@ JackALSARawMidiDriver::Open(bool capturing, bool playing, int in_channels,
}
size_t num_inputs = 0;
size_t num_outputs = 0;
const char *client_name = fClientControl.fName;
if (potential_inputs) {
try {
input_ports = new JackALSARawMidiInputPort *[potential_inputs];
@@ -428,7 +433,7 @@ JackALSARawMidiDriver::Open(bool capturing, bool playing, int in_channels,
for (size_t i = 0; i < potential_inputs; i++) {
snd_rawmidi_info_t *info = in_info_list.at(i);
try {
input_ports[num_inputs] = new JackALSARawMidiInputPort(info, i);
input_ports[num_inputs] = new JackALSARawMidiInputPort(client_name, info, i);
num_inputs++;
} catch (std::exception& e) {
jack_error("JackALSARawMidiDriver::Open - while creating new "
@@ -439,7 +444,7 @@ JackALSARawMidiDriver::Open(bool capturing, bool playing, int in_channels,
for (size_t i = 0; i < potential_outputs; i++) {
snd_rawmidi_info_t *info = out_info_list.at(i);
try {
output_ports[num_outputs] = new JackALSARawMidiOutputPort(info, i);
output_ports[num_outputs] = new JackALSARawMidiOutputPort(client_name, info, i);
num_outputs++;
} catch (std::exception& e) {
jack_error("JackALSARawMidiDriver::Open - while creating new "


+ 3
- 2
linux/alsarawmidi/JackALSARawMidiInputPort.cpp View File

@@ -26,11 +26,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

using Jack::JackALSARawMidiInputPort;

JackALSARawMidiInputPort::JackALSARawMidiInputPort(snd_rawmidi_info_t *info,
JackALSARawMidiInputPort::JackALSARawMidiInputPort(const char* client_name,
snd_rawmidi_info_t *info,
size_t index,
size_t max_bytes,
size_t max_messages):
JackALSARawMidiPort(info, index, POLLIN)
JackALSARawMidiPort(client_name, info, index, POLLIN)
{
alsa_event = 0;
jack_event = 0;


+ 3
- 1
linux/alsarawmidi/JackALSARawMidiInputPort.h View File

@@ -41,7 +41,9 @@ namespace Jack {

public:

JackALSARawMidiInputPort(snd_rawmidi_info_t *info, size_t index,
JackALSARawMidiInputPort(const char* client_name,
snd_rawmidi_info_t *info,
size_t index,
size_t max_bytes=4096,
size_t max_messages=1024);



+ 3
- 2
linux/alsarawmidi/JackALSARawMidiOutputPort.cpp View File

@@ -25,12 +25,13 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

using Jack::JackALSARawMidiOutputPort;

JackALSARawMidiOutputPort::JackALSARawMidiOutputPort(snd_rawmidi_info_t *info,
JackALSARawMidiOutputPort::JackALSARawMidiOutputPort(const char* client_name,
snd_rawmidi_info_t *info,
size_t index,
size_t max_bytes_per_poll,
size_t max_bytes,
size_t max_messages):
JackALSARawMidiPort(info, index, POLLOUT)
JackALSARawMidiPort(client_name, info, index, POLLOUT)
{
alsa_event = 0;
read_queue = new JackMidiBufferReadQueue();


+ 3
- 1
linux/alsarawmidi/JackALSARawMidiOutputPort.h View File

@@ -40,7 +40,9 @@ namespace Jack {

public:

JackALSARawMidiOutputPort(snd_rawmidi_info_t *info, size_t index,
JackALSARawMidiOutputPort(const char* client_name,
snd_rawmidi_info_t *info,
size_t index,
size_t max_bytes_per_poll=3,
size_t max_bytes=4096,
size_t max_messages=1024);


+ 14
- 6
linux/alsarawmidi/JackALSARawMidiPort.cpp View File

@@ -27,7 +27,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

using Jack::JackALSARawMidiPort;

JackALSARawMidiPort::JackALSARawMidiPort(snd_rawmidi_info_t *info,
JackALSARawMidiPort::JackALSARawMidiPort(const char *client_name, snd_rawmidi_info_t *info,
size_t index, unsigned short io_mask)
{
int card = snd_rawmidi_info_get_card(info);
@@ -36,20 +36,21 @@ JackALSARawMidiPort::JackALSARawMidiPort(snd_rawmidi_info_t *info,
char device_id[32];
snprintf(device_id, sizeof(device_id), "hw:%d,%d,%d", card, device,
subdevice);
const char* driver_name = snd_rawmidi_info_get_name(info);
const char *alias_suffix;
const char *error_message;
snd_rawmidi_t **in;
const char *name_prefix;
const char *port_name;
snd_rawmidi_t **out;
if (snd_rawmidi_info_get_stream(info) == SND_RAWMIDI_STREAM_OUTPUT) {
alias_suffix = "out";
in = 0;
name_prefix = "system:midi_playback_";
port_name = "playback_";
out = &rawmidi;
} else {
alias_suffix = "in";
in = &rawmidi;
name_prefix = "system:midi_capture_";
port_name = "capture_";
out = 0;
}
const char *func;
@@ -114,9 +115,10 @@ JackALSARawMidiPort::JackALSARawMidiPort(snd_rawmidi_info_t *info,
goto close;
}
snprintf(alias, sizeof(alias), "system:%d-%d %s %d %s", card + 1,
device + 1, snd_rawmidi_info_get_name(info), subdevice + 1,
device + 1, driver_name, subdevice + 1,
alias_suffix);
snprintf(name, sizeof(name), "%s%zu", name_prefix, index + 1);
snprintf(name, sizeof(name), "%s:%s%zu", client_name, port_name, index + 1);
strncpy(device_name, driver_name, sizeof(device_name) - 1);
this->io_mask = io_mask;
return;
free_params:
@@ -178,6 +180,12 @@ JackALSARawMidiPort::GetName()
return name;
}

const char *
JackALSARawMidiPort::GetDeviceName()
{
return device_name;
}

int
JackALSARawMidiPort::GetPollDescriptorCount()
{


+ 6
- 2
linux/alsarawmidi/JackALSARawMidiPort.h View File

@@ -37,6 +37,7 @@ namespace Jack {
int fds[2];
unsigned short io_mask;
char name[REAL_JACK_PORT_NAME_SIZE+1];
char device_name[REAL_JACK_PORT_NAME_SIZE+1];
struct pollfd *queue_poll_fd;

protected:
@@ -60,8 +61,8 @@ namespace Jack {

public:

JackALSARawMidiPort(snd_rawmidi_info_t *info, size_t index,
unsigned short io_mask);
JackALSARawMidiPort(const char *client_name, snd_rawmidi_info_t *info,
size_t index, unsigned short io_mask);

virtual
~JackALSARawMidiPort();
@@ -72,6 +73,9 @@ namespace Jack {
const char *
GetName();

const char *
GetDeviceName();

int
GetPollDescriptorCount();



+ 8
- 0
macosx/coremidi/JackCoreMidiDriver.mm View File

@@ -372,6 +372,8 @@ JackCoreMidiDriver::Attach()
port = fGraphManager->GetPort(index);
port->SetAlias(port_obj->GetAlias());
port->SetLatencyRange(JackCaptureLatency, &latency_range);
fEngine->PortSetDeviceName(fClientControl.fRefNum, index,
port_obj->GetDeviceName());
fCapturePortList[i] = index;
}

@@ -390,6 +392,8 @@ JackCoreMidiDriver::Attach()
port = fGraphManager->GetPort(index);
port->SetAlias(port_obj->GetAlias());
port->SetLatencyRange(JackCaptureLatency, &latency_range);
fEngine->PortSetDeviceName(fClientControl.fRefNum, index,
port_obj->GetDeviceName());
fCapturePortList[num_physical_inputs + i] = index;
}

@@ -415,6 +419,8 @@ JackCoreMidiDriver::Attach()
port = fGraphManager->GetPort(index);
port->SetAlias(port_obj->GetAlias());
port->SetLatencyRange(JackPlaybackLatency, &latency_range);
fEngine->PortSetDeviceName(fClientControl.fRefNum, index,
port_obj->GetDeviceName());
fPlaybackPortList[i] = index;
}

@@ -434,6 +440,8 @@ JackCoreMidiDriver::Attach()
port = fGraphManager->GetPort(index);
port->SetAlias(port_obj->GetAlias());
port->SetLatencyRange(JackPlaybackLatency, &latency_range);
fEngine->PortSetDeviceName(fClientControl.fRefNum, index,
port_obj->GetDeviceName());
fPlaybackPortList[num_physical_outputs + i] = index;
}



+ 5
- 1
macosx/coremidi/JackCoreMidiPort.h View File

@@ -33,6 +33,7 @@ namespace Jack {

char alias[REAL_JACK_PORT_NAME_SIZE+1];
char name[REAL_JACK_PORT_NAME_SIZE+1];
char device_name[REAL_JACK_PORT_NAME_SIZE+1];
bool initialized;

protected:
@@ -62,7 +63,10 @@ namespace Jack {

const char *
GetName();

const char *
GetDeviceName();

static bool IsInternalPort(MIDIObjectRef port_aux);

};


+ 8
- 0
macosx/coremidi/JackCoreMidiPort.mm View File

@@ -65,6 +65,13 @@ JackCoreMidiPort::GetName()
return name;
}

const char *
JackCoreMidiPort::GetDeviceName()
{
assert(initialized);
return device_name;
}

void
JackCoreMidiPort::Initialize(const char *alias_name, const char *client_name,
const char *driver_name, int index,
@@ -96,6 +103,7 @@ JackCoreMidiPort::Initialize(const char *alias_name, const char *client_name,
}
snprintf(name, sizeof(name), "%s:%s_%d", client_name,
is_output ? "playback" : "capture", num);
strncpy(device_name, endpoint_name, sizeof(device_name) - 1);
this->endpoint = endpoint;
initialized = true;
}

+ 4
- 19
windows/winmme/JackWinMMEDriver.cpp View File

@@ -71,6 +71,8 @@ JackWinMMEDriver::Attach()
port = fGraphManager->GetPort(index);
port->SetAlias(input_port->GetAlias());
port->SetLatencyRange(JackCaptureLatency, &latency_range);
fEngine->PortSetDeviceName(fClientControl.fRefNum, index,
input_port->GetDeviceName());
fCapturePortList[i] = index;
}

@@ -95,6 +97,8 @@ JackWinMMEDriver::Attach()
port = fGraphManager->GetPort(index);
port->SetAlias(output_port->GetAlias());
port->SetLatencyRange(JackPlaybackLatency, &latency_range);
fEngine->PortSetDeviceName(fClientControl.fRefNum, index,
output_port->GetDeviceName());
fPlaybackPortList[i] = index;
}

@@ -424,22 +428,3 @@ extern "C"
#ifdef __cplusplus
}
#endif


/*
jack_connect system:midi_capture_1 system_midi:playback_1
jack_connect system:midi_capture_1 system_midi:playback_2

jack_connect system:midi_capture_1 system_midi:playback_1

jack_connect system:midi_capture_1 system_midi:playback_1

jack_connect system:midi_capture_1 system_midi:playback_1

jack_connect system_midi:capture_1 system:midi_playback_1
jack_connect system_midi:capture_2 system:midi_playback_1

jack_connect system_midi:capture_1 system_midi:playback_1

*/


+ 1
- 0
windows/winmme/JackWinMMEInputPort.cpp View File

@@ -92,6 +92,7 @@ JackWinMMEInputPort::JackWinMMEInputPort(const char *alias_name,
snprintf(alias, sizeof(alias) - 1, "%s:%s:in%d", alias_name, name_tmp,
index + 1);
snprintf(name, sizeof(name) - 1, "%s:capture_%d", client_name, index + 1);
strncpy(device_name, name_tmp, sizeof(device_name) - 1);
jack_event = 0;
started = false;
write_queue_ptr.release();


+ 1
- 0
windows/winmme/JackWinMMEOutputPort.cpp View File

@@ -87,6 +87,7 @@ JackWinMMEOutputPort::JackWinMMEOutputPort(const char *alias_name,
snprintf(alias, sizeof(alias) - 1, "%s:%s:out%d", alias_name, name_tmp,
index + 1);
snprintf(name, sizeof(name) - 1, "%s:playback_%d", client_name, index + 1);
strncpy(device_name, name_tmp, sizeof(device_name) - 1);
read_queue_ptr.release();
thread_queue_ptr.release();
thread_ptr.release();


+ 7
- 1
windows/winmme/JackWinMMEPort.cpp View File

@@ -18,7 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include <memory>
#include <stdexcept>
#include <stdexcept>
#include <stdio.h>

#include "JackWinMMEPort.h"
@@ -48,6 +48,12 @@ JackWinMMEPort::GetName()
return name;
}

const char *
JackWinMMEPort::GetDeviceName()
{
return device_name;
}

void
JackWinMMEPort::GetOSErrorString(LPTSTR text)
{


+ 4
- 0
windows/winmme/JackWinMMEPort.h View File

@@ -33,6 +33,7 @@ namespace Jack {

char alias[REAL_JACK_PORT_NAME_SIZE+1];
char name[REAL_JACK_PORT_NAME_SIZE+1];
char device_name[REAL_JACK_PORT_NAME_SIZE+1];

public:

@@ -46,6 +47,9 @@ namespace Jack {
const char *
GetName();

const char *
GetDeviceName();

void
GetOSErrorString(LPTSTR text);



Loading…
Cancel
Save