commit 6544996a33cbe2150e27329d774ff3cd31b5f2a0
Author: Nedko Arnaudov <nedko@nedk.org>
Date:   Wed Mar 11 17:57:15 2026 +0200

    pipewire-jack: emit foreign port registration callbacks on jack_activate
    
    The jack_activate loop was only queuing NOTIFY_TYPE_PORTREGISTRATION
    for the activating client's own ports. Ports belonging to other clients
    — including all WirePlumber-managed ports and MIDI ports — were silently
    skipped due to the o->port.port->client != c condition.
    
    This caused two observable bugs for clients using libjackserver (e.g.
    jackdbus):
    - JackPortRegistrationCallback was not fired for any pre-existing
      foreign ports at activate time, leaving the patchbay empty unless
      the session manager happened to start after the client.
    - JACK MIDI ports were never announced via callback, even though they
      are correctly returned by jack_get_ports().
    
    The graph_order_callback fallback (used by jackdbus for initial port
    enumeration) is also ineffective here because pipewire-jack only fires
    it on connection events, not on activate.
    
    Fix by iterating all non-removed foreign ports in the object list and
    queuing registration callbacks for those whose node is active, matching
    the semantics already implemented in node_info() for ports of nodes
    that transition to running state after activate.
    
    The change is libjackserver.so only. libjack.so behaviour is left
    unmodifed, as carla is showing ports of each client twice.

diff --git a/pipewire-jack/src/meson.build b/pipewire-jack/src/meson.build
index 0630d96a8..639405bb9 100644
--- a/pipewire-jack/src/meson.build
+++ b/pipewire-jack/src/meson.build
@@ -55,7 +55,7 @@ pipewire_jackserver = shared_library('jackserver',
     pipewire_jackserver_sources,
     soversion : soversion,
     version : libjackversion,
-    c_args : pipewire_jack_c_args,
+    c_args : pipewire_jack_c_args + '-DLIBJACKSERVER',
     include_directories : [configinc, jack_inc],
     dependencies : [pipewire_dep, mathlib],
     install : true,
diff --git a/pipewire-jack/src/pipewire-jack.c b/pipewire-jack/src/pipewire-jack.c
index 94482dbc0..c7017e936 100644
--- a/pipewire-jack/src/pipewire-jack.c
+++ b/pipewire-jack/src/pipewire-jack.c
@@ -4887,9 +4887,21 @@ int jack_activate (jack_client_t *client)
 	c->activation->pending_sync = true;
 
 	spa_list_for_each(o, &c->context.objects, link) {
+#if !defined(LIBJACKSERVER)
 		if (o->type != INTERFACE_Port || o->port.port == NULL ||
 		    o->port.port->client != c || !o->port.port->valid)
 			continue;
+#else
+		/* emits all foreign active ports, skips own (already announced via jack_port_register) */
+		if (o->type != INTERFACE_Port || o->removed)
+			continue;
+		/* own ports are handled by jack_port_register */
+		if (o->port.port != NULL && o->port.port->client == c)
+			continue;
+		/* only announce ports whose node is active */
+		if (o->port.node != NULL && !node_is_active(c, o->port.node))
+			continue;
+#endif
 		o->registered = 0;
 		queue_notify(c, NOTIFY_TYPE_PORTREGISTRATION, o, 1, NULL);
 	}
