mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2026-03-13 05:33:55 -04:00
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.
This commit is contained in:
parent
e447b46d36
commit
b0065bfe9a
1 changed files with 8 additions and 2 deletions
|
|
@ -4886,9 +4886,15 @@ int jack_activate (jack_client_t *client)
|
|||
c->activation->pending_new_pos = true;
|
||||
c->activation->pending_sync = true;
|
||||
|
||||
/* emits all foreign active ports, skips own (already announced via jack_port_register) */
|
||||
spa_list_for_each(o, &c->context.objects, link) {
|
||||
if (o->type != INTERFACE_Port || o->port.port == NULL ||
|
||||
o->port.port->client != c || !o->port.port->valid)
|
||||
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;
|
||||
o->registered = 0;
|
||||
queue_notify(c, NOTIFY_TYPE_PORTREGISTRATION, o, 1, NULL);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue