From 2af43a8baf47495b8832a725f082a52b68aba71a Mon Sep 17 00:00:00 2001 From: Christopher Arndt Date: Sat, 1 May 2021 16:57:13 +0200 Subject: Add port order metadata to JACK sink / source ports Adds JACK metadata property to ports created by *module-jack-sink* and *module-jack-source* with key `JACK_METADATA_ORDER`, the port index (1-based, in order of creation) as value and type `http://www.w3.org/2001/XMLSchema#int`. This allows JACK applications, which use JACK metadata, to list or display these ports in correct order. See also: https://jackaudio.org/api/group__Metadata.html Signed-off-by: Christopher Arndt Part-of: --- src/modules/jack/module-jack-sink.c | 17 +++++++++++++++++ src/modules/jack/module-jack-source.c | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/modules/jack/module-jack-sink.c b/src/modules/jack/module-jack-sink.c index a7c723073..5a690cbb5 100644 --- a/src/modules/jack/module-jack-sink.c +++ b/src/modules/jack/module-jack-sink.c @@ -28,6 +28,8 @@ #include #include +#include +#include #include #include @@ -69,6 +71,8 @@ PA_MODULE_USAGE( "connect="); #define DEFAULT_SINK_NAME "jack_out" +#define METADATA_TYPE_INT "http://www.w3.org/2001/XMLSchema#int" +#define METADATA_KEY_ORDER "http://jackaudio.org/metadata/order" struct userdata { pa_core *core; @@ -301,6 +305,8 @@ int pa__init(pa_module*m) { const char **ports = NULL, **p; pa_sink_new_data data; jack_latency_range_t r; + jack_uuid_t port_uuid; + char port_order[4]; size_t n; pa_assert(m); @@ -389,6 +395,17 @@ int pa__init(pa_module*m) { pa_log("jack_port_register() failed."); goto fail; } + + /* Set order of ports as JACK metadata, if possible. */ + /* See: https://jackaudio.org/api/group__Metadata.html */ + port_uuid = jack_port_uuid(u->port[i]); + + if (!jack_uuid_empty(port_uuid)) { + if (snprintf(port_order, 4, "%d", i+1) >= 4) + pa_log("Port order metadata value > 999 truncated."); + if (jack_set_property(u->client, port_uuid, METADATA_KEY_ORDER, port_order, METADATA_TYPE_INT) != 0) + pa_log("jack_set_property() failed."); + } } pa_sink_new_data_init(&data); diff --git a/src/modules/jack/module-jack-source.c b/src/modules/jack/module-jack-source.c index c4541913c..dbee5a68e 100644 --- a/src/modules/jack/module-jack-source.c +++ b/src/modules/jack/module-jack-source.c @@ -28,6 +28,8 @@ #include #include +#include +#include #include #include @@ -59,6 +61,8 @@ PA_MODULE_USAGE( "connect="); #define DEFAULT_SOURCE_NAME "jack_in" +#define METADATA_TYPE_INT "http://www.w3.org/2001/XMLSchema#int" +#define METADATA_KEY_ORDER "http://jackaudio.org/metadata/order" struct userdata { pa_core *core; @@ -249,6 +253,8 @@ int pa__init(pa_module*m) { const char **ports = NULL, **p; pa_source_new_data data; jack_latency_range_t r; + jack_uuid_t port_uuid; + char port_order[4]; size_t n; pa_assert(m); @@ -331,6 +337,17 @@ int pa__init(pa_module*m) { pa_log("jack_port_register() failed."); goto fail; } + + /* Set order of ports as JACK metadata, if possible. */ + /* See: https://jackaudio.org/api/group__Metadata.html */ + port_uuid = jack_port_uuid(u->port[i]); + + if (!jack_uuid_empty(port_uuid)) { + if (snprintf(port_order, 4, "%d", i+1) >= 4) + pa_log("Port order metadata value > 999 truncated."); + if (jack_set_property(u->client, port_uuid, METADATA_KEY_ORDER, port_order, METADATA_TYPE_INT) != 0) + pa_log("jack_set_property() failed."); + } } pa_source_new_data_init(&data); -- cgit v1.2.3